diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index 9a110f37..f02f4f62 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -1,7 +1,7 @@ application { title = 'MuWire' - startupGroups = ['EventList', 'MainFrame'] + startupGroups = ['EventList', 'MainFrame', 'ShutdownWindow'] autoShutdown = false } @@ -16,6 +16,11 @@ mvcGroups { view = 'com.muwire.gui.MainFrameView' controller = 'com.muwire.gui.MainFrameController' } + 'ShutdownWindow' { + model = 'com.muwire.gui.ShutdownWindowModel' + view = 'com.muwire.gui.ShutdownWindowView' + controller = 'com.muwire.gui.ShutdownWindowController' + } 'SearchTab' { model = 'com.muwire.gui.SearchTabModel' view = 'com.muwire.gui.SearchTabView' diff --git a/gui/griffon-app/controllers/com/muwire/gui/ShutdownWindowController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ShutdownWindowController.groovy new file mode 100644 index 00000000..152ab846 --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/ShutdownWindowController.groovy @@ -0,0 +1,11 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonController +import griffon.core.controller.ControllerAction +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonController) +class ShutdownWindowController { +} \ No newline at end of file diff --git a/gui/griffon-app/lifecycle/Initialize.groovy b/gui/griffon-app/lifecycle/Initialize.groovy index 824cbcfe..4b14b5c5 100644 --- a/gui/griffon-app/lifecycle/Initialize.groovy +++ b/gui/griffon-app/lifecycle/Initialize.groovy @@ -49,7 +49,7 @@ class Initialize extends AbstractLifecycleHandler { } } - if (SystemTray.isSupported()) { + if (SystemTray.isSupported() && (SystemVersion.isMac() || SystemVersion.isWindows())) { try { def tray = SystemTray.getSystemTray() def url = Initialize.class.getResource("/MuWire-32x32.png") @@ -60,11 +60,17 @@ class Initialize extends AbstractLifecycleHandler { def exit = new MenuItem("Exit") exit.addActionListener({ + application.getWindowManager().findWindow("main-frame").setVisible(false) + application.getWindowManager().findWindow("shutdown-window").setVisible(true) Core core = application.getContext().get("core") - if (core != null) - core.shutdown() + if (core != null) { + Thread t = new Thread({ + core.shutdown() + application.shutdown() + }as Runnable) + t.start() + } tray.remove(trayIcon) - System.exit(0) }) def showMW = {e -> diff --git a/gui/griffon-app/lifecycle/Shutdown.groovy b/gui/griffon-app/lifecycle/Shutdown.groovy index 1c82aff5..ab3624b1 100644 --- a/gui/griffon-app/lifecycle/Shutdown.groovy +++ b/gui/griffon-app/lifecycle/Shutdown.groovy @@ -20,6 +20,7 @@ class Shutdown extends AbstractLifecycleHandler { void execute() { log.info("shutting down") Core core = application.context.get("core") - core.shutdown() + if (core != null) + core.shutdown() } } diff --git a/gui/griffon-app/models/com/muwire/gui/ShutdownWindowModel.groovy b/gui/griffon-app/models/com/muwire/gui/ShutdownWindowModel.groovy new file mode 100644 index 00000000..9d95dae1 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/ShutdownWindowModel.groovy @@ -0,0 +1,9 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class ShutdownWindowModel { +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/ShutdownWindowView.groovy b/gui/griffon-app/views/com/muwire/gui/ShutdownWindowView.groovy new file mode 100644 index 00000000..57cda57c --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/ShutdownWindowView.groovy @@ -0,0 +1,40 @@ +package com.muwire.gui + +import griffon.core.GriffonApplication +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.Box +import javax.swing.SwingConstants +import javax.annotation.Nonnull +import javax.inject.Inject + +@ArtifactProviderFor(GriffonView) +class ShutdownWindowView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + ShutdownWindowModel model + + void initUI() { + builder.with { + app = application(size: [320, 80], id: 'shutdown-window', + locationRelativeTo : null, + title: application.configuration['application.title'], + iconImage: imageIcon('/MuWire-48x48.png').image, + iconImages: [imageIcon('/MuWire-48x48.png').image, + imageIcon('/MuWire-32x32.png').image, + imageIcon('/MuWire-16x16.png').image], + visible: false ) { + panel { + vbox { + label("MuWire is shutting down, please wait...") + Box.createVerticalGlue() + progressBar(indeterminate : true) + } + } + } + } + } +} \ No newline at end of file