/** * Whenever the current page is changed, if an invoice page is * the current page, set focus on the sheet or notes field. */ static void gnc_plugin_page_invoice_main_window_page_changed (GncMainWindow *window, GncPluginPage *plugin_page, gpointer user_data) { // We continue only if the plugin_page is a valid if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page)) return; if (gnc_main_window_get_current_page (window) == plugin_page) { GncPluginPageInvoice *page; GncPluginPageInvoicePrivate *priv; if (!GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page)) return; page = GNC_PLUGIN_PAGE_INVOICE(plugin_page); priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page); // The page changed signal is emitted multiple times so we need // to use an idle_add to change the focus to the sheet g_idle_remove_by_data (priv->iw); g_idle_add ((GSourceFunc)gnc_plugin_page_invoice_focus, priv->iw); } }
static void update_inactive_actions(GncPluginPage *plugin_page) { GncMainWindow *window; GtkActionGroup *action_group; // We are readonly - so we have to switch particular actions to inactive. gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book()); // We continue only if the current page is a plugin page if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page)) return; // Check that this is a main window and not embedded sx if (!GNC_IS_MAIN_WINDOW(plugin_page->window)) return; window = GNC_MAIN_WINDOW(plugin_page->window); g_return_if_fail(GNC_IS_MAIN_WINDOW(window)); action_group = gnc_main_window_get_action_group(window, PLUGIN_ACTIONS_NAME); g_return_if_fail(GTK_IS_ACTION_GROUP(action_group)); /* Set the action's sensitivity */ gnc_plugin_update_actions (action_group, readonly_inactive_actions, "sensitive", is_readwrite); }
/* Remove a data plugin page from a window. */ void gnc_embedded_window_close_page (GncEmbeddedWindow *window, GncPluginPage *page) { GncEmbeddedWindowPrivate *priv; g_return_if_fail (GNC_IS_EMBEDDED_WINDOW (window)); g_return_if_fail (GNC_IS_PLUGIN_PAGE (page)); priv = GNC_EMBEDDED_WINDOW_GET_PRIVATE(window); g_return_if_fail (priv->page == page); ENTER("window %p, page %p", window, page); if (!page->notebook_page) { LEAVE("no displayed widget"); return; } gtk_container_remove (GTK_CONTAINER(window), GTK_WIDGET(page->notebook_page)); priv->page = NULL; gnc_plugin_page_removed (page); gnc_plugin_page_unmerge_actions (page, window->ui_merge); gtk_ui_manager_ensure_update (window->ui_merge); gnc_plugin_page_destroy_widget (page); g_object_unref(page); LEAVE(" "); }
static void gnc_plugin_page_owner_tree_selected (GObject *object, gpointer user_data) { GncPluginPage *page = GNC_PLUGIN_PAGE (object); g_return_if_fail (GNC_IS_PLUGIN_PAGE (page)); update_inactive_actions(page); }
static void gnc_plugin_business_cmd_assign_payment (GtkAction *action, GncMainWindowActionData *mw) { GncPluginBusiness *plugin_business; GncPluginBusinessPrivate *plugin_business_priv; GncPluginPage *plugin_page; GNCSplitReg *gsr; SplitRegister *reg; Split *split; Transaction *trans; gboolean have_owner; GncOwner owner; GncOwner *owner_p; g_return_if_fail (mw != NULL); g_return_if_fail (GNC_IS_PLUGIN_BUSINESS (mw->data)); plugin_page = gnc_main_window_get_current_page(mw->window); // We continue only if the current page is a plugin page and more // specifically a register plugin page if (!GNC_IS_PLUGIN_PAGE(plugin_page) || !GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page)) return; gsr = gnc_plugin_page_register_get_gsr(plugin_page); g_return_if_fail(gsr); reg = gnc_ledger_display_get_split_register( gsr->ledger ); g_return_if_fail(reg); split = gnc_split_register_get_current_split(reg); g_return_if_fail(split); trans = xaccSplitGetParent(split); g_return_if_fail(trans); plugin_business = GNC_PLUGIN_BUSINESS (mw->data); plugin_business_priv = GNC_PLUGIN_BUSINESS_GET_PRIVATE (plugin_business); have_owner = gncOwnerGetOwnerFromTxn (trans, &owner); if (have_owner) owner_p = &owner; else if (gnc_ui_payment_is_customer_payment(trans)) owner_p = plugin_business_priv->last_customer; else owner_p = plugin_business_priv->last_vendor; gnc_business_assign_payment (GTK_WINDOW (mw->window), trans, owner_p); }
/** This button press handler calls the common button press handler * for all pages. The GtkTreeView eats all button presses and * doesn't pass them up the widget tree, even when doesn't do * anything with them. The only way to get access to the button * presses in an owner tree page is here on the tree view widget. * Button presses on all other pages are caught by the signal * registered in gnc-main-window.c. */ static gboolean gnc_plugin_page_owner_tree_button_press_cb (GtkWidget *widget, GdkEventButton *event, GncPluginPage *page) { g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE); ENTER("widget %p, event %p, page %p", widget, event, page); gnc_main_window_button_press_cb(widget, event, page); LEAVE(" "); /* Always return FALSE. This will let the tree view callback run as * well which will select the item under the cursor. By the time * the user sees the menu both callbacks will have run and the menu * actions will operate on the just-selected owner. */ return FALSE; }
static void update_inactive_actions(GncPluginPage *plugin_page) { GtkActionGroup *action_group; gboolean is_sensitive = !qof_book_is_readonly(gnc_get_current_book()); // We are readonly - so we have to switch particular actions to inactive. g_return_if_fail(plugin_page); g_return_if_fail(GNC_IS_PLUGIN_PAGE(plugin_page)); /* Get the action group */ action_group = gnc_plugin_page_get_action_group(plugin_page); g_return_if_fail(GTK_IS_ACTION_GROUP (action_group)); /* Set the action's sensitivity */ gnc_plugin_update_actions (action_group, readonly_inactive_actions, "sensitive", is_sensitive); }
static void gnc_plugin_account_tree_main_window_page_changed (GncMainWindow *window, GncPluginPage *plugin_page, gpointer user_data) { // We continue only if the plugin_page is a valid if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page)) return; if (gnc_main_window_get_current_page (window) == plugin_page) { if (!GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page)) return; // The page changed signal is emitted multiple times so we need // to use an idle_add to change the focus to the tree view g_idle_add ((GSourceFunc)gnc_plugin_page_account_tree_focus, GNC_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page)); } }
/* Display a data plugin page in a window. */ void gnc_embedded_window_open_page (GncEmbeddedWindow *window, GncPluginPage *page) { GncEmbeddedWindowPrivate *priv; g_return_if_fail (GNC_IS_EMBEDDED_WINDOW (window)); g_return_if_fail (GNC_IS_PLUGIN_PAGE (page)); priv = GNC_EMBEDDED_WINDOW_GET_PRIVATE(window); g_return_if_fail (priv->page == NULL); ENTER("window %p, page %p", window, page); priv->page = page; page->window = GTK_WIDGET(window); page->notebook_page = gnc_plugin_page_create_widget (page); gtk_box_pack_end(GTK_BOX(window), page->notebook_page, TRUE, TRUE, 2); gnc_plugin_page_inserted (page); gnc_plugin_page_merge_actions (page, window->ui_merge); LEAVE(" "); }
static void gnc_plugin_business_update_menus (GncPluginPage *plugin_page) { GncMainWindow *window; GtkActionGroup *action_group; gboolean is_txn_register, is_bus_txn = FALSE, is_bus_doc = FALSE; // We continue only if the current page is a plugin page if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page)) return; // Check that this is a main window and not embedded sx if (!GNC_IS_MAIN_WINDOW(plugin_page->window)) return; is_txn_register = GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page); window = GNC_MAIN_WINDOW(plugin_page->window); g_return_if_fail(GNC_IS_MAIN_WINDOW(window)); action_group = gnc_main_window_get_action_group(window, PLUGIN_ACTIONS_NAME); g_return_if_fail(GTK_IS_ACTION_GROUP(action_group)); if (is_txn_register) { Transaction *trans = gnc_plugin_page_register_get_current_txn (GNC_PLUGIN_PAGE_REGISTER(plugin_page)); if (xaccTransCountSplits(trans) > 0) is_bus_txn = (xaccTransGetFirstAPARAcctSplit(trans, TRUE) != NULL); is_bus_doc = (xaccTransGetTxnType (trans) == TXN_TYPE_INVOICE); } // Change visibility and also sensitivity according to whether we are in a txn register gnc_plugin_update_actions (action_group, register_txn_actions, "sensitive", is_txn_register && !is_bus_txn && !is_bus_doc); gnc_plugin_update_actions (action_group, register_txn_actions, "visible", is_txn_register && !is_bus_txn && !is_bus_doc); gnc_plugin_update_actions (action_group, register_bus_txn_actions, "sensitive", is_txn_register && is_bus_txn && !is_bus_doc); gnc_plugin_update_actions (action_group, register_bus_txn_actions, "visible", is_txn_register && is_bus_txn && !is_bus_doc); }