Bug 12304 fixed: Undoc, redock and undock led to an exception 91/10491/2
Calixte DENIZET [Fri, 15 Feb 2013 13:28:43 +0000 (14:28 +0100)]
Change-Id: I216ba28686f46fddbb1d06a05a299b19abf4045a

scilab/CHANGES_5.4.X
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/tab/SwingScilabTab.java
scilab/modules/gui/src/java/org/scilab/modules/gui/utils/SciUndockingAction.java

index 565ba5a..1b70a25 100644 (file)
@@ -359,6 +359,8 @@ Bug fixes
 
 * Bug #12284 fixed - Completion in console could to a crash (or deadlock).
 
+* Bug #12304 fixed - Undock, redock and undock led to an exception.
+
 
                     Changes between version 5.3.3 and 5.4.0
                     =======================================
index 695ce78..d9e53bf 100644 (file)
@@ -416,7 +416,9 @@ public class SwingScilabTab extends View implements SwingViewObject, SimpleTab,
     @Override
     public void dockingComplete(DockingEvent evt) {
         super.dockingComplete(evt);
+
         DockingPort port = evt.getNewDockingPort();
+        SwingScilabWindow win = (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (Component) port);
         Iterator iter = port.getDockables().iterator();
 
         if (port.getDockables().size() > 1) {
@@ -430,6 +432,21 @@ public class SwingScilabTab extends View implements SwingViewObject, SimpleTab,
         } else {
             removeActions(this);
         }
+
+        if (win != null) {
+            setParentWindowId(win.getId());
+        } else {
+            // Should not occur
+            SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        if (getParentWindow() != null) {
+                            setParentWindowId(getParentWindow().getId());
+                        } else {
+                            System.err.println("No window for tab:" + SwingScilabTab.this.getClass().getName() + " after docking complete");
+                        }
+                    }
+                });
+        }
     }
 
     /**
@@ -452,6 +469,13 @@ public class SwingScilabTab extends View implements SwingViewObject, SimpleTab,
     }
 
     /**
+     * @return the UUID of the parent window
+     */
+    public SwingScilabWindow getParentWindow() {
+        return (SwingScilabWindow) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, this);
+    }
+
+    /**
      * Gets the title of a swing Scilab tab
      * @return the title of the tab
      * @see org.scilab.modules.gui.tab.ScilabTab#getName()
@@ -1329,6 +1353,12 @@ public class SwingScilabTab extends View implements SwingViewObject, SimpleTab,
      * Close the tab and disable it.
      */
     public void close() {
+        if (getTitlePane() != null) {
+            ((Titlebar) getTitlePane()).removeAction(DockingConstants.CLOSE_ACTION);
+            ((Titlebar) getTitlePane()).removeAction(UNDOCK);
+            ((Titlebar) getTitlePane()).removeAction(HELP);
+        }
+
         setMenuBar(null);
         setToolBar(null);
         setInfoBar(null);
index 9932d76..52c3ff5 100644 (file)
@@ -61,7 +61,7 @@ public class SciUndockingAction extends AbstractAction {
         /** Save the tab dimensions to set them back after docking */
         Size oldtabSize = associatedTab.getDims();
         /** Save the old parent Window position to use it to set the new Window position */
-        Position oldWindowPosition = SwingScilabWindow.allScilabWindows.get(associatedTab.getParentWindowId()).getPosition();
+        Position oldWindowPosition = associatedTab.getParentWindow().getPosition();
         /* If we undock a tab contained in view with two elements, then
            the two elements will be alone, so we remove the actions. */
         DockingPort port = DockingManager.getMainDockingPort(associatedTab);
@@ -97,7 +97,7 @@ public class SciUndockingAction extends AbstractAction {
         Size windowSize = newWindow.getDims();
         Size newTabSize = associatedTab.getDims();
         newWindow.setDims(new Size((windowSize.getWidth() - newTabSize.getWidth()) + oldtabSize.getWidth(),
-                (windowSize.getHeight() - newTabSize.getHeight()) + oldtabSize.getHeight()));
+                                   (windowSize.getHeight() - newTabSize.getHeight()) + oldtabSize.getHeight()));
 
         associatedTab.setParentWindowId(newWindow.getId());
         associatedTab.requestFocus();