package org.argeo.cms.swt.dialogs;
import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.ux.widgets.CmsDialog;
import org.argeo.eclipse.ui.EclipseUiException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
public class LightweightDialog {
private final static CmsLog log = CmsLog.getLog(LightweightDialog.class);
- // must be the same value as org.eclipse.jface.window.Window#OK
- public final static int OK = 0;
- // must be the same value as org.eclipse.jface.window.Window#CANCEL
- public final static int CANCEL = 1;
-
private Shell parentShell;
private Shell backgroundShell;
private Shell foregoundShell;
+ private Display display;
+
private Integer returnCode = null;
private boolean block = true;
private String title;
/** Tries to find a display */
- private static Display getDisplay() {
+ static Display findDisplay() {
try {
Display display = Display.getCurrent();
if (display != null)
}
public int open() {
+ display = findDisplay();
if (foregoundShell != null)
throw new EclipseUiException("There is already a shell");
backgroundShell = new Shell(parentShell, SWT.ON_TOP);
// } else
// backgroundShell.setMaximized(true);
backgroundShell.setAlpha(128);
- backgroundShell.setBackground(getDisplay().getSystemColor(SWT.COLOR_BLACK));
+ backgroundShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
foregoundShell = new Shell(backgroundShell, SWT.NO_TRIM | SWT.ON_TOP);
if (title != null)
setTitle(title);
// shell.pack();
// shell.layout();
- Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : Display.getCurrent().getBounds();// RAP
+ Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : display.getBounds();// RAP
Point dialogSize = foregoundShell.getSize();
int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2;
int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2;
if (hasChildShells())
return;
if (returnCode == null)// not yet closed
- closeShell(CANCEL);
+ closeShell(CmsDialog.CANCEL);
}
@Override
if (hasChildShells())
return;
if (returnCode == null)// not yet closed
- closeShell(CANCEL);
+ closeShell(CmsDialog.CANCEL);
}
});
+ backgroundShell.addDisposeListener((event) -> onClose());
if (block) {
block();
}
if (returnCode == null)
- returnCode = OK;
+ returnCode = CmsDialog.OK;
return returnCode;
}
try {
runEventLoop(foregoundShell);
} catch (ThreadDeath t) {
- returnCode = CANCEL;
+ returnCode = CmsDialog.CANCEL;
if (log.isTraceEnabled())
log.error("Thread death, canceling dialog", t);
} catch (Throwable t) {
- returnCode = CANCEL;
+ returnCode = CmsDialog.CANCEL;
log.error("Cannot open blocking lightweight dialog", t);
}
}
return foregoundShell.getShells().length != 0;
}
+ protected void onClose() {
+
+ }
+
// public synchronized int openAndWait() {
// open();
// while (returnCode == null)
private synchronized void notifyClose() {
if (returnCode == null)
- returnCode = CANCEL;
+ returnCode = CmsDialog.CANCEL;
notifyAll();
}
protected void closeShell(int returnCode) {
this.returnCode = returnCode;
- if (CANCEL == returnCode)
+ if (CmsDialog.CANCEL == returnCode)
onCancel();
if (foregoundShell != null && !foregoundShell.isDisposed()) {
foregoundShell.close();
}
protected Point getInitialSize() {
- // if (exception != null)
- // return new Point(800, 600);
- // else
return new Point(600, 400);
}
return returnCode;
}
+ Display getDisplay() {
+ return display;
+ }
+
}
\ No newline at end of file