Improve Scilab GUI startup 20/12120/2
Calixte DENIZET [Tue, 23 Jul 2013 13:21:58 +0000 (15:21 +0200)]
Change-Id: I0fff6f0b24c8283627bd4280025900d12186a6d9

scilab/modules/console/etc/XConfiguration-general.xml
scilab/modules/console/etc/XConfiguration-general.xsl
scilab/modules/core/src/java/org/scilab/modules/core/ConsoleTab.java
scilab/modules/core/src/java/org/scilab/modules/core/Scilab.java
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/CallScilabBridge.java
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/window/SwingScilabWindow.java
scilab/modules/gui/src/java/org/scilab/modules/gui/utils/BarUpdater.java
scilab/modules/gui/src/java/org/scilab/modules/gui/utils/ClosingOperationsManager.java
scilab/modules/gui/src/java/org/scilab/modules/gui/utils/WindowsConfigurationManager.java
scilab/modules/preferences/etc/XConfiguration.xml
scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/SciNotesOptions.java

index a5cb0da..bbc0279 100644 (file)
@@ -37,7 +37,7 @@
     </confirmation-dialogs>
     <desktop-layout title="_(Desktop layout)">
         <body>
-            <layouts id="0">
+            <layouts id="0" save-desktop="true">
                 <layout id="0" name="_(Integrated)" path="$SCI/modules/gui/etc/integratedConfiguration.xml" image="file:///$SCI/modules/gui/images/preferences/integrated.png"/>
                 <layout id="1" name="_(Simple)" path="$SCI/modules/gui/etc/simpleConfiguration.xml" image="file:///$SCI/modules/gui/images/preferences/simple.png"/>
             </layouts>
index 21135ba..488d2a1 100644 (file)
                         <xsl:value-of select="layout[@id=$id]/@image"/>
                     </xsl:attribute>
                 </Image>
-                
+                <Panel gridx="1" gridy="5">
+                    <VSpace height="10"/>
+                </Panel>
+                <Checkbox gridx="1" gridy="6" weightx="0" text="_(Save layout on exiting)" checked="{@save-desktop}" selected-value="true" unselected-value="false" listener="ActionListener">
+                    <actionPerformed choose="save-desktop">
+                        <xsl:call-template name="context"/>
+                    </actionPerformed>
+                </Checkbox>
             </Grid>
         </Title>
     </xsl:template>
index 1cf7746..5f5dd27 100644 (file)
@@ -19,6 +19,7 @@ import java.util.UUID;
 import javax.swing.JTextArea;
 
 import org.scilab.modules.commons.ScilabCommonsUtils;
+import org.scilab.modules.commons.ScilabConstants;
 import org.scilab.modules.gui.ScilabTermination;
 import org.scilab.modules.gui.bridge.CallScilabBridge;
 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
@@ -27,8 +28,12 @@ import org.scilab.modules.gui.menubar.MenuBar;
 import org.scilab.modules.gui.menubar.ScilabMenuBar;
 import org.scilab.modules.gui.tab.ScilabTab;
 import org.scilab.modules.gui.tab.Tab;
+import org.scilab.modules.gui.textbox.ScilabTextBox;
+import org.scilab.modules.gui.textbox.TextBox;
+import org.scilab.modules.gui.toolbar.ToolBar;
 import org.scilab.modules.gui.utils.ClosingOperationsManager;
 import org.scilab.modules.gui.utils.ConfigManager;
+import org.scilab.modules.gui.utils.ToolBarBuilder;
 import org.scilab.modules.gui.utils.WindowsConfigurationManager;
 import org.scilab.modules.jvm.LoadClassPath;
 import org.scilab.modules.localization.Messages;
@@ -43,6 +48,7 @@ public class ConsoleTab {
     private static final String SEE_DEFAULT_PATHS = "See SCI/etc/classpath.xml for default paths.";
     private static final String NOCONSOLE = Messages.gettext("No available console !\nPlease use STD mode.");
     private static final String EMPTYTAB = Messages.gettext("Empty tab");
+    private static final String MAINTOOLBARXMLFILE = ScilabConstants.SCI + "/modules/gui/etc/main_toolbar.xml";
 
     /**
      * Create a console tab
@@ -71,7 +77,7 @@ public class ConsoleTab {
 
                 @Override
                 public void updateDependencies(List<SwingScilabTab> list,
-                ListIterator<SwingScilabTab> it) {
+                                               ListIterator<SwingScilabTab> it) {
                 }
             });
 
@@ -114,7 +120,7 @@ public class ConsoleTab {
 
                 @Override
                 public void updateDependencies(List<SwingScilabTab> list,
-                ListIterator<SwingScilabTab> it) {
+                                               ListIterator<SwingScilabTab> it) {
                 }
             });
 
@@ -138,6 +144,18 @@ public class ConsoleTab {
         ((SwingScilabTab) consoleTab.getAsSimpleTab()).setMenuBar(menuBar);
         ScilabConsole.getConsole().addMenuBar(menuBar);
 
+        ToolBar toolBar = ToolBarBuilder.buildToolBar(MAINTOOLBARXMLFILE);
+        TextBox infoBar = ScilabTextBox.createTextBox();
+
+        toolBar.setVisible(true); // Enabled in scilab.start
+
+        ((SwingScilabTab) consoleTab.getAsSimpleTab()).setToolBar(toolBar);
+        ((SwingScilabTab) consoleTab.getAsSimpleTab()).setInfoBar(infoBar);
+
+        ScilabConsole.getConsole().addMenuBar(consoleTab.getMenuBar());
+        ScilabConsole.getConsole().addToolBar(toolBar);
+        ScilabConsole.getConsole().addInfoBar(infoBar);
+
         return consoleTab;
     }
 }
index cda4716..a9fb16e 100644 (file)
@@ -45,7 +45,6 @@ import org.scilab.modules.gui.toolbar.ToolBar;
 import org.scilab.modules.gui.utils.ClosingOperationsManager;
 import org.scilab.modules.gui.utils.ConfigManager;
 import org.scilab.modules.gui.utils.LookAndFeelManager;
-import org.scilab.modules.gui.utils.ToolBarBuilder;
 
 /**
  * Main Class for Scilab
@@ -65,8 +64,6 @@ public class Scilab {
     /** Index of windows vista version */
     private static final double VISTA_VERSION = 6.0;
 
-    private static final String MAINTOOLBARXMLFILE = ScilabConstants.SCI + "/modules/gui/etc/main_toolbar.xml";
-
     private static final String ENABLE_JAVA2D_OPENGL_PIPELINE = "sun.java2d.opengl";
     private static final String ENABLE = "true";
     private static final String DISABLE = "false";
@@ -189,18 +186,9 @@ public class Scilab {
             String consoleId = GraphicController.getController().askObject(Type.JAVACONSOLE);
             MenuBarBuilder.buildConsoleMenuBar(consoleId);
 
-            ToolBar toolBar = ToolBarBuilder.buildToolBar(MAINTOOLBARXMLFILE);
-            TextBox infoBar = ScilabTextBox.createTextBox();
-
-            toolBar.setVisible(false); // Enabled in scilab.start
-
             SwingScilabConsole sciConsole = ((SwingScilabConsole) ScilabConsole.getConsole().getAsSimpleConsole());
             SwingScilabTab consoleTab = (SwingScilabTab) sciConsole.getParent();
-            consoleTab.setToolBar(toolBar);
-            consoleTab.setInfoBar(infoBar);
-            ScilabConsole.getConsole().addMenuBar(consoleTab.getMenuBar());
-            ScilabConsole.getConsole().addToolBar(toolBar);
-            ScilabConsole.getConsole().addInfoBar(infoBar);
+
             mainView = SwingScilabWindow.allScilabWindows.get(consoleTab.getParentWindowId());
         } else {
             GraphicController.getController().askObject(Type.CONSOLE);
index 31fd673..818b5b2 100644 (file)
@@ -2136,9 +2136,12 @@ public class CallScilabBridge {
     public static void setToolbarVisible(String parentUID, boolean status) {
         SwingScilabTab parentTab = (SwingScilabTab) SwingView.getFromId(parentUID);
         if (parentTab != null) {
-            parentTab.getToolBar().getAsSimpleToolBar().setVisible(status);
-            BarUpdater.updateBars(parentTab.getParentWindowId(), parentTab.getMenuBar(),
-                                  parentTab.getToolBar(), parentTab.getInfoBar(), parentTab.getName(), parentTab.getWindowIcon());
+            boolean oldStatus = parentTab.getToolBar().getAsSimpleToolBar().isVisible();
+            if (oldStatus != status) {
+                parentTab.getToolBar().getAsSimpleToolBar().setVisible(status);
+                BarUpdater.updateBars(parentTab.getParentWindowId(), parentTab.getMenuBar(),
+                                      parentTab.getToolBar(), parentTab.getInfoBar(), parentTab.getName(), parentTab.getWindowIcon());
+            }
         }
     }
 
index 8ccc80c..c96e1e9 100644 (file)
@@ -102,6 +102,7 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
     private final boolean MAC_OS_X = (System.getProperty("os.name").toLowerCase().startsWith("mac os x"));
     private Dimension lastDimension;
     private Point lastPosition;
+    private boolean isRestoring;
 
     /**
      * Constructor
@@ -109,7 +110,6 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
     public SwingScilabWindow() {
         super();
         this.uuid = UUID.randomUUID().toString();
-
         setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
 
         // By default ctrl+w close the window
@@ -188,6 +188,14 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
         allScilabWindows.put(windowUID, this);
     }
 
+    public void setIsRestoring(boolean b) {
+        isRestoring = b;
+    }
+
+    public boolean isRestoring() {
+        return isRestoring;
+    }
+
     /**
      * Get the last dimension of the window before MAXIMIZED or MINIMIZED
      * @return the last dimension
@@ -498,6 +506,18 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
         }
     }
 
+    public boolean compareMenuBar(MenuBar mb) {
+        if (mb == null ^ this.menuBar == null) {
+            return false;
+        }
+
+        if (mb == null && this.menuBar == null) {
+            return true;
+        }
+
+        return mb.getAsSimpleMenuBar() == this.menuBar;
+    }
+
     /**
      * Sets a Scilab ToolBar to a Scilab window
      * @param newToolBar the Scilab ToolBar to set to the Scilab window
@@ -525,6 +545,18 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
         }
     }
 
+    public boolean compareToolBar(ToolBar tb) {
+        if (tb == null ^ this.toolBar == null) {
+            return false;
+        }
+
+        if (tb == null && this.toolBar == null) {
+            return true;
+        }
+
+        return tb.getAsSimpleToolBar() == this.toolBar;
+    }
+
     /**
      * Sets a Scilab InfoBar to a Scilab window
      * @param newInfoBar the Scilab InfoBar to set to the Scilab window
@@ -552,6 +584,18 @@ public class SwingScilabWindow extends JFrame implements SimpleWindow {
         }
     }
 
+    public boolean compareInfoBar(TextBox ib) {
+        if (ib == null ^ this.infoBar == null) {
+            return false;
+        }
+
+        if (ib == null && this.infoBar == null) {
+            return true;
+        }
+
+        return ib.getAsSimpleTextBox() == this.infoBar;
+    }
+
     /**
      * Get the element id for this window
      * @return id the id of the corresponding window object
index f6cd25d..c0e3693 100644 (file)
@@ -75,18 +75,52 @@ public final class BarUpdater implements PropertyChangeListener {
      */
     public static void updateBars(String parentWindowsID, MenuBar newMenuBar, ToolBar newToolBar, TextBox newInfoBar, String newWindowTitle, Image newIcon) {
         SwingScilabWindow parentWindow = SwingScilabWindow.allScilabWindows.get(parentWindowsID);
-        if (parentWindow != null) {
-            parentWindow.addMenuBar(newMenuBar);
-            parentWindow.addToolBar(newToolBar);
-            parentWindow.addInfoBar(newInfoBar);
-            parentWindow.setTitle(newWindowTitle);
-            /** The following line is used to update the menubar, toolbar, ... displayed on screen */
-            parentWindow.getRootPane().revalidate();
-            if (OS.get() == OS.MAC) { /* Fix bug #11787 */
-                parentWindow.repaint();
+        if (parentWindow != null && !parentWindow.isRestoring()) {
+            boolean same = parentWindow.compareMenuBar(newMenuBar) && parentWindow.compareToolBar(newToolBar) && parentWindow.compareInfoBar(newInfoBar);
+            if (!same) {
+                parentWindow.addMenuBar(newMenuBar);
+                parentWindow.addToolBar(newToolBar);
+                parentWindow.addInfoBar(newInfoBar);
+                parentWindow.setTitle(newWindowTitle);
+                /** The following line is used to update the menubar, toolbar, ... displayed on screen */
+                parentWindow.getRootPane().revalidate();
+                if (OS.get() == OS.MAC) { /* Fix bug #11787 */
+                    parentWindow.repaint();
+                }
+                if (newIcon != null) {
+                    parentWindow.setIconImage(newIcon);
+                }
             }
-            if (newIcon != null) {
-                parentWindow.setIconImage(newIcon);
+        }
+    }
+
+    /**
+     * Local update for MenuBar and ToolBar
+     * Called when a Dock is complete.
+     * @param parentWindowsID : the ID of the window we want to update.
+     * @param newMenuBar the new MenuBar to display.
+     * @param newToolBar the new ToolBar to display.
+     * @param newInfoBar the new InfoBar to display.
+     * @param newWindowTitle the new Title to display
+     * @param newIcon the new windows icon
+     */
+    public static void forceUpdateBars(String parentWindowsID, MenuBar newMenuBar, ToolBar newToolBar, TextBox newInfoBar, String newWindowTitle, Image newIcon) {
+        SwingScilabWindow parentWindow = SwingScilabWindow.allScilabWindows.get(parentWindowsID);
+        if (parentWindow != null) {
+            boolean same = parentWindow.compareMenuBar(newMenuBar) && parentWindow.compareToolBar(newToolBar) && parentWindow.compareInfoBar(newInfoBar);
+            if (!same) {
+                parentWindow.addMenuBar(newMenuBar);
+                parentWindow.addToolBar(newToolBar);
+                parentWindow.addInfoBar(newInfoBar);
+                parentWindow.setTitle(newWindowTitle);
+                /** The following line is used to update the menubar, toolbar, ... displayed on screen */
+                parentWindow.getRootPane().revalidate();
+                if (OS.get() == OS.MAC) { /* Fix bug #11787 */
+                    parentWindow.repaint();
+                }
+                if (newIcon != null) {
+                    parentWindow.setIconImage(newIcon);
+                }
             }
         }
     }
index 63e5498..a55208b 100644 (file)
@@ -78,8 +78,7 @@ public class ClosingOperationsManager {
      * @param op
      *            the closing operation
      */
-    public static void registerClosingOperation(SwingScilabTab tab,
-            ClosingOperation op) {
+    public static void registerClosingOperation(SwingScilabTab tab, ClosingOperation op) {
         if (tab != null) {
             closingOps.put(tab, op);
         }
index edf57ea..493d6dc 100644 (file)
@@ -49,6 +49,7 @@ import org.scilab.modules.commons.xml.ScilabXMLUtilities;
 import org.scilab.modules.commons.xml.XConfiguration;
 import org.scilab.modules.commons.xml.XConfigurationEvent;
 import org.scilab.modules.commons.xml.XConfigurationListener;
+import static org.scilab.modules.commons.xml.XConfiguration.XConfAttribute;
 import org.scilab.modules.gui.bridge.tab.SwingScilabTab;
 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
 import org.scilab.modules.gui.console.ScilabConsole;
@@ -92,6 +93,7 @@ public class WindowsConfigurationManager implements XConfigurationListener {
 
     private static boolean mustInvalidate;
     private static boolean mustSave = true;
+    private static int layoutId;
 
     static {
         try {
@@ -118,7 +120,6 @@ public class WindowsConfigurationManager implements XConfigurationListener {
             Method registerFinalHook = scilab.getDeclaredMethod("registerFinalHook", Runnable.class);
             registerFinalHook.invoke(null, runnable);
 
-
             defaultWinAttributes.put("x", new Integer(DEFAULTX));
             defaultWinAttributes.put("y", new Integer(DEFAULTY));
             defaultWinAttributes.put("height", new Integer(DEFAULTHEIGHT));
@@ -143,7 +144,13 @@ public class WindowsConfigurationManager implements XConfigurationListener {
 
     public void configurationChanged(XConfigurationEvent e) {
         if (e.getModifiedPaths().contains(LAYOUT_PATH)) {
-            mustInvalidate = true;
+            Options options = getOptions();
+            if (options.id != layoutId) {
+                mustInvalidate = true;
+                layoutId = options.id;
+            }
+
+            mustSave = options.mustSave;
         }
     }
 
@@ -179,6 +186,11 @@ public class WindowsConfigurationManager implements XConfigurationListener {
         if (doc == null) {
             createUserCopy();
             doc = ScilabXMLUtilities.readDocument(USER_WINDOWS_CONFIG_FILE);
+            Options options = getOptions();
+            if (mustSave) {
+                mustSave = options.mustSave;
+            }
+            layoutId = options.id;
         }
 
         if (doc == null && !oneTry) {
@@ -318,6 +330,7 @@ public class WindowsConfigurationManager implements XConfigurationListener {
         }
 
         SwingScilabWindow window = new SwingScilabWindow();
+        window.setVisible(false);
 
         final String localUUID;
         if (preserveUUID) {
@@ -375,6 +388,8 @@ public class WindowsConfigurationManager implements XConfigurationListener {
             return null;
         }
 
+        window.setIsRestoring(true);
+
         if (restoreTab) {
             if (!nullUUID) {
                 final LayoutNodeSerializer serializer = new LayoutNodeSerializer();
@@ -397,7 +412,7 @@ public class WindowsConfigurationManager implements XConfigurationListener {
             // Be sur that the main tab will have the focus.
             // Get the elder tab and activate it
             final SwingScilabTab mainTab = ClosingOperationsManager.getElderTab(new ArrayList(Arrays.asList(tabs)));
-            BarUpdater.updateBars(mainTab.getParentWindowId(), mainTab.getMenuBar(), mainTab.getToolBar(), mainTab.getInfoBar(), mainTab.getName(), mainTab.getWindowIcon());
+            BarUpdater.forceUpdateBars(mainTab.getParentWindowId(), mainTab.getMenuBar(), mainTab.getToolBar(), mainTab.getInfoBar(), mainTab.getName(), mainTab.getWindowIcon());
 
             if (!ScilabConsole.isExistingConsole() && tabs.length == 1 && tabs[0].getPersistentId().equals(NULLUUID)) {
                 // null uuid is reserved to the console and in NW mode, there is no console.
@@ -423,8 +438,6 @@ public class WindowsConfigurationManager implements XConfigurationListener {
                 }
             }
 
-            window.setVisible(true);
-
             if (requestFocus) {
                 SwingUtilities.invokeLater(new Runnable() {
                     @Override
@@ -441,20 +454,24 @@ public class WindowsConfigurationManager implements XConfigurationListener {
                                         }
                                     }
                                 }
-
+                                window.setVisible(true);
+                                window.requestFocus();
                                 window.toFront();
-                                mainTab.requestFocusInWindow();
-                                while (!mainTab.hasFocus()) {
-                                    Thread.yield();
-                                    mainTab.requestFocusInWindow();
-                                }
-
-                                ActiveDockableTracker.requestDockableActivation(mainTab);
+                                window.setIsRestoring(false);
+                                SwingUtilities.invokeLater(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        ActiveDockableTracker.requestDockableActivation(mainTab);
+                                    }
+                                });
                             }
                         });
                         t.start();
                     }
                 });
+            } else {
+                window.setIsRestoring(false);
+                window.setVisible(true);
             }
         }
 
@@ -1043,6 +1060,10 @@ public class WindowsConfigurationManager implements XConfigurationListener {
         return length;
     }
 
+    private static final Options getOptions() {
+        return XConfiguration.get(Options.class, XConfiguration.getXConfigurationDocument(), LAYOUT_PATH)[0];
+    }
+
 
     /**
      * Inner interface used to have something to execute when the restoration is finished
@@ -1054,4 +1075,17 @@ public class WindowsConfigurationManager implements XConfigurationListener {
          */
         public void finish();
     }
+
+    @XConfAttribute
+    private static class Options {
+
+        public boolean mustSave;
+        public int id;
+
+        @XConfAttribute(tag = "layouts", attributes = {"id", "save-desktop"})
+        private void set(int id, boolean mustSave) {
+            this.id = id;
+            this.mustSave = mustSave;
+        }
+    }
 }
index f796192..774cb5e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<interface version="0.13" path="1/" width="800" height="600">
+<interface version="0.14" path="1/" width="800" height="600">
     <general/>
     <web/>
     <preference/>
index bd303c0..e850aa2 100644 (file)
@@ -62,7 +62,7 @@ public class SciNotesOptions {
         private Preferences() { }
 
         @XConfAttribute(tag = "scinotes-preferences", attributes = {"restart-reopen", "add-line-termination", "number-of-recently-open", "encoding", "eol", "scinotes", "cmd", "external-cmd"})
-        private void set(boolean restartOpen, boolean addLineTermination, int numberOfRecentlyOpen, String encoding, String eol, boolean useScinotes, boolean externalCmd, String cmd) {
+        private void set(boolean restartOpen, boolean addLineTermination, int numberOfRecentlyOpen, String encoding, String eol, boolean useScinotes, String cmd, boolean externalCmd) {
             this.restartOpen = restartOpen;
             this.addLineTermination = addLineTermination;
             this.numberOfRecentlyOpen = numberOfRecentlyOpen > 0 ? numberOfRecentlyOpen : 1;