+
+GString *list_txn_to_string(GtkTreeView *treeview, gboolean clipboard)
+{
+GtkTreeModel *model;
+GtkTreeIter iter;
+gboolean valid;
+GString *node;
+const gchar *format;
+Transaction *ope;
+gchar datebuf[16];
+gchar *info, *payeename, *categoryname;
+Payee *payee;
+Category *category;
+gchar *tags;
+char amountbuf[G_ASCII_DTOSTR_BUF_SIZE];
+
+ node = g_string_new(NULL);
+
+ //title line
+ if(clipboard)
+ g_string_append (node, "date\tpaymode\tinfo\tpayee\tmemo\tamount\tcategory\ttags\n");
+ else
+ g_string_append (node, "date;paymode;info;payee;memo;amount;category;tags\n");
+
+ model = gtk_tree_view_get_model(treeview);
+
+ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
+ while (valid)
+ {
+ gtk_tree_model_get (model, &iter,
+ LST_DSPOPE_DATAS, &ope,
+ -1);
+
+ hb_sprint_date(datebuf, ope->date);
+
+ info = ope->info;
+ if(info == NULL) info = "";
+ payee = da_pay_get(ope->kpay);
+ payeename = (payee->name == NULL) ? "" : payee->name;
+ category = da_cat_get(ope->kcat);
+ categoryname = (category->name == NULL) ? NULL : da_cat_get_fullname(category);
+ tags = transaction_tags_tostring(ope);
+
+ //#793719
+ //g_ascii_dtostr (amountbuf, sizeof (amountbuf), ope->amount);
+ g_ascii_formatd (amountbuf, sizeof (amountbuf), "%.2f", ope->amount);
+
+ DB( g_print("amount = %f '%s'\n", ope->amount, amountbuf) );
+
+ format = (clipboard == TRUE) ? "%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n" : "%s;%d;%s;%s;%s;%s;%s;%s\n";
+ g_string_append_printf(node, format,
+ datebuf,
+ ope->paymode,
+ info,
+ payeename,
+ ope->memo,
+ amountbuf,
+ categoryname != NULL ? categoryname : "",
+ tags != NULL ? tags : ""
+ );
+
+ //leak
+ g_free(categoryname);
+ g_free(tags);
+
+ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
+ }
+
+ //DB( g_print("text is:\n%s", node->str) );
+
+ return node;
+}
+
+