From 3dbb1df40322ad995b405ea2b16262e18f87bdc9 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Tue, 25 Sep 2001 10:06:33 +0000 Subject: [PATCH] Move more mdi code into gnome-utils. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@5425 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/app-utils/prefs.scm | 4 +- src/gnome-utils/gnc-mdi-utils.c | 362 +++++++++++++++++++++++++++++++- src/gnome-utils/gnc-mdi-utils.h | 20 ++ src/gnome/top-level.c | 25 +-- src/gnome/top-level.h | 2 - src/gnome/window-acct-tree.c | 18 +- src/gnome/window-main.c | 335 ++--------------------------- src/gnome/window-main.h | 5 - src/gnome/window-report.c | 17 +- src/scm/main-window.scm | 6 +- 10 files changed, 426 insertions(+), 368 deletions(-) diff --git a/src/app-utils/prefs.scm b/src/app-utils/prefs.scm index 014c63f1d5..d6f428a668 100644 --- a/src/app-utils/prefs.scm +++ b/src/app-utils/prefs.scm @@ -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 diff --git a/src/gnome-utils/gnc-mdi-utils.c b/src/gnome-utils/gnc-mdi-utils.c index fd1545e2cc..aa88b64489 100644 --- a/src/gnome-utils/gnc-mdi-utils.c +++ b/src/gnome-utils/gnc-mdi-utils.c @@ -25,9 +25,15 @@ #include +#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 = _(""); + 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)); +} diff --git a/src/gnome-utils/gnc-mdi-utils.h b/src/gnome-utils/gnc-mdi-utils.h index 10f6d30492..78418a087d 100644 --- a/src/gnome-utils/gnc-mdi-utils.h +++ b/src/gnome-utils/gnc-mdi-utils.h @@ -25,19 +25,25 @@ #define GNC_MDI_UTILS_H #include +#include + +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 diff --git a/src/gnome/top-level.c b/src/gnome/top-level.c index 48747f8d5e..c9f72c196c 100644 --- a/src/gnome/top-level.c +++ b/src/gnome/top-level.c @@ -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 (); diff --git a/src/gnome/top-level.h b/src/gnome/top-level.h index 0fd386cbf9..d1fbbcf11b 100644 --- a/src/gnome/top-level.h +++ b/src/gnome/top-level.h @@ -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); diff --git a/src/gnome/window-acct-tree.c b/src/gnome/window-acct-tree.c index 580da39487..666240b611 100644 --- a/src/gnome/window-acct-tree.c +++ b/src/gnome/window-acct-tree.c @@ -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)); diff --git a/src/gnome/window-main.c b/src/gnome/window-main.c index 0eb8789fbe..9c5d6e652f 100644 --- a/src/gnome/window-main.c +++ b/src/gnome/window-main.c @@ -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 = _(""); - 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; diff --git a/src/gnome/window-main.h b/src/gnome/window-main.h index 3bb0c3c2d3..51eff59456 100644 --- a/src/gnome/window-main.h +++ b/src/gnome/window-main.h @@ -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); diff --git a/src/gnome/window-report.c b/src/gnome/window-report.c index fb88105d33..049172fc97 100644 --- a/src/gnome/window-report.c +++ b/src/gnome/window-report.c @@ -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"); } diff --git a/src/scm/main-window.scm b/src/scm/main-window.scm index 91e0484c19..a41aa31550 100644 --- a/src/scm/main-window.scm +++ b/src/scm/main-window.scm @@ -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)