Browse Source

GUI: config

Willi Zschiebsch 4 years ago
parent
commit
480e2b4586

+ 79 - 0
src/main/java/mdd/client/Configuration.java

@@ -0,0 +1,79 @@
+package mdd.client;
+
+
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.Group;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyCode;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+public class Configuration extends Group {
+    private String _name = "";
+    private Module _parent = null;
+    private String _type = "";
+    protected GUIEventHandler _eventHandler;
+
+    Configuration(Module parent, String key, JSONObject json){
+        _eventHandler = GUIEventHandler.getEventHandler();
+        _parent = parent;
+        _name = key;
+
+        if (json.containsKey("options")){
+            _type = "selection";
+            ObservableList<String> options = FXCollections.observableArrayList();
+            System.out.println(json.toString());
+            for (Object opt : (JSONArray) json.get("options")){
+                String item = opt.toString();
+                options.add(opt.toString());
+
+            }
+            ComboBox cbox = new ComboBox(options);
+            cbox.getSelectionModel().select(json.get("value").toString());
+            cbox.setOnAction(e->{
+                JSONObject jconfi = new JSONObject();
+                jconfi.put("value", cbox.getValue().toString());
+                JSONObject jconfigs = new JSONObject();
+                jconfigs.put(_name, jconfi);
+                JSONObject jconfigure = new JSONObject();
+                jconfigure.put("configure", jconfigs);
+                JSONObject jmsg = new JSONObject();
+                jmsg.put("operation", "change");
+                JSONObject jargs = new JSONObject();
+                jargs.put("subject",  _parent.getJSONIdentifier());
+                jargs.put("object",   jconfigure);
+                jmsg.put("args", jargs);
+                _eventHandler.publishEvent("try", jmsg);
+            });
+            getChildren().addAll(cbox);
+        }
+        else {
+            _type = "input";
+            TextField cfield = new TextField(json.get("value").toString());
+            cfield.setOnKeyPressed(event -> {
+                if (event.getCode().equals(KeyCode.ENTER)) {
+                    JSONObject jconfi = new JSONObject();
+                    jconfi.put("value", cfield.getText().toString());
+                    JSONObject jconfigs = new JSONObject();
+                    jconfigs.put(_name, jconfi);
+                    JSONObject jconfigure = new JSONObject();
+                    jconfigure.put("configure", jconfigs);
+                    JSONObject jmsg = new JSONObject();
+                    jmsg.put("operation", "change");
+                    JSONObject jargs = new JSONObject();
+                    jargs.put("subject", _parent.getJSONIdentifier());
+                    jargs.put("object", jconfigure);
+                    jmsg.put("args", jargs);
+                    _eventHandler.publishEvent("try", jmsg);
+                }
+            });
+            getChildren().addAll(cfield);
+        }
+    }
+
+    public String getName(){
+        return _name;
+    }
+}

+ 0 - 28
src/main/java/mdd/client/Input.java

@@ -1,28 +0,0 @@
-package mdd.client;
-
-import javafx.scene.control.TextField;
-import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import javafx.scene.text.Font;
-import javafx.scene.text.Text;
-import org.json.simple.JSONObject;
-
-public class Input  extends Connectable {
-    private TextField _input;
-
-    public Input(Module parent, JSONObject json){
-        super(parent, ConnectableType.INPUT, json);
-
-        _input = new TextField(Value.toString());
-        _input.setPrefWidth(50);
-
-        add(_label,1,0);
-        add(_input,1,1);
-    }
-
-    public void setConnected(boolean state){
-        super.setConnected(state);
-        _input.setVisible(!state);
-        _input.setManaged(!state);
-    }
-}

+ 110 - 94
src/main/java/mdd/client/Module.java

@@ -6,27 +6,31 @@ import javafx.beans.value.ObservableValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.geometry.Bounds;
+import javafx.geometry.Orientation;
 import javafx.geometry.Point2D;
+import javafx.geometry.Pos;
 import javafx.scene.Group;
 import javafx.scene.Node;
 import javafx.scene.control.ComboBox;
 import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
-import javafx.scene.input.KeyEvent;
+import javafx.scene.input.KeyCode;
 import javafx.scene.input.MouseButton;
 import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.BorderPane;
-import javafx.scene.layout.GridPane;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.VBox;
+import javafx.scene.layout.*;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import mdd.client.connectable.Connectable;
+import mdd.client.connectable.Input;
+import mdd.client.connectable.Output;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 
-import javax.swing.*;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Set;
 import java.util.Vector;
 
 
@@ -43,104 +47,43 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
     public String ID = "TEST-1";
     public Vector<String> Prefix;
 
+    protected JSONObject jID = new JSONObject();
+
     protected String Type = "module";
     protected String Key = "";
 
     public VBox vlayout = new VBox();
     GridPane configs = new GridPane();
     public BorderPane hlayout = new BorderPane();
-    public VBox inputs = new VBox();
+    public VBox  inputs = new VBox();
     public VBox outputs = new VBox();
     public boolean isSelected = false;
 
     public Module(JSONObject json){
-        Name = json.get("name").toString();
-        Appendix = (long)json.get("id");
-        ID = Name +Appendix;
-        Type = json.get("type").toString();
-        Key = json.get("key").toString();
-        Prefix = new Vector<>();
-        JSONArray jarr = (JSONArray)json.get("prefix");
-        for (Object o : jarr) {
-            Prefix.add(o.toString());
-        }
-
-        if (json.containsKey("inputs")){
-            inputs.getChildren().clear();
-            for (Object o : (JSONArray)json.get("inputs")){
-                addInput(new Input(this,(JSONObject)o));
-            }
-        }
-
-        if (json.containsKey("outputs")) {
-            outputs.getChildren().clear();
-            for (Object o : (JSONArray) json.get("outputs")) {
-                addOutput(new Output(this, (JSONObject) o));
-            }
-        }
-
-        if (json.containsKey("configure")) {
-            configs.getChildren().clear();
-            configs.setHgap(20);
-            configs.setVgap(20);
-            int counter = 0;
-            for (Object o : (JSONArray) json.get("configure")) {
-                JSONObject jconfig = (JSONObject) o;
-                HBox hbox = new HBox();
-                configs.add(new Label((String) jconfig.get("name")),0,counter);
-                if (jconfig.containsKey("options")){
-                    ObservableList<String> options = FXCollections.observableArrayList();
-                    System.out.println(jconfig.toString());
-                    for (Object opt : (JSONArray) jconfig.get("options")){
-                        String item = opt.toString();
-                        options.add(opt.toString());
-
-                    }
-                    ComboBox cbox = new ComboBox(options);
-                    cbox.getSelectionModel().select(jconfig.get("value").toString());
-                    configs.add(cbox,1,counter);
-                }
-                else{
-                    configs.add(new TextField(jconfig.get("value").toString()),1,counter);
-                }
-                configs.getChildren().add(hbox);
-                ++counter;
-            }
-        }
-        if (json.containsKey("GUI")) {
-            JSONObject jgui = (JSONObject) json.get("GUI");
-            setTranslateX((double)jgui.get("posX"));
-            setTranslateY((double)jgui.get("posY"));
-        }
-
-        Color color = Color.DARKCYAN;
-
         setFocusTraversable(true);
         _eventHandler = GUIEventHandler.getEventHandler();
         _eventHandler.addEventListener(this);
 
         inputs.setSpacing(10);
-
+        inputs.setAlignment(Pos.TOP_LEFT);
         outputs.setSpacing(10);
+        //outputs.setVgap(10);
+        //outputs.setOrientation(Orientation.VERTICAL);
+        outputs.setAlignment(Pos.TOP_RIGHT);
 
         hlayout.setLeft(inputs);
         hlayout.setRight(outputs);
-        //hlayout.getChildren().addAll(inputs, outputs);
-        //hlayout.setSpacing(200);
+
         inputs.setTranslateX(-13);
         outputs.setTranslateX(13);
         vlayout.getChildren().addAll(configs, hlayout);
         vlayout.setTranslateX(5);
         vlayout.setTranslateY(30);
 
-        // System.out.println("[Module]: pressed: "+ hbox.getPrefWidth());
-
-
-        //titlebar = new Rectangle(0.0f, 0.0f, 150-20, 20.0f);
         titlebar = new Rectangle(0.0f, 0.0f, 1.0, 20f);
         titlebar.setArcWidth(10.0f);
         titlebar.setArcHeight(10.0f);
-        titlebar.setFill(color);
+
         //ackground = new Rectangle(0.0f, 0.0f, 150-20, 150 + 40);
         background = new Rectangle(0.0f, 0.0f, 1.0, 1.0);
         background.setArcWidth(10.0f);
@@ -152,10 +95,7 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         caption.setX(10);
         caption.setY(15);
 
-
-        getChildren().addAll( background, titlebar, caption, vlayout);
-
-
+        configure(json);
 
         addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
             if(e.getButton() == MouseButton.PRIMARY) {
@@ -210,12 +150,92 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         vlayout.layoutBoundsProperty().addListener(this);
     }
 
-    public void addInput(Input in){
-        inputs.getChildren().add(in);
+    public void configure(JSONObject json){
+        Type = json.get("type").toString();
+        Key = json.get("key").toString();
+        if (json.containsKey("ID")){
+            jID = (JSONObject)json.get("ID");
+
+            Name = jID.get("name").toString();
+            Appendix = (long)jID.get("appendix");
+            ID = Name +Appendix;
+            Prefix = new Vector<>();
+            JSONArray jarr = (JSONArray)jID.get("prefix");
+            for (Object o : jarr) {
+                Prefix.add(o.toString());
+            }
+        }
+
+        updateConnectable(ConnectableType.INPUT,json);
+        updateConnectable(ConnectableType.OUTPUT,json);
+
+
+        if (json.containsKey("configure")) {
+            configs.getChildren().clear();
+            configs.setHgap(20);
+            configs.setVgap(20);
+
+            JSONObject jconfigs = (JSONObject)json.get("configure");
+            Iterator<String> itr = jconfigs.keySet().iterator();
+            int counter = 0;
+            while (itr.hasNext()){
+                String key = itr.next();
+                JSONObject jconfig = (JSONObject) jconfigs.get(key);
+                Label clabel = new Label(key);
+                configs.add(clabel,0,counter);
+                configs.add(new Configuration(this, key, jconfig),1,counter);
+                ++counter;
+            }
+        }
+
+        if (json.containsKey("GUI")) {
+            JSONObject jgui = (JSONObject) json.get("GUI");
+            setTranslateX((double)jgui.get("posX"));
+            setTranslateY((double)jgui.get("posY"));
+        }
+
+        Color color = Color.DARKCYAN;
+        titlebar.setFill(color);
+
+        getChildren().clear();
+        getChildren().addAll( background, titlebar, caption, vlayout);
     }
 
-    public void addOutput(Output out){
-        outputs.getChildren().add(out);
+    protected void updateConnectable(ConnectableType ctype,JSONObject json){
+        JSONArray jarray = new JSONArray();
+        ObservableList<Node> connectables;
+        if (ctype == ConnectableType.INPUT){
+            connectables = inputs.getChildren();
+            if (json.containsKey("inputs")){
+                jarray = (JSONArray)json.get("inputs");
+            }
+        }else{
+            connectables = outputs.getChildren();
+            if (json.containsKey("outputs")){
+                jarray = (JSONArray)json.get("outputs");
+            }
+        }
+        //remove
+        int size = connectables.size() - jarray.size();
+        for (int i = 0; i < size; ++i){
+            connectables.remove(connectables.size()-1);
+        }
+        //change
+        size = connectables.size();
+        for (int i = 0; i < size; ++i){
+            ((Connectable)connectables.get(i)).configure((JSONObject)jarray.get(i));
+        }
+        //add
+        size = jarray.size()-connectables.size();
+        for (int i = 0; i < size; ++i){
+            JSONObject jobj = (JSONObject)jarray.get(i);
+            if (ctype == ConnectableType.INPUT){
+                connectables.add(new Input(this,jobj));
+            }
+            else{
+                connectables.add(new Output(this,jobj));
+            }
+        }
     }
 
     public Input getInput(String id){
@@ -246,14 +266,10 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         return null;
     }
 
+
+
     public JSONObject getJSONIdentifier(){
-        JSONObject json = new JSONObject();
-        json.put("prefix", Prefix);
-        json.put("name", Name);
-        json.put("id", Appendix);
-        json.put("type", Type);
-        json.put("key", Key);
-        return json;
+        return jID;
     }
 
     public Vector<String> getAsPrefix(){
@@ -294,6 +310,9 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
                         setTranslateX((double)jgui.get("posX"));
                         setTranslateY((double)jgui.get("posY"));
                     }
+                    if (jobj.containsKey("configure")){
+                        configure((JSONObject) jobj.get("configure"));
+                    }
             }
             return;
         }
@@ -310,8 +329,5 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         titlebar.setHeight(20.0f);
         background.setWidth(newValue.getWidth()+10);
         background.setHeight(newValue.getHeight()+vlayout.getTranslateY()+10);
-        Bounds hlayout_bounds = hlayout.getLayoutBounds();
-        //double val = newValue.getWidth()-hlayout.getWidth()-hlayout.getSpacing();
-        //System.out.println("[Module]: test" + val+ " " + hlayout.getWidth());
     }
 }

+ 21 - 50
src/main/java/mdd/client/Processor.java

@@ -1,12 +1,12 @@
 package mdd.client;
 
-import javafx.event.EventHandler;
-import javafx.geometry.Point2D;
 import javafx.scene.Group;
 import javafx.scene.Node;
 import javafx.scene.input.*;
-import javafx.scene.paint.Color;
-import javafx.scene.shape.Line;
+import mdd.client.connectable.Connectable;
+import mdd.client.connectable.Connection;
+import mdd.client.connectable.Input;
+import mdd.client.connectable.Output;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -117,7 +117,6 @@ public class Processor extends Module{
                         }
                     }
                     if (in != null && out != null) {
-                        clearWrongConnections(in, out);
                         JSONObject jmsg = new JSONObject();
                         jmsg.put("operation","add");
                         JSONObject jargs = new JSONObject();
@@ -143,21 +142,6 @@ public class Processor extends Module{
         });
     }
 
-    private void clearWrongConnections(Input in, Output out){
-        if (in != null && out != null) {
-            if (in.isConnected()) {
-                for (int i = 0; i < connections.getChildren().size(); ++i) {
-                    Connection con = (Connection) connections.getChildren().get(i);
-                    if (con.in.equals(in)) {
-                        con.in.setConnected(false);
-                        con.out.setConnected(false);
-                        connections.getChildren().remove(i);
-                    }
-                }
-            }
-        }
-    }
-
     public Module getModule(String id){
         for (Node node : modules.getChildren()){
             if (node instanceof Module){
@@ -191,14 +175,6 @@ public class Processor extends Module{
         }
     }
 
-    public void addModule(Module module){
-        modules.getChildren().add(module);
-    }
-
-    public void addConnection(Connection connection){
-        connections.getChildren().add(connection);
-    }
-
     @Override
     public void processGUIEvent(String event, JSONObject args) {
         super.processGUIEvent(event, args);
@@ -248,9 +224,9 @@ public class Processor extends Module{
             JSONObject jargs = (JSONObject) args.get("args");
             if (!jargs.containsKey("subject")){return;}
             JSONObject jsub = (JSONObject)jargs.get("subject");
-            if (!jsub.get("type").toString().equals(Type)){return;}
-            String id = jsub.get("name").toString()+jsub.get("id").toString();
-            if (!id.equals(ID)){return;}
+            if (!jsub.equals(getJSONIdentifier())){
+                return;
+            }
 
             if (!jargs.containsKey("object")){return;}
             JSONObject jobj = (JSONObject)jargs.get("object");
@@ -262,9 +238,20 @@ public class Processor extends Module{
                             System.out.println(jobj.toString());
                             JSONObject jin = (JSONObject)jobj.get("input");
                             JSONObject jout = (JSONObject)jobj.get("output");
-                            Input in = getModule(((JSONArray)jin.get("prefix")).get(0).toString()).getInput(jin.get("name").toString()+jin.get("id").toString());
-                            Output out = getModule(((JSONArray)jout.get("prefix")).get(0).toString()).getOutput(jout.get("name").toString()+jout.get("id").toString());
-                            clearWrongConnections(in,out);
+                            Input in = getModule(((JSONArray)jin.get("prefix")).get(0).toString()).getInput(jin.get("name").toString()+jin.get("appendix").toString());
+                            Output out = getModule(((JSONArray)jout.get("prefix")).get(0).toString()).getOutput(jout.get("name").toString()+jout.get("appendix").toString());
+                            if (in != null && out != null) {
+                                if (in.isConnected()) {
+                                    for (int i = 0; i < connections.getChildren().size(); ++i) {
+                                        Connection con = (Connection) connections.getChildren().get(i);
+                                        if (con.in.equals(in)) {
+                                            con.in.setConnected(false);
+                                            con.out.setConnected(false);
+                                            connections.getChildren().remove(i);
+                                        }
+                                    }
+                                }
+                            }
                             connections.getChildren().add(new Connection(in, out));
                             break;
                         case "module":
@@ -276,22 +263,6 @@ public class Processor extends Module{
                     }
                     break;
             }
-
-            if (args.containsKey("id")){
-                System.out.println("[Processor] is " + args.get("id").toString() + " == " + getJSONIdentifier());
-                if (args.get("id").equals(getJSONIdentifier())){
-                    if (args.containsKey("add")){
-
-                        JSONObject jadd = (JSONObject)args.get("add");
-                        switch ((String) ((JSONObject) jadd.get("id")).get("type")) {
-                            case "processor" -> modules.getChildren().add(new Processor(jadd));
-                            case "module" -> modules.getChildren().add(new Module(jadd));
-                            case "connection" -> connections.getChildren().add(new Connection());
-                            default -> System.out.println("[Processor] Unexpected value: " + (String) jadd.get("type"));
-                        }
-                    }
-                }
-            }
         }
     }
 }

+ 48 - 46
src/main/java/mdd/client/Connectable.java

@@ -1,4 +1,4 @@
-package mdd.client;
+package mdd.client.connectable;
 
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
@@ -7,6 +7,7 @@ import javafx.beans.value.ObservableValue;
 import javafx.event.Event;
 import javafx.geometry.Bounds;
 import javafx.scene.Group;
+import javafx.scene.control.Label;
 import javafx.scene.input.*;
 import javafx.scene.layout.GridPane;
 import javafx.scene.layout.StackPane;
@@ -14,6 +15,10 @@ import javafx.scene.paint.Color;
 import javafx.scene.shape.Circle;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import mdd.client.ConnectableType;
+import mdd.client.GUIEventHandler;
+import mdd.client.IGUIEventClient;
+import mdd.client.Module;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -22,8 +27,8 @@ import org.json.simple.parser.ParseException;
 import java.util.Vector;
 import java.util.function.DoubleUnaryOperator;
 
-public class Connectable extends GridPane implements IGUIEventClient ,ChangeListener<Number>{
-    private GUIEventHandler _eventHandler;
+public class Connectable extends GridPane implements IGUIEventClient,ChangeListener<Number>{
+    protected GUIEventHandler _eventHandler;
     private Circle _border;
     private Circle _circle;
     private boolean _connected = false;
@@ -34,11 +39,14 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
     private ConnectableType _type;
 
     protected StackPane _connection;
-    protected Text _label;
+    protected Label _label = new Label();
     public String Name = "";
     public String ID = "";
     public long Appendix = 0;
     public Vector<Double> Value = new Vector<>();
+
+    protected JSONObject jID = new JSONObject();
+
     public DoubleProperty x = new SimpleDoubleProperty();
     public DoubleProperty y = new SimpleDoubleProperty();
 
@@ -49,26 +57,10 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
         _parent = parent;
         _type = type;
 
-        if (json.containsKey("name")){
-            Name = (String) json.get("name");
-        }
-        if (json.containsKey("appendix")){
-            Appendix = (long) json.get("appendix");
-        }
-        if (json.containsKey("value")){
-            for (Object o: (JSONArray)json.get("value")) {
-                Value.add((Double)o);
-            }
-        }
-
         setHgap(5);
         setVgap(5);
 
-        ID = Name + Appendix;
-        _label = new Text(Name);
-
-        _label.setFont(new Font("Arial", 15));
-        _label.getStyleClass().add("text");
+        configure(json);
 
         _parent.translateXProperty().addListener(this);
         _parent.translateYProperty().addListener(this);
@@ -94,9 +86,6 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
             _parent.outputs.layoutYProperty().addListener(this);
         }
 
-        layoutXProperty().addListener(this);
-        layoutYProperty().addListener(this);
-
         _border = new Circle(0,0, 7);
         _border.setFill(Color.BLACK);
         _circle = new Circle(0,0,5);
@@ -114,15 +103,8 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
 
         });
 
-        if (_type == ConnectableType.INPUT){
-            add(_connection,0,0);
-        }
-        else{
-            add(_connection,1,0);
-        }
-
         _connection.addEventHandler(MouseEvent.DRAG_DETECTED, e -> {
-            Dragboard db = startDragAndDrop(TransferMode.MOVE);
+            Dragboard db = _connection.startDragAndDrop(TransferMode.MOVE);
             ClipboardContent content = new ClipboardContent();
             JSONObject jmsg = generateJSON();
             content.putString(jmsg.toString());
@@ -179,6 +161,29 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
         });
     }
 
+    public void configure(JSONObject json){
+        if (json.containsKey("value")){
+            Value.clear();
+            for (Object o: (JSONArray)json.get("value")) {
+                Value.add((Double)o);
+            }
+        }
+
+        if (json.containsKey("ID")){
+            jID = (JSONObject)json.get("ID");
+            if (jID.containsKey("name")){
+                Name = (String) jID.get("name");
+            }
+            if (jID.containsKey("appendix")){
+                Appendix = (long) jID.get("appendix");
+            }
+        }
+
+
+        ID = Name + Appendix;
+        _label.setText(Name);
+    }
+
     private void updateColor(){
         if (_connected){
             _circle.setFill(Color.YELLOW);
@@ -206,18 +211,7 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
     }
 
     public JSONObject getJSONIdentifier(){
-        JSONObject json = new JSONObject();
-        json.put("prefix", _parent.getAsPrefix());
-        json.put("name", Name);
-        json.put("id", Appendix);
-        if (_type == ConnectableType.INPUT){
-            json.put("type", "input");
-        }else if(_type == ConnectableType.OUTPUT){
-            json.put("type", "output");
-        }else{
-            json.put("type", "anything");
-        }
-        return json;
+        return jID;
     }
 
     public boolean isConnected(){
@@ -246,6 +240,14 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
         }
     }
 
+    public StackPane getConnector(){
+        return _connection;
+    }
+
+    public Label getLabel(){
+        return _label;
+    }
+
     @Override
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
         double dx, dy;
@@ -258,8 +260,8 @@ public class Connectable extends GridPane implements IGUIEventClient ,ChangeList
              dy =   _parent.outputs.getLayoutY();
         }
         Bounds con_bounds = _connection.getLayoutBounds();
-        x.setValue(dx + _parent.getTranslateX()+ _parent.hlayout.getTranslateX() +  _parent.hlayout.getLayoutX() + _parent.vlayout.getTranslateX() + _parent.vlayout.getLayoutX() + getLayoutX() + _connection.getLayoutX() + con_bounds.getWidth()/2);
-        y.setValue(dy + _parent.getTranslateY()+ _parent.hlayout.getTranslateY() +  _parent.hlayout.getLayoutY()+  _parent.vlayout.getTranslateY() + _parent.vlayout.getLayoutY() + getLayoutY() + _connection.getLayoutY() + con_bounds.getHeight()/2);
+        x.setValue(dx + _parent.getTranslateX()+ _parent.hlayout.getTranslateX() +  _parent.hlayout.getLayoutX() + _parent.vlayout.getTranslateX() + _parent.vlayout.getLayoutX() + _connection.getLayoutX() + con_bounds.getWidth()/2  + getLayoutX());
+        y.setValue(dy + _parent.getTranslateY()+ _parent.hlayout.getTranslateY() +  _parent.hlayout.getLayoutY()+  _parent.vlayout.getTranslateY() + _parent.vlayout.getLayoutY() + _connection.getLayoutY() + con_bounds.getHeight()/2 + getLayoutX());
     }
 
     @Override

+ 5 - 1
src/main/java/mdd/client/Connection.java

@@ -1,6 +1,10 @@
-package mdd.client;
+package mdd.client.connectable;
 
 import javafx.scene.shape.Line;
+import mdd.client.GUIEventHandler;
+import mdd.client.IGUIEventClient;
+import mdd.client.connectable.Input;
+import mdd.client.connectable.Output;
 import org.json.simple.JSONObject;
 
 

+ 80 - 0
src/main/java/mdd/client/connectable/Input.java

@@ -0,0 +1,80 @@
+package mdd.client.connectable;
+
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyCode;
+import mdd.client.ConnectableType;
+import mdd.client.Module;
+import org.json.simple.JSONObject;
+
+public class Input  extends Connectable {
+    private TextField _input;
+
+    public Input(Module parent, JSONObject json){
+        super(parent, ConnectableType.INPUT, json);
+        add(_connection,0,0);
+        add(_label,1,0);
+        add(_input,1,1);
+
+        _input.setPrefWidth(50);
+
+        _input.setOnKeyPressed(event -> {
+            if (event.getCode().equals(KeyCode.ENTER)) {
+                JSONObject jvalue = new JSONObject();
+                jvalue.put("value", _input.getText());
+                JSONObject jmsg = new JSONObject();
+                jmsg.put("operation", "change");
+                JSONObject jargs = new JSONObject();
+                jargs.put("subject",  getJSONIdentifier());
+                jargs.put("object",   jvalue);
+                jmsg.put("args", jargs);
+                _eventHandler.publishEvent("try", jmsg);
+            }
+        });
+
+    }
+
+    @Override
+    public void configure(JSONObject json){
+        super.configure(json);
+        if (_input == null){
+            _input = new TextField("");
+        }
+        _input.setText(Value.toString());
+    }
+
+    public TextField getInput(){
+        return _input;
+    }
+
+    public void setConnected(boolean state){
+        super.setConnected(state);
+        _input.setVisible(!state);
+        _input.setManaged(!state);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+        super.processGUIEvent(event, args);
+        if (event.equals("change")){
+            if (!args.containsKey("args")){
+                return;
+            }
+            JSONObject jargs = (JSONObject) args.get("args");
+            if (!jargs.containsKey("subject")){
+                return;
+            }
+            JSONObject jsub = (JSONObject) jargs.get("subject");
+            if (!jsub.equals(getJSONIdentifier())){
+                return;
+            }
+            if (!args.containsKey("operation")){
+                return;
+            }
+            JSONObject jobj = (JSONObject) jargs.get("object");
+            if (jobj.containsKey("value")){
+                _input.setText(jobj.get("value").toString());
+            }
+        }
+    }
+}

+ 5 - 4
src/main/java/mdd/client/Output.java

@@ -1,14 +1,15 @@
-package mdd.client;
+package mdd.client.connectable;
 
-import javafx.scene.paint.Color;
-import javafx.scene.text.Font;
-import javafx.scene.text.Text;
+import mdd.client.ConnectableType;
+import mdd.client.Module;
+import mdd.client.connectable.Connectable;
 import org.json.simple.JSONObject;
 
 public class Output extends Connectable {
 
     public Output(Module parent, JSONObject json){
         super(parent, ConnectableType.OUTPUT, json);
+        add(_connection,1,0);
         add(_label,0,0);
     }