Xcos: use dynamic palette for "Commonly used blocks" 86/18886/4
Clément DAVID [Mon, 16 Jan 2017 15:05:49 +0000 (16:05 +0100)]
The previous implementation added a special palette and thus break the
palette management. Re-using the "Commonly used blocks" is simpler and
more intuitive for the user ; the number of blocks is also configuration
dependent.

Change-Id: I8361e8e84feeab3d88099107e09a61302e182947

scilab/modules/xcos/etc/palettes.xml
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/view/PaletteManagerPanel.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosConstants.java

index 1df40c8..559d18b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <category enable="true" name="Config">
     <node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Category" enable="true" name="Palettes">
-        <node xsi:type="PreLoaded" enable="true" name="Commonly Used Blocks">
+        <node xsi:type="PreLoaded" enable="true" name="Recently Used Blocks">
             <block name="ANDBLK">
                 <icon variable="SCI" path="/modules/xcos/images/palettes/ANDBLK.png"/>
             </block>
             <block name="TrigFun">
                 <icon variable="SCI" path="/modules/xcos/images/palettes/TrigFun.png"/>
             </block>
+            <block name="RELATIONALOP">
+                <icon variable="SCI" path="/modules/xcos/images/palettes/RELATIONALOP.png"/>
+            </block>
         </node>
         <node xsi:type="PreLoaded" enable="true" name="Matrix">
             <block name="CUMSUM">
             <block name="SRFLIPFLOP">
                 <icon variable="SCI" path="/modules/xcos/images/palettes/SRFLIPFLOP.png"/>
             </block>
+            <block name="LOGICAL_OP">
+                <icon variable="SCI" path="/modules/xcos/images/palettes/LOGICAL_OP.png"/>
+            </block>
         </node>
         <node xsi:type="PreLoaded" enable="true" name="Port &amp; Subsystem">
             <block name="CLKINV_f">
index 0e316e6..110be57 100644 (file)
@@ -431,22 +431,22 @@ public class XcosDiagram extends ScilabGraph {
     /**
      * CellResizedTracker Called when mxEvents.CELLS_RESIZED is fired.
      */
-    private static final class CellResizedTracker implements mxIEventListener {
+    private static final class RepositionTracker implements mxIEventListener {
 
-        private static CellResizedTracker instance;
+        private static RepositionTracker instance;
 
         /**
          * Constructor
          */
-        private CellResizedTracker() {
+        private RepositionTracker() {
         }
 
         /**
          * @return the instance
          */
-        public static CellResizedTracker getInstance() {
+        public static RepositionTracker getInstance() {
             if (instance == null) {
-                instance = new CellResizedTracker();
+                instance = new RepositionTracker();
             }
             return instance;
         }
@@ -1089,12 +1089,13 @@ public class XcosDiagram extends ScilabGraph {
         /*
          * First remove all listeners if present
          */
-        removeListener(CellResizedTracker.getInstance());
+        removeListener(RepositionTracker.getInstance());
         getUndoManager().removeListener(UndoUpdateTracker.getInstance());
         removeListener(RefreshBlockTracker.getInstance());
 
-        // Track when resizing a cell.
-        addListener(mxEvent.CELLS_RESIZED, CellResizedTracker.getInstance());
+        // Track when resizing or moving (droping) a cell.
+        addListener(mxEvent.CELLS_RESIZED, RepositionTracker.getInstance());
+        addListener(mxEvent.CELLS_MOVED, RepositionTracker.getInstance());
 
         // Update the blocks view on undo/redo
         getUndoManager().addListener(mxEvent.UNDO, UndoUpdateTracker.getInstance());
@@ -2263,13 +2264,12 @@ public class XcosDiagram extends ScilabGraph {
         };
     }
 
-   /**
-    * Counts the number of children in the diagram
-    *
-    * @return the number of children in the diagram
-    */
-    public int countChildren()
-    {
+    /**
+     * Counts the number of children in the diagram
+     *
+     * @return the number of children in the diagram
+     */
+    public int countChildren() {
         return getModel().getChildCount(this.getDefaultParent());
     }
 }
index ad78d7e..8705a26 100644 (file)
@@ -203,29 +203,35 @@ public class PaletteManagerPanel extends JSplitPane {
     public void addRecentltyUsedBlock(PaletteBlock block) {
         PaletteNode currentNode = (PaletteNode) tree.getLastSelectedPathComponent();
         if (currentNode != null && currentNode.getName().equals(RECENTLY_USED_BLOCKS)) {
+            // do not refresh when the dynamic palette is selected
             return;
         }
 
+        // look for the dynamic palette
         final Category root = PaletteManager.getInstance().getRoot();
-        List<PaletteNode> nodes = root.getNode();
-
+        ArrayList<PaletteNode> nodes = new ArrayList<>(root.getNode());
         PreLoaded p = null;
-        for (PaletteNode n : nodes) {
-            if (n.getName().equals(RECENTLY_USED_BLOCKS) && n instanceof PreLoaded) {
+        while (p == null && !nodes.isEmpty()) {
+            // pop()
+            PaletteNode n = nodes.get(nodes.size() - 1);
+            nodes.remove(nodes.size() - 1);
+
+            // terminate if found
+            if (n instanceof PreLoaded && n.getName().equals(RECENTLY_USED_BLOCKS)) {
                 p = (PreLoaded) n;
                 break;
             }
-        }
 
+            // add all the sub palettes
+            if (n instanceof Category) {
+                nodes.addAll(((Category) n).getNode());
+            }
+        }
         if (p == null) {
-            p = new PreLoaded();
-            p.setName(RECENTLY_USED_BLOCKS);
-            p.setEnable(true);
-            root.getNode().add(p);
-            p.setParent(root);
-            PaletteNode.refreshView(root, currentNode);
+            return;
         }
 
+        // do not resort if already present
         List<PaletteBlock> blocks = p.getBlock();
         for (PaletteBlock b : blocks) {
             if (b.getName().equals(block.getName())) {
@@ -233,9 +239,8 @@ public class PaletteManagerPanel extends JSplitPane {
             }
         }
 
-        if (blocks.size() >= XcosConstants.MAX_RECENTLY_USED_BLOCKS) {
-            blocks.remove(XcosConstants.MAX_RECENTLY_USED_BLOCKS - 1);
-        }
+        // add the block but keep the same number of elements (with a custom palette.xml the user can change the number of recent blocks)
+        blocks.remove(blocks.size() - 1);
         blocks.add(0, block);
     }
 
index 68290b8..aed4573 100644 (file)
@@ -37,9 +37,6 @@ public final class XcosConstants extends ScilabGraphConstants {
     /** Define the maximum number of char that might be represented as style */
     public static final int MAX_CHAR_IN_STYLE = 37;
 
-    /** Define the maximum number of blocks on the "Recently Used Blocks" palette */
-    public static final int MAX_RECENTLY_USED_BLOCKS = 12;
-
     /** Define the history length */
     public static final int HISTORY_LENGTH = 20;
 
@@ -142,7 +139,7 @@ public final class XcosConstants extends ScilabGraphConstants {
             }
             return null;
         }
-       }
+    }
 
     /* Events */
     /**