diff options
11 files changed, 112 insertions, 40 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/App.java b/dozentenmodul/src/main/java/org/openslx/dozmod/App.java index dd9aa3ce..6666d747 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/App.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/App.java @@ -12,8 +12,8 @@ import org.apache.log4j.FileAppender; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.spi.LoggingEvent; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.Gui; import org.openslx.dozmod.util.ProxyConfigurator; import org.openslx.thrifthelper.ThriftManager; @@ -121,9 +121,11 @@ public class App { // setup global thrift connection error handler before anything else // Set master server to use (TODO: make configurable via command line) ThriftManager.setMasterServerAddress("bwlp-masterserver.ruf.uni-freiburg.de"); + + MainWindow.open(); // start the main window - MainWindow.mainloop(); + Gui.mainloop(); } private static void showAwtMessage(String message, Throwable e) { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/Gui.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/Gui.java index 04b9ed2b..8e5231ae 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/Gui.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/Gui.java @@ -1,5 +1,8 @@ -package org.openslx.dozmod.gui.helper; +package org.openslx.dozmod.gui; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import java.util.concurrent.atomic.AtomicReference; import org.apache.log4j.Logger; @@ -10,6 +13,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Monitor; import org.eclipse.swt.widgets.Shell; +import org.openslx.dozmod.gui.helper.MessageType; public class Gui { @@ -21,6 +25,13 @@ public class Gui { public static final Display display = new Display(); /** + * All active shells - we don't use display.getShells() as it is slow... + */ + private static final List<Shell> shells = new ArrayList<>(); + + private static volatile int exitCode = 0; + + /** * Center the given shell on the {@link Monitor} it is displayed on. * * @param shell Some shell @@ -190,4 +201,69 @@ public class Gui { return ret == SWT.OK || ret == SWT.RETRY || ret == SWT.YES; } + /** + * Run the GUI mainloop as long as a window exists. This method does not + * return. + */ + public static void mainloop() { + do { + Iterator<Shell> it = shells.iterator(); + while (it.hasNext()) { + if (it.next().isDisposed()) + it.remove(); + } + if (!display.readAndDispatch()) + display.sleep(); + } while (!shells.isEmpty()); + display.dispose(); + System.exit(exitCode); + } + + /** + * Exit application - dispose all shells, so mainloop will terminate. + * + * @param code + */ + public static void exit(int code) { + exitCode = code; + asyncExec(new Runnable() { + @Override + public void run() { + for (Shell shell : shells) { + shell.dispose(); + } + } + }); + } + + /** + * Wrapper to get a new shell. This adds the shell to the list of shells, + * which we need to determine whether the app should still be running. + * + * @param style the style of the {@link Shell} + * @return a new {@link Shell} that has no other {@link Shell} as its + * parent. + */ + public static Shell newShell(int style) { + Shell shell = new Shell(display, style); + shells.add(shell); + return shell; + } + + /** + * Wrapper to get a new shell that is a child of another shell. This adds + * the shell to the list of shells, which we need to determine whether the + * app should still be running. + * + * @param parent the parent {@link Shell} + * @param style the style of the {@link Shell} + * @return a new {@link Shell} that has no other {@link Shell} as its + * parent. + */ + public static Shell newShell(Shell parent, int style) { + Shell shell = new Shell(parent, style); + shells.add(shell); + return shell; + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java index 07cfd292..c7135d66 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java @@ -6,8 +6,6 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -19,9 +17,8 @@ import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.openslx.dozmod.Config; +import org.openslx.dozmod.gui.Gui.GuiCallable; import org.openslx.dozmod.gui.helper.CompositePage; -import org.openslx.dozmod.gui.helper.Gui; -import org.openslx.dozmod.gui.helper.Gui.GuiCallable; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.window.DisclaimerWindow; import org.openslx.dozmod.gui.window.ImageListWindow; @@ -31,12 +28,14 @@ import org.openslx.dozmod.gui.window.VirtualizerNoticeWindow; import org.openslx.dozmod.thrift.Session; import org.openslx.thrifthelper.ThriftManager; import org.openslx.thrifthelper.ThriftManager.ErrorCallback; +import org.openslx.util.QuickTimer; public abstract class MainWindow { private final static Logger LOGGER = Logger.getLogger(MainWindow.class); private static final Shell mainShell; + private static CompositePage currentPage; private static final Map<Class<? extends CompositePage>, CompositePage> pages = new ConcurrentHashMap<>(); @@ -61,7 +60,8 @@ public abstract class MainWindow { if (currentPage == null) { showMessageBox("Tried to show unknown page " + clazz.getSimpleName(), MessageType.ERROR, LOGGER, null); - System.exit(1); + Gui.exit(1); + return; } // sets the starting preferred size. @@ -72,8 +72,12 @@ public abstract class MainWindow { } /** + * * @param clazz Class to open as a popup over the main window. * MUST be a subclass of Composite. + * @param modal modal mode - other windows will be blocked until this popup + * is closed + * @param noclose don't allow closing the popup via the (X) in the title bar */ public static void openPopup(Class<? extends Composite> clazz, boolean modal, boolean noclose) { int style = SWT.TITLE | SWT.BORDER | SWT.RESIZE; @@ -81,7 +85,7 @@ public abstract class MainWindow { style |= SWT.APPLICATION_MODAL; if (!noclose) style |= SWT.CLOSE; - Shell dialogShell = new Shell(mainShell, style); + Shell dialogShell = Gui.newShell(mainShell, style); // populate dialogShell dialogShell.setLayout(new GridLayout(1, false)); LOGGER.debug(clazz.getDeclaredClasses()); @@ -113,14 +117,14 @@ public abstract class MainWindow { } /** - * Initialises the GUI by creating the main window, adding the menu and + * Initializes the GUI by creating the main window, adding the menu and * creating the login mask as the first content window. * Further sets up the global thrift error callback to catch any * connection errors during the communication with the servers. */ static { // init SWT stuff - mainShell = new Shell(Gui.display, SWT.SHELL_TRIM | SWT.CENTER); + mainShell = Gui.newShell(SWT.SHELL_TRIM | SWT.CENTER); // Catch the close button (X) mainShell.addListener(SWT.Close, new Listener() { @@ -163,16 +167,10 @@ public abstract class MainWindow { Gui.display.addFilter(SWT.KeyDown, new Listener() { @Override public void handleEvent(Event event) { - if (event.character == 17) // Ctrl-Q = Quit + if (event.character == 17) { // Ctrl-Q = Quit askApplicationQuit(); - } - }); - - mainShell.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - askApplicationQuit(); + event.doit = false; + } } }); @@ -204,23 +202,15 @@ public abstract class MainWindow { } /** - * Run the GUI mainloop as long as the main window exists. - */ - public static void mainloop() { - while (!mainShell.isDisposed()) { - if (!Gui.display.readAndDispatch()) - Gui.display.sleep(); - } - } - - /** * Request application quit. Will show a message box asking the user for * confirmation. */ protected static void askApplicationQuit() { // TODO: Only ask if an upload or download is running,, wizard is open etc.. - if (showMessageBox("Are you sure you want to quit?", MessageType.QUESTION_YESNO, null, null)) - System.exit(0); + if (showMessageBox("Are you sure you want to quit?", MessageType.QUESTION_YESNO, null, null)) { + QuickTimer.cancel(); + Gui.exit(0); + } } /** @@ -300,4 +290,8 @@ public abstract class MainWindow { return Gui.showMessageBox(mainShell, message, messageType, logger, exception); } + public static void open() { + mainShell.open(); + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java index 0aaa81f3..23acd65a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java @@ -16,8 +16,8 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Shell; import org.openslx.bwlp.thrift.iface.ImagePermissions; import org.openslx.bwlp.thrift.iface.ImageSummaryRead; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.Gui; import org.openslx.dozmod.gui.helper.ImageListComparator; import org.openslx.dozmod.gui.helper.ImageListFilter; import org.openslx.dozmod.gui.helper.MessageType; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java index 568954c1..8066c599 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java @@ -21,8 +21,8 @@ import org.openslx.dozmod.authentication.EcpAuthenticator; import org.openslx.dozmod.authentication.ShibbolethEcp; import org.openslx.dozmod.authentication.ShibbolethEcp.ReturnCode; import org.openslx.dozmod.authentication.TestAccountAuthenticator; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.Gui; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.window.layout.LoginWindowLayout; import org.openslx.dozmod.thrift.OrganizationCache; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageListWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageListWindowLayout.java index bccbb509..aa50a425 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageListWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageListWindowLayout.java @@ -14,8 +14,8 @@ import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.CompositePage; -import org.openslx.dozmod.gui.helper.Gui; import org.openslx.dozmod.gui.helper.ImageListFilter; public abstract class ImageListWindowLayout extends CompositePage { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java index 7d637b37..544e84bb 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java @@ -12,7 +12,7 @@ import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; -import org.openslx.dozmod.gui.helper.Gui; +import org.openslx.dozmod.gui.Gui; public abstract class LoginWindowLayout extends Composite { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/VirtualizerNoticeWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/VirtualizerNoticeWindowLayout.java index 7d2a1aa6..ef6818d7 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/VirtualizerNoticeWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/VirtualizerNoticeWindowLayout.java @@ -9,7 +9,7 @@ import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; -import org.openslx.dozmod.gui.helper.Gui; +import org.openslx.dozmod.gui.Gui; public abstract class VirtualizerNoticeWindowLayout extends Composite { private final String title = "Hinweis VMWare Player"; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java index 8c0d5cc5..5012fdb9 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java @@ -12,7 +12,7 @@ import org.eclipse.swt.widgets.Composite; import org.openslx.bwlp.thrift.iface.ImagePermissions; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.ShareMode; -import org.openslx.dozmod.gui.helper.Gui; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.wizard.layout.ImageMetaDataPageLayout; import org.openslx.dozmod.state.UploadWizardState; import org.openslx.dozmod.thrift.MetaDataCache; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java index e0838031..ac92ec4a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java @@ -14,8 +14,8 @@ import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.openslx.dozmod.Config; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.Gui; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout; import org.openslx.dozmod.state.UploadWizardState; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ResourceLoader.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ResourceLoader.java index 1fd705c1..ca48e55b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ResourceLoader.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ResourceLoader.java @@ -9,7 +9,7 @@ import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; -import org.openslx.dozmod.gui.helper.Gui; +import org.openslx.dozmod.gui.Gui; /** * Helper class for loading resources. This should be error safe loaders with a |
