Willi Zschiebsch 4 年之前
父節點
當前提交
77f3a25bd5

+ 49 - 12
src/main/java/mdd/client/Client.java

@@ -1,5 +1,9 @@
 package mdd.client;
 
+import javafx.application.Platform;
+import javafx.concurrent.Service;
+import javafx.concurrent.Task;
+import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
@@ -7,23 +11,35 @@ import org.zeromq.SocketType;
 import org.zeromq.ZMQ;
 import org.zeromq.ZContext;
 
+import java.util.concurrent.CountDownLatch;
+
 public class Client implements IGUIEventClient
 {
     private ZContext context;
     private ZMQ.Socket req_socket;
     private ZMQ.Socket sub_socket;
-    private long server_id;
+    private long server_id = 0;
     private long msg_counter = 0;
     private Thread listenerThread;
     private GUIEventHandler _eventHandler;
 
-    private void request_state(){
+    static Client client = new Client();
+
+    public void request_state(){
         JSONObject json = new JSONObject();
-        json.put("state", "all");
+        json.put("operation", "state");
+        json.put("args", "all");
         JSONObject jmsg = request("get",json);
         server_id = (long)jmsg.get("serverID");
         msg_counter = (long) jmsg.get("msgNr");
-        System.out.println("TEST");
+        if (jmsg.containsKey("receive"))
+        {
+            JSONObject jstate = (JSONObject)jmsg.get("receive");
+            System.out.println("[Client]: state: " + jstate.toString());
+            _eventHandler.publishEvent("load", (JSONObject)jstate.get("args"));
+        }
+
+        //System.out.println("State : " + jmsg.toString());
     }
 
     private void listen(){
@@ -43,9 +59,18 @@ public class Client implements IGUIEventClient
 
             if ((long) jmsg.get("serverID") == server_id){
                 if ((long) jmsg.get("msgNr") == msg_counter) {
-                    _eventHandler.publishEvent("change", jmsg);
-                    System.out.println("[Client] "+ "change: " + jmsg.toString());
-                    ++msg_counter;
+                    //<--close Thread
+
+                    JSONObject finalJmsg = jmsg;
+                    Platform.runLater(new Runnable() {
+                                          @Override
+                                          public void run() {
+                                              _eventHandler.publishEvent("change", (JSONObject) finalJmsg.get("change"));//<--do in main Thread
+                                              System.out.println("[Client] " + "change: " + finalJmsg.toString());
+                                              ++msg_counter;
+                                          }
+                                      });
+                    //<--reopen Thread
                 } else {
                     request_state();
                 }
@@ -85,22 +110,32 @@ public class Client implements IGUIEventClient
         } catch (ParseException e) {
             e.printStackTrace();
         }
+        //System.out.println("[Client]: request: "+ jmsg.toString());
         return jmsg;
     }
 
     public JSONObject request(String flag, JSONObject json){
-        JSONObject args = new JSONObject();
-        args.put(flag, json);
-        return request(args);
+        JSONObject jmsg = new JSONObject();
+        jmsg.put("serverID", server_id);
+        jmsg.put("msgNr", msg_counter);
+        jmsg.put("protocol", "0.1");
+
+        JSONArray jcontext = new JSONArray();
+        JSONObject jelem = new JSONObject();
+        jelem.put(flag, json);
+        jcontext.add(jelem);
+        jmsg.put("context", jcontext);
+        return request(jmsg);
     }
 
     @Override
     public void processGUIEvent(String event, JSONObject args) {
         if (event.equals("try")){
-            request("try",args);
+            JSONObject jans = request("try",args);
         }
         if (event.equals("get")){
-            _eventHandler.publishEvent("receive", request("get", args));
+            JSONObject jans = request("get",  args);
+            _eventHandler.publishEvent("receive", (JSONObject)jans.get("receive"));
         }
     }
 
@@ -110,4 +145,6 @@ public class Client implements IGUIEventClient
         //close Server
         _eventHandler.removeEventListener(this);
     }
+
+    public long getID(){return server_id;}
 }

+ 42 - 19
src/main/java/mdd/client/Connectable.java

@@ -5,12 +5,8 @@ import javafx.beans.property.SimpleDoubleProperty;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.event.Event;
-import javafx.event.EventHandler;
-import javafx.geometry.Point2D;
 import javafx.scene.Group;
-import javafx.scene.control.TextField;
 import javafx.scene.input.*;
-import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Circle;
 import javafx.scene.text.Font;
@@ -20,6 +16,9 @@ import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
+import java.util.Vector;
+import java.util.function.DoubleUnaryOperator;
+
 public class Connectable extends Group implements IGUIEventClient ,ChangeListener<Number>{
     private GUIEventHandler _eventHandler;
     private Circle _border;
@@ -29,17 +28,38 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
     private Module _parent;
     private ConnectableType _type;
 
+    protected Text _label;
+    public String Name = "";
     public String ID = "";
+    public int Appendix = 0;
+    public Vector<Double> Value = new Vector<>();
     public DoubleProperty x = new SimpleDoubleProperty();
     public DoubleProperty y = new SimpleDoubleProperty();
 
 
-    public Connectable(Module parent, ConnectableType type, String id){
+    public Connectable(Module parent, ConnectableType type, JSONObject json){
         _eventHandler = GUIEventHandler.getEventHandler();
         _eventHandler.addEventListener(this);
         _parent = parent;
         _type = type;
-        ID = id;
+
+        if (json.containsKey("name")){
+            Name = (String) json.get("name");
+        }
+        if (json.containsKey("id")){
+            Appendix = (int) json.get("id");
+        }
+        if (json.containsKey("value")){
+            for (Object o: (JSONArray)json.get("value")) {
+                Value.add((Double)o);
+            }
+        }
+
+        ID = Name + Appendix;
+        _label = new Text(Name);
+
+        _label.setFont(new Font("Arial", 15));
+        _label.getStyleClass().add("text");
 
         _parent.translateXProperty().addListener(this);
         _parent.translateYProperty().addListener(this);
@@ -47,6 +67,9 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
         _parent.hlayout.translateXProperty().addListener(this);
         _parent.hlayout.translateYProperty().addListener(this);
 
+        _parent.vlayout.translateXProperty().addListener(this);
+        _parent.vlayout.translateYProperty().addListener(this);
+
         if (_type == ConnectableType.INPUT){
             _parent.inputs.layoutXProperty().addListener(this);
             _parent.inputs.layoutYProperty().addListener(this);
@@ -79,11 +102,11 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
         _circle.addEventHandler(MouseEvent.DRAG_DETECTED, e -> {
             Dragboard db = startDragAndDrop(TransferMode.MOVE);
             ClipboardContent content = new ClipboardContent();
-            JSONObject json = generateJSON();
-            content.putString(json.toString());
-            System.out.println("[Connectable]: started drag with id = " + json.toString());
+            JSONObject jmsg = generateJSON();
+            content.putString(jmsg.toString());
+            System.out.println("[Connectable]: started drag with id = " + jmsg.toString());
             db.setContent(content);
-            _eventHandler.publishEvent("DRAG_LINE", json);
+            _eventHandler.publishEvent("DRAG_LINE", jmsg);
             e.consume();
         });
 
@@ -102,14 +125,14 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
             boolean success = false;
             if (db.hasString()) {
                 JSONParser parser = new JSONParser();
-                JSONObject json = null;
+                JSONObject jmsg = null;
                 try {
-                    json = (JSONObject)parser.parse(db.getString());
+                    jmsg = (JSONObject)parser.parse(db.getString());
                 } catch (ParseException parseException) {
                     parseException.printStackTrace();
                 }
                 JSONArray jsonList = new JSONArray();
-                jsonList.add(json);
+                jsonList.add(jmsg);
                 jsonList.add(generateJSON());
 
                 ClipboardContent content = new ClipboardContent();
@@ -154,7 +177,7 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
             json.put("type", "ANYTHING");
         }
 
-        json.put("ID", ID);
+        json.put("ID", Name + Appendix);
         json.put("parent", _parent.ID);
 
         return json;
@@ -169,13 +192,13 @@ public class Connectable extends Group implements IGUIEventClient ,ChangeListene
 
     @Override
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
-        if (_type == ConnectableType.INPUT){
-            x.setValue(_parent.getTranslateX()+_parent.inputs.getLayoutX()+_parent.hlayout.getTranslateX()+getLayoutX());
-            y.setValue(_parent.getTranslateY()+_parent.inputs.getLayoutY()+_parent.hlayout.getTranslateY()+getLayoutY());
+        if (_type == ConnectableType.INPUT) {
+            x.setValue(_parent.getTranslateX() + _parent.inputs.getTranslateX() + _parent.inputs.getLayoutX() + _parent.hlayout.getTranslateX() +  _parent.hlayout.getLayoutX()  + _parent.vlayout.getTranslateX() +  _parent.vlayout.getLayoutX() + getLayoutX());
+            y.setValue(_parent.getTranslateY() + _parent.inputs.getLayoutY() + _parent.hlayout.getTranslateY() +  _parent.hlayout.getLayoutY() + _parent.vlayout.getTranslateY() + _parent.vlayout.getLayoutY() + getLayoutY());
         }
         else{
-            x.setValue(_parent.getTranslateX()+_parent.outputs.getLayoutX()+_parent.hlayout.getTranslateX()+getLayoutX());
-            y.setValue(_parent.getTranslateY()+_parent.outputs.getLayoutY()+_parent.hlayout.getTranslateY()+getLayoutY());
+            x.setValue(_parent.getTranslateX() + _parent.outputs.getTranslateX() + _parent.outputs.getLayoutX() + _parent.hlayout.getTranslateX() +  _parent.hlayout.getLayoutX() + _parent.vlayout.getTranslateX() + _parent.vlayout.getLayoutX() + getLayoutX());
+            y.setValue(_parent.getTranslateY() + _parent.outputs.getLayoutY() + _parent.hlayout.getTranslateY() +  _parent.hlayout.getLayoutY() + _parent.vlayout.getTranslateY() + _parent.vlayout.getLayoutY() + getLayoutY());
         }
     }
 

+ 1 - 1
src/main/java/mdd/client/GUIMain.java

@@ -18,7 +18,7 @@ import java.io.IOException;
 
 public class GUIMain extends Application implements IGUIEventClient{
     private GUIEventHandler _eventHandler;
-    private Client client = new Client();
+    private Client client = Client.client;
 
     public static void main(String[] args) {
         launch(args);

+ 4 - 7
src/main/java/mdd/client/Input.java

@@ -5,18 +5,15 @@ 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 Text _label;
     private TextField _input;
 
-    public Input(Module parent, String id){
-        super(parent, ConnectableType.INPUT, id);
-        _label = new Text("TEST");
-        _label.setFont(new Font("Arial", 15));
-        _label.getStyleClass().add("text");
+    public Input(Module parent, JSONObject json){
+        super(parent, ConnectableType.INPUT, json);
 
-        _input = new TextField("{1, 2, 3}");
+        _input = new TextField(Value.toString());
         _input.setPrefWidth(50);
 
         VBox vbox = new VBox(_label, _input);

+ 104 - 39
src/main/java/mdd/client/Module.java

@@ -1,37 +1,109 @@
 package mdd.client;
 
 
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.geometry.Bounds;
 import javafx.geometry.Point2D;
 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.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.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 
+import javax.swing.*;
 import java.util.Vector;
 
 
-public class Module extends Group implements IGUIEventClient{
+public class Module extends Group implements IGUIEventClient, ChangeListener<Bounds> {
     private boolean _dragged = false;
     private Point2D _pos = new Point2D(0.0f,0.0f);
+    private Rectangle titlebar;
+    private Rectangle background;
+    private Text caption;
     protected GUIEventHandler _eventHandler;
 
-    public String ID = "";
+    public String Name = "TEST";
+    public String ID = "TEST-1";
     public Vector<String> Prefix;
+
     protected String Type = "module";
-    public HBox hlayout = new HBox();
+    protected String Key = "";
+
+    public VBox vlayout = new VBox();
+    GridPane configs = new GridPane();
+    public BorderPane hlayout = new BorderPane();
     public VBox inputs = new VBox();
     public VBox outputs = new VBox();
     public boolean isSelected = false;
 
-    private void init(Color color){
+    public Module(JSONObject json){
+        Name = json.get("name").toString();
+        ID = Name + json.get("id").toString();
+        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")){
+                        options.add(opt.toString());
+                    }
+                    configs.add(new ComboBox(options),1,counter);
+                }
+                else{
+                    configs.add(new TextField(jconfig.get("value").toString()),1,counter);
+                }
+                configs.getChildren().add(hbox);
+                ++counter;
+            }
+        }
+
+        Color color = Color.DARKCYAN;
+
         setFocusTraversable(true);
         _eventHandler = GUIEventHandler.getEventHandler();
         _eventHandler.addEventListener(this);
@@ -40,33 +112,37 @@ public class Module extends Group implements IGUIEventClient{
 
         outputs.setSpacing(10);
 
-
-        hlayout.getChildren().addAll(inputs, outputs);
-        hlayout.setSpacing(20);
-        hlayout.setTranslateX(-7);
-        hlayout.setTranslateY(30);
+        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());
-        Rectangle titlebar;
-        Rectangle background;
-        Text caption;
 
-        titlebar = new Rectangle(0.0f, 0.0f, 150-20, 20.0f);
+
+        //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);
-        background = new Rectangle(0.0f, 0.0f, 150-20, 150 + 40);
+        //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);
         background.setArcHeight(10.0f);
         background.setFill(Color.GRAY);
-        caption = new Text("TEST");
+        caption = new Text(Name);
         caption.setFont(new Font("Arial", 15));
         caption.getStyleClass().add("text");
         caption.setX(10);
         caption.setY(15);
 
 
-        getChildren().addAll( background, titlebar, caption, hlayout);
+        getChildren().addAll( background, titlebar, caption, vlayout);
 
 
 
@@ -96,30 +172,8 @@ public class Module extends Group implements IGUIEventClient{
 
             }
         });
-    }
-
-    public static Module DefaultModule(){
-        return new Module(new Vector<String>(), "", Color.DARKBLUE);
-    }
-
-
-    public Module(JSONObject json){
-        init(Color.DARKCYAN);
-    }
-
-    public Module(Vector<String> prefix, String id, Color color){
-        Prefix = prefix;
-        ID = id;
-
-        addInput(new Input(this,"1"));
-        addInput(new Input(this,"2"));
-        addInput(new Input(this,"3"));
 
-        addOutput(new Output(this,"1"));
-        addOutput(new Output(this,"2"));
-        addOutput(new Output(this,"3"));
-
-        init(color);
+        vlayout.layoutBoundsProperty().addListener(this);
     }
 
     public void addInput(Input in){
@@ -190,4 +244,15 @@ public class Module extends Group implements IGUIEventClient{
     public void close() throws Exception {
         _eventHandler.removeEventListener(this);
     }
+
+    @Override
+    public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) {
+        titlebar.setWidth(newValue.getWidth()+10);
+        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());
+    }
 }

+ 3 - 6
src/main/java/mdd/client/Output.java

@@ -3,15 +3,12 @@ package mdd.client;
 import javafx.scene.paint.Color;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import org.json.simple.JSONObject;
 
 public class Output extends Connectable {
-    private Text _label;
 
-    public Output(Module parent, String id){
-        super(parent, ConnectableType.OUTPUT, id);
-        _label = new Text("TEST");
-        _label.setFont(new Font("Arial", 15));
-        _label.getStyleClass().add("text");
+    public Output(Module parent, JSONObject json){
+        super(parent, ConnectableType.OUTPUT, json);
         _label.setTranslateX(-50);
         _label.setTranslateY(7);
         getChildren().add(_label);

+ 52 - 39
src/main/java/mdd/client/Processor.java

@@ -25,8 +25,21 @@ public class Processor extends Module{
     public Connection temp_connection = new Connection();
     private Connectable connectable;
 
-    private void init(){
+    public Processor(JSONObject json){
+        super(json);
         Type = "processor";
+
+        if (json.containsKey("modules")){
+            for (Object o : (JSONArray) json.get("modules")){
+                JSONObject jobj = (JSONObject) o;
+                if (jobj.get("type").equals("module")){
+                    modules.getChildren().add(new Module(jobj));
+                }else if(jobj.get("type").equals("processor")){
+                    modules.getChildren().add(new Processor(jobj));
+                }
+            }
+        }
+
         modules.addEventHandler(MouseEvent.DRAG_DETECTED, e -> {
             // System.out.println("[Module]: dragg event detected!");
             if(e.getButton() == MouseButton.PRIMARY) {
@@ -75,31 +88,26 @@ public class Processor extends Module{
 
                 assert jsonList != null;
                 if (jsonList.size() == 2){
-
-                    boolean foundInput = false;
-                    boolean foundOutput = false;
-                    Input in = new Input(this, "-1");
-                    Output out = new Output(this, "-1");
+                    Input in = null;
+                    Output out = null;
                     for (Object o : jsonList) {
-                        JSONObject json = (JSONObject) o;
-                        if (json.containsKey("type")) {
-                            String type = json.get("type").toString();
+                        JSONObject jobj = (JSONObject) o;
+                        if (jobj.containsKey("type")) {
+                            String type = jobj.get("type").toString();
                             if (type.equals("INPUT")) {
                                 System.out.println("[Processor] Dropped found type = " + "INPUT");
-                                foundInput = true;
-                                in = getModule(json.get("parent").toString()).getInput(json.get("ID").toString());
+                                in = getModule(jobj.get("parent").toString()).getInput(jobj.get("ID").toString());
                             } else if (type.equals("OUTPUT")) {
                                 System.out.println("[Processor] Dropped found type = " + "OUTPUT");
-                                foundOutput = true;
-                                out = getModule(json.get("parent").toString()).getOutput(json.get("ID").toString());
+                                out = getModule(jobj.get("parent").toString()).getOutput(jobj.get("ID").toString());
                             }
                         }
                     }
-                    if (foundInput && foundOutput){
+                    if (in != null && out != null) {
                         System.out.println("[Processor] Dropped: success!");
-                        if(in.connected){
-                            for (int i = 0; i < connections.getChildren().size(); ++i){
-                                if (((Connection)connections.getChildren().get(i)).in.equals(in)){
+                        if (in.connected) {
+                            for (int i = 0; i < connections.getChildren().size(); ++i) {
+                                if (((Connection) connections.getChildren().get(i)).in.equals(in)) {
                                     connections.getChildren().remove(i);
                                 }
                             }
@@ -118,16 +126,6 @@ public class Processor extends Module{
         });
     }
 
-    public Processor(JSONObject json){
-        super(json);
-        init();
-    }
-
-    public Processor(Vector<String> prefix, String id) {
-        super(prefix, id, Color.DARKVIOLET);
-        init();
-    }
-
     public Module getModule(String id){
         for (Node node : modules.getChildren()){
             if (node instanceof Module){
@@ -162,10 +160,6 @@ public class Processor extends Module{
     }
 
     public void addModule(Module module){
-        JSONObject json = new JSONObject();
-        json.put("id", getJSONIdentifier());
-        json.put("add", module.getJSONIdentifier());
-        _eventHandler.publishEvent("try", json);
         modules.getChildren().add(module);
     }
 
@@ -178,6 +172,7 @@ public class Processor extends Module{
         super.processGUIEvent(event, args);
         if (isSelected){
             if (event.equals("KeyTyped")){
+                if (!args.containsKey("key")){return;}
                 String key = args.get("key").toString();
                 if (key.equals("ENTER")){
                     JSONObject json = new JSONObject();
@@ -214,15 +209,33 @@ public class Processor extends Module{
             }
         }
         if (event.equals("change")){
-            /*
-            "{
-            "id":{...},
-            "add":
-                {
+            if (!args.containsKey("operation")){return;}
+            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 (!jargs.containsKey("object")){return;}
+            JSONObject jobj = (JSONObject)jargs.get("object");
+            switch (args.get("operation").toString()){
+                case "add":
+                    switch (jobj.get("type").toString()){
+                        case "connection":
+                            //Connection connection = new Connection(jobj);
+                            //addConnection(connection);
+                            break;
+                        case "module":
+                            modules.getChildren().add(new Module(jobj));
+                            break;
+                        case "processor":
+                            modules.getChildren().add(new Processor(jobj));
+                            break;
+                    }
+                    break;
+            }
 
-                }
-            }"
-             */
             if (args.containsKey("id")){
                 System.out.println("[Processor] is " + args.get("id").toString() + " == " + getJSONIdentifier());
                 if (args.get("id").equals(getJSONIdentifier())){

+ 30 - 0
src/main/java/mdd/client/Tool.java

@@ -0,0 +1,30 @@
+package mdd.client;
+
+import javafx.scene.control.Label;
+import javafx.scene.input.ClipboardContent;
+import javafx.scene.input.Dragboard;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.input.TransferMode;
+import org.json.simple.JSONObject;
+
+public class Tool extends Label {
+    private JSONObject _context = new JSONObject();
+
+    public Tool(JSONObject json){
+        super(json.get("key").toString());
+        _context = json;
+        addEventHandler(MouseEvent.DRAG_DETECTED, e -> {
+            Dragboard db = startDragAndDrop(TransferMode.MOVE);
+            ClipboardContent content = new ClipboardContent();
+
+            JSONObject jmsg = new JSONObject();
+            jmsg.put("server", Client.client.getID());
+            jmsg.put("add", _context);
+
+            content.putString(jmsg.toString());
+            System.out.println("[Tool]: started drag with context = " + jmsg.toString());
+            db.setContent(content);
+            e.consume();
+        });
+    }
+}

+ 22 - 8
src/main/java/mdd/client/Toolbox.java

@@ -5,6 +5,10 @@ import javafx.scene.control.Accordion;
 import javafx.scene.control.Label;
 import javafx.scene.control.ScrollPane;
 import javafx.scene.control.TitledPane;
+import javafx.scene.input.ClipboardContent;
+import javafx.scene.input.Dragboard;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.input.TransferMode;
 import javafx.scene.layout.GridPane;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
@@ -29,9 +33,14 @@ public class Toolbox extends ScrollPane implements IGUIEventClient{
         accordion.getPanes().add(pane1);
         accordion.getPanes().add(pane2);
 
+
         JSONObject json = new JSONObject();
-        json.put("module", "all");
-        json.put("process", "all");
+        JSONObject jargs = new JSONObject();
+
+        jargs.put("module", "all");
+        jargs.put("processor", "all");
+        json.put("operation", "state");
+        json.put("args", jargs);
 
         _eventhandler.publishEvent("get", json);
 
@@ -47,18 +56,23 @@ public class Toolbox extends ScrollPane implements IGUIEventClient{
     @Override
     public void processGUIEvent(String event, JSONObject args) {
         if (event.equals("receive")){
-            if (args.containsKey("module")){
-                JSONArray array = (JSONArray) args.get("module");
+            if (!args.containsKey("operation")){ return; }
+            if (!args.get("operation").toString().equals("state")){ return; }
+            JSONObject jargs = (JSONObject)args.get("args");
+            if (jargs.containsKey("module")){
+                JSONArray array = (JSONArray) jargs.get("module");
                 gridpane_modules.getChildren().clear();
                 for (int i = 0; i < array.size(); i++){
-                    gridpane_modules.add(new Label((String)array.get(i)),0,i);
+                    Tool tool = new Tool((JSONObject) array.get(i));
+                    gridpane_modules.add(tool,0,i);
                 }
             }
-            if (args.containsKey("process")){
-                JSONArray array = (JSONArray) args.get("process");
+            if (jargs.containsKey("processor")){
+                JSONArray array = (JSONArray) jargs.get("processor");
                 gridpane_processors.getChildren().clear();
                 for (int i = 0; i < array.size(); i++){
-                    gridpane_processors.add(new Label((String)array.get(i)),0,i);
+                    Tool tool = new Tool((JSONObject) array.get(i));
+                    gridpane_processors.add(tool,0,i);
                 }
             }
         }

+ 35 - 2
src/main/java/mdd/client/WorkBench.java

@@ -3,9 +3,10 @@ package mdd.client;
 import javafx.geometry.Point2D;
 import javafx.scene.control.ScrollPane;
 import javafx.scene.control.Tab;
-import javafx.scene.input.MouseButton;
-import javafx.scene.input.MouseEvent;
+import javafx.scene.input.*;
 import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
 
 public class WorkBench extends Tab implements IGUIEventClient{
     private ScrollPane _scrollPane;
@@ -23,6 +24,38 @@ public class WorkBench extends Tab implements IGUIEventClient{
         _scrollPane = new ScrollPane(_processor.all);
         setContent(_scrollPane);
         //setContent(_processor.all);
+
+        _scrollPane.addEventHandler(DragEvent.DRAG_DROPPED, e -> {
+            Dragboard db = e.getDragboard();
+            boolean success = false;
+            if (db.hasString()) {
+                JSONParser parser = new JSONParser();
+                JSONObject json = null;
+                try {
+                    json = (JSONObject)parser.parse(db.getString());
+                } catch (ParseException parseException) {
+                    parseException.printStackTrace();
+                }
+                if (json.containsKey("server")){
+                    if(json.get("server").equals(Client.client.getID())){
+                        if(json.containsKey("add")){
+                            //System.out.println("[WorkBench]: Drag detected: " + json.toString());
+                            JSONObject jmsg = new JSONObject();
+                            jmsg.put("operation", "add");
+                            JSONObject jargs = new JSONObject();
+                            jargs.put("subject",  _processor.getJSONIdentifier());
+                            jargs.put("object",   json.get("add"));
+                            jmsg.put("args", jargs);
+                            _eventHandler.publishEvent("try", jmsg);
+                            success = true;
+                        }
+                    }
+                }
+
+            }
+            e.setDropCompleted(success);
+            e.consume();
+        });
     }
 
     @Override

+ 32 - 25
src/main/java/mdd/client/Workshop.java

@@ -3,10 +3,12 @@ package mdd.client;
 import javafx.collections.ObservableList;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
-import javafx.scene.input.MouseButton;
-import javafx.scene.input.MouseEvent;
+import javafx.scene.input.*;
 import javafx.scene.paint.Color;
+import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
 
 import java.util.Vector;
 
@@ -19,30 +21,29 @@ public class Workshop extends TabPane implements IGUIEventClient {
         super();
         _eventHandler = GUIEventHandler.getEventHandler();
         _eventHandler.addEventListener(this);
-        loadExample();
-        showMainProcessor();
-    }
-
-    private void loadExample(){
-        _main_processor = new Processor(new Vector<String>(),"0");
-        System.out.println("[Workshop] " + _main_processor.getJSONIdentifier().toString());
-        _main_processor.addModule(new Module(_main_processor.getAsPrefix(), "1", Color.DODGERBLUE));
-        _main_processor.addModule(new Module(_main_processor.getAsPrefix(),"2", Color.DARKRED));
-
-        Processor processor3 = new Processor(_main_processor.getAsPrefix(),"3");
-
-        Processor processor4 = new Processor(processor3.getAsPrefix(),"4");
-        processor4.addModule(new Module(processor4.getAsPrefix(),"5", Color.DODGERBLUE));
-        processor4.addModule(new Module(processor4.getAsPrefix(),"6", Color.DARKRED));
-        processor4.addModule(new Module(processor4.getAsPrefix(),"7", Color.DODGERBLUE));
-        processor4.addConnection(new Connection(processor4.getModule("5").getInput("1"), processor4.getModule("6").getOutput("1")));
-        processor4.addConnection(new Connection(processor4.getModule("7").getInput("3"), processor4.getModule("5").getOutput("2")));
-
-        processor3.addModule(processor4);
 
-        _main_processor.addModule(processor3);
-
-        _main_processor.addConnection(new Connection(_main_processor.getModule("1").getInput("1"), _main_processor.getModule("3").getOutput("1")));
+        addEventHandler(DragEvent.DRAG_OVER, e -> {
+            Dragboard db = e.getDragboard();
+            if (db.hasString()) {
+                JSONParser parser = new JSONParser();
+                JSONObject json = null;
+                try {
+                    json = (JSONObject)parser.parse(db.getString());
+                } catch (ParseException parseException) {
+                    parseException.printStackTrace();
+                }
+                if (json.containsKey("server")){
+                    if(json.get("server").equals(Client.client.getID())){
+                        e.acceptTransferModes(TransferMode.MOVE);
+                    }
+                }
+            }
+            e.consume();
+        });
+        Client.client.request_state();
+        //loadExample();
+        //_main_processor = new Processor(new Vector<String>(),"0");
+        //showMainProcessor();
     }
 
     public void showMainProcessor(){
@@ -84,5 +85,11 @@ public class Workshop extends TabPane implements IGUIEventClient {
             }
 
         }
+        if (event == "load"){
+            System.out.println("[Workshop]: load " +args.toString());
+            _main_processor = new Processor(args);
+            showMainProcessor();
+        }
+
     }
 }