X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.eclipse.ui%2Fsrc%2Forg%2Fargeo%2Feclipse%2Fui%2Fdialogs%2FLightweightDialog.java;h=606030e38079452eee9ae3239cff55c6a453d633;hb=9b72f40bbe64838d1007fc27182fc7c98c242157;hp=6d45e8cf21bc35ecae4be693ff993efdf807a4bc;hpb=6960fb17d7601de34cc6c4f320c9d1f63caca692;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java index 6d45e8cf2..606030e38 100644 --- a/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java +++ b/org.argeo.eclipse.ui/src/org/argeo/eclipse/ui/dialogs/LightweightDialog.java @@ -1,20 +1,7 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package org.argeo.eclipse.ui.dialogs; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.eclipse.ui.EclipseUiException; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; @@ -32,6 +19,8 @@ import org.eclipse.swt.widgets.Shell; /** Generic lightweight dialog, not based on JFace. */ public class LightweightDialog { + private final static Log log = LogFactory.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 @@ -66,12 +55,14 @@ public class LightweightDialog { public int open() { if (foregoundShell != null) throw new EclipseUiException("There is already a shell"); - backgroundShell = new Shell(parentShell, SWT.DIALOG_TRIM | SWT.ON_TOP); + backgroundShell = new Shell(parentShell, SWT.ON_TOP); backgroundShell.setFullScreen(true); + // if (parentShell != null) { + // backgroundShell.setBounds(parentShell.getBounds()); + // } else // backgroundShell.setMaximized(true); backgroundShell.setAlpha(128); backgroundShell.setBackground(getDisplay().getSystemColor(SWT.COLOR_BLACK)); - backgroundShell.open(); foregoundShell = new Shell(backgroundShell, SWT.NO_TRIM | SWT.ON_TOP); if (title != null) setTitle(title); @@ -81,7 +72,7 @@ public class LightweightDialog { // shell.pack(); // shell.layout(); - Rectangle shellBounds = Display.getCurrent().getBounds();// RAP + Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : Display.getCurrent().getBounds();// RAP Point dialogSize = foregoundShell.getSize(); int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2; int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2; @@ -92,6 +83,8 @@ public class LightweightDialog { @Override public void shellDeactivated(ShellEvent e) { + if (hasChildShells()) + return; if (returnCode == null)// not yet closed closeShell(CANCEL); } @@ -103,6 +96,7 @@ public class LightweightDialog { }); + backgroundShell.open(); foregoundShell.open(); // after the foreground shell has been opened backgroundShell.addFocusListener(new FocusListener() { @@ -114,19 +108,40 @@ public class LightweightDialog { @Override public void focusGained(FocusEvent event) { + if (hasChildShells()) + return; if (returnCode == null)// not yet closed closeShell(CANCEL); } }); if (block) { - runEventLoop(foregoundShell); + block(); } if (returnCode == null) returnCode = OK; return returnCode; } + public void block() { + try { + runEventLoop(foregoundShell); + } catch (ThreadDeath t) { + returnCode = CANCEL; + if (log.isTraceEnabled()) + log.error("Thread death, canceling dialog", t); + } catch (Throwable t) { + returnCode = CANCEL; + log.error("Cannot open blocking lightweight dialog", t); + } + } + + private boolean hasChildShells() { + if (foregoundShell == null) + return false; + return foregoundShell.getShells().length != 0; + } + // public synchronized int openAndWait() { // open(); // while (returnCode == null) @@ -186,6 +201,10 @@ public class LightweightDialog { block = shouldBlock; } + public void pack() { + foregoundShell.pack(); + } + private void runEventLoop(Shell loopShell) { Display display; if (foregoundShell == null) { @@ -199,6 +218,8 @@ public class LightweightDialog { if (!display.readAndDispatch()) { display.sleep(); } + } catch (UnsupportedOperationException e) { + throw e; } catch (Throwable e) { handleException(e); } @@ -228,4 +249,8 @@ public class LightweightDialog { getForegoundShell().setText(title); } + public Integer getReturnCode() { + return returnCode; + } + } \ No newline at end of file