Bug #668693: aqbanking: Improve transaction UI

* Use expander to show/hide templates
* Disable execute button as long as field values are incorrect
* Use icons and tooltips in entries to indicate that an incorrect value was inserted

Patch by Johannes Schmid.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@21903 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Christian Stimming 2012-01-28 22:12:26 +00:00
parent 183aec5ec2
commit a9c51ffc1c
2 changed files with 526 additions and 489 deletions

View File

@ -69,11 +69,10 @@ static AB_TRANSACTION *gnc_ab_trans_dialog_fill_values(GncABTransDialog *td);
static AB_JOB *gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc,
GncABTransType trans_type);
static gboolean gnc_ab_trans_dialog_check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
const AB_TRANSACTION *trans);
static void gnc_ab_trans_dialog_check_ktoblzcheck(const GncABTransDialog *td,
const AB_TRANSACTION *trans);
/* Callbacks - connect with GtkBuilder */
G_MODULE_EXPORT void gnc_ab_trans_dialog_account_changed_cb(GtkEditable *editable, gpointer user_data);
/* Callbacks - connected with GtkBuilder */
G_MODULE_EXPORT void gnc_ab_trans_dialog_bankcode_changed_cb(GtkEditable *editable, gpointer user_data);
G_MODULE_EXPORT void gnc_ab_trans_dialog_add_templ_cb(GtkButton *button, gpointer user_data);
G_MODULE_EXPORT void gnc_ab_trans_dialog_moveup_templ_cb(GtkButton *button, gpointer user_data);
@ -89,6 +88,7 @@ G_MODULE_EXPORT void gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView
GtkTreePath *path,
GtkTreeViewColumn *column,
gpointer user_data);
G_MODULE_EXPORT void gnc_ab_trans_dialog_verify_values(GncABTransDialog *td);
enum
@ -104,7 +104,7 @@ struct _GncABTransDialog
GtkWidget *dialog;
GtkWidget *parent;
AB_ACCOUNT *ab_acc;
/* Whether this is a transfer or a direct debit */
GncABTransType trans_type;
@ -129,6 +129,9 @@ struct _GncABTransDialog
GtkTreeView *template_gtktreeview;
GtkListStore *template_list_store;
/* Exec button */
GtkWidget *exec_button;
/* Flag, if template list has been changed */
gboolean templ_changed;
@ -227,6 +230,7 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
const gchar *ab_accountnumber;
const gchar *ab_bankname;
const gchar *ab_bankcode;
GtkWidget *trans_vbox;
GtkWidget *heading_label;
GtkWidget *recp_name_heading;
GtkWidget *recp_account_heading;
@ -271,6 +275,7 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
gtk_window_set_transient_for(GTK_WINDOW(td->dialog), GTK_WINDOW(parent));
/* Extract widgets */
trans_vbox = GTK_WIDGET(gtk_builder_get_object (builder, "trans_vbox"));
heading_label = GTK_WIDGET(gtk_builder_get_object (builder, "heading_label"));
recp_name_heading = GTK_WIDGET(gtk_builder_get_object (builder, "recp_name_heading"));
td->recp_name_entry = GTK_WIDGET(gtk_builder_get_object (builder, "recp_name_entry"));
@ -284,6 +289,7 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
td->purpose_cont_entry = GTK_WIDGET(gtk_builder_get_object (builder, "purpose_cont_entry"));
td->purpose_cont2_entry = GTK_WIDGET(gtk_builder_get_object (builder, "purpose_cont2_entry"));
td->purpose_cont3_entry = GTK_WIDGET(gtk_builder_get_object (builder, "purpose_cont3_entry"));
td->exec_button = GTK_WIDGET(gtk_builder_get_object(builder, "exec_now_button"));
orig_name_heading = GTK_WIDGET(gtk_builder_get_object (builder, "orig_name_heading"));
orig_name_label = GTK_WIDGET(gtk_builder_get_object (builder, "orig_name_label"));
orig_account_heading = GTK_WIDGET(gtk_builder_get_object (builder, "orig_account_heading"));
@ -302,7 +308,9 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
TRUE);
gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(td->amount_edit),
commodity_scu);
g_signal_connect_swapped (gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit)), "changed",
G_CALLBACK(gnc_ab_trans_dialog_verify_values), td);
/* Check for what kind of transaction this should be, and change the
* labels accordingly */
switch (trans_type)
@ -367,23 +375,37 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
gtk_tree_view_append_column(td->template_gtktreeview, column);
/* Connect the Signals */
gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, td);
gtk_builder_connect_signals_full(builder, gnc_builder_connect_full_func, td);
g_object_unref(G_OBJECT(builder));
/* Disabled OK button until suitable values are filled */
gnc_ab_trans_dialog_verify_values(td);
return td;
}
static gboolean
check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
const AB_TRANSACTION *trans)
static void
gnc_ab_trans_dialog_entry_set (GtkWidget* entry,
const gchar* message,
const gchar* stock_icon)
{
g_object_set (entry,
"secondary-icon-stock", stock_icon,
"secondary-icon-tooltip-text", message,
NULL);
}
static void
gnc_ab_trans_dialog_check_ktoblzcheck(const GncABTransDialog *td,
const AB_TRANSACTION *trans)
{
#ifndef HAVE_KTOBLZCHECK_H
return TRUE;
return;
#else
gint blzresult;
const char *blztext;
gboolean values_ok = TRUE;
gchar* message;
ENTER(" ");
@ -394,15 +416,16 @@ check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
switch (blzresult)
{
case 2:
gtk_widget_show(parent);
values_ok = gnc_verify_dialog(
parent, TRUE,
_("The internal check of the destination account number '%s' "
"at the specified bank with bank code '%s' failed. This means "
"the account number might contain an error. Should the online "
"transfer job be sent with this account number anyway?"),
AB_Transaction_GetRemoteAccountNumber(trans),
AB_Transaction_GetRemoteBankCode(trans));
message = g_strdup_printf(_("The internal check of the destination account number '%s' "
"at the specified bank with bank code '%s' failed. This means "
"the account number might contain an error."),
AB_Transaction_GetRemoteAccountNumber(trans),
AB_Transaction_GetRemoteBankCode(trans));
gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry, message,
GTK_STOCK_DIALOG_WARNING);
gnc_ab_trans_dialog_entry_set (td->recp_account_entry, message,
GTK_STOCK_DIALOG_WARNING);
blztext = "Kontonummer wahrscheinlich falsch";
break;
case 0:
@ -417,13 +440,130 @@ check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
break;
}
if (blzresult != 2)
{
gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry, "",
NULL);
gnc_ab_trans_dialog_entry_set (td->recp_account_entry, "",
NULL);
}
LEAVE("KtoBlzCheck said check is %d = %s",
blzresult, blztext ? blztext : "(none)");
return values_ok;
#endif
}
static void
gnc_ab_trans_dialog_clear_transaction(GncABTransDialog *td)
{
AB_Transaction_free(td->ab_trans);
td->ab_trans = NULL;
}
void
gnc_ab_trans_dialog_verify_values(GncABTransDialog *td)
{
gchar* purpose;
gchar* othername;
const gchar* account;
const gchar* bankcode;
gboolean values_ok = TRUE;
GtkWidget *amount_entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit));
/* Fill in the values from the entry fields into a new
* AB_TRANSACTION */
td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
/* Check recipient / remote name */
othername = gnc_ab_get_remote_name(td->ab_trans);
if (!othername || !strlen(othername))
{
gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
_("You did not enter a recipient name. A recipient name is "
"required for an online transfer.\n"),
GTK_STOCK_CANCEL);
g_free (othername);
values_ok = FALSE;
}
else
{
gnc_ab_trans_dialog_entry_set (td->recp_name_entry, "", NULL);
g_free(othername);
}
/* Check account */
account = AB_Transaction_GetRemoteAccountNumber(td->ab_trans);
if (!account || !strlen(account))
{
gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
_("You did not enter a recipient account. A recipient account is "
"required for an online transfer.\n"),
GTK_STOCK_CANCEL);
values_ok = FALSE;
}
else
{
gnc_ab_trans_dialog_entry_set (td->recp_account_entry, "", NULL);
}
/* Check bank */
bankcode = AB_Transaction_GetRemoteBankCode(td->ab_trans);
if (!bankcode || !strlen(bankcode))
{
gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
_("You did not enter a recipient bank. A recipient bank is "
"required for an online transfer.\n"),
GTK_STOCK_CANCEL);
values_ok = FALSE;
}
else
{
gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry, "", NULL);
}
/* Check if account details are correct - gives warning only */
if (values_ok)
gnc_ab_trans_dialog_check_ktoblzcheck(td, td->ab_trans);
/* Check transaction value */
if (AB_Value_GetValueAsDouble(AB_Transaction_GetValue(td->ab_trans))
== 0.0)
{
gnc_ab_trans_dialog_entry_set (amount_entry,
_("The amount is zero or the amount field could not be "
"interpreted correctly. You might have mixed up decimal "
"point and comma, compared to your locale settings. "
"This does not result in a valid online transfer job."),
GTK_STOCK_CANCEL);
values_ok = FALSE;
}
else
{
gnc_ab_trans_dialog_entry_set (amount_entry, "", NULL);
}
/* Check transaction purpose */
purpose = gnc_ab_get_purpose(td->ab_trans);
if (!purpose || !strlen(purpose))
{
gnc_ab_trans_dialog_entry_set (td->purpose_entry,
_("You did not enter any transaction purpose. A purpose is "
"required for an online transfer.\n"),
GTK_STOCK_CANCEL);
g_free (purpose);
values_ok = FALSE;
}
else
{
gnc_ab_trans_dialog_entry_set (td->purpose_entry, "", NULL);
g_free(purpose);
}
gtk_widget_set_sensitive(td->exec_button, values_ok);
gnc_ab_trans_dialog_clear_transaction(td);
}
gint
gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
{
@ -454,116 +594,29 @@ gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
/* Show the dialog */
gtk_widget_show(td->dialog);
/* Repeat until entered values make sense */
do
/* Now run the dialog until it gets closed by a button press */
result = gtk_dialog_run (GTK_DIALOG (td->dialog));
/* Was cancel pressed or dialog closed?
* GNC_RESPONSE_NOW == execute now
* GNC_RESPONSE_LATER == scheduled for later execution (unimplemented)
* GTK_RESPONSE_CANCEL == cancel
* GTK_RESPONSE_DELETE_EVENT == window destroyed */
if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER)
{
/* Now run the dialog until it gets closed by a button press */
result = gtk_dialog_run (GTK_DIALOG (td->dialog));
/* Was cancel pressed or dialog closed?
* GNC_RESPONSE_NOW == execute now
* GNC_RESPONSE_LATER == scheduled for later execution (unimplemented)
* GTK_RESPONSE_CANCEL == cancel
* GTK_RESPONSE_DELETE_EVENT == window destroyed */
if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER)
{
gtk_widget_destroy(td->dialog);
td->dialog = NULL;
break;
}
/* Now fill in the values from the entry fields into a new
* AB_TRANSACTION */
td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
values_ok = TRUE;
/* Check transaction value */
values_ok =
AB_Value_GetValueAsDouble(AB_Transaction_GetValue(td->ab_trans))
!= 0.0;
if (!values_ok)
{
gtk_widget_show(td->dialog);
if (gnc_verify_dialog(
td->dialog, TRUE, "%s",
_("The amount is zero or the amount field could not be "
"interpreted correctly. You might have mixed up decimal "
"point and comma, compared to your locale settings. "
"This does not result in a valid online transfer job. \n"
"\n"
"Do you want to enter the job again?")))
{
continue;
}
else
{
AB_Transaction_free(td->ab_trans);
td->ab_trans = NULL;
result = GTK_RESPONSE_CANCEL;
break;
}
}
/* Check transaction purpose */
purpose = gnc_ab_get_purpose(td->ab_trans);
values_ok = *purpose;
g_free(purpose);
if (!values_ok)
{
gtk_widget_show(td->dialog);
if (gnc_verify_dialog(
td->dialog, TRUE, "%s",
_("You did not enter any transaction purpose. A purpose is "
"required for an online transfer.\n"
"\n"
"Do you want to enter the job again?")))
{
continue;
}
else
{
AB_Transaction_free(td->ab_trans);
td->ab_trans = NULL;
result = GTK_RESPONSE_CANCEL;
break;
}
}
/* Check recipient / remote name */
othername = gnc_ab_get_remote_name(td->ab_trans);
values_ok = othername && *othername;
g_free(othername);
if (!values_ok)
{
gtk_widget_show(td->dialog);
if (gnc_verify_dialog(
td->dialog, TRUE, "%s",
_("You did not enter a recipient name. A recipient name is "
"required for an online transfer.\n"
"\n"
"Do you want to enter the job again?")))
{
continue;
}
else
{
AB_Transaction_free(td->ab_trans);
td->ab_trans = NULL;
result = GTK_RESPONSE_CANCEL;
break;
}
}
/* FIXME: If this is a direct debit, set the textkey/ "Textschluessel"/
* transactionCode according to some GUI selection here!! */
/*if (td->trans_type == SINGLE_DEBITNOTE)
AB_TRANSACTION_setTextKey (td->hbci_trans, 05); */
/* And finally check the account code, if ktoblzcheck is available */
values_ok = check_ktoblzcheck(td->dialog, td, td->ab_trans);
gtk_widget_destroy(td->dialog);
td->dialog = NULL;
return result;
}
while (!values_ok);
/* Get the transaction details - have been checked beforehand */
td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
/* FIXME: If this is a direct debit, set the textkey/ "Textschluessel"/
* transactionCode according to some GUI selection here!! */
/*if (td->trans_type == SINGLE_DEBITNOTE)
AB_TRANSACTION_setTextKey (td->hbci_trans, 05); */
/* Hide the dialog */
if (td->dialog)
@ -807,12 +860,6 @@ gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView *view,
LEAVE(" ");
}
void
gnc_ab_trans_dialog_account_changed_cb(GtkEditable *editable, gpointer user_data)
{
/* TODO */
}
void
gnc_ab_trans_dialog_bankcode_changed_cb(GtkEditable *editable, gpointer user_data)
{
@ -864,6 +911,7 @@ gnc_ab_trans_dialog_bankcode_changed_cb(GtkEditable *editable, gpointer user_dat
}
LEAVE(" ");
#endif
gnc_ab_trans_dialog_verify_values(td);
}
struct _FindTemplData

View File

@ -1,7 +1,6 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkDialog" id="Connection Dialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
@ -11,12 +10,12 @@
<property name="type_hint">dialog</property>
<signal name="delete-event" handler="ggg_delete_event_cb" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox9">
<object class="GtkBox" id="dialog-vbox9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area9">
<object class="GtkButtonBox" id="dialog-action_area9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
@ -118,12 +117,10 @@
<object class="GtkEntry" id="top_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
@ -181,12 +178,10 @@
<object class="GtkEntry" id="second_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
@ -240,8 +235,6 @@
<object class="GtkScrolledWindow" id="scrolledwindow30">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="log_text">
@ -305,12 +298,12 @@
<property name="title" translatable="yes">Get Transactions Online</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<object class="GtkBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
@ -623,11 +616,11 @@
<property name="title" translatable="yes">Enter Password</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox3">
<object class="GtkBox" id="dialog-vbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area3">
<object class="GtkButtonBox" id="dialog-action_area3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
@ -729,12 +722,10 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
@ -747,12 +738,10 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
@ -891,11 +880,11 @@
<property name="title" translatable="yes">Name for new template</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox2">
<object class="GtkBox" id="dialog-vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area2">
<object class="GtkButtonBox" id="dialog-action_area2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
@ -963,13 +952,11 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">250</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="activates_default">True</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -997,114 +984,13 @@
<property name="title" translatable="yes">Online Transaction</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox7">
<object class="GtkBox" id="dialog-vbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="exec_later_button">
<property name="label" translatable="yes">Execute later (unimpl.)</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="exec_now_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_markup">Execute this online transaction now</property>
<property name="tooltip_text" translatable="yes">Execute this online transaction now</property>
<property name="use_action_appearance">False</property>
<child>
<object class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox122">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-execute</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8877454">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Execute Now</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox151">
<object class="GtkVBox" id="trans_vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
@ -1121,17 +1007,6 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator7">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkTable" id="table6">
<property name="visible">True</property>
@ -1143,13 +1018,11 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">12</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<signal name="changed" handler="gnc_ab_trans_dialog_account_changed_cb" swapped="no"/>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
<signal name="insert-text" handler="gnc_ab_trans_dialog_entry_filter_cb" swapped="no"/>
</object>
<packing>
@ -1177,12 +1050,10 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">8</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<signal name="changed" handler="gnc_ab_trans_dialog_bankcode_changed_cb" swapped="no"/>
<signal name="insert-text" handler="gnc_ab_trans_dialog_entry_filter_cb" swapped="no"/>
</object>
@ -1215,12 +1086,11 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char"></property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
</object>
<packing>
<property name="right_attach">3</property>
@ -1441,6 +1311,202 @@
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">●</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
</object>
<packing>
<property name="top_attach">11</property>
<property name="bottom_attach">12</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont2_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">●</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
</object>
<packing>
<property name="top_attach">13</property>
<property name="bottom_attach">14</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">●</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">11</property>
<property name="bottom_attach">12</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont3_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">●</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<signal name="changed" handler="gnc_ab_trans_dialog_verify_values" swapped="yes"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">13</property>
<property name="bottom_attach">14</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHBox" id="amount_hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator8">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">19</property>
<property name="bottom_attach">20</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_padding">1</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator4">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">14</property>
<property name="bottom_attach">15</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_padding">1</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator6">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">9</property>
<property name="bottom_attach">10</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkExpander" id="expander1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkHBox" id="hbox117">
<property name="visible">True</property>
@ -1450,6 +1516,7 @@
<object class="GtkVButtonBox" id="vbutonbox158">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkButton" id="add_templ_button">
<property name="visible">True</property>
@ -1633,8 +1700,6 @@
<object class="GtkScrolledWindow" id="template_scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="template_list">
@ -1643,6 +1708,9 @@
<property name="headers_visible">False</property>
<property name="rules_hint">True</property>
<signal name="row-activated" handler="gnc_ab_trans_dialog_templ_list_row_activated_cb" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1"/>
</child>
</object>
</child>
</object>
@ -1650,222 +1718,143 @@
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8877442">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Use Transaction Template</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">20</property>
<property name="bottom_attach">21</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="top_attach">11</property>
<property name="bottom_attach">12</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont2_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="top_attach">13</property>
<property name="bottom_attach">14</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">11</property>
<property name="bottom_attach">12</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkEntry" id="purpose_cont3_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">27</property>
<property name="invisible_char">&#x25CF;</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">13</property>
<property name="bottom_attach">14</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHBox" id="amount_hbox">
<child type="label">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<property name="label" translatable="yes">Templates</property>
</object>
<packing>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator8">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">19</property>
<property name="bottom_attach">20</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_padding">1</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator4">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">14</property>
<property name="bottom_attach">15</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
<property name="y_padding">1</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator6">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="right_attach">3</property>
<property name="top_attach">9</property>
<property name="bottom_attach">10</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHSeparator" id="hseparator7">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">0</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="exec_later_button">
<property name="label" translatable="yes">Execute later (unimpl.)</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="exec_now_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_markup">Execute this online transaction now</property>
<property name="tooltip_text" translatable="yes">Execute this online transaction now</property>
<property name="use_action_appearance">False</property>
<child>
<object class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<object class="GtkHBox" id="hbox122">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-execute</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8877454">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Execute Now</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>