summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-07-15 11:56:41 +0200
committerSimon Rettberg2015-07-15 11:56:41 +0200
commitf1240b0ddef62b03da3ca9d87812e3be2ff36e15 (patch)
tree3d65208981043fd7e4ca2c61d462d6c602175d95
parent[client] Use vmx parser to check validity of VM (work in progress) (diff)
downloadtutor-module-f1240b0ddef62b03da3ca9d87812e3be2ff36e15.tar.gz
tutor-module-f1240b0ddef62b03da3ca9d87812e3be2ff36e15.tar.xz
tutor-module-f1240b0ddef62b03da3ca9d87812e3be2ff36e15.zip
[client] Clean up SWT resources when exiting
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/App.java6
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/Gui.java (renamed from dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/Gui.java)78
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java52
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageListWindowLayout.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/VirtualizerNoticeWindowLayout.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/util/ResourceLoader.java2
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