Improve CMS dialogs and localisation.
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui / src / org / argeo / eclipse / ui / dialogs / LightweightDialog.java
index e816ec718dbb4fd30ad81e44af83d0fbc523d616..d00365bf2c7e8ad1aa6547ffae2a326a6d8ecfd8 100644 (file)
@@ -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;
@@ -31,7 +18,10 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
 /** Generic lightweight dialog, not based on JFace. */
+@Deprecated
 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 +56,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 +73,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 +84,8 @@ public class LightweightDialog {
 
                        @Override
                        public void shellDeactivated(ShellEvent e) {
+                               if (hasChildShells())
+                                       return;
                                if (returnCode == null)// not yet closed
                                        closeShell(CANCEL);
                        }
@@ -103,6 +97,7 @@ public class LightweightDialog {
 
                });
 
+               backgroundShell.open();
                foregoundShell.open();
                // after the foreground shell has been opened
                backgroundShell.addFocusListener(new FocusListener() {
@@ -114,19 +109,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 +202,10 @@ public class LightweightDialog {
                block = shouldBlock;
        }
 
+       public void pack() {
+               foregoundShell.pack();
+       }
+
        private void runEventLoop(Shell loopShell) {
                Display display;
                if (foregoundShell == null) {
@@ -199,6 +219,8 @@ public class LightweightDialog {
                                if (!display.readAndDispatch()) {
                                        display.sleep();
                                }
+                       } catch (UnsupportedOperationException e) {
+                               throw e;
                        } catch (Throwable e) {
                                handleException(e);
                        }
@@ -224,8 +246,12 @@ public class LightweightDialog {
 
        public void setTitle(String title) {
                this.title = title;
-               if (getForegoundShell() != null)
+               if (title != null && getForegoundShell() != null)
                        getForegoundShell().setText(title);
        }
 
+       public Integer getReturnCode() {
+               return returnCode;
+       }
+
 }
\ No newline at end of file