33#include <glib/gi18n.h>
39#include "gnc-ab-gettrans.h"
44#include "gnc-file-aqb-import.h"
54static QofLogModule log_module = G_LOG_DOMAIN;
56static void gnc_plugin_aqbanking_add_to_window(GncPlugin *plugin, GncMainWindow *window, GQuark type);
57static void gnc_plugin_aqbanking_remove_from_window(GncPlugin *plugin, GncMainWindow *window, GQuark type);
60static void gnc_plugin_ab_main_window_page_added(GncMainWindow *window,
GncPluginPage *page, gpointer user_data);
61static void gnc_plugin_ab_main_window_page_changed(GncMainWindow *window,
GncPluginPage *page, gpointer user_data);
62static void gnc_plugin_ab_account_selected(
GncPluginPage *plugin_page,
Account *account, gpointer user_data);
65static Account *main_window_to_account(GncMainWindow *window);
68static void gnc_plugin_ab_cmd_setup (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
69static void gnc_plugin_ab_cmd_get_balance (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
70static void gnc_plugin_ab_cmd_get_transactions (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
71static void gnc_plugin_ab_cmd_issue_sepatransaction (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
72static void gnc_plugin_ab_cmd_issue_sepainternaltransaction (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
73static void gnc_plugin_ab_cmd_issue_inttransaction (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
74static void gnc_plugin_ab_cmd_issue_sepa_direct_debit (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
75static void gnc_plugin_ab_cmd_view_logwindow (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
76static void gnc_plugin_ab_cmd_aqb_import (GSimpleAction *simple, GVariant *parameter, gpointer user_data);
78#define PLUGIN_ACTIONS_NAME "gnc-plugin-aqbanking-actions"
79#define PLUGIN_UI_FILENAME "gnc-plugin-aqbanking.ui"
81#define MENU_TOGGLE_ACTION_AB_VIEW_LOGWINDOW "ABViewLogwindowAction"
83static GActionEntry gnc_plugin_actions [] =
85 {
"OnlineActionsAction", NULL, NULL, NULL, NULL },
86 {
"ABSetupAction", gnc_plugin_ab_cmd_setup, NULL, NULL, NULL },
87 {
"ABGetBalanceAction", gnc_plugin_ab_cmd_get_balance, NULL, NULL, NULL },
88 {
"ABGetTransAction", gnc_plugin_ab_cmd_get_transactions, NULL, NULL, NULL },
89 {
"ABIssueSepaTransAction", gnc_plugin_ab_cmd_issue_sepatransaction, NULL, NULL, NULL },
90 {
"ABIssueSepaIntTransAction", gnc_plugin_ab_cmd_issue_sepainternaltransaction, NULL, NULL, NULL },
91 {
"ABIssueIntTransAction", gnc_plugin_ab_cmd_issue_inttransaction, NULL, NULL, NULL },
92 {
"ABIssueSepaDirectDebitAction", gnc_plugin_ab_cmd_issue_sepa_direct_debit, NULL, NULL, NULL },
93 {
"AQBankingImportAction", gnc_plugin_ab_cmd_aqb_import, NULL, NULL, NULL },
94 { MENU_TOGGLE_ACTION_AB_VIEW_LOGWINDOW, gnc_plugin_ab_cmd_view_logwindow, NULL,
"true", NULL },
97static guint gnc_plugin_n_actions = G_N_ELEMENTS(gnc_plugin_actions);
100static const gchar *gnc_plugin_load_ui_items [] =
104 "ActionsPlaceholder1",
108static const gchar *need_account_actions[] =
110 "ABGetBalanceAction",
112 "ABIssueSepaTransAction",
113#if (AQBANKING_VERSION_INT >= 60400)
114 "ABIssueSepaIntTransAction",
116 "ABIssueIntTransAction",
117 "ABIssueSepaDirectDebitAction",
121#if (AQBANKING_VERSION_INT < 60400)
122static const gchar *inactive_account_actions[] =
124 "ABIssueSepaIntTransAction",
129static const gchar *readonly_inactive_actions[] =
131 "OnlineActionsAction",
136static GncMainWindow *gnc_main_window = NULL;
144 GncPlugin gnc_plugin;
147G_DEFINE_TYPE(GncPluginAqBanking, gnc_plugin_aqbanking, GNC_TYPE_PLUGIN)
152 return GNC_PLUGIN(g_object_new(GNC_TYPE_PLUGIN_AQBANKING, (gchar*) NULL));
156gnc_plugin_aqbanking_class_init(GncPluginAqBankingClass *klass)
158 GncPluginClass *plugin_class = GNC_PLUGIN_CLASS(klass);
161 plugin_class->plugin_name = GNC_PLUGIN_AQBANKING_NAME;
164 plugin_class->actions_name = PLUGIN_ACTIONS_NAME;
165 plugin_class->actions = gnc_plugin_actions;
166 plugin_class->n_actions = gnc_plugin_n_actions;
167 plugin_class->ui_filename = PLUGIN_UI_FILENAME;
168 plugin_class->ui_updates = gnc_plugin_load_ui_items;
169 plugin_class->add_to_window = gnc_plugin_aqbanking_add_to_window;
170 plugin_class->remove_from_window = gnc_plugin_aqbanking_remove_from_window;
174gnc_plugin_aqbanking_init(GncPluginAqBanking *plugin)
183gnc_plugin_aqbanking_add_to_window(GncPlugin *plugin, GncMainWindow *window,
188 gnc_main_window = window;
190 g_signal_connect (window,
"page_added",
191 G_CALLBACK(gnc_plugin_ab_main_window_page_added),
193 g_signal_connect (window,
"page_changed",
194 G_CALLBACK(gnc_plugin_ab_main_window_page_changed),
198 MENU_TOGGLE_ACTION_AB_VIEW_LOGWINDOW);
202 GVariant *state = g_action_get_state (G_ACTION(action));
203 g_action_change_state (G_ACTION(action), g_variant_new_boolean (FALSE));
204 g_variant_unref (state);
209gnc_plugin_aqbanking_remove_from_window(GncPlugin *plugin, GncMainWindow *window,
212 g_signal_handlers_disconnect_by_func(
213 window, G_CALLBACK(gnc_plugin_ab_main_window_page_changed), plugin);
214 g_signal_handlers_disconnect_by_func(
215 window, G_CALLBACK(gnc_plugin_ab_main_window_page_added), plugin);
227gnc_plugin_ab_main_window_page_added(GncMainWindow *window,
GncPluginPage *page,
230 const gchar *page_name;
232 ENTER(
"main window %p, page %p", window, page);
233 if (!GNC_IS_PLUGIN_PAGE(page))
235 LEAVE(
"no plugin_page");
242 LEAVE(
"no page_name of plugin_page");
246 if (strcmp(page_name, GNC_PLUGIN_PAGE_ACCOUNT_TREE_NAME) == 0)
248 DEBUG(
"account tree page, adding signal");
249 g_signal_connect(page,
"account_selected",
250 G_CALLBACK(gnc_plugin_ab_account_selected), NULL);
253 gnc_plugin_ab_main_window_page_changed(window, page, user_data);
260static void update_inactive_actions(
GncPluginPage *plugin_page)
262 GncMainWindow *window;
263 GSimpleActionGroup *simple_action_group;
269 if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page))
272 window = GNC_MAIN_WINDOW(plugin_page->
window);
273 g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
275 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP(simple_action_group));
288gnc_plugin_ab_main_window_page_changed (GncMainWindow *window,
291 Account *account = main_window_to_account (window);
297 gnc_plugin_ab_account_selected (page, account, user_data);
300 update_inactive_actions (page);
312 GncMainWindow *window;
313 GSimpleActionGroup *simple_action_group;
314 const gchar *bankcode = NULL;
315 const gchar *accountid = NULL;
317 g_return_if_fail(GNC_IS_PLUGIN_PAGE(plugin_page));
318 window = GNC_MAIN_WINDOW(plugin_page->
window);
319 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
321 g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP(simple_action_group));
329 (account && bankcode && *bankcode
330 && accountid && *accountid));
334#if (AQBANKING_VERSION_INT < 60400)
336 inactive_account_actions, FALSE);
344 need_account_actions, FALSE);
367main_window_to_account(GncMainWindow *window)
370 const gchar *page_name;
372 const gchar *account_name;
374 ENTER(
"main window %p", window);
375 if (!GNC_IS_MAIN_WINDOW(window))
377 LEAVE(
"no main_window");
382 if (!GNC_IS_PLUGIN_PAGE(page))
384 LEAVE(
"no plugin_page");
390 LEAVE(
"no page_name of plugin_page");
394 if (strcmp(page_name, GNC_PLUGIN_PAGE_REGISTER_NAME) == 0)
396 DEBUG(
"register page");
398 GNC_PLUGIN_PAGE_REGISTER(page));
400 else if (strcmp(page_name, GNC_PLUGIN_PAGE_ACCOUNT_TREE_NAME) == 0)
402 DEBUG(
"account tree page");
404 GNC_PLUGIN_PAGE_ACCOUNT_TREE(page));
411 LEAVE(
"account %s(%p)", account_name ? account_name :
"(null)", account);
419 MENU_TOGGLE_ACTION_AB_VIEW_LOGWINDOW);
423 GVariant *state = g_action_get_state (G_ACTION(action));
424 g_action_change_state (G_ACTION(action), g_variant_new_boolean (logwindow_visible));
425 g_variant_unref (state);
434gnc_plugin_ab_cmd_setup (GSimpleAction *simple,
439 ENTER(
"action %p, main window data %p", simple, data);
440 gnc_main_window = data->window;
446gnc_plugin_ab_cmd_get_balance (GSimpleAction *simple,
453 ENTER(
"action %p, main window data %p", simple, data);
454 account = main_window_to_account(data->window);
457 PINFO(
"No AqBanking account selected");
462 gnc_main_window = data->window;
469gnc_plugin_ab_cmd_get_transactions (GSimpleAction *simple,
476 ENTER(
"action %p, main window data %p", simple, data);
477 account = main_window_to_account(data->window);
480 PINFO(
"No AqBanking account selected");
485 gnc_main_window = data->window;
492gnc_plugin_ab_cmd_issue_sepatransaction (GSimpleAction *simple,
499 ENTER(
"action %p, main window data %p", simple, data);
500 account = main_window_to_account(data->window);
503 PINFO(
"No AqBanking account selected");
508 gnc_main_window = data->window;
514#if (AQBANKING_VERSION_INT >= 60400)
516gnc_plugin_ab_cmd_issue_sepainternaltransaction (GSimpleAction *simple,
523 ENTER(
"action %p, main window data %p", simple, data);
524 account = main_window_to_account(data->window);
527 PINFO(
"No AqBanking account selected");
532 gnc_main_window = data->window;
533 gnc_ab_maketrans(GTK_WIDGET(data->window), account, SEPA_INTERNAL_TRANSFER);
539gnc_plugin_ab_cmd_issue_sepainternaltransaction (GSimpleAction *simple,
545 ENTER(
"action %p, main window data %p", simple, data);
546 PINFO(
"Sepa Internal Transfer not supported by your aqbanking version!");
547 LEAVE(
"Sepa Internal Transfer not supported!");
552gnc_plugin_ab_cmd_issue_inttransaction (GSimpleAction *simple,
559 ENTER(
"action %p, main window data %p", simple, data);
560 account = main_window_to_account(data->window);
563 PINFO(
"No AqBanking account selected");
568 gnc_main_window = data->window;
570 SINGLE_INTERNAL_TRANSFER);
576gnc_plugin_ab_cmd_issue_sepa_direct_debit (GSimpleAction *simple,
583 ENTER(
"action %p, main window data %p", simple, data);
584 account = main_window_to_account(data->window);
587 PINFO(
"No AqBanking account selected");
592 gnc_main_window = data->window;
599gnc_plugin_ab_cmd_view_logwindow (GSimpleAction *simple,
603 GVariant *state = g_action_get_state (G_ACTION(simple));
604 gboolean toggle = g_variant_get_boolean (state);
605 g_variant_unref (state);
607 gboolean new_toggle = !toggle;
608 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (new_toggle));
615 g_action_change_state (G_ACTION(simple), g_variant_new_boolean (FALSE));
625gnc_plugin_ab_cmd_aqb_import (GSimpleAction *simple,
630 gnc_main_window = data->window;
Account handling public routines.
AqBanking setup functionality.
Dialog for AqBanking transaction data.
AqBanking getbalance functions.
Dialog for AqBanking transaction data.
AqBanking utility functions.
GUI callbacks for AqBanking.
Functions for adding content to a window.
Plugin registration of the AqBanking module.
Plugin management functions for the GnuCash UI.
Functions providing a chart of account page.
Functions providing a register page for the GnuCash UI.
Generic api to store and retrieve preferences.
utility functions for the GnuCash UI
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
const gchar * gnc_ab_get_account_bankcode(const Account *a)
Return the bankcode string in the Account a.
gboolean gnc_GWEN_Gui_show_dialog()
Unhides Online Banking Connection Window (Make log visible)
void gnc_plugin_aqbanking_create_plugin(void)
Create a new GncPluginAqBanking object and register it.
void gnc_ab_initial_assistant(void)
Create and show an assistant for the aqbanking setup.
GncPlugin * gnc_plugin_aqbanking_new(void)
void gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc)
Execute a GetBalance job, show the resulting balance and offer to reconcile the GnuCash account.
void gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc, GncABTransType trans_type)
Create SEPA transfers.
void gnc_GWEN_Gui_hide_dialog()
Hides Online Banking Connection Window (Close log window)
const gchar * gnc_ab_get_account_accountid(const Account *a)
Return accountid string in the Account a.
void gnc_plugin_aqbanking_set_logwindow_visible(gboolean logwindow_visible)
Set MENU_TOGGLE_ACTION_AB_VIEW_LOGWINDOW.
void gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
Execute a GetTransactions job.
void gnc_file_aqbanking_import_dialog(GtkWindow *parent)
Import files via AQBanking's Import Dialog.
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
const gchar * gnc_plugin_page_get_plugin_name(GncPluginPage *plugin_page)
Retrieve the textual name of a plugin.
GAction * gnc_main_window_find_action_in_group(GncMainWindow *window, const gchar *group_name, const gchar *action_name)
Find the GAction in a specific action group for window.
GncPluginPage * gnc_main_window_get_current_page(GncMainWindow *window)
Retrieve a pointer to the page that is currently at the front of the specified window.
GSimpleActionGroup * gnc_main_window_get_action_group(GncMainWindow *window, const gchar *group_name)
Retrieve a specific set of user interface actions from a window.
void gnc_main_window_set_vis_of_items_by_action(GncMainWindow *window, const gchar **action_names, gboolean vis)
Show or hide menu and toolbar items based on a NULL terminated list of action names.
Account * gnc_plugin_page_account_tree_get_current_account(GncPluginPageAccountTree *page)
Given a pointer to an account tree plugin page, return the selected account (if any).
#define PINFO(format, args...)
Print an informational note.
#define DEBUG(format, args...)
Print a debugging message.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.
void gnc_plugin_manager_add_plugin(GncPluginManager *manager, GncPlugin *plugin)
Add a plugin to the list maintained by the plugin manager.
GncPluginManager * gnc_plugin_manager_get(void)
Retrieve a pointer to the plugin manager.
Account * gnc_plugin_page_register_get_account(GncPluginPageRegister *page)
Get the Account associated with this register page.
The instance data structure for a content plugin.
GtkWidget * window
The window that contains the display widget for this plugin.