28 #include <gdk/gdkkeysyms.h>
29 #include <glib/gi18n.h>
31 #include "dialog-transfer.h"
32 #include "dialog-utils.h"
33 #include "gnc-amount-edit.h"
34 #include "gnc-component-manager.h"
35 #include "gnc-date-edit.h"
38 #include "gnc-exp-parser.h"
40 #include "gnc-gui-query.h"
47 #include "swig-runtime.h"
48 #include "guile-mappings.h"
49 #include "engine-helpers.h"
50 #include "engine-helpers-guile.h"
55 #define DIALOG_TRANSFER_CM_CLASS "dialog-transfer"
56 #define GNC_PREFS_GROUP "dialogs.transfer"
58 #define PRECISION 1000000
74 GtkWidget * amount_edit;
75 GtkWidget * date_entry;
76 GtkWidget * num_entry;
77 GtkWidget * description_entry;
78 GtkWidget * memo_entry;
79 GtkWidget * conv_forward;
80 GtkWidget * conv_reverse;
82 GtkWidget * from_window;
83 GtkTreeView * from_tree_view;
85 GtkWidget * to_window;
86 GtkTreeView * to_tree_view;
92 XferDirection quickfill;
95 gint desc_start_selection;
96 gint desc_end_selection;
97 guint desc_selection_source_id;
99 GtkWidget * transferinfo_label;
101 GtkWidget * from_transfer_label;
102 GtkWidget * to_transfer_label;
104 GtkWidget * from_currency_label;
105 GtkWidget * to_currency_label;
107 GtkWidget * from_show_button;
108 GtkWidget * to_show_button;
110 GtkWidget * curr_xfer_table;
112 GtkWidget * price_edit;
113 GtkWidget * to_amount_edit;
115 GtkWidget * price_radio;
116 GtkWidget * amount_radio;
118 GtkWidget * fetch_button;
129 gnc_xfer_dialog_cb transaction_cb;
131 gpointer transaction_user_data;
149 char *acct_full_name;
156 static void gnc_xfer_update_to_amount (
XferDialog *xferData);
157 static void gnc_xfer_dialog_update_conv_info(
XferDialog *xferData);
160 XferDirection direction);
161 static void gnc_transfer_dialog_set_selected_account (
XferDialog *dialog,
163 XferDirection direction);
165 void gnc_xfer_description_insert_cb(GtkEditable *editable,
166 const gchar *insert_text,
167 const gint insert_text_len,
170 gboolean gnc_xfer_description_key_press_cb( GtkEntry *entry,
173 void gnc_xfer_dialog_fetch (GtkButton *button,
XferDialog *xferData);
174 gboolean gnc_xfer_dialog_inc_exp_filter_func (
Account *account,
176 void price_amount_radio_toggled_cb(GtkToggleButton *togglebutton, gpointer data);
178 void gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data);
179 void gnc_xfer_dialog_close_cb(GtkDialog *dialog, gpointer data);
184 gnc_xfer_dialog_compute_price (
XferDialog *xferData)
189 from_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit));
190 to_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->to_amount_edit));
197 gnc_xfer_dialog_update_price (
XferDialog *xferData)
206 if (!xferData)
return;
207 if (!xferData->from_commodity || ! xferData->to_commodity)
return;
210 if (!xferData->pricedb)
return;
217 date = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (xferData->date_entry));
249 price = gnc_price_get_value (prc);
264 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (xferData->price_edit), price);
267 gnc_xfer_update_to_amount (xferData);
271 gnc_xfer_dialog_toggle_cb(GtkToggleButton *button, gpointer data)
276 info = g_object_get_data (G_OBJECT(treeview),
"filter-info");
279 info->
show_inc_exp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
287 gnc_xfer_dialog_key_press_cb (GtkWidget *widget,
293 if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter))
295 toplevel = gtk_widget_get_toplevel (widget);
296 if (gtk_widget_is_toplevel(toplevel) && GTK_IS_WINDOW(toplevel))
298 gtk_window_activate_default(GTK_WINDOW(toplevel));
306 gnc_xfer_dialog_set_price_auto (
XferDialog *xferData,
307 gboolean currency_active,
315 if (!currency_active)
319 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(xferData->price_edit),
320 gnc_numeric_zero ());
321 entry = GTK_ENTRY(gnc_amount_edit_gtk_entry
322 (GNC_AMOUNT_EDIT(xferData->price_edit)));
323 gtk_entry_set_text(entry,
"");
325 gnc_xfer_update_to_amount (xferData);
330 if (!gnc_is_euro_currency (from_currency) ||
331 !gnc_is_euro_currency (to_currency))
333 gnc_xfer_dialog_update_price (xferData);
337 from_rate = gnc_euro_currency_get_rate (from_currency);
338 to_rate = gnc_euro_currency_get_rate (to_currency);
341 gnc_xfer_dialog_update_price (xferData);
345 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT(xferData->price_edit), price);
347 gnc_xfer_update_to_amount (xferData);
351 gnc_xfer_dialog_curr_acct_activate(
XferDialog *xferData)
355 gboolean curr_active;
357 g_return_if_fail (xferData != NULL);
359 gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM);
362 gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_TO);
364 curr_active = (xferData->exch_rate ||
365 ((from_account != NULL) && (to_account != NULL)))
367 xferData->to_commodity);
369 gtk_widget_set_sensitive(xferData->curr_xfer_table, curr_active);
370 gtk_widget_set_sensitive(xferData->price_edit,
371 curr_active && gtk_toggle_button_get_active
372 (GTK_TOGGLE_BUTTON(xferData->price_radio)));
373 gtk_widget_set_sensitive(xferData->to_amount_edit,
374 curr_active && gtk_toggle_button_get_active
375 (GTK_TOGGLE_BUTTON(xferData->amount_radio)));
376 gtk_widget_set_sensitive(xferData->price_radio, curr_active);
377 gtk_widget_set_sensitive(xferData->amount_radio, curr_active);
379 gnc_xfer_dialog_set_price_auto (xferData, curr_active,
380 xferData->from_commodity, xferData->to_commodity);
381 gnc_xfer_dialog_update_conv_info(xferData);
387 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(xferData->to_amount_edit),
388 gnc_numeric_zero ());
389 entry = GTK_ENTRY(gnc_amount_edit_gtk_entry
390 (GNC_AMOUNT_EDIT(xferData->to_amount_edit)));
391 gtk_entry_set_text(entry,
"");
397 price_amount_radio_toggled_cb(GtkToggleButton *togglebutton, gpointer data)
400 g_return_if_fail (xferData != NULL);
402 gtk_widget_set_sensitive(xferData->price_edit, gtk_toggle_button_get_active
403 (GTK_TOGGLE_BUTTON(xferData->price_radio)));
404 gtk_widget_set_sensitive(xferData->to_amount_edit,
405 gtk_toggle_button_get_active
406 (GTK_TOGGLE_BUTTON(xferData->amount_radio)));
417 gnc_xfer_dialog_reload_quickfill(
XferDialog *xferData )
419 GList *splitlist, *node;
424 account = gnc_transfer_dialog_get_selected_account (xferData, xferData->quickfill);
427 gnc_quickfill_destroy( xferData->qf );
428 xferData->qf = gnc_quickfill_new();
432 for ( node = splitlist; node; node = node->next )
443 gnc_xfer_dialog_from_tree_selection_changed_cb (GtkTreeSelection *selection,
451 account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM);
456 gtk_label_set_text(GTK_LABEL(xferData->from_currency_label),
459 xferData->from_commodity = commodity;
461 print_info = gnc_account_print_info (account, FALSE);
462 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (xferData->amount_edit),
464 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (xferData->amount_edit),
467 gnc_xfer_dialog_curr_acct_activate(xferData);
470 if (xferData->quickfill == XFER_DIALOG_FROM)
471 gnc_xfer_dialog_reload_quickfill(xferData);
476 gnc_xfer_dialog_to_tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
483 account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_TO);
488 gtk_label_set_text(GTK_LABEL(xferData->to_currency_label),
491 xferData->to_commodity = commodity;
493 print_info = gnc_account_print_info (account, FALSE);
494 gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (xferData->to_amount_edit),
496 gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (xferData->to_amount_edit),
499 gnc_xfer_dialog_curr_acct_activate(xferData);
502 if (xferData->quickfill == XFER_DIALOG_TO)
503 gnc_xfer_dialog_reload_quickfill(xferData);
507 gnc_xfer_dialog_inc_exp_filter_func (
Account *account,
530 gnc_xfer_dialog_fill_tree_view(
XferDialog *xferData,
531 XferDirection direction)
533 GtkTreeView *tree_view;
534 const char *show_inc_exp_message = _(
"Show the income and expense accounts");
535 GtkWidget *scroll_win;
537 GtkTreeSelection *selection;
538 gboolean use_accounting_labels;
540 GtkBuilder *builder = g_object_get_data (G_OBJECT (xferData->dialog),
"builder");
542 g_return_if_fail (xferData != NULL);
544 GNC_PREF_ACCOUNTING_LABELS);
557 if (use_accounting_labels)
559 button = GTK_WIDGET(gtk_builder_get_object (builder,
560 (direction == XFER_DIALOG_TO) ?
561 "left_show_button" :
"right_show_button"));
562 scroll_win = GTK_WIDGET(gtk_builder_get_object (builder,
563 (direction == XFER_DIALOG_TO) ?
564 "left_trans_window" :
"right_trans_window"));
568 button = GTK_WIDGET(gtk_builder_get_object (builder,
569 (direction == XFER_DIALOG_TO) ?
570 "right_show_button" :
"left_show_button"));
571 scroll_win = GTK_WIDGET(gtk_builder_get_object (builder,
572 (direction == XFER_DIALOG_TO) ?
573 "right_trans_window" :
"left_trans_window"));
577 if (direction == XFER_DIALOG_TO)
583 gtk_container_add(GTK_CONTAINER(scroll_win), GTK_WIDGET(tree_view));
584 info->
show_inc_exp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
587 gnc_xfer_dialog_inc_exp_filter_func,
590 g_object_set_data (G_OBJECT(tree_view),
"filter-info", info);
592 gtk_widget_show(GTK_WIDGET(tree_view));
593 g_signal_connect (G_OBJECT (tree_view),
"key-press-event",
594 G_CALLBACK (gnc_xfer_dialog_key_press_cb), NULL);
596 selection = gtk_tree_view_get_selection (tree_view);
597 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
599 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
600 gtk_widget_set_tooltip_text (button, show_inc_exp_message);
602 if (direction == XFER_DIALOG_TO)
604 xferData->to_tree_view = tree_view;
605 xferData->to_window = scroll_win;
606 xferData->to_show_button = GTK_WIDGET (button);
607 g_signal_connect (G_OBJECT (selection),
"changed",
608 G_CALLBACK (gnc_xfer_dialog_to_tree_selection_changed_cb), xferData);
612 xferData->from_tree_view = tree_view;
613 xferData->from_window = scroll_win;
614 xferData->from_show_button = GTK_WIDGET (button);
615 g_signal_connect (G_OBJECT (selection),
"changed",
616 G_CALLBACK (gnc_xfer_dialog_from_tree_selection_changed_cb), xferData);
618 g_signal_connect (G_OBJECT (button),
"toggled",
619 G_CALLBACK (gnc_xfer_dialog_toggle_cb), tree_view);
624 gnc_parse_error_dialog (
XferDialog *xferData,
const char *error_string)
626 const char * parse_error_string;
627 g_return_if_fail (xferData != NULL);
629 parse_error_string = gnc_exp_parser_error_string ();
630 if (parse_error_string == NULL)
631 parse_error_string =
"";
633 if (error_string == NULL)
636 gnc_error_dialog (xferData->dialog,
638 error_string, _(
"Error"),
651 gnc_xfer_dialog_quickfill(
XferDialog *xferData )
658 gboolean changed = FALSE;
660 ENTER(
"xferData=%p", xferData);
667 match_account = gnc_transfer_dialog_get_selected_account (xferData, xferData->quickfill);
669 desc = gtk_entry_get_text( GTK_ENTRY(xferData->description_entry) );
671 if ( !desc || desc[0] ==
'\0' )
678 LEAVE(
"split not found");
681 DEBUG(
"split=%p", split);
689 gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit))))
692 DEBUG(
"updating amount");
703 gnc_amount_edit_set_amount( GNC_AMOUNT_EDIT(xferData->amount_edit), amt );
707 if ( !g_strcmp0(gtk_entry_get_text(GTK_ENTRY(xferData->memo_entry)),
"" ))
709 DEBUG(
"updating memo");
710 gtk_entry_set_text( GTK_ENTRY(xferData->memo_entry),
724 GtkWidget *other_button;
725 XferDirection other_direction;
727 DEBUG(
"updating other split");
728 if (xferData->quickfill == XFER_DIALOG_FROM)
730 other_button = xferData->to_show_button;
731 other_direction = XFER_DIALOG_TO;
735 other_button = xferData->from_show_button;
736 other_direction = XFER_DIALOG_FROM;
745 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(other_button), TRUE);
747 gnc_transfer_dialog_set_selected_account (xferData, other_acct, other_direction);
756 idle_select_region(gpointer data)
759 g_return_val_if_fail(xferData, FALSE);
761 gtk_editable_select_region(GTK_EDITABLE(xferData->description_entry),
762 xferData->desc_start_selection,
763 xferData->desc_end_selection);
765 xferData->desc_selection_source_id = 0;
774 gnc_xfer_description_insert_cb(GtkEditable *editable,
775 const gchar *insert_text,
776 const gint insert_text_len,
780 gchar *prefix, *suffix, *new_text;
782 const gchar *match_str;
783 gint prefix_len, new_text_len, match_str_len;
785 g_return_if_fail (xferData != NULL);
787 if (insert_text_len <= 0)
790 suffix = gtk_editable_get_chars(editable, *start_pos, -1);
800 prefix = gtk_editable_get_chars(editable, 0, *start_pos);
801 new_text = g_strconcat(prefix, insert_text, (gchar*) NULL);
802 prefix_len = strlen(prefix);
803 new_text_len = prefix_len + insert_text_len;
808 && ((match_str_len = strlen(match_str)) > new_text_len))
810 g_signal_handlers_block_matched (G_OBJECT (editable),
811 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, xferData);
813 gtk_editable_insert_text(editable,
814 match_str + prefix_len,
815 match_str_len - prefix_len,
818 g_signal_handlers_unblock_matched (G_OBJECT (editable),
819 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, xferData);
822 g_signal_stop_emission_by_name (G_OBJECT (editable),
"insert_text");
825 *start_pos = g_utf8_strlen(new_text, -1);
829 xferData->desc_start_selection = *start_pos;
830 xferData->desc_end_selection = -1;
831 xferData->desc_selection_source_id = g_idle_add(idle_select_region,
838 gnc_xfer_description_key_press_cb( GtkEntry *entry,
842 gboolean done_with_input = FALSE;
849 switch ( event->keyval )
853 gnc_xfer_dialog_quickfill( xferData );
858 case GDK_ISO_Left_Tab:
859 if ( !( event->state & GDK_SHIFT_MASK) )
862 gnc_xfer_dialog_quickfill( xferData );
866 gtk_editable_select_region( GTK_EDITABLE(xferData->description_entry),
872 LEAVE(
"done=%d", done_with_input);
873 return( done_with_input );
879 gnc_xfer_dialog_update_conv_info (
XferDialog *xferData)
881 const gchar *to_mnemonic, *from_mnemonic;
893 if (!from_mnemonic || !to_mnemonic)
896 rate = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->price_edit));
899 string = g_strdup_printf(
"1 %s = x %s", from_mnemonic, to_mnemonic);
900 gtk_label_set_text(GTK_LABEL(xferData->conv_forward),
string);
903 string = g_strdup_printf(
"1 %s = x %s", to_mnemonic, from_mnemonic);
904 gtk_label_set_text(GTK_LABEL(xferData->conv_reverse),
string);
909 string = g_strdup_printf(
"1 %s = %f %s", from_mnemonic,
911 gtk_label_set_text(GTK_LABEL(xferData->conv_forward),
string);
916 string = g_strdup_printf(
"1 %s = %f %s", to_mnemonic,
918 gtk_label_set_text(GTK_LABEL(xferData->conv_reverse),
string);
924 gnc_xfer_amount_update_cb(GtkWidget *widget, GdkEventFocus *event,
928 g_return_val_if_fail (xferData != NULL, FALSE);
930 gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->amount_edit));
932 gnc_xfer_update_to_amount (xferData);
939 gnc_xfer_update_to_amount (
XferDialog *xferData)
946 g_return_if_fail(xferData);
949 amount_edit = GNC_AMOUNT_EDIT(xferData->amount_edit);
950 price_edit = GNC_AMOUNT_EDIT(xferData->price_edit);
951 to_amount_edit = GNC_AMOUNT_EDIT(xferData->to_amount_edit);
954 account = gnc_transfer_dialog_get_selected_account(xferData, XFER_DIALOG_TO);
956 account = gnc_transfer_dialog_get_selected_account(xferData,
960 else if (xferData->to_commodity != NULL)
964 if (!gnc_amount_edit_evaluate(price_edit) ||
966 to_amount = gnc_numeric_zero();
972 gnc_amount_edit_set_amount(to_amount_edit, to_amount);
974 gtk_entry_set_text(GTK_ENTRY(gnc_amount_edit_gtk_entry(to_amount_edit)),
977 gnc_xfer_dialog_update_conv_info(xferData);
982 gnc_xfer_price_update_cb(GtkWidget *widget, GdkEventFocus *event,
987 gnc_xfer_update_to_amount (xferData);
993 gnc_xfer_date_changed_cb(GtkWidget *widget, gpointer data)
998 gnc_xfer_dialog_update_price (xferData);
1004 gnc_xfer_to_amount_update_cb(GtkWidget *widget, GdkEventFocus *event,
1011 account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_TO);
1012 if (account == NULL)
1013 account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM);
1015 gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->to_amount_edit));
1017 price = gnc_xfer_dialog_compute_price(xferData);
1019 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(xferData->price_edit), price);
1020 gnc_xfer_dialog_update_conv_info(xferData);
1037 gnc_transfer_dialog_set_selected_account (xferData, account, XFER_DIALOG_FROM);
1052 gnc_transfer_dialog_set_selected_account (xferData, account, XFER_DIALOG_TO);
1058 if (!xferData)
return;
1061 gtk_label_set_text(GTK_LABEL(xferData->from_currency_label),
1064 gnc_amount_edit_set_print_info(GNC_AMOUNT_EDIT(xferData->amount_edit),
1065 gnc_commodity_print_info(cur, FALSE));
1066 gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(xferData->amount_edit),
1069 xferData->from_commodity = cur;
1070 gnc_xfer_dialog_curr_acct_activate(xferData);
1076 gtk_label_set_text(GTK_LABEL(xferData->to_currency_label),
1079 gnc_amount_edit_set_print_info(GNC_AMOUNT_EDIT(xferData->to_amount_edit),
1080 gnc_commodity_print_info(cur, FALSE));
1081 gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(xferData->to_amount_edit),
1084 xferData->to_commodity = cur;
1085 gnc_xfer_dialog_curr_acct_activate(xferData);
1089 gnc_xfer_dialog_lock_account_tree(
XferDialog *xferData,
1090 XferDirection direction,
1093 GtkTreeView *tree_view;
1094 GtkWidget *show_button;
1095 GtkWidget *scroll_win;
1097 if (xferData == NULL)
1102 case XFER_DIALOG_FROM:
1103 tree_view = xferData->from_tree_view;
1104 scroll_win = xferData->from_window;
1105 show_button = xferData->from_show_button;
1107 case XFER_DIALOG_TO:
1108 tree_view = xferData->to_tree_view;
1109 scroll_win = xferData->to_window;
1110 show_button = xferData->to_show_button;
1116 gtk_widget_set_sensitive( GTK_WIDGET(tree_view), FALSE );
1117 gtk_widget_set_sensitive( GTK_WIDGET(show_button), FALSE );
1121 gtk_widget_hide( scroll_win );
1122 gtk_widget_hide( GTK_WIDGET(show_button) );
1135 gnc_xfer_dialog_lock_from_account_tree(
XferDialog *xferData)
1137 gnc_xfer_dialog_lock_account_tree(xferData, XFER_DIALOG_FROM, FALSE);
1149 gnc_xfer_dialog_lock_to_account_tree(
XferDialog *xferData)
1151 gnc_xfer_dialog_lock_account_tree(xferData, XFER_DIALOG_TO, FALSE);
1163 gnc_xfer_dialog_hide_from_account_tree(
XferDialog *xferData)
1165 gnc_xfer_dialog_lock_account_tree(xferData, XFER_DIALOG_FROM, TRUE);
1177 gnc_xfer_dialog_hide_to_account_tree(
XferDialog *xferData)
1179 gnc_xfer_dialog_lock_account_tree(xferData, XFER_DIALOG_TO, TRUE);
1194 gnc_xfer_dialog_is_exchange_dialog (
XferDialog *xferData,
1199 g_return_if_fail(xferData);
1200 ENTER(
"xferData=%p, exch_rate=%p (%s)", xferData, exch_rate,
1201 exch_rate == NULL ?
"NULL" : xaccPrintAmount(*exch_rate,
1202 gnc_default_print_info(FALSE)));
1204 gtk_widget_set_sensitive (xferData->amount_edit, FALSE);
1205 gtk_widget_set_sensitive (xferData->date_entry, FALSE);
1206 gtk_widget_set_sensitive (xferData->num_entry, FALSE);
1207 gtk_widget_set_sensitive (xferData->description_entry, FALSE);
1208 gtk_widget_set_sensitive (xferData->memo_entry, FALSE);
1211 gae = GNC_AMOUNT_EDIT (xferData->price_edit);
1212 gtk_widget_grab_focus (gnc_amount_edit_gtk_entry (gae));
1214 xferData->exch_rate = exch_rate;
1232 if (xferData == NULL)
1235 account = gnc_transfer_dialog_get_selected_account (xferData,
1237 if (account == NULL)
1238 account = gnc_transfer_dialog_get_selected_account (xferData,
1241 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (xferData->amount_edit), amount);
1243 void gnc_xfer_dialog_set_amount_sensitive(
XferDialog *xferData,
1244 gboolean is_sensitive)
1247 gtk_widget_set_sensitive(gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT (xferData->amount_edit)), is_sensitive);
1251 gnc_xfer_dialog_set_fetch_sensitive (GtkWidget *fetch)
1255 gtk_widget_set_sensitive (fetch, TRUE);
1256 gtk_widget_set_tooltip_text (fetch, _(
"Retrieve the current online quote"));
1259 gtk_widget_set_sensitive (fetch, FALSE);
1260 gtk_widget_set_tooltip_text (fetch, _(
"Finance::Quote must be installed to enable this button."));
1273 gnc_xfer_dialog_set_description(
XferDialog *xferData,
const char *description)
1275 if (xferData == NULL)
1278 gtk_entry_set_text(GTK_ENTRY(xferData->description_entry), description);
1291 gnc_xfer_dialog_set_memo(
XferDialog *xferData,
const char *memo)
1293 if (xferData == NULL)
1296 gtk_entry_set_text(GTK_ENTRY(xferData->memo_entry), memo);
1309 gnc_xfer_dialog_set_num(
XferDialog *xferData,
const char *num)
1311 if (xferData == NULL)
1314 gtk_entry_set_text(GTK_ENTRY(xferData->num_entry), num);
1329 if (xferData == NULL)
1332 gnc_date_edit_set_time( GNC_DATE_EDIT(xferData->date_entry), set_date );
1334 void gnc_xfer_dialog_set_date_sensitive(
XferDialog *xferData,
1335 gboolean is_sensitive)
1338 gtk_widget_set_sensitive (xferData->date_entry, is_sensitive);
1344 if (xferData == NULL)
1350 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (xferData->price_edit),
1353 gnc_xfer_update_to_amount (xferData);
1357 gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
1368 gboolean curr_trans;
1374 g_return_if_fail (xferData != NULL);
1377 if (response == GTK_RESPONSE_APPLY)
1379 LEAVE(
"fetching exchange rate");
1383 if (response != GTK_RESPONSE_OK)
1385 gnc_close_gui_component_by_data (DIALOG_TRANSFER_CM_CLASS, xferData);
1386 LEAVE(
"cancel, etc.");
1390 from_account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM);
1391 to_account = gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_TO);
1393 if (xferData->exch_rate == NULL)
1395 if ((from_account == NULL) || (to_account == NULL))
1397 const char *message = _(
"You must specify an account to transfer from, "
1398 "or to, or both, for this transaction. "
1399 "Otherwise, it will not be recorded.");
1400 gnc_error_dialog(xferData->dialog,
"%s", message);
1401 LEAVE(
"bad account");
1405 if (from_account == to_account)
1407 const char *message = _(
"You can't transfer from and to the same "
1409 gnc_error_dialog(xferData->dialog,
"%s", message);
1410 LEAVE(
"same account");
1417 const char *placeholder_format =
1418 _(
"The account %s does not allow transactions.");
1425 gnc_error_dialog(xferData->dialog, placeholder_format, name);
1427 LEAVE(
"placeholder");
1433 const char *message = _(
"You can't transfer from a non-currency account. "
1434 "Try reversing the \"from\" and \"to\" accounts "
1435 "and making the \"amount\" negative.");
1436 gnc_error_dialog(xferData->dialog,
"%s", message);
1437 LEAVE(
"non-currency");
1442 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->amount_edit)))
1444 gnc_parse_error_dialog (xferData, _(
"You must enter a valid amount."));
1445 LEAVE(
"no account");
1449 from_commodity = xferData->from_commodity;
1450 to_commodity = xferData->to_commodity;
1454 amount = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit));
1458 const char *message = _(
"You must enter an amount to transfer.");
1459 gnc_error_dialog(xferData->dialog,
"%s", message);
1460 LEAVE(
"invalid from amount");
1464 ts = gnc_date_edit_get_date_ts(GNC_DATE_EDIT(xferData->date_entry));
1468 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->price_edit)))
1470 if (gtk_toggle_button_get_active
1471 (GTK_TOGGLE_BUTTON(xferData->price_radio)))
1473 gnc_parse_error_dialog (xferData, _(
"You must enter a valid price."));
1474 LEAVE(
"invalid price");
1479 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->to_amount_edit)))
1481 if (gtk_toggle_button_get_active
1482 (GTK_TOGGLE_BUTTON(xferData->amount_radio)))
1484 gnc_parse_error_dialog (xferData,
1485 _(
"You must enter a valid `to' amount."));
1486 LEAVE(
"invalid to amount");
1491 to_amount = gnc_amount_edit_get_amount
1492 (GNC_AMOUNT_EDIT(xferData->to_amount_edit));
1497 gnc_suspend_gui_refresh ();
1499 if (xferData->exch_rate)
1506 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xferData->price_radio)))
1507 gnc_xfer_update_to_amount(xferData);
1509 price = gnc_xfer_dialog_compute_price(xferData);
1525 string = gtk_entry_get_text(GTK_ENTRY(xferData->description_entry));
1547 string = gtk_entry_get_text(GTK_ENTRY(xferData->num_entry));
1548 gnc_set_num_action (trans, from_split,
string, NULL);
1551 string = gtk_entry_get_text(GTK_ENTRY(xferData->memo_entry));
1562 if (xferData->transaction_cb)
1563 xferData->transaction_cb(trans, xferData->transaction_user_data);
1567 if (xferData->pricedb)
1576 !(gnc_is_euro_currency (from) && gnc_is_euro_currency (to)))
1585 from_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit));
1586 to_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->to_amount_edit));
1613 price_value = gnc_price_get_value(price);
1621 gnc_price_get_value(price),
1647 gnc_price_begin_edit (price);
1648 gnc_price_set_commodity (price, from);
1649 gnc_price_set_currency (price, to);
1650 gnc_price_set_time (price, ts);
1651 gnc_price_set_source (price,
"user:xfer-dialog");
1652 gnc_price_set_value (price, value);
1654 gnc_price_commit_edit (price);
1664 gnc_resume_gui_refresh ();
1666 DEBUG(
"close component");
1667 gnc_close_gui_component_by_data (DIALOG_TRANSFER_CM_CLASS, xferData);
1672 gnc_xfer_dialog_close_cb(GtkDialog *dialog, gpointer data)
1678 if (xferData->transaction_cb)
1679 xferData->transaction_cb(NULL, xferData->transaction_user_data);
1681 entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(xferData->amount_edit));
1682 g_signal_handlers_disconnect_matched (G_OBJECT (entry), G_SIGNAL_MATCH_DATA,
1683 0, 0, NULL, NULL, xferData);
1685 entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(xferData->price_edit));
1686 g_signal_handlers_disconnect_matched (G_OBJECT (entry), G_SIGNAL_MATCH_DATA,
1687 0, 0, NULL, NULL, xferData);
1689 entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(xferData->to_amount_edit));
1690 g_signal_handlers_disconnect_matched (G_OBJECT (entry), G_SIGNAL_MATCH_DATA,
1691 0, 0, NULL, NULL, xferData);
1693 entry = xferData->description_entry;
1694 g_signal_handlers_disconnect_matched (G_OBJECT (entry), G_SIGNAL_MATCH_DATA,
1695 0, 0, NULL, NULL, xferData);
1697 DEBUG(
"unregister component");
1698 gnc_unregister_gui_component_by_data (DIALOG_TRANSFER_CM_CLASS, xferData);
1700 gnc_quickfill_destroy (xferData->qf);
1701 xferData->qf = NULL;
1703 if (xferData->desc_selection_source_id)
1704 g_source_remove (xferData->desc_selection_source_id);
1709 DEBUG(
"xfer dialog destroyed");
1714 gnc_xfer_dialog_fetch (GtkButton *button,
XferDialog *xferData)
1723 gboolean have_price = FALSE;
1725 g_return_if_fail (xferData);
1729 quotes_func = scm_c_eval_string (
"gnc:book-add-quotes");
1731 if (!scm_is_procedure (quotes_func))
1733 LEAVE(
"quote retrieval failed");
1737 book_scm = gnc_book_to_scm (xferData->book);
1738 if (scm_is_true (scm_not (book_scm)))
1744 scm_window = SWIG_NewPointerObj(xferData->dialog,
1745 SWIG_TypeQuery(
"_p_GtkWidget"), 0);
1747 if (scm_is_true (scm_not (book_scm)))
1749 LEAVE(
"no scm window");
1753 gnc_set_busy_cursor (NULL, TRUE);
1754 scm_call_2 (quotes_func, scm_window, book_scm);
1755 gnc_unset_busy_cursor (NULL);
1762 rate = gnc_price_get_value (prc);
1763 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(xferData->price_edit), rate);
1774 rate =
gnc_numeric_div (gnc_numeric_create (1, 1), gnc_price_get_value (prc),
1777 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(xferData->price_edit), rate);
1783 LEAVE(
"quote retrieved");
1788 gnc_xfer_dialog_create(GtkWidget *parent,
XferDialog *xferData)
1790 GtkBuilder *builder;
1791 gboolean use_accounting_labels;
1794 GNC_PREF_ACCOUNTING_LABELS);
1797 builder = gtk_builder_new();
1798 gnc_builder_add_from_file (builder,
"dialog-transfer.glade",
"Transfer Dialog");
1800 xferData->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Transfer Dialog"));
1801 g_object_set_data_full (G_OBJECT (xferData->dialog),
"builder", builder, g_object_unref);
1805 gtk_window_set_transient_for (GTK_WINDOW (xferData->dialog), GTK_WINDOW (parent));
1808 xferData->quickfill = XFER_DIALOG_FROM;
1810 xferData->transferinfo_label = GTK_WIDGET(gtk_builder_get_object (builder,
"transferinfo-label"));
1812 xferData->fetch_button = GTK_WIDGET(gtk_builder_get_object (builder,
"fetch"));
1813 gnc_xfer_dialog_set_fetch_sensitive (xferData->fetch_button);
1822 amount = gnc_amount_edit_new();
1823 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"amount_hbox"));
1824 gtk_box_pack_end(GTK_BOX(hbox), amount, TRUE, TRUE, 0);
1825 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (amount), TRUE);
1826 xferData->amount_edit = amount;
1828 entry = gnc_amount_edit_gtk_entry (GNC_AMOUNT_EDIT (amount));
1829 gtk_entry_set_activates_default (GTK_ENTRY(entry), TRUE);
1830 g_signal_connect (G_OBJECT (entry),
"focus-out-event",
1831 G_CALLBACK (gnc_xfer_amount_update_cb), xferData);
1833 date = gnc_date_edit_new(time (NULL), FALSE, FALSE);
1834 gnc_date_activates_default (GNC_DATE_EDIT(date), TRUE);
1835 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"date_hbox"));
1837 gtk_box_pack_end(GTK_BOX(hbox), date, TRUE, TRUE, 0);
1838 xferData->date_entry = date;
1839 g_signal_connect (G_OBJECT (date),
"date_changed",
1840 G_CALLBACK (gnc_xfer_date_changed_cb), xferData);
1846 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"num_entry"));
1847 xferData->num_entry = entry;
1849 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"description_entry"));
1850 xferData->description_entry = entry;
1852 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"memo_entry"));
1853 xferData->memo_entry = entry;
1864 gnc_xfer_dialog_fill_tree_view (xferData, XFER_DIALOG_TO);
1865 gnc_xfer_dialog_fill_tree_view (xferData, XFER_DIALOG_FROM);
1869 if (use_accounting_labels)
1871 label = GTK_WIDGET(gtk_builder_get_object (builder,
"right_trans_label"));
1872 xferData->from_transfer_label = label;
1874 label = GTK_WIDGET(gtk_builder_get_object (builder,
"left_trans_label"));
1875 xferData->to_transfer_label = label;
1877 text = g_strconcat (
"<b>", _(
"Credit Account"),
"</b>", NULL);
1878 gtk_label_set_markup (GTK_LABEL (xferData->from_transfer_label), text);
1881 text = g_strconcat (
"<b>", _(
"Debit Account"),
"</b>", NULL);
1882 gtk_label_set_markup (GTK_LABEL (xferData->to_transfer_label), text);
1885 label = GTK_WIDGET(gtk_builder_get_object (builder,
"right_currency_label"));
1886 xferData->from_currency_label = label;
1888 label = GTK_WIDGET(gtk_builder_get_object (builder,
"left_currency_label"));
1889 xferData->to_currency_label = label;
1893 label = GTK_WIDGET(gtk_builder_get_object (builder,
"left_trans_label"));
1894 xferData->from_transfer_label = label;
1896 label = GTK_WIDGET(gtk_builder_get_object (builder,
"right_trans_label"));
1897 xferData->to_transfer_label = label;
1899 text = g_strconcat (
"<b>", _(
"Transfer From"),
"</b>", NULL);
1900 gtk_label_set_markup (GTK_LABEL (xferData->from_transfer_label), text);
1903 text = g_strconcat (
"<b>", _(
"Transfer To"),
"</b>", NULL);
1904 gtk_label_set_markup (GTK_LABEL (xferData->to_transfer_label), text);
1906 label = GTK_WIDGET(gtk_builder_get_object (builder,
"left_currency_label"));
1907 xferData->from_currency_label = label;
1909 label = GTK_WIDGET(gtk_builder_get_object (builder,
"right_currency_label"));
1910 xferData->to_currency_label = label;
1913 label = GTK_WIDGET(gtk_builder_get_object (builder,
"conv_forward"));
1914 xferData->conv_forward = label;
1916 label = GTK_WIDGET(gtk_builder_get_object (builder,
"conv_reverse"));
1917 xferData->conv_reverse = label;
1928 table = GTK_WIDGET(gtk_builder_get_object (builder,
"curr_transfer_table"));
1929 xferData->curr_xfer_table = table;
1931 edit = gnc_amount_edit_new();
1932 gnc_amount_edit_set_print_info(GNC_AMOUNT_EDIT(edit),
1933 gnc_default_print_info (FALSE));
1934 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"price_hbox"));
1935 gtk_box_pack_start(GTK_BOX(hbox), edit, TRUE, TRUE, 0);
1936 xferData->price_edit = edit;
1937 entry = gnc_amount_edit_gtk_entry (GNC_AMOUNT_EDIT (edit));
1938 g_signal_connect (G_OBJECT (entry),
"focus-out-event",
1939 G_CALLBACK (gnc_xfer_price_update_cb), xferData);
1940 gtk_entry_set_activates_default(GTK_ENTRY (entry), TRUE);
1942 edit = gnc_amount_edit_new();
1943 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"right_amount_hbox"));
1944 gtk_box_pack_start(GTK_BOX(hbox), edit, TRUE, TRUE, 0);
1945 xferData->to_amount_edit = edit;
1946 entry = gnc_amount_edit_gtk_entry (GNC_AMOUNT_EDIT (edit));
1947 g_signal_connect (G_OBJECT (entry),
"focus-out-event",
1948 G_CALLBACK (gnc_xfer_to_amount_update_cb), xferData);
1949 gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
1951 button = GTK_WIDGET(gtk_builder_get_object (builder,
"price_radio"));
1952 xferData->price_radio = button;
1954 button = GTK_WIDGET(gtk_builder_get_object (builder,
"amount_radio"));
1955 xferData->amount_radio = button;
1957 if (use_accounting_labels)
1959 gtk_label_set_text(GTK_LABEL(GTK_BIN(xferData->amount_radio)->child),
1960 _(
"Debit Amount:"));
1964 gtk_label_set_text(GTK_LABEL(GTK_BIN(xferData->amount_radio)->child),
1969 gtk_builder_connect_signals(builder, xferData);
1970 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW (xferData->dialog));
1975 close_handler (gpointer user_data)
1981 dialog = GTK_WIDGET (xferData->dialog);
1983 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW (dialog));
1984 gtk_widget_hide (dialog);
1985 gnc_xfer_dialog_close_cb(GTK_DIALOG(dialog), xferData);
1986 gtk_widget_destroy (dialog);
2001 gnc_xfer_dialog (GtkWidget * parent,
Account * initial)
2005 GtkWidget *amount_entry;
2010 xferData->desc_start_selection = 0;
2011 xferData->desc_end_selection = 0;
2012 xferData->desc_selection_source_id = 0;
2013 xferData->quickfill = XFER_DIALOG_FROM;
2014 xferData->transaction_cb = NULL;
2018 book = gnc_account_get_book (initial);
2022 book = gnc_get_current_book ();
2025 xferData->book = book;
2028 gnc_xfer_dialog_create(parent, xferData);
2030 DEBUG(
"register component");
2031 gnc_register_gui_component (DIALOG_TRANSFER_CM_CLASS,
2032 NULL, close_handler, xferData);
2034 gae = GNC_AMOUNT_EDIT(xferData->amount_edit);
2035 amount_entry = gnc_amount_edit_gtk_entry (gae);
2037 gtk_widget_grab_focus(amount_entry);
2039 gnc_xfer_dialog_select_from_account(xferData, initial);
2040 gnc_xfer_dialog_select_to_account(xferData, initial);
2042 gnc_xfer_dialog_curr_acct_activate(xferData);
2044 gtk_widget_show_all(xferData->dialog);
2046 gnc_window_adjust_for_screen(GTK_WINDOW(xferData->dialog));
2052 gnc_xfer_dialog_close(
XferDialog *xferData )
2056 DEBUG(
"close component");
2057 gtk_dialog_response( GTK_DIALOG(xferData->dialog), GTK_RESPONSE_NONE );
2062 gnc_xfer_dialog_set_title(
XferDialog *xferData,
const gchar *title )
2064 if ( xferData && title )
2066 gtk_window_set_title (GTK_WINDOW (xferData->dialog), title);
2071 gnc_xfer_dialog_set_information_label(
XferDialog *xferData,
2074 if (xferData && text)
2076 gchar *markup_text = g_strdup_printf (
"<b>%s</b>", text);
2077 gtk_label_set_markup (GTK_LABEL (xferData->transferinfo_label), markup_text);
2078 g_free (markup_text);
2084 gnc_xfer_dialog_set_account_label(
XferDialog *xferData,
2086 XferDirection direction )
2088 if (xferData && text)
2090 gchar *markup_text = g_strdup_printf (
"<b>%s</b>", text);
2091 gtk_label_set_markup (GTK_LABEL ((direction == XFER_DIALOG_FROM ?
2092 xferData->from_transfer_label :
2093 xferData->to_transfer_label)),
2095 g_free (markup_text);
2100 gnc_xfer_dialog_set_from_account_label(
XferDialog *xferData,
2101 const gchar *label )
2103 gnc_xfer_dialog_set_account_label (xferData, label, XFER_DIALOG_FROM);
2107 gnc_xfer_dialog_set_to_account_label(
XferDialog *xferData,
2108 const gchar *label )
2110 gnc_xfer_dialog_set_account_label (xferData, label, XFER_DIALOG_TO);
2114 gnc_xfer_dialog_set_from_show_button_active(
XferDialog *xferData,
2115 gboolean set_value )
2117 if ( xferData && xferData->from_show_button )
2119 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(xferData->from_show_button),
2125 gnc_xfer_dialog_set_to_show_button_active(
XferDialog *xferData,
2126 gboolean set_value )
2128 if ( xferData && xferData->to_show_button )
2130 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(xferData->to_show_button),
2136 void gnc_xfer_dialog_add_user_specified_button(
XferDialog *xferData,
2139 gpointer user_data )
2141 if ( xferData && label && callback )
2143 GtkBuilder *builder = g_object_get_data (G_OBJECT (xferData->dialog),
"builder");
2144 GtkWidget *button = gtk_button_new_with_label( label );
2145 GtkWidget *box = GTK_WIDGET(gtk_builder_get_object (builder,
2146 "transfermain-vbox" ));
2147 gtk_box_pack_end( GTK_BOX(box), button, FALSE, FALSE, 0 );
2148 g_signal_connect (G_OBJECT (button),
"clicked", G_CALLBACK (callback), user_data);
2149 gtk_widget_show( button );
2153 void gnc_xfer_dialog_toggle_currency_table(
XferDialog *xferData,
2154 gboolean show_table )
2156 if (xferData && xferData->curr_xfer_table)
2159 gtk_widget_show(xferData->curr_xfer_table);
2161 gtk_widget_hide(xferData->curr_xfer_table);
2168 find_xfer (gpointer
find_data, gpointer user_data)
2170 return( find_data == user_data );
2177 gboolean gnc_xfer_dialog_run_until_done(
XferDialog *xferData )
2180 gint count, response;
2182 ENTER(
"xferData=%p", xferData);
2183 if ( xferData == NULL )
2189 dialog = GTK_DIALOG (xferData->dialog);
2196 count = g_signal_handlers_disconnect_by_func(dialog,
2197 gnc_xfer_dialog_response_cb,
2199 g_assert(count == 1);
2203 DEBUG(
"calling gtk_dialog_run");
2204 response = gtk_dialog_run (dialog);
2205 DEBUG(
"gtk_dialog_run returned %d", response);
2206 gnc_xfer_dialog_response_cb (dialog, response, xferData);
2208 if ((response != GTK_RESPONSE_OK) && (response != GTK_RESPONSE_APPLY))
2220 if ( !gnc_find_first_gui_component( DIALOG_TRANSFER_CM_CLASS,
2221 find_xfer, xferData ) )
2231 g_assert_not_reached();
2241 gnc_xfer_dialog_quickfill_to_account(
XferDialog *xferData,
2242 gboolean qf_to_account )
2244 XferDirection old = xferData->quickfill;
2246 xferData->quickfill = qf_to_account ? XFER_DIALOG_TO : XFER_DIALOG_FROM;
2249 if ( old != xferData->quickfill )
2250 gnc_xfer_dialog_reload_quickfill( xferData );
2254 gnc_transfer_dialog_get_selected_account (
XferDialog *dialog,
2255 XferDirection direction)
2257 GtkTreeView *tree_view;
2262 case XFER_DIALOG_FROM:
2263 tree_view = dialog->from_tree_view;
2265 case XFER_DIALOG_TO:
2266 tree_view = dialog->to_tree_view;
2269 g_assert_not_reached ();
2278 gnc_transfer_dialog_set_selected_account (
XferDialog *dialog,
2280 XferDirection direction)
2282 GtkTreeView *tree_view;
2283 GtkCheckButton *show_button;
2286 if (account == NULL)
2291 case XFER_DIALOG_FROM:
2292 tree_view = dialog->from_tree_view;
2293 show_button = GTK_CHECK_BUTTON (dialog->from_show_button);
2295 case XFER_DIALOG_TO:
2296 tree_view = dialog->to_tree_view;
2297 show_button = GTK_CHECK_BUTTON (dialog->to_show_button);
2300 g_assert_not_reached ();
2305 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_button),
2314 void gnc_xfer_dialog_set_txn_cb(
XferDialog *xferData,
2315 gnc_xfer_dialog_cb handler,
2319 xferData->transaction_cb = handler;
2320 xferData->transaction_user_data = user_data;
2325 gboolean gnc_xfer_dialog_run_exchange_dialog(
2330 gboolean swap_amounts = FALSE;
2334 g_return_val_if_fail(txn_cur, TRUE);
2346 *exch_rate = gnc_numeric_create(1, 1);
2349 swap_amounts = expanded;
2362 swap_amounts = FALSE;
2369 swap_amounts = TRUE;
2380 gnc_numeric rate = xaccTransGetAccountConvRate(txn, reg_acc);
2391 gnc_xfer_dialog_select_to_currency(xfer, txn_cur);
2392 gnc_xfer_dialog_select_from_currency(xfer, xfer_com);
2400 gnc_xfer_dialog_select_to_currency(xfer, xfer_com);
2401 gnc_xfer_dialog_select_from_currency(xfer, txn_cur);
2406 gnc_xfer_dialog_hide_to_account_tree(xfer);
2407 gnc_xfer_dialog_hide_from_account_tree(xfer);
2409 gnc_xfer_dialog_set_amount(xfer, amount);
2411 gnc_xfer_update_to_amount(xfer);
2419 gnc_xfer_dialog_set_exchange_rate(xfer, *exch_rate);
2422 if (gnc_xfer_dialog_run_until_done(xfer) == FALSE)
GNCPrice * gnc_price_create(QofBook *book)
void gnc_quickfill_insert(QuickFill *qf, const char *text, QuickFillSort sort)
#define xaccTransAppendSplit(t, s)
Transaction * xaccMallocTransaction(QofBook *book)
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
void xaccSplitSetBaseValue(Split *s, gnc_numeric value, const gnc_commodity *base_currency)
int gnc_commodity_get_fraction(const gnc_commodity *cm)
GNCPrice * gnc_pricedb_lookup_day(GNCPriceDB *db, const gnc_commodity *c, const gnc_commodity *currency, Timespec t)
gboolean xaccTransUseTradingAccounts(const Transaction *trans)
SplitList * xaccAccountGetSplitList(const Account *acc)
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
a simple price database for gnucash
#define PINFO(format, args...)
GNCAccountType xaccAccountGetType(const Account *acc)
int xaccAccountGetCommoditySCU(const Account *acc)
gnc_numeric gnc_numeric_neg(gnc_numeric a)
void gnc_price_unref(GNCPrice *p)
#define DEBUG(format, args...)
gboolean gnc_pricedb_add_price(GNCPriceDB *db, GNCPrice *p)
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
void xaccTransSetDescription(Transaction *trans, const char *desc)
Use a 64-bit unsigned int timespec.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Transaction * xaccSplitGetParent(const Split *split)
#define ENTER(format, args...)
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
gboolean gnc_numeric_negative_p(gnc_numeric a)
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
gnc_commodity * gnc_default_currency(void)
gboolean xaccAccountIsHidden(const Account *acc)
Split * xaccAccountFindSplitByDesc(const Account *acc, const char *description)
gdouble gnc_numeric_to_double(gnc_numeric n)
void gnc_tree_view_account_set_filter(GncTreeViewAccount *view, gnc_tree_view_account_filter_func func, gpointer data, GSourceFunc destroy)
gchar * gnc_account_get_full_name(const Account *account)
Account handling public routines.
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
void gnc_tree_view_account_refilter(GncTreeViewAccount *view)
GtkTreeView implementation for gnucash account tree.
gnc_numeric gnc_numeric_mul(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
void xaccSplitSetMemo(Split *split, const char *memo)
gnc_numeric gnc_numeric_error(GNCNumericErrorCode error_code)
GtkTreeView * gnc_tree_view_account_new(gboolean show_root)
const char * xaccTransGetDescription(const Transaction *trans)
QuickFill * gnc_quickfill_get_string_match(QuickFill *qf, const char *str)
gnc_numeric gnc_numeric_abs(gnc_numeric a)
GNCPrice * gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db, const gnc_commodity *c, const gnc_commodity *currency, Timespec t)
void xaccTransCommitEdit(Transaction *trans)
gnc_numeric gnc_numeric_div(gnc_numeric x, gnc_numeric y, gint64 denom, gint how)
void xaccTransBeginEdit(Transaction *trans)
All type declarations for the whole Gnucash engine.
Split * xaccMallocSplit(QofBook *book)
Generic api to store and retrieve preferences.
gnc_commodity * gnc_account_or_default_currency(const Account *account, gboolean *currency_from_account_found)
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
void gnc_tree_view_account_set_selected_account(GncTreeViewAccount *view, Account *account)
const char * gnc_quickfill_string(QuickFill *qf)
gnc_numeric xaccSplitGetValue(const Split *split)
void xaccAccountBeginEdit(Account *acc)
Account * xaccSplitGetAccount(const Split *s)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
#define xaccAccountInsertSplit(acc, s)
gboolean xaccAccountGetPlaceholder(const Account *acc)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Account * gnc_tree_view_account_get_selected_account(GncTreeViewAccount *view)
Split * xaccSplitGetOtherSplit(const Split *split)
#define LEAVE(format, args...)
QuickFill is used to auto-complete typed user entries.
const char * xaccSplitGetMemo(const Split *split)
GNCPrice * gnc_pricedb_lookup_latest(GNCPriceDB *db, const gnc_commodity *commodity, const gnc_commodity *currency)
API for Transactions and Splits (journal entries)
void xaccAccountCommitEdit(Account *acc)
Commodity handling public routines.
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
gboolean gnc_commodity_is_iso(const gnc_commodity *cm)
gboolean gnc_quote_source_fq_installed(void)
const gchar * QofLogModule
void xaccTransSetDatePostedTS(Transaction *trans, const Timespec *ts)