gui: remove SwingScilabDockablePanel ambiguous casts 52/21252/5
Clement David [Thu, 23 Jan 2020 22:02:40 +0000 (23:02 +0100)]
This will avoid crash at runtime on ClassCastException.

Change-Id: Ia74d4eeca8fd4c295e9b38a6f9b27f357aa6ac53

scilab/CHANGES.md
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/CallScilabBridge.java
scilab/modules/gui/src/java/org/scilab/modules/gui/bridge/filechooser/SwingScilabExportFileChooser.java
scilab/modules/gui/tests/nonreg_tests/bug_13683.tst [new file with mode: 0644]

index e38b28b..362f585 100644 (file)
@@ -228,6 +228,7 @@ Bug Fixes
 * [#12520](http://bugzilla.scilab.org/show_bug.cgi?id=12520): Vriable browser did not display the size of the variables.
 * [#12534](http://bugzilla.scilab.org/show_bug.cgi?id=12534): Variable browser did not display the size of the variables.
 * [#12837](http://bugzilla.scilab.org/show_bug.cgi?id=12837): `strcmpi` was an obsolete duplicate of `strcmp(,'i')`. It is removed.
+* [#13683](http://bugzilla.scilab.org/show_bug.cgi?id=13683): unsetmenu for a dockable="off" figure crashed Scilab.
 * [#13766](http://bugzilla.scilab.org/show_bug.cgi?id=13766): Minimal values for `.figure_size` were not documented.
 * [#14015](http://bugzilla.scilab.org/show_bug.cgi?id=14015): Nan terms added to a polynomial were ignored.
 * [#14422](http://bugzilla.scilab.org/show_bug.cgi?id=14422): `clc(0)` did nothing, now clears last console entry. Remove leading blank after a `clc()`.
@@ -235,7 +236,8 @@ Bug Fixes
 * [#14501](http://bugzilla.scilab.org/show_bug.cgi?id=14501): `strsubst` crashed on consecutive occurrences.
 * [#14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557): `csim` failed when the system has no state.
 * [#14498](http://bugzilla.scilab.org/show_bug.cgi?id=14498): `size([],3)` returned 1 instead of 0.
-* [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr` is 40x slower with 6.0.0 wrt 5.5.2
+* [#14502](http://bugzilla.scilab.org/show_bug.cgi?id=14502): `Demo > GUI > Uicontrols 2` could not be exported to a file.
+* [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` is 40x slower with 6.0.0 wrt 5.5.2
 * [#14605](http://bugzilla.scilab.org/show_bug.cgi?id=14605): fixed - `bench_run` was too strict about the specification of tests names.
 * [#14606](http://bugzilla.scilab.org/show_bug.cgi?id=14606): Memory used by variables returned by `[names,mem]=who()` was always zero.
 * [#14610](http://bugzilla.scilab.org/show_bug.cgi?id=14610): `x = ric_desc(H,E)` always yielded an error. [x1,x2,residual] = ric_desc(..) returned a wrong `residual` value.
@@ -245,6 +247,7 @@ Bug Fixes
 * [#14746](http://bugzilla.scilab.org/show_bug.cgi?id=14746): Tiny numbers were sometimes displayed as 0.
 * [#14791](http://bugzilla.scilab.org/show_bug.cgi?id=14791): `sleep 1` crashed Scilab.
 * [#14812](http://bugzilla.scilab.org/show_bug.cgi?id=14812): Minor typos in messages.
+* [#14836](http://bugzilla.scilab.org/show_bug.cgi?id=14836): calling `exportUI()` on a non dockable figure crashed scilab.
 * [#14863](http://bugzilla.scilab.org/show_bug.cgi?id=14863): In Xcos, the default ending time was unhandily high (100000), reduced it to 30.
 * [#14982](http://bugzilla.scilab.org/show_bug.cgi?id=14982): `msprintf` segmentation fault was caught due to wrong size
 * [#14985](http://bugzilla.scilab.org/show_bug.cgi?id=14985): scilab crashed if a .bin file was not found.
@@ -375,3 +378,5 @@ Bug Fixes
 * [#16293](http://bugzilla.scilab.org/show_bug.cgi?id=16293): Some demos run in step-by-step console mode(4) did not focus user's attention to the console to proceed.
 * [#16299](http://bugzilla.scilab.org/show_bug.cgi?id=16299): After `graypolarplot`, `colorbar` displayed an empty ungraduated color bar.
 * [#16303](http://bugzilla.scilab.org/show_bug.cgi?id=16303): log10(x) had wrong dimensions when x is an hypermatrix.
+* [#16307](http://bugzilla.scilab.org/show_bug.cgi?id=16307): `dockable="off"` and `closerequestfcn` on figures crached Scilab.
+
index dbb431a..0801036 100644 (file)
@@ -249,8 +249,9 @@ public class CallScilabBridge {
      * @param status true to set the menu enabled
      */
     public static void setMenuEnabled(int parentUID, String menuName, boolean status) {
-        SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) SwingView.getFromId(parentUID);
-        if (parentTab != null) { /** Parent must exist */
+        SwingViewObject view = SwingView.getFromId(parentUID);
+        if (view != null && view instanceof SwingScilabDockablePanel) { /** Parent must exist */
+            SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) view;
             parentTab.getMenuBar().getAsSimpleMenuBar().setMenuEnabled(menuName, status);
         }
     }
@@ -263,8 +264,9 @@ public class CallScilabBridge {
      * @param status true to set the menu enabled
      */
     public static void setSubMenuEnabled(int parentUID, String parentMenuName, int menuItemPosition, boolean status) {
-        SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) SwingView.getFromId(parentUID);
-        if (parentTab != null) { /** Parent must exist */
+        SwingViewObject view = SwingView.getFromId(parentUID);
+        if (view != null && view instanceof SwingScilabDockablePanel) { /** Parent must exist */
+            SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) view;
             parentTab.getMenuBar().getAsSimpleMenuBar().setSubMenuEnabled(parentMenuName, menuItemPosition, status);
         }
     }
@@ -281,8 +283,9 @@ public class CallScilabBridge {
      * @param menuName the name of the menu
      */
     public static void removeMenu(int parentUID, String menuName) {
-        SwingScilabPanel parentTab = (SwingScilabPanel) SwingView.getFromId(parentUID);
-        if (parentTab != null) { /** Parent must exist */
+        SwingViewObject view = SwingView.getFromId(parentUID);
+        if (view != null && view instanceof SwingScilabDockablePanel) { /** Parent must exist */
+            SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) view;
             parentTab.getMenuBar().getAsSimpleMenuBar().removeMenu(menuName);
         }
     }
@@ -894,7 +897,7 @@ public class CallScilabBridge {
                 Figure figure = (Figure) GraphicController.getController().getObjectFromId(figID);
                 int figureID = figure.getId();
                 BufferedImage bimage = null;
-                if (figure.getVisible()) {
+                if (figure.getVisible() && SwingView.getFromId(figID) instanceof SwingScilabDockablePanel) {
                     bimage = ((SwingScilabDockablePanel) SwingView.getFromId(figID)).getContentCanvas().dumpAsBufferedImage();
                 } else {
                     try {
@@ -1357,8 +1360,11 @@ public class CallScilabBridge {
     /******************/
 
     public static void fireClosingFinished(int figUID) {
-        SwingScilabDockablePanel parentTab = (SwingScilabDockablePanel) SwingView.getFromId(figUID);
-        ClosingOperationsManager.removeFromDunnoList(parentTab);
+        SwingViewObject view = SwingView.getFromId(figUID);
+        if (view instanceof SwingScilabDockablePanel)
+        {
+            ClosingOperationsManager.removeFromDunnoList((SwingScilabDockablePanel) view);
+        }
     }
     
     public static void registerSwingView() {
index a850223..64b8674 100644 (file)
@@ -22,7 +22,9 @@ import java.io.File;
 import java.util.ArrayList;
 
 import javax.swing.BorderFactory;
+import javax.swing.JComponent;
 import javax.swing.JFileChooser;
+import javax.swing.JFrame;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
@@ -32,7 +34,9 @@ import org.scilab.modules.graphic_export.FileExporter;
 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
 import org.scilab.modules.graphic_objects.figure.Figure;
 import org.scilab.modules.gui.SwingView;
+import org.scilab.modules.gui.SwingViewObject;
 import org.scilab.modules.gui.bridge.tab.SwingScilabDockablePanel;
+import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
 import org.scilab.modules.gui.tab.SimpleTab;
 import org.scilab.modules.gui.utils.ConfigManager;
 import org.scilab.modules.localization.Messages;
@@ -84,8 +88,8 @@ public class SwingScilabExportFileChooser extends SwingScilabFileChooser {
     public SwingScilabExportFileChooser(Integer figureUID) {
         super();
         this.figureUID = figureUID;
-        SwingScilabDockablePanel tab = (SwingScilabDockablePanel) SwingView.getFromId(figureUID);
-        setParentFrame(tab.getParentWindow());
+        JFrame parentWindow = (JFrame) SwingUtilities.getAncestorOfClass(SwingScilabWindow.class, (JComponent) SwingView.getFromId(figureUID));
+        setParentFrame(parentWindow);
         exportCustomFileChooser(figureUID);
     }
 
@@ -152,8 +156,13 @@ public class SwingScilabExportFileChooser extends SwingScilabFileChooser {
         accessoryPanel.setVisible(true);
         super.setAccessory(accessoryPanel);
 
-        Component c = DrawerVisitor.getVisitor(figureUID).getComponent();
-        Window parentWindow = (Window) SwingUtilities.getAncestorOfClass(Window.class, c);
+        Window parentWindow = null;
+        DrawerVisitor visitor = DrawerVisitor.getVisitor(figureUID);
+        if (visitor != null)
+        {
+            Component c = visitor.getComponent();
+            parentWindow = (Window) SwingUtilities.getAncestorOfClass(Window.class, c);
+        }
 
         int selection = super.showSaveDialog(parentWindow);
         if (selection == JFileChooser.APPROVE_OPTION && super.getSelectedFile() != null) {
@@ -290,7 +299,16 @@ public class SwingScilabExportFileChooser extends SwingScilabFileChooser {
      * @param userExtension extension caught by the user
      */
     public void vectorialExport(String userExtension) {
-        SwingScilabDockablePanel tab = (SwingScilabDockablePanel) SwingView.getFromId(figureUID);
+        SwingViewObject view = SwingView.getFromId(figureUID);
+        SimpleTab tab;
+        if (view instanceof SimpleTab)
+        {
+            tab = (SimpleTab) SwingView.getFromId(figureUID);
+        }
+        else
+        {
+            tab = null;
+        }
         ExportData exportData = new ExportData(figureUID, this.exportName, userExtension, null);
 
         String actualFilename = exportData.getExportName();
diff --git a/scilab/modules/gui/tests/nonreg_tests/bug_13683.tst b/scilab/modules/gui/tests/nonreg_tests/bug_13683.tst
new file mode 100644 (file)
index 0000000..cec8d58
--- /dev/null
@@ -0,0 +1,20 @@
+
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - ESI Group - Clement DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13683 -->
+// <-- NO CHECK REF -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13683
+//
+// <-- Short Description -->
+// Stack error using unsetmenu for a dockable="off" figure
+//
+
+f = figure("dockable", "off");
+unsetmenu(f.figure_id, _("File"), 2);