summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java
diff options
context:
space:
mode:
authorSimon Rettberg2015-07-10 13:27:56 +0200
committerSimon Rettberg2015-07-10 13:27:56 +0200
commite0f5dee96b23105f325334d7af5f826ac3469bb0 (patch)
treed5ef04f9dcc1d6de8b59c1f8a57e6c318c2f55d1 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java
parent[client] Fix mltk repo entry in pom.xml (diff)
downloadtutor-module-e0f5dee96b23105f325334d7af5f826ac3469bb0.tar.gz
tutor-module-e0f5dee96b23105f325334d7af5f826ac3469bb0.tar.xz
tutor-module-e0f5dee96b23105f325334d7af5f826ac3469bb0.zip
[client] Minor refactoring
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java223
1 files changed, 223 insertions, 0 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java
new file mode 100644
index 00000000..72b19293
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java
@@ -0,0 +1,223 @@
+package org.openslx.dozmod.gui;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.log4j.Logger;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+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;
+import org.openslx.dozmod.gui.window.DisclaimerWindow;
+import org.openslx.dozmod.gui.window.LoginWindow;
+import org.openslx.dozmod.gui.window.MainMenuWindow;
+import org.openslx.dozmod.gui.window.VirtualizerNoticeWindow;
+import org.openslx.dozmod.thrift.Session;
+import org.openslx.thrifthelper.ThriftManager;
+import org.openslx.thrifthelper.ThriftManager.ErrorCallback;
+
+public abstract class MainWindow {
+
+ private final static Logger LOGGER = Logger.getLogger(MainWindow.class);
+
+ private static final Shell mainShell;
+ private static Composite contentComposite;
+ private static final Display display;
+
+ private static final String THRIFT_CONNECTION_ERROR = "Lost connection to the masterserver. Do you want to retry?";
+
+ /**
+ * Add a new composite with content to the main Shell
+ *
+ * @param The composite to add, should be a GUI
+ */
+ public static void setContent(Composite contentComposite) {
+
+ if (contentComposite == null) return;
+ if (MainWindow.contentComposite != null)
+ MainWindow.contentComposite.dispose();
+
+ MainWindow.contentComposite = contentComposite;
+
+ // sets the starting preferred size.
+ contentComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
+ mainShell.layout();
+ }
+
+ /**
+ * @param clazz Class to open as a popup over the main window.
+ * MUST be a subclass of Composite.
+ */
+ public static void openPopup(Class<? extends Composite> clazz, boolean modal) {
+ Shell dialogShell = new Shell(mainShell, SWT.DIALOG_TRIM | (modal ? SWT.APPLICATION_MODAL : 0));
+ // populate dialogShell
+ dialogShell.setLayout(new GridLayout(1, false));
+ LOGGER.debug(clazz.getDeclaredClasses());
+ Constructor<?> con = null;
+ try {
+ con = clazz.getConstructor(Shell.class);
+ con.newInstance(dialogShell);
+ } catch (Exception e1) {
+ showMessageBox(mainShell, "Cannot show popup " + clazz.getName(), MessageType.DEBUG, LOGGER, e1);
+ return;
+ }
+
+ dialogShell.layout();
+ dialogShell.pack();
+ dialogShell.open();
+ }
+
+ /**
+ * @return The instance of SWT display currently in use
+ */
+ public static Display getDisplay() {
+ return display;
+ }
+
+ static {
+ // init SWT stuff
+ display = new Display();
+ mainShell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
+
+ // Set up thrift error message displaying
+ ThriftManager.setErrorCallback(new ErrorCallback() {
+
+ @Override
+ public boolean thriftError(int failCount, String method, Throwable t) {
+ // Ask user if we should retry
+ return showMessageBox(mainShell, THRIFT_CONNECTION_ERROR, MessageType.ERROR_RETRY, LOGGER, t);
+ }
+ });
+
+ // Global key listener
+ display.addFilter(SWT.KeyDown, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ if (event.character == 17) // Ctrl-Q = Quit
+ System.exit(0);
+ }
+ });
+
+ createMenu();
+
+ mainShell.setText("bwSuite");
+
+ // Set layout for the mainshell, items added to the shell should get a gridData
+ mainShell.setLayout(new GridLayout(1, true));
+ mainShell.setMinimumSize(850, 650);
+
+ // always show the main menu
+ setContent(new MainMenuWindow(mainShell));
+
+ // center the window on the primary monitor
+ Monitor primary = display.getPrimaryMonitor();
+ Rectangle bounds = primary.getBounds();
+ Rectangle rect = mainShell.getBounds();
+
+ int x = bounds.x + (bounds.width - rect.width) / 2;
+ int y = bounds.y + (bounds.height - rect.height) / 2;
+
+ mainShell.setLocation(x, y);
+ mainShell.open();
+
+ // here we can check for Session information
+ if (Session.getSatelliteToken() == null) {
+ // User did not login, show the login mask
+ openPopup(LoginWindow.class, true);
+ }
+ }
+
+ /**
+ * Initialises 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.
+ */
+ public static void mainloop() {
+ while (!mainShell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ }
+
+ private static void createMenu() {
+ // the File menu button
+ Menu menuBar = new Menu(mainShell, SWT.BAR);
+ MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
+ cascadeFileMenu.setText("&File");
+
+ Menu fileMenu = new Menu(mainShell, SWT.DROP_DOWN);
+ cascadeFileMenu.setMenu(fileMenu);
+
+ MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
+ exitItem.setText("&Exit");
+ exitItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ System.exit(0);
+ }
+ });
+
+ // the About menu button
+ MenuItem cascadeAboutMenu = new MenuItem(menuBar, SWT.CASCADE);
+ cascadeAboutMenu.setText("&About");
+
+ Menu aboutMenu = new Menu(mainShell, SWT.DROP_DOWN);
+ cascadeAboutMenu.setMenu(aboutMenu);
+
+ MenuItem disclaimerItem = new MenuItem(aboutMenu, SWT.PUSH);
+ disclaimerItem.setText("&Disclaimer");
+ disclaimerItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ MainWindow.openPopup(DisclaimerWindow.class, false);
+ }
+ });
+
+ MenuItem virtualizerNoticeItem = new MenuItem(aboutMenu, SWT.PUSH);
+ virtualizerNoticeItem.setText("&Virtualizer");
+ virtualizerNoticeItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ MainWindow.openPopup(VirtualizerNoticeWindow.class, false);
+ }
+ });
+ mainShell.setMenuBar(menuBar);
+ }
+
+ /**
+ * Generic helper to show a message box to the user, and optionally log the
+ * message to the log file.
+ *
+ * @param parent parent shell this message box belongs to
+ * @param message Message to display. Can be multiline.
+ * @param messageType Type of message (warning, information)
+ * @param logger Logger instance to log to. Can be null.
+ * @param exception Exception related to this message. Can be null.
+ * @return true if OK, YES or RETRY was clicked, false for CANCEL or NO
+ */
+ public static boolean showMessageBox(Shell parent, String message, MessageType messageType,
+ Logger logger, Throwable exception) {
+ if (logger != null)
+ logger.log(messageType.logPriority, message, exception);
+ if (exception != null)
+ message += "\n\n" + exception.getClass().getSimpleName() + " (Siehe Logdatei)";
+ MessageBox box = new MessageBox(parent, messageType.style);
+ box.setMessage(message);
+ box.setText(messageType.title);
+ int ret = box.open();
+ return ret == SWT.OK || ret == SWT.RETRY || ret == SWT.YES;
+ }
+
+}