mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Move more mdi code into gnome-utils.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@5425 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
e222f9e9c3
commit
3dbb1df403
@ -71,8 +71,8 @@
|
||||
|
||||
(define gnc:*save-options-hook*
|
||||
(gnc:hook-define
|
||||
'ui-shutdown-hook
|
||||
"Functions to run at ui shutdown. Hook args: ()"))
|
||||
'save-options-hook
|
||||
"Functions to run when saving options. Hook args: ()"))
|
||||
|
||||
;; save-all-options: this is the actual hook that gets called at
|
||||
;; shutdown. right now, we put all the options in the same file so
|
||||
|
@ -25,9 +25,15 @@
|
||||
|
||||
#include <gnome.h>
|
||||
|
||||
#include "dialog-utils.h"
|
||||
#include "gnc-mdi-utils.h"
|
||||
#include "gnc-ui-util.h"
|
||||
#include "gnc-ui.h"
|
||||
|
||||
|
||||
static GNCMDIInfo *gnc_mdi_current = NULL;
|
||||
|
||||
|
||||
gncUIWidget
|
||||
gnc_ui_get_toplevel (void)
|
||||
{
|
||||
@ -37,18 +43,18 @@ gnc_ui_get_toplevel (void)
|
||||
for (; containers; containers = containers->next)
|
||||
{
|
||||
GtkWidget *w = containers->data;
|
||||
GnomeMDI *mdi;
|
||||
GNCMDIInfo *gnc_mdi;
|
||||
|
||||
if (!GNOME_IS_APP (w))
|
||||
continue;
|
||||
|
||||
app = GNOME_APP (w);
|
||||
|
||||
mdi = gtk_object_get_data (GTK_OBJECT (w), "gnc_mdi");
|
||||
if (!mdi)
|
||||
gnc_mdi = gtk_object_get_data (GTK_OBJECT (w), "gnc_mdi");
|
||||
if (!gnc_mdi)
|
||||
continue;
|
||||
|
||||
app = gnome_mdi_get_active_window (mdi);
|
||||
app = gnome_mdi_get_active_window (gnc_mdi->mdi);
|
||||
|
||||
break;
|
||||
}
|
||||
@ -58,3 +64,351 @@ gnc_ui_get_toplevel (void)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_mdi_child_set_title (GNCMDIChildInfo *childwin)
|
||||
{
|
||||
GNCBook *book;
|
||||
const char *filename;
|
||||
char *title;
|
||||
|
||||
if (!childwin || !childwin->app)
|
||||
return;
|
||||
|
||||
filename = gnc_book_get_url (gnc_get_current_book ());
|
||||
|
||||
if (!filename)
|
||||
filename = _("<no file>");
|
||||
else if (strncmp ("file:", filename, 5) == 0)
|
||||
filename += 5;
|
||||
|
||||
if (!childwin->title)
|
||||
title = g_strdup_printf ("%s (%s)", childwin->gnc_mdi->title, filename);
|
||||
else
|
||||
title = g_strdup_printf ("%s - %s (%s)", childwin->title,
|
||||
childwin->gnc_mdi->title, filename);
|
||||
|
||||
gtk_window_set_title (GTK_WINDOW(childwin->app), title);
|
||||
|
||||
g_free (title);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_mdi_app_destroyed_cb (GnomeApp * app, gpointer user_data)
|
||||
{
|
||||
GNCMDIInfo * mainwin = user_data;
|
||||
GnomeMDI * mdi = mainwin->mdi;
|
||||
|
||||
if (mainwin->shutdown && (g_list_length (mdi->windows) == 0))
|
||||
mainwin->shutdown (0);
|
||||
else
|
||||
{
|
||||
GtkWidget *toolbar = gtk_object_get_user_data (GTK_OBJECT (app));
|
||||
GList * child;
|
||||
|
||||
if (toolbar)
|
||||
gtk_widget_unref (toolbar);
|
||||
|
||||
gtk_object_set_user_data (GTK_OBJECT (app), NULL);
|
||||
|
||||
for (child = mainwin->children; child; child = child->next)
|
||||
{
|
||||
GNCMDIChildInfo * mc = child->data;
|
||||
|
||||
if (mc && mc->toolbar && mc->app && (mc->app == app))
|
||||
{
|
||||
/* we need to pull the toolbar out to prevent its being destroyed */
|
||||
gtk_widget_ref (mc->toolbar);
|
||||
gtk_container_remove (GTK_CONTAINER(mc->toolbar->parent), mc->toolbar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_mdi_app_created_cb (GnomeMDI * mdi, GnomeApp * app, gpointer data)
|
||||
{
|
||||
GNCMDIInfo * mainwin = data;
|
||||
|
||||
/* enable save and restore of menubar positions */
|
||||
gnome_app_enable_layout_config (app, TRUE);
|
||||
|
||||
/* flag the app as gnc mdi created */
|
||||
gtk_object_set_data (GTK_OBJECT (app), "gnc_mdi", mainwin);
|
||||
|
||||
/* add a signal to preserve the toolbar on destroy */
|
||||
gtk_signal_connect (GTK_OBJECT (app), "destroy",
|
||||
GTK_SIGNAL_FUNC (gnc_mdi_app_destroyed_cb),
|
||||
mainwin);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_mdi_destroy_cb (GtkObject * w, gpointer data)
|
||||
{
|
||||
GNCMDIInfo * gnc_mdi = data;
|
||||
|
||||
gnc_mdi->mdi = NULL;
|
||||
|
||||
if (gnc_mdi->shutdown)
|
||||
gnc_mdi->shutdown (0);
|
||||
|
||||
if (gnc_mdi_current == gnc_mdi)
|
||||
gnc_mdi_current = NULL;
|
||||
|
||||
g_free (gnc_mdi);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_mdi_child_changed_cb (GnomeMDI * mdi, GnomeMDIChild * not_used,
|
||||
gpointer data)
|
||||
{
|
||||
GNCMDIInfo * mainwin = data;
|
||||
GNCMDIChildInfo * childwin = NULL;
|
||||
GnomeUIInfo * hintinfo;
|
||||
GtkWidget * oldbar;
|
||||
GnomeApp * new_app = NULL;
|
||||
GnomeDockItemBehavior behavior;
|
||||
|
||||
if (mdi && mdi->active_child)
|
||||
{
|
||||
childwin = gtk_object_get_user_data (GTK_OBJECT(mdi->active_child));
|
||||
new_app = gnome_mdi_get_app_from_view (childwin->contents);
|
||||
}
|
||||
|
||||
behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE;
|
||||
if (!gnome_preferences_get_toolbar_detachable ())
|
||||
behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
|
||||
|
||||
if (childwin && childwin->toolbar)
|
||||
{
|
||||
if (childwin->app && (childwin->app == new_app))
|
||||
{
|
||||
oldbar = gtk_object_get_user_data (GTK_OBJECT(new_app));
|
||||
if (oldbar && (oldbar != childwin->toolbar))
|
||||
{
|
||||
if (oldbar->parent)
|
||||
gtk_widget_hide (GTK_WIDGET(oldbar)->parent);
|
||||
gtk_widget_show (GTK_WIDGET(childwin->toolbar)->parent);
|
||||
}
|
||||
}
|
||||
else if (childwin->app)
|
||||
{
|
||||
oldbar = gtk_object_get_user_data (GTK_OBJECT(new_app));
|
||||
if (oldbar && oldbar->parent && (oldbar != childwin->toolbar))
|
||||
gtk_widget_hide (GTK_WIDGET(oldbar)->parent);
|
||||
|
||||
/* we need to move the toolbar to a new App (mdi mode probably
|
||||
* changed) */
|
||||
if (GTK_WIDGET(childwin->toolbar)->parent)
|
||||
{
|
||||
gtk_widget_ref (GTK_WIDGET(childwin->toolbar));
|
||||
gtk_container_remove (GTK_CONTAINER
|
||||
(GTK_WIDGET(childwin->toolbar)->parent),
|
||||
GTK_WIDGET(childwin->toolbar));
|
||||
}
|
||||
|
||||
childwin->app = new_app;
|
||||
gnome_app_add_toolbar (GNOME_APP(childwin->app),
|
||||
GTK_TOOLBAR(childwin->toolbar),
|
||||
"Toolbar", behavior,
|
||||
GNOME_DOCK_TOP, 1, 0, 0);
|
||||
|
||||
gtk_toolbar_set_style (GTK_TOOLBAR(childwin->toolbar),
|
||||
gnc_get_toolbar_style ());
|
||||
}
|
||||
else
|
||||
{
|
||||
oldbar = gtk_object_get_user_data (GTK_OBJECT(new_app));
|
||||
if (oldbar && oldbar->parent && (oldbar != childwin->toolbar))
|
||||
gtk_widget_hide (GTK_WIDGET(oldbar)->parent);
|
||||
|
||||
childwin->app = new_app;
|
||||
gnome_app_add_toolbar (GNOME_APP(childwin->app),
|
||||
GTK_TOOLBAR(childwin->toolbar),
|
||||
"Toolbar", behavior,
|
||||
GNOME_DOCK_TOP, 1, 0, 0);
|
||||
|
||||
gtk_toolbar_set_style (GTK_TOOLBAR(childwin->toolbar),
|
||||
gnc_get_toolbar_style ());
|
||||
}
|
||||
|
||||
oldbar = gtk_object_get_user_data (GTK_OBJECT(new_app));
|
||||
if (oldbar)
|
||||
gtk_widget_unref (oldbar);
|
||||
|
||||
if (childwin->toolbar)
|
||||
gtk_widget_ref (childwin->toolbar);
|
||||
|
||||
gtk_object_set_user_data (GTK_OBJECT(new_app), childwin->toolbar);
|
||||
}
|
||||
|
||||
/* set the window title */
|
||||
gnc_mdi_child_set_title (childwin);
|
||||
|
||||
/* install menu hints if relevant */
|
||||
if (mdi->active_child)
|
||||
{
|
||||
/* the arg to this callback is SUPPOSED to be the last active child,
|
||||
* but it gets to be NULL under some circumstances */
|
||||
hintinfo = gnome_mdi_get_menubar_info (new_app);
|
||||
if (hintinfo)
|
||||
gnome_app_install_menu_hints (new_app, hintinfo);
|
||||
|
||||
hintinfo = gnome_mdi_get_child_menu_info (new_app);
|
||||
if (hintinfo)
|
||||
gnome_app_install_menu_hints (new_app, hintinfo);
|
||||
}
|
||||
}
|
||||
|
||||
GNCMDIInfo *
|
||||
gnc_mdi_new (const char *app_name, const char *title,
|
||||
GNCShutdownFunc shutdown)
|
||||
{
|
||||
GNCMDIInfo * gnc_mdi;
|
||||
|
||||
if (gnc_mdi_current)
|
||||
return gnc_mdi_current;
|
||||
|
||||
g_return_val_if_fail (app_name != NULL, NULL);
|
||||
g_return_val_if_fail (title != NULL, NULL);
|
||||
|
||||
gnc_mdi = g_new0 (GNCMDIInfo, 1);
|
||||
|
||||
gnc_mdi->shutdown = shutdown;
|
||||
gnc_mdi->title = g_strdup (title);
|
||||
|
||||
gnc_mdi->mdi = GNOME_MDI (gnome_mdi_new (app_name, title));
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT(gnc_mdi->mdi), "destroy",
|
||||
GTK_SIGNAL_FUNC(gnc_mdi_destroy_cb),
|
||||
gnc_mdi);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT(gnc_mdi->mdi), "app_created",
|
||||
GTK_SIGNAL_FUNC(gnc_mdi_app_created_cb),
|
||||
gnc_mdi);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT(gnc_mdi->mdi), "child_changed",
|
||||
GTK_SIGNAL_FUNC(gnc_mdi_child_changed_cb),
|
||||
gnc_mdi);
|
||||
|
||||
gnc_mdi_current = gnc_mdi;
|
||||
|
||||
return gnc_mdi;
|
||||
}
|
||||
|
||||
static char *
|
||||
gnc_mdi_child_save_func (GnomeMDIChild * child, gpointer user_data)
|
||||
{
|
||||
return g_strdup (child->name);
|
||||
}
|
||||
|
||||
void
|
||||
gnc_mdi_add_child (GNCMDIInfo * wind, GNCMDIChildInfo * child)
|
||||
{
|
||||
g_return_if_fail (wind != NULL);
|
||||
g_return_if_fail (child != NULL);
|
||||
|
||||
wind->children = g_list_append (wind->children, child);
|
||||
child->gnc_mdi = wind;
|
||||
|
||||
if (GNOME_IS_MDI_GENERIC_CHILD (child->child))
|
||||
{
|
||||
GnomeMDIGenericChild *mdi_child;
|
||||
|
||||
mdi_child = GNOME_MDI_GENERIC_CHILD (child->child);
|
||||
|
||||
gnome_mdi_generic_child_set_config_func (mdi_child,
|
||||
gnc_mdi_child_save_func, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gnc_mdi_remove_child (GNCMDIInfo * gnc_mdi, GNCMDIChildInfo * child)
|
||||
{
|
||||
if (!gnc_mdi || !child) return;
|
||||
|
||||
gnc_mdi->children = g_list_remove (gnc_mdi->children, child);
|
||||
}
|
||||
|
||||
void
|
||||
gnc_mdi_child_refresh (GNCMDIChildInfo *child)
|
||||
{
|
||||
g_return_if_fail (child != NULL);
|
||||
|
||||
gnome_mdi_child_set_name (child->child, child->child->name);
|
||||
gnome_mdi_update_child (child->gnc_mdi->mdi, child->child);
|
||||
|
||||
/* pesky child_set_name tries to change the window title. Set it back. */
|
||||
if ((child->gnc_mdi->mdi->active_child == child->child) && child->app)
|
||||
gnc_mdi_child_set_title (child);
|
||||
}
|
||||
|
||||
GNCMDIInfo *
|
||||
gnc_mdi_get_current (void)
|
||||
{
|
||||
return gnc_mdi_current;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gnc_mdi_has_apps (void)
|
||||
{
|
||||
GList *toplevels;
|
||||
|
||||
for (toplevels = gtk_container_get_toplevels ();
|
||||
toplevels;
|
||||
toplevels = toplevels->next)
|
||||
{
|
||||
GNCMDIInfo *gnc_mdi;
|
||||
|
||||
if (!GNOME_IS_APP (toplevels->data))
|
||||
continue;
|
||||
|
||||
if (GTK_OBJECT_DESTROYED (toplevels->data))
|
||||
continue;
|
||||
|
||||
gnc_mdi = gtk_object_get_data (GTK_OBJECT (toplevels->data), "gnc_mdi");
|
||||
if (!gnc_mdi)
|
||||
continue;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
gnc_app_set_title (GnomeApp *app)
|
||||
{
|
||||
GNCMDIChildInfo *childwin;
|
||||
GNCMDIInfo *mainwin;
|
||||
GnomeMDIChild *child;
|
||||
GtkWidget *view;
|
||||
|
||||
g_return_if_fail (app != NULL);
|
||||
|
||||
mainwin = gtk_object_get_data (GTK_OBJECT (app), "gnc_mdi");
|
||||
if (!mainwin || !mainwin->mdi)
|
||||
return;
|
||||
|
||||
view = gnome_mdi_get_view_from_window (mainwin->mdi, app);
|
||||
if (!view) return;
|
||||
|
||||
child = gnome_mdi_get_child_from_view (view);
|
||||
if (!child) return;
|
||||
|
||||
childwin = gtk_object_get_user_data (GTK_OBJECT (child));
|
||||
if (!childwin) return;
|
||||
|
||||
gnc_mdi_child_set_title (childwin);
|
||||
}
|
||||
|
||||
void
|
||||
gnc_mdi_destroy (GNCMDIInfo * gnc_mdi)
|
||||
{
|
||||
if (!gnc_mdi) return;
|
||||
|
||||
gnc_mdi->shutdown = NULL;
|
||||
|
||||
if (gnc_mdi->mdi)
|
||||
gtk_object_destroy (GTK_OBJECT (gnc_mdi->mdi));
|
||||
}
|
||||
|
@ -25,19 +25,25 @@
|
||||
#define GNC_MDI_UTILS_H
|
||||
|
||||
#include <gnome.h>
|
||||
#include <guile/gh.h>
|
||||
|
||||
typedef void (*GNCShutdownFunc) (int exit_status);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GnomeMDI * mdi;
|
||||
char * title;
|
||||
int component_id;
|
||||
SCM toolbar_change_callback_id;
|
||||
SCM mdi_change_callback_id;
|
||||
GList * children;
|
||||
GNCShutdownFunc shutdown;
|
||||
} GNCMDIInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GnomeMDIChild * child;
|
||||
GNCMDIInfo * gnc_mdi;
|
||||
GtkWidget * contents;
|
||||
GnomeApp * app;
|
||||
|
||||
@ -51,4 +57,18 @@ typedef struct
|
||||
char * title;
|
||||
} GNCMDIChildInfo;
|
||||
|
||||
|
||||
GNCMDIInfo * gnc_mdi_new (const char *app_name, const char *title,
|
||||
GNCShutdownFunc shutdown);
|
||||
void gnc_mdi_destroy (GNCMDIInfo * gnc_mdi);
|
||||
|
||||
void gnc_mdi_add_child (GNCMDIInfo * wind, GNCMDIChildInfo * child);
|
||||
void gnc_mdi_remove_child (GNCMDIInfo * gnc_mdi, GNCMDIChildInfo * child);
|
||||
void gnc_mdi_child_refresh (GNCMDIChildInfo *child);
|
||||
|
||||
GNCMDIInfo * gnc_mdi_get_current (void);
|
||||
gboolean gnc_mdi_has_apps (void);
|
||||
|
||||
void gnc_app_set_title (GnomeApp *app);
|
||||
|
||||
#endif
|
||||
|
@ -101,8 +101,6 @@ static void gnc_configure_register_hint_font(void);
|
||||
/* This static indicates the debugging module that this .o belongs to. */
|
||||
static short module = MOD_GUI;
|
||||
|
||||
static GNCMDIInfo * app = NULL;
|
||||
|
||||
static int gnome_is_running = FALSE;
|
||||
static int gnome_is_initialized = FALSE;
|
||||
static int gnome_is_terminating = FALSE;
|
||||
@ -131,16 +129,10 @@ gnucash_ui_is_terminating(void)
|
||||
return gnome_is_terminating;
|
||||
}
|
||||
|
||||
GNCMDIInfo *
|
||||
gnc_ui_get_data (void)
|
||||
{
|
||||
return app;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnc_ui_can_cancel_save (void)
|
||||
{
|
||||
return gnc_main_window_can_cancel_save (app);
|
||||
return gnc_main_window_can_cancel_save (gnc_mdi_get_current ());
|
||||
}
|
||||
|
||||
|
||||
@ -553,7 +545,9 @@ gnucash_ui_init(void)
|
||||
gnc_options_dialog_set_global_help_cb (gnc_global_options_help_cb, NULL);
|
||||
|
||||
/* initialize gnome MDI and set up application window defaults */
|
||||
app = gnc_main_window_new();
|
||||
if (!gnc_mdi_get_current ())
|
||||
gnc_main_window_new ();
|
||||
|
||||
/* Run the ui startup hooks. */
|
||||
{
|
||||
SCM run_danglers = gh_eval_str("gnc:hook-run-danglers");
|
||||
@ -575,10 +569,9 @@ gnc_ui_shutdown (void)
|
||||
if (gnome_is_running && !gnome_is_terminating)
|
||||
{
|
||||
gnome_is_terminating = TRUE;
|
||||
/* gnc_main_window_save(app); */
|
||||
gnc_main_window_destroy(app);
|
||||
app = NULL;
|
||||
|
||||
gtk_main_quit();
|
||||
|
||||
#ifdef USE_GUPPI
|
||||
gnc_html_guppi_shutdown();
|
||||
#endif
|
||||
@ -602,11 +595,7 @@ gnc_ui_destroy (void)
|
||||
gnc_unregister_option_change_callback_id(register_font_callback_id);
|
||||
gnc_unregister_option_change_callback_id(register_hint_font_callback_id);
|
||||
|
||||
if (app != NULL)
|
||||
{
|
||||
gnc_main_window_destroy(app);
|
||||
app = NULL;
|
||||
}
|
||||
gnc_mdi_destroy (gnc_mdi_get_current ());
|
||||
|
||||
gnc_extensions_shutdown ();
|
||||
|
||||
|
@ -30,8 +30,6 @@
|
||||
gboolean gnucash_ui_is_running(void);
|
||||
gboolean gnucash_ui_is_terminating(void);
|
||||
int gnucash_ui_init(void);
|
||||
|
||||
GNCMDIInfo * gnc_ui_get_data(void);
|
||||
void gnc_ui_shutdown(void);
|
||||
void gnc_ui_destroy(void);
|
||||
int gnc_ui_start_event_loop(void);
|
||||
|
@ -130,7 +130,7 @@ gnc_acct_tree_view_destroy(GtkObject * obj, gpointer user_data) {
|
||||
GNCMDIChildInfo * mc = user_data;
|
||||
GNCAcctTreeWin * w = mc->user_data;
|
||||
|
||||
gnc_main_window_remove_child(gnc_ui_get_data(), mc);
|
||||
gnc_mdi_remove_child(gnc_mdi_get_current (), mc);
|
||||
gnc_acct_tree_window_destroy(w);
|
||||
g_free(mc->toolbar_info);
|
||||
g_free(mc->menu_info);
|
||||
@ -144,6 +144,12 @@ gnc_acct_tree_view_destroy(GtkObject * obj, gpointer user_data) {
|
||||
* create a new account view.
|
||||
********************************************************************/
|
||||
|
||||
static void
|
||||
gnc_acct_tree_view_refresh (gpointer data)
|
||||
{
|
||||
gnc_mdi_child_refresh (data);
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
gnc_acct_tree_view_new(GnomeMDIChild * child, gpointer user_data) {
|
||||
GNCMDIInfo * maininfo = user_data;
|
||||
@ -170,11 +176,11 @@ gnc_acct_tree_view_new(GnomeMDIChild * child, gpointer user_data) {
|
||||
gtk_signal_connect(GTK_OBJECT(child), "destroy",
|
||||
gnc_acct_tree_view_destroy, mc);
|
||||
|
||||
gnc_main_window_add_child(maininfo, mc);
|
||||
gnc_mdi_add_child (maininfo, mc);
|
||||
|
||||
win->name_change_callback_id =
|
||||
gnc_option_db_register_change_callback(win->odb,
|
||||
gnc_main_window_child_refresh,
|
||||
gnc_acct_tree_view_refresh,
|
||||
mc,
|
||||
N_("Account Tree"),
|
||||
N_("Name of account view"));
|
||||
@ -204,10 +210,10 @@ gnc_acct_tree_view_new(GnomeMDIChild * child, gpointer user_data) {
|
||||
|
||||
GnomeMDIChild *
|
||||
gnc_acct_tree_window_create_child(const gchar * url) {
|
||||
GNCMDIInfo * maininfo = gnc_ui_get_data();
|
||||
GNCMDIInfo * maininfo = gnc_mdi_get_current ();
|
||||
GnomeMDIGenericChild * accountchild =
|
||||
gnome_mdi_generic_child_new(url);
|
||||
|
||||
|
||||
gnome_mdi_generic_child_set_label_func(accountchild,
|
||||
gnc_acct_tree_view_labeler,
|
||||
maininfo);
|
||||
@ -225,7 +231,7 @@ gnc_acct_tree_window_create_child(const gchar * url) {
|
||||
|
||||
void
|
||||
gnc_main_window_open_accounts(gint toplevel) {
|
||||
GNCMDIInfo * maininfo = gnc_ui_get_data();
|
||||
GNCMDIInfo * maininfo = gnc_mdi_get_current ();
|
||||
GnomeMDIChild * accountchild = gnc_acct_tree_window_create_child(NULL);
|
||||
gnome_mdi_add_child(GNOME_MDI(maininfo->mdi),
|
||||
GNOME_MDI_CHILD(accountchild));
|
||||
|
@ -72,50 +72,6 @@
|
||||
|
||||
static void gnc_main_window_create_menus(GNCMDIInfo * maininfo);
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_destroy_cb()
|
||||
* Shut down the Gnucash ui windows
|
||||
********************************************************************/
|
||||
|
||||
static void
|
||||
gnc_main_window_destroy_cb(GtkObject * w, gpointer data) {
|
||||
gnc_shutdown (0);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_app_destroyed_cb()
|
||||
* called when a top-level GnomeApp is destroyed.
|
||||
********************************************************************/
|
||||
|
||||
static void
|
||||
gnc_main_window_app_destroyed_cb(GnomeApp * app, gpointer user_data) {
|
||||
GNCMDIInfo * mainwin = user_data;
|
||||
GNCMDIChildInfo * mc = NULL;
|
||||
GnomeMDI * mdi = mainwin->mdi;
|
||||
GtkWidget *toolbar;
|
||||
GList * child;
|
||||
|
||||
if(g_list_length(mdi->windows) == 0) {
|
||||
gnc_shutdown(0);
|
||||
}
|
||||
else {
|
||||
toolbar = gtk_object_get_user_data (GTK_OBJECT (app));
|
||||
if (toolbar)
|
||||
gtk_widget_unref (toolbar);
|
||||
gtk_object_set_user_data (GTK_OBJECT (app), NULL);
|
||||
|
||||
for(child = mainwin->children; child; child = child->next) {
|
||||
mc = child->data;
|
||||
if(mc && mc->toolbar && mc->app && (mc->app == app)) {
|
||||
/* we need to pull the toolbar out to prevent its being
|
||||
* destroyed */
|
||||
gtk_widget_ref(mc->toolbar);
|
||||
gtk_container_remove(GTK_CONTAINER(mc->toolbar->parent), mc->toolbar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_app_created_cb()
|
||||
@ -129,12 +85,6 @@ gnc_main_window_app_created_cb(GnomeMDI * mdi, GnomeApp * app,
|
||||
GtkWidget * summarybar;
|
||||
GtkWidget * statusbar;
|
||||
|
||||
/* enable save and restore of menubar positions */
|
||||
gnome_app_enable_layout_config( app, TRUE );
|
||||
|
||||
/* flag the app as gnc mdi created */
|
||||
gtk_object_set_data (GTK_OBJECT (app), "gnc_mdi", mdi);
|
||||
|
||||
/* add the summarybar */
|
||||
summarybar = gnc_main_window_summary_new();
|
||||
|
||||
@ -174,11 +124,6 @@ gnc_main_window_app_created_cb(GnomeMDI * mdi, GnomeApp * app,
|
||||
statusbar = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_USER);
|
||||
gnome_app_set_statusbar(app, statusbar);
|
||||
|
||||
/* add a signal to preserve the toolbar on destroy */
|
||||
gtk_signal_connect(GTK_OBJECT(app), "destroy",
|
||||
GTK_SIGNAL_FUNC (gnc_main_window_app_destroyed_cb),
|
||||
mainwin);
|
||||
|
||||
/* set up extensions menu and hints */
|
||||
gnc_extensions_menu_setup (app);
|
||||
|
||||
@ -186,60 +131,6 @@ gnc_main_window_app_created_cb(GnomeMDI * mdi, GnomeApp * app,
|
||||
gnc_history_update_menu (GTK_WIDGET (app));
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_main_window_child_set_title (GNCMDIChildInfo *childwin)
|
||||
{
|
||||
GNCBook *book;
|
||||
const char *filename;
|
||||
char *title;
|
||||
|
||||
if (!childwin || !childwin->app)
|
||||
return;
|
||||
|
||||
filename = gnc_book_get_url (gnc_get_current_book ());
|
||||
|
||||
if (!filename)
|
||||
filename = _("<no file>");
|
||||
else if (strncmp ("file:", filename, 5) == 0)
|
||||
filename += 5;
|
||||
|
||||
if (!childwin->title)
|
||||
title = g_strdup_printf("GnuCash (%s)", filename);
|
||||
else
|
||||
title = g_strdup_printf("%s - GnuCash (%s)", childwin->title, filename);
|
||||
|
||||
gtk_window_set_title(GTK_WINDOW(childwin->app), title);
|
||||
|
||||
g_free(title);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_app_set_title (GnomeApp *app)
|
||||
{
|
||||
GNCMDIChildInfo *childwin;
|
||||
GNCMDIInfo *mainwin;
|
||||
GnomeMDIChild *child;
|
||||
GtkWidget *view;
|
||||
|
||||
if (!app)
|
||||
return;
|
||||
|
||||
mainwin = gnc_ui_get_data ();
|
||||
if (!mainwin || !mainwin->mdi)
|
||||
return;
|
||||
|
||||
view = gnome_mdi_get_view_from_window (mainwin->mdi, app);
|
||||
if (!view) return;
|
||||
|
||||
child = gnome_mdi_get_child_from_view (view);
|
||||
if (!child) return;
|
||||
|
||||
childwin = gtk_object_get_user_data (GTK_OBJECT (child));
|
||||
if (!childwin) return;
|
||||
|
||||
gnc_main_window_child_set_title (childwin);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_refresh_main_window_info (void)
|
||||
{
|
||||
@ -259,119 +150,6 @@ gnc_refresh_main_window_info (void)
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_child_remove_cb()
|
||||
* called when a child is removed
|
||||
********************************************************************/
|
||||
|
||||
static gboolean
|
||||
gnc_main_window_child_remove_cb(GnomeMDI * mdi, GnomeMDIChild * child,
|
||||
gpointer data) {
|
||||
GNCMDIInfo * mainwin = data;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_child_changed_cb()
|
||||
* called when the active child changes. Not sure what this means
|
||||
* with top-level windows. focus, maybe?
|
||||
********************************************************************/
|
||||
|
||||
static void
|
||||
gnc_main_window_child_changed_cb(GnomeMDI * mdi, GnomeMDIChild * not_used,
|
||||
gpointer data) {
|
||||
GNCMDIInfo * mainwin = data;
|
||||
GNCMDIChildInfo * childwin = NULL;
|
||||
GnomeUIInfo * hintinfo;
|
||||
GtkWidget * oldbar;
|
||||
GnomeApp * new_app = NULL;
|
||||
GnomeDockItemBehavior behavior;
|
||||
|
||||
if(mdi && mdi->active_child) {
|
||||
childwin = gtk_object_get_user_data(GTK_OBJECT(mdi->active_child));
|
||||
new_app = gnome_mdi_get_app_from_view(childwin->contents);
|
||||
}
|
||||
|
||||
behavior = GNOME_DOCK_ITEM_BEH_EXCLUSIVE;
|
||||
if (!gnome_preferences_get_toolbar_detachable ())
|
||||
behavior |= GNOME_DOCK_ITEM_BEH_LOCKED;
|
||||
|
||||
if(childwin && childwin->toolbar) {
|
||||
if(childwin->app && (childwin->app == new_app)) {
|
||||
oldbar = gtk_object_get_user_data(GTK_OBJECT(new_app));
|
||||
if(oldbar && (oldbar != childwin->toolbar)) {
|
||||
if (oldbar->parent)
|
||||
gtk_widget_hide(GTK_WIDGET(oldbar)->parent);
|
||||
gtk_widget_show(GTK_WIDGET(childwin->toolbar)->parent);
|
||||
}
|
||||
}
|
||||
else if(childwin->app) {
|
||||
oldbar = gtk_object_get_user_data(GTK_OBJECT(new_app));
|
||||
if(oldbar && oldbar->parent && (oldbar != childwin->toolbar)) {
|
||||
gtk_widget_hide(GTK_WIDGET(oldbar)->parent);
|
||||
}
|
||||
|
||||
/* we need to move the toolbar to a new App (mdi mode probably
|
||||
* changed) */
|
||||
if(GTK_WIDGET(childwin->toolbar)->parent) {
|
||||
gtk_widget_ref(GTK_WIDGET(childwin->toolbar));
|
||||
gtk_container_remove(GTK_CONTAINER
|
||||
(GTK_WIDGET(childwin->toolbar)->parent),
|
||||
GTK_WIDGET(childwin->toolbar));
|
||||
}
|
||||
childwin->app = new_app;
|
||||
gnome_app_add_toolbar(GNOME_APP(childwin->app),
|
||||
GTK_TOOLBAR(childwin->toolbar),
|
||||
"Toolbar", behavior,
|
||||
GNOME_DOCK_TOP, 1, 0, 0);
|
||||
gtk_toolbar_set_style(GTK_TOOLBAR(childwin->toolbar),
|
||||
gnc_get_toolbar_style());
|
||||
}
|
||||
else {
|
||||
oldbar = gtk_object_get_user_data(GTK_OBJECT(new_app));
|
||||
if(oldbar && oldbar->parent && (oldbar != childwin->toolbar)) {
|
||||
gtk_widget_hide(GTK_WIDGET(oldbar)->parent);
|
||||
}
|
||||
|
||||
childwin->app = new_app;
|
||||
gnome_app_add_toolbar(GNOME_APP(childwin->app),
|
||||
GTK_TOOLBAR(childwin->toolbar),
|
||||
"Toolbar", behavior,
|
||||
GNOME_DOCK_TOP, 1, 0, 0);
|
||||
gtk_toolbar_set_style(GTK_TOOLBAR(childwin->toolbar),
|
||||
gnc_get_toolbar_style());
|
||||
}
|
||||
|
||||
oldbar = gtk_object_get_user_data(GTK_OBJECT(new_app));
|
||||
if (oldbar)
|
||||
gtk_widget_unref (oldbar);
|
||||
|
||||
if (childwin->toolbar)
|
||||
gtk_widget_ref (childwin->toolbar);
|
||||
|
||||
gtk_object_set_user_data(GTK_OBJECT(new_app), childwin->toolbar);
|
||||
}
|
||||
|
||||
/* set the window title */
|
||||
gnc_main_window_child_set_title (childwin);
|
||||
|
||||
/* install menu hints if relevant */
|
||||
if(mdi->active_child) {
|
||||
/* the arg to this callback is SUPPOSED to be the last active child,
|
||||
* but it gets to be NULL under some circumstances */
|
||||
hintinfo = gnome_mdi_get_menubar_info(new_app);
|
||||
if(hintinfo) {
|
||||
gnome_app_install_menu_hints(new_app, hintinfo);
|
||||
}
|
||||
|
||||
hintinfo = gnome_mdi_get_child_menu_info(new_app);
|
||||
if(hintinfo) {
|
||||
gnome_app_install_menu_hints(new_app, hintinfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_configure_toolbar_cb
|
||||
@ -445,45 +223,16 @@ gnc_main_window_create_child(const gchar * configstring) {
|
||||
return child;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_child_save_func()
|
||||
********************************************************************/
|
||||
|
||||
static char *
|
||||
gnc_main_window_child_save_func(GnomeMDIChild * child, gpointer user_data) {
|
||||
return g_strdup(child->name);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_can_*()
|
||||
********************************************************************/
|
||||
|
||||
static gboolean
|
||||
gnc_main_window_has_apps (GNCMDIInfo * wind)
|
||||
{
|
||||
GList *toplevels;
|
||||
|
||||
toplevels = gtk_container_get_toplevels ();
|
||||
while (toplevels)
|
||||
{
|
||||
if (GNOME_IS_APP (toplevels->data) &&
|
||||
!GTK_OBJECT_DESTROYED (toplevels->data))
|
||||
return TRUE;
|
||||
|
||||
toplevels = toplevels->next;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gnc_main_window_can_save (GNCMDIInfo * wind)
|
||||
{
|
||||
if (!wind) return FALSE;
|
||||
|
||||
return gnc_main_window_has_apps (wind);
|
||||
return gnc_mdi_has_apps ();
|
||||
}
|
||||
|
||||
gboolean
|
||||
@ -491,10 +240,9 @@ gnc_main_window_can_cancel_save (GNCMDIInfo *wind)
|
||||
{
|
||||
if (!wind) return FALSE;
|
||||
|
||||
return gnc_main_window_has_apps (wind);
|
||||
return gnc_mdi_has_apps ();
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_save()
|
||||
* save the status of the MDI session
|
||||
@ -505,6 +253,9 @@ gnc_main_window_save(GNCMDIInfo * wind, char * filename) {
|
||||
char * encoded;
|
||||
char * session_name;
|
||||
|
||||
if (!wind)
|
||||
return;
|
||||
|
||||
encoded = gnc_html_encode_string(filename);
|
||||
session_name = g_strdup_printf("/GnuCash/MDI : %s",
|
||||
encoded ? encoded : "");
|
||||
@ -569,16 +320,18 @@ gnc_main_window_close_children(GNCMDIInfo * wind) {
|
||||
|
||||
GNCMDIInfo *
|
||||
gnc_main_window_new(void) {
|
||||
GNCMDIInfo * retval = g_new0(GNCMDIInfo, 1);
|
||||
GNCMDIInfo * retval;
|
||||
|
||||
retval = gnc_mdi_new ("GnuCash", "GnuCash", gnc_shutdown);
|
||||
g_return_val_if_fail (retval != NULL, NULL);
|
||||
|
||||
retval->mdi = GNOME_MDI(gnome_mdi_new("GnuCash", "GnuCash"));
|
||||
retval->component_id =
|
||||
gnc_register_gui_component (WINDOW_MAIN_CM_CLASS, NULL, NULL,
|
||||
retval);
|
||||
|
||||
/* these menu and toolbar options are the ones that are always
|
||||
* available */
|
||||
gnc_main_window_create_menus(retval);
|
||||
gnc_main_window_create_menus (retval);
|
||||
|
||||
/* set up the position where the child menus/toolbars will be
|
||||
* inserted */
|
||||
@ -600,77 +353,13 @@ gnc_main_window_new(void) {
|
||||
gnome_mdi_set_mode(retval->mdi, gnc_get_mdi_mode ());
|
||||
|
||||
/* handle top-level signals */
|
||||
gtk_signal_connect(GTK_OBJECT(retval->mdi), "destroy",
|
||||
GTK_SIGNAL_FUNC(gnc_main_window_destroy_cb),
|
||||
retval);
|
||||
gtk_signal_connect(GTK_OBJECT(retval->mdi), "app_created",
|
||||
GTK_SIGNAL_FUNC(gnc_main_window_app_created_cb),
|
||||
retval);
|
||||
gtk_signal_connect(GTK_OBJECT(retval->mdi), "remove_child",
|
||||
GTK_SIGNAL_FUNC(gnc_main_window_child_remove_cb),
|
||||
retval);
|
||||
gtk_signal_connect(GTK_OBJECT(retval->mdi), "child_changed",
|
||||
GTK_SIGNAL_FUNC(gnc_main_window_child_changed_cb),
|
||||
retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_add_child()
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
gnc_main_window_add_child(GNCMDIInfo * wind, GNCMDIChildInfo * child) {
|
||||
wind->children = g_list_append(wind->children, child);
|
||||
|
||||
if(GNOME_IS_MDI_GENERIC_CHILD(child->child)) {
|
||||
gnome_mdi_generic_child_set_config_func
|
||||
(GNOME_MDI_GENERIC_CHILD(child->child),
|
||||
gnc_main_window_child_save_func, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_remove_child()
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
gnc_main_window_remove_child(GNCMDIInfo * wind, GNCMDIChildInfo * child) {
|
||||
wind->children = g_list_remove(wind->children, child);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_destroy()
|
||||
* free MDI toplevel resources
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
gnc_main_window_destroy(GNCMDIInfo * wind) {
|
||||
g_free(wind);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* gnc_main_window_child_refresh(GNCMDIChildInfo * child)
|
||||
* send an update event to the child
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
gnc_main_window_child_refresh(gpointer data) {
|
||||
GNCMDIChildInfo *child = data;
|
||||
|
||||
gnome_mdi_child_set_name(child->child, child->child->name);
|
||||
gnome_mdi_update_child(gnc_ui_get_data()->mdi, child->child);
|
||||
|
||||
/* pesky child_set_name tries to change the window title... set
|
||||
* it back. */
|
||||
if((gnc_ui_get_data()->mdi->active_child == child->child) && child->app) {
|
||||
gnc_main_window_child_set_title (child);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* menu/toolbar data structures and callbacks
|
||||
* these are the "templates" that are installed in every toplevel
|
||||
@ -845,7 +534,7 @@ gnc_main_window_file_close_cb(GtkWidget * widget, GnomeMDI * mdi) {
|
||||
{
|
||||
GNCMDIInfo *main_info;
|
||||
|
||||
main_info = gnc_ui_get_data ();
|
||||
main_info = gnc_mdi_get_current ();
|
||||
if (!main_info) return;
|
||||
|
||||
mdi = main_info->mdi;
|
||||
|
@ -38,11 +38,6 @@ void gnc_main_window_restore(GNCMDIInfo * wind,
|
||||
const char * session);
|
||||
void gnc_main_window_create_child_toolbar(GNCMDIInfo * mi,
|
||||
GNCMDIChildInfo * child);
|
||||
void gnc_main_window_add_child(GNCMDIInfo * main,
|
||||
GNCMDIChildInfo * child);
|
||||
void gnc_main_window_remove_child(GNCMDIInfo * main,
|
||||
GNCMDIChildInfo * child);
|
||||
void gnc_main_window_child_refresh(gpointer data);
|
||||
GnomeMDIChild * gnc_main_window_create_child(const gchar * configstring);
|
||||
void gnc_main_window_close_children(GNCMDIInfo * main);
|
||||
|
||||
|
@ -129,7 +129,8 @@ static void
|
||||
gnc_report_window_view_destroy(GtkObject * obj, gpointer user_data) {
|
||||
GNCMDIChildInfo * mc = user_data;
|
||||
gnc_report_window * w = mc->user_data;
|
||||
gnc_main_window_remove_child(gnc_ui_get_data(), mc);
|
||||
|
||||
gnc_mdi_remove_child(gnc_mdi_get_current(), mc);
|
||||
g_free(mc->toolbar_info);
|
||||
g_free(mc->menu_info);
|
||||
g_free(mc->title);
|
||||
@ -157,7 +158,7 @@ gnc_report_window_view_new(GnomeMDIChild * child, gpointer user_data) {
|
||||
mc->child = child;
|
||||
mc->title = g_strdup("Report");
|
||||
|
||||
gnc_main_window_add_child(maininfo, mc);
|
||||
gnc_mdi_add_child (maininfo, mc);
|
||||
|
||||
type = gnc_html_parse_url(gnc_report_window_get_html(win),
|
||||
child->name, &url_location, &url_label);
|
||||
@ -197,7 +198,7 @@ GnomeMDIChild *
|
||||
gnc_report_window_create_child(const gchar * configstring) {
|
||||
GnomeMDIGenericChild * reportchild =
|
||||
gnome_mdi_generic_child_new(configstring);
|
||||
GNCMDIInfo * maininfo = gnc_ui_get_data();
|
||||
GNCMDIInfo * maininfo = gnc_mdi_get_current();
|
||||
|
||||
gnome_mdi_generic_child_set_label_func(reportchild,
|
||||
gnc_report_window_view_labeler,
|
||||
@ -224,7 +225,7 @@ gnc_main_window_open_report(int report_id, gint toplevel) {
|
||||
void
|
||||
gnc_main_window_open_report_url(const char * url, gint toplevel) {
|
||||
GnomeMDIChild * reportchild = gnc_report_window_create_child(url);
|
||||
GNCMDIInfo * maininfo = gnc_ui_get_data();
|
||||
GNCMDIInfo * maininfo = gnc_mdi_get_current();
|
||||
|
||||
gnome_mdi_add_child(GNOME_MDI(maininfo->mdi),
|
||||
GNOME_MDI_CHILD(reportchild));
|
||||
@ -440,6 +441,12 @@ gnc_report_window_option_change_cb(gpointer data) {
|
||||
* called after a report is loaded into the gnc_html widget
|
||||
********************************************************************/
|
||||
|
||||
static void
|
||||
gnc_report_window_refresh (gpointer data)
|
||||
{
|
||||
gnc_mdi_child_refresh (data);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_report_window_load_cb(gnc_html * html, URLType type,
|
||||
const gchar * location, const gchar * label,
|
||||
@ -491,7 +498,7 @@ gnc_report_window_load_cb(gnc_html * html, URLType type,
|
||||
win->initial_odb = gnc_option_db_new(gh_call1(get_options, inst_report));
|
||||
win->name_change_cb_id =
|
||||
gnc_option_db_register_change_callback(win->initial_odb,
|
||||
gnc_main_window_child_refresh,
|
||||
gnc_report_window_refresh,
|
||||
win->mc,
|
||||
"General", "Report name");
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ the account instead of opening a register.") #f))
|
||||
(if (not save-file?) (gnc:warn (_ "Can't save window state")))
|
||||
|
||||
(if (and save-file? conf-file-name
|
||||
(gnc:main-window-can-save? (gnc:get-ui-data)))
|
||||
(gnc:main-window-can-save? (gnc:mdi-get-current)))
|
||||
(let ((book-path (build-path (getenv "HOME") ".gnucash" "books"
|
||||
conf-file-name)))
|
||||
(with-output-to-port (open-output-file book-path)
|
||||
@ -149,7 +149,7 @@ the account instead of opening a register.") #f))
|
||||
#t gnc:*acct-tree-options*)
|
||||
|
||||
(force-output)))
|
||||
(gnc:main-window-save (gnc:get-ui-data) book-url)))))
|
||||
(gnc:main-window-save (gnc:mdi-get-current) book-url)))))
|
||||
|
||||
(define (gnc:main-window-book-close-handler book-url)
|
||||
(gnc:main-window-save-state book-url)
|
||||
@ -182,7 +182,7 @@ the account instead of opening a register.") #f))
|
||||
(dead-reports '()))
|
||||
(if conf-file-name
|
||||
(try-load conf-file-name))
|
||||
(gnc:main-window-restore (gnc:get-ui-data) book-url)))
|
||||
(gnc:main-window-restore (gnc:mdi-get-current) book-url)))
|
||||
|
||||
(gnc:hook-add-dangler gnc:*book-opened-hook*
|
||||
gnc:main-window-book-open-handler)
|
||||
|
Loading…
Reference in New Issue
Block a user