From 5576520a56ee690ee5510c4ef05487196b41f467 Mon Sep 17 00:00:00 2001
From: Stephane Dallongeville <stephane.dallongeville@pasteur.fr>
Date: Tue, 31 Aug 2021 18:18:56 +0200
Subject: [PATCH] Added new Output type block for easier interface with
 external processes

---
 .../blocks/tools/output/BooleanOutput.java    | 26 ++++++++++++++
 .../blocks/tools/output/DecimalOutput.java    | 29 +++++++++++++++
 .../blocks/tools/output/DecimalsOutput.java   | 29 +++++++++++++++
 .../blocks/tools/output/FileOutput.java       | 34 ++++++++++++++++++
 .../blocks/tools/output/FilesOutput.java      | 34 ++++++++++++++++++
 .../blocks/tools/output/FolderOutput.java     | 34 ++++++++++++++++++
 .../blocks/tools/output/FoldersOutput.java    | 34 ++++++++++++++++++
 .../blocks/tools/output/IntegerOutput.java    | 30 ++++++++++++++++
 .../blocks/tools/output/IntegersOutput.java   | 29 +++++++++++++++
 .../blocks/tools/output/OutputBlock.java      | 13 +++++++
 .../blocks/tools/output/SequenceOutput.java   | 36 +++++++++++++++++++
 .../blocks/tools/output/SequencesOutput.java  | 30 ++++++++++++++++
 .../blocks/tools/output/TextOutput.java       | 31 ++++++++++++++++
 .../adufour/blocks/util/BlocksFinder.java     | 10 ++++++
 .../plugins/adufour/blocks/util/BlocksML.java |  5 +--
 .../protocols/gui/block/BlockPanel.java       |  5 +--
 16 files changed, 405 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java
 create mode 100644 src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java

diff --git a/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java
new file mode 100644
index 0000000..a268cac
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/BooleanOutput.java
@@ -0,0 +1,26 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarBoolean;
+
+public class BooleanOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("boolean", new VarBoolean("Boolean", false));
+    }
+
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+        //
+    }
+
+    @Override
+    public void run()
+    {
+        //
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java
new file mode 100644
index 0000000..eb469a2
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/DecimalOutput.java
@@ -0,0 +1,29 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarDouble;
+
+/**
+ * Input block reading a 64-bit double-precision floating-point value
+ * 
+ * @author Alexandre Dufour
+ */
+public class DecimalOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("decimal", new VarDouble("decimal", 0.0));
+    }
+    
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java
new file mode 100644
index 0000000..5014b21
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/DecimalsOutput.java
@@ -0,0 +1,29 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarDoubleArrayNative;
+
+/**
+ * Utility block reading an array of double-precision floating-point values
+ * 
+ * @author Alexandre Dufour
+ */
+public class DecimalsOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("decimals", new VarDoubleArrayNative("decimals", new double[0]));
+    }
+    
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java
new file mode 100644
index 0000000..c57803e
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FileOutput.java
@@ -0,0 +1,34 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.gui.FileMode;
+import plugins.adufour.vars.gui.model.FileTypeModel;
+import plugins.adufour.vars.lang.VarFile;
+
+/**
+ * Input block reading a file
+ * 
+ * @author Alexandre Dufour
+ */
+public class FileOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarFile vf = new VarFile("file", null);
+        vf.setDefaultEditorModel(new FileTypeModel("", FileMode.FILES, null, false));
+        inputMap.add("file", vf);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+    
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java
new file mode 100644
index 0000000..16eec7c
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FilesOutput.java
@@ -0,0 +1,34 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.gui.FileMode;
+import plugins.adufour.vars.gui.model.FileTypeListModel;
+import plugins.adufour.vars.lang.VarFileArray;
+
+/**
+ * Input block reading a list of files
+ * 
+ * @author Alexandre Dufour
+ */
+public class FilesOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarFileArray vf = new VarFileArray("files", new java.io.File[0]);
+        vf.setDefaultEditorModel(new FileTypeListModel("", FileMode.FILES, null, false));
+        inputMap.add("files", vf);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+    
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java
new file mode 100644
index 0000000..acdd8dd
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FolderOutput.java
@@ -0,0 +1,34 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.gui.FileMode;
+import plugins.adufour.vars.gui.model.FileTypeModel;
+import plugins.adufour.vars.lang.VarFile;
+
+/**
+ * Input block reading a folder
+ * 
+ * @author Alexandre Dufour
+ */
+public class FolderOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarFile vf = new VarFile("folder", null);
+        vf.setDefaultEditorModel(new FileTypeModel("", FileMode.FOLDERS, null, false));
+        inputMap.add("folder", vf);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+    
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java
new file mode 100644
index 0000000..7097d7d
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/FoldersOutput.java
@@ -0,0 +1,34 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.gui.FileMode;
+import plugins.adufour.vars.gui.model.FileTypeListModel;
+import plugins.adufour.vars.lang.VarFileArray;
+
+/**
+ * Input block reading a list of folders
+ * 
+ * @author Alexandre Dufour
+ */
+public class FoldersOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarFileArray vf = new VarFileArray("folders", new java.io.File[0]);
+        vf.setDefaultEditorModel(new FileTypeListModel("", FileMode.FOLDERS, null, false));
+        inputMap.add("folders", vf);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+    
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java
new file mode 100644
index 0000000..ea444dc
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/IntegerOutput.java
@@ -0,0 +1,30 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarInteger;
+
+/**
+ * Utility block reading a 32-bit integer value
+ * 
+ * @author Alexandre Dufour
+ */
+public class IntegerOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarInteger vi = new VarInteger("integer", 0);
+        inputMap.add("integer", vi);
+    }
+    
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java
new file mode 100644
index 0000000..24f3b63
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/IntegersOutput.java
@@ -0,0 +1,29 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarIntegerArrayNative;
+
+/**
+ * Utility block reading an array of 32-bit integer values
+ * 
+ * @author Alexandre Dufour
+ */
+public class IntegersOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("integers", new VarIntegerArrayNative("integers", new int[0]));
+    }
+    
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java b/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java
new file mode 100644
index 0000000..f412710
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/OutputBlock.java
@@ -0,0 +1,13 @@
+package plugins.adufour.blocks.tools.output;
+
+import plugins.adufour.blocks.lang.Block;
+
+/**
+ * Interface used to flag pure output blocks
+ * 
+ * @author Stephane Dallongeville
+ * 
+ */
+public interface OutputBlock extends Block
+{
+}
\ No newline at end of file
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java
new file mode 100644
index 0000000..607badb
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/SequenceOutput.java
@@ -0,0 +1,36 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarSequence;
+
+/**
+ * Utility block reading a {@link icy.sequence.Sequence} object
+ * 
+ * @author Alexandre Dufour
+ */
+public class SequenceOutput extends Plugin implements OutputBlock
+{
+    private final VarSequence vs = new VarSequence("sequence", null);
+    
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("input sequence", vs);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+    
+    public VarSequence getVariable()
+    {
+        return vs;
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java
new file mode 100644
index 0000000..f185d08
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/SequencesOutput.java
@@ -0,0 +1,30 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarSequenceArray;
+
+/**
+ * Utility block reading a list of {@link icy.sequence.Sequence} objects
+ * 
+ * @author Alexandre Dufour
+ */
+public class SequencesOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        VarSequenceArray vsa = new VarSequenceArray("sequence");
+        inputMap.add("input sequence", vsa);
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java b/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java
new file mode 100644
index 0000000..d5c3ec0
--- /dev/null
+++ b/src/main/java/plugins/adufour/blocks/tools/output/TextOutput.java
@@ -0,0 +1,31 @@
+package plugins.adufour.blocks.tools.output;
+
+import icy.plugin.abstract_.Plugin;
+import plugins.adufour.blocks.util.VarList;
+import plugins.adufour.vars.lang.VarString;
+
+/**
+ * Text input
+ * 
+ * @author Alexandre Dufour
+ */
+public class TextOutput extends Plugin implements OutputBlock
+{
+    @Override
+    public void run()
+    {
+        
+    }
+    
+    @Override
+    public void declareInput(VarList inputMap)
+    {
+        inputMap.add("text", new VarString("text", ""));
+    }
+    
+    @Override
+    public void declareOutput(VarList outputMap)
+    {
+        
+    }
+}
diff --git a/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java b/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java
index 73c13ac..99cf451 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksFinder.java
@@ -51,6 +51,7 @@ import plugins.adufour.blocks.tools.ToolsBlock;
 import plugins.adufour.blocks.tools.ij.IJBlock;
 import plugins.adufour.blocks.tools.input.InputBlock;
 import plugins.adufour.blocks.tools.io.IOBlock;
+import plugins.adufour.blocks.tools.output.OutputBlock;
 import plugins.adufour.blocks.tools.roi.ROIBlock;
 import plugins.adufour.blocks.tools.sequence.SequenceBlock;
 import plugins.adufour.protocols.gui.BlockSearchPanel;
@@ -311,6 +312,9 @@ public class BlocksFinder
         JMenu mnInput = new JMenu("Read...");
         mnInput.setIcon(new IcyIcon(ResourceUtil.ICON_REDO, 22));
 
+        JMenu mnOutput = new JMenu("Out...");
+        mnOutput.setIcon(new IcyIcon(ResourceUtil.ICON_UNDO, 22));
+
         JMenu mnIO = new JMenu("I/O...");
         mnIO.setIcon(new IcyIcon(ResourceUtil.ICON_SAVE, 22));
 
@@ -432,6 +436,10 @@ public class BlocksFinder
                 {
                     mnInput.add(menuItem);
                 }
+                else if (OutputBlock.class.isAssignableFrom(blockClass))
+                {
+                    mnOutput.add(menuItem);
+                }
                 else if (SequenceBlock.class.isAssignableFrom(blockClass))
                 {
                     mnSeq.add(menuItem);
@@ -489,6 +497,7 @@ public class BlocksFinder
 
         splitLongMenus(mnBlocks, 15);
         splitLongMenus(mnInput, 15);
+        splitLongMenus(mnOutput, 15);
         splitLongMenus(mnSeq, 15);
         splitLongMenus(mnROI, 15);
         splitLongMenus(mnIO, 15);
@@ -498,6 +507,7 @@ public class BlocksFinder
 
         menuContainer.add(mnBlocks);
         menuContainer.add(mnInput);
+        menuContainer.add(mnOutput);
         menuContainer.add(mnSeq);
         menuContainer.add(mnROI);
         menuContainer.add(mnIO);
diff --git a/src/main/java/plugins/adufour/blocks/util/BlocksML.java b/src/main/java/plugins/adufour/blocks/util/BlocksML.java
index e8c3e33..5fbb6a6 100644
--- a/src/main/java/plugins/adufour/blocks/util/BlocksML.java
+++ b/src/main/java/plugins/adufour/blocks/util/BlocksML.java
@@ -43,6 +43,7 @@ import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.Link;
 import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.blocks.tools.input.InputBlock;
+import plugins.adufour.blocks.tools.output.OutputBlock;
 import plugins.adufour.protocols.Protocols;
 import plugins.adufour.vars.gui.model.TypeSelectionModel;
 import plugins.adufour.vars.lang.Var;
@@ -598,7 +599,7 @@ public class BlocksML
             XMLUtil.setAttributeValue(blockNode, "definedName", blockData.getDefinedName());
             XMLUtil.setAttributeBooleanValue(blockNode, "keepsResults", blockData.keepsResults());
 
-            if (block instanceof InputBlock)
+            if ((block instanceof InputBlock) || (block instanceof OutputBlock))
                 XMLUtil.setAttributeValue(blockNode, "CommandLineID", blockData.getCommandLineID());
 
             if (blockData.isWorkFlow())
@@ -1360,7 +1361,7 @@ public class BlocksML
 
             blockDescriptor.keepResults(XMLUtil.getAttributeBooleanValue(blockNode, "keepsResults", true));
 
-            if (block instanceof InputBlock)
+            if ((block instanceof InputBlock) || (block instanceof OutputBlock))
                 blockDescriptor.setCommandLineID(XMLUtil.getAttributeValue(blockNode, "CommandLineID", ""));
 
             workFlow.addBlock(blockDescriptor);
diff --git a/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java b/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java
index 5dfcf70..11a1704 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/BlockPanel.java
@@ -53,6 +53,7 @@ import plugins.adufour.blocks.lang.BlockDescriptor;
 import plugins.adufour.blocks.lang.BlockDescriptor.BlockStatus;
 import plugins.adufour.blocks.lang.WorkFlow;
 import plugins.adufour.blocks.tools.input.InputBlock;
+import plugins.adufour.blocks.tools.output.OutputBlock;
 import plugins.adufour.blocks.util.BlockListener;
 import plugins.adufour.blocks.util.VarList;
 import plugins.adufour.protocols.Protocols;
@@ -90,7 +91,7 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
             if (dragging)
             {
                 WorkFlow wf = workFlowPane.getWorkFlow();
-                
+
                 if (wf.isBlockSelected(blockDesc))
                 {
                     for (BlockDescriptor bd : wf.getBlockSelection())
@@ -846,7 +847,7 @@ public class BlockPanel extends JPanel implements ActionListener, BlockListener
 
         menu.addSeparator();
 
-        if (blockDesc.getBlock() instanceof InputBlock)
+        if ((blockDesc.getBlock() instanceof InputBlock) || (blockDesc.getBlock() instanceof OutputBlock))
         {
             // option to retrieve parameter from command line
             String tooltip = "<html><h4>Identifier used to set the value from the command line</h4></html>";
-- 
GitLab