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:
Dave Peticolas 2001-09-25 10:06:33 +00:00
parent e222f9e9c3
commit 3dbb1df403
10 changed files with 426 additions and 368 deletions

View File

@ -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

View File

@ -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));
}

View File

@ -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

View File

@ -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 ();

View File

@ -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);

View File

@ -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));

View File

@ -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;

View File

@ -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);

View File

@ -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");
}

View File

@ -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)