Explorar o código

drawing Connection work

Willi Zschiebsch %!s(int64=4) %!d(string=hai) anos
pai
achega
aff5db51e3
Modificáronse 38 ficheiros con 564 adicións e 92 borrados
  1. BIN=BIN
      .gradle/6.5.1/executionHistory/executionHistory.bin
  2. BIN=BIN
      .gradle/6.5.1/executionHistory/executionHistory.lock
  3. BIN=BIN
      .gradle/6.5.1/fileHashes/fileHashes.bin
  4. BIN=BIN
      .gradle/6.5.1/fileHashes/fileHashes.lock
  5. BIN=BIN
      .gradle/6.5.1/javaCompile/classAnalysis.bin
  6. BIN=BIN
      .gradle/6.5.1/javaCompile/javaCompile.lock
  7. BIN=BIN
      .gradle/6.5.1/javaCompile/taskHistory.bin
  8. BIN=BIN
      .gradle/buildOutputCleanup/buildOutputCleanup.lock
  9. BIN=BIN
      .gradle/checksums/checksums.lock
  10. BIN=BIN
      .gradle/checksums/md5-checksums.bin
  11. BIN=BIN
      .gradle/checksums/sha1-checksums.bin
  12. 1 1
      build.gradle
  13. BIN=BIN
      build/classes/java/main/mdd/client/Connectable$1.class
  14. BIN=BIN
      build/classes/java/main/mdd/client/Connectable.class
  15. BIN=BIN
      build/classes/java/main/mdd/client/ConnectableType.class
  16. BIN=BIN
      build/classes/java/main/mdd/client/Connection.class
  17. BIN=BIN
      build/classes/java/main/mdd/client/FXMLDocumentController.class
  18. BIN=BIN
      build/classes/java/main/mdd/client/GUIEventHandler.class
  19. BIN=BIN
      build/classes/java/main/mdd/client/IGUIEventClient.class
  20. BIN=BIN
      build/classes/java/main/mdd/client/Input.class
  21. BIN=BIN
      build/classes/java/main/mdd/client/Module.class
  22. BIN=BIN
      build/classes/java/main/mdd/client/Output.class
  23. BIN=BIN
      build/classes/java/main/mdd/client/Processor.class
  24. BIN=BIN
      build/classes/java/main/mdd/client/WorkBench.class
  25. 8 8
      build/resources/main/mdd/client/main.fxml
  26. 18 8
      build/tmp/compileJava/source-classes-mapping.txt
  27. 141 6
      src/main/java/mdd/client/Connectable.java
  28. 1 0
      src/main/java/mdd/client/ConnectableType.java
  29. 38 1
      src/main/java/mdd/client/Connection.java
  30. 7 15
      src/main/java/mdd/client/FXMLDocumentController.java
  31. 28 0
      src/main/java/mdd/client/GUIEventHandler.java
  32. 9 0
      src/main/java/mdd/client/IGUIEventClient.java
  33. 8 2
      src/main/java/mdd/client/Input.java
  34. 114 39
      src/main/java/mdd/client/Module.java
  35. 2 2
      src/main/java/mdd/client/Output.java
  36. 122 1
      src/main/java/mdd/client/Processor.java
  37. 59 1
      src/main/java/mdd/client/WorkBench.java
  38. 8 8
      src/main/resources/mdd/client/main.fxml

BIN=BIN
.gradle/6.5.1/executionHistory/executionHistory.bin


BIN=BIN
.gradle/6.5.1/executionHistory/executionHistory.lock


BIN=BIN
.gradle/6.5.1/fileHashes/fileHashes.bin


BIN=BIN
.gradle/6.5.1/fileHashes/fileHashes.lock


BIN=BIN
.gradle/6.5.1/javaCompile/classAnalysis.bin


BIN=BIN
.gradle/6.5.1/javaCompile/javaCompile.lock


BIN=BIN
.gradle/6.5.1/javaCompile/taskHistory.bin


BIN=BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock


BIN=BIN
.gradle/checksums/checksums.lock


BIN=BIN
.gradle/checksums/md5-checksums.bin


BIN=BIN
.gradle/checksums/sha1-checksums.bin


+ 1 - 1
build.gradle

@@ -17,7 +17,7 @@ repositories {
 dependencies {
     testCompile group: 'junit', name: 'junit', version: '4.12'
     compile group: 'org.zeromq', name: 'jeromq', version: '0.5.2'
-    compile 'org.json:json:20171018'
+    compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'
 }
 
 javafx {

BIN=BIN
build/classes/java/main/mdd/client/Connectable$1.class


BIN=BIN
build/classes/java/main/mdd/client/Connectable.class


BIN=BIN
build/classes/java/main/mdd/client/ConnectableType.class


BIN=BIN
build/classes/java/main/mdd/client/Connection.class


BIN=BIN
build/classes/java/main/mdd/client/FXMLDocumentController.class


BIN=BIN
build/classes/java/main/mdd/client/GUIEventHandler.class


BIN=BIN
build/classes/java/main/mdd/client/IGUIEventClient.class


BIN=BIN
build/classes/java/main/mdd/client/Input.class


BIN=BIN
build/classes/java/main/mdd/client/Module.class


BIN=BIN
build/classes/java/main/mdd/client/Output.class


BIN=BIN
build/classes/java/main/mdd/client/Processor.class


BIN=BIN
build/classes/java/main/mdd/client/WorkBench.class


+ 8 - 8
build/resources/main/mdd/client/main.fxml

@@ -13,45 +13,45 @@
            <Menu fx:id="mAbout" text="About">
            </Menu>
        </MenuBar>
-      <SplitPane fx:id="sPane" dividerPositions="0.2591973244147157, 0.8010033444816054" prefHeight="${sPane.parent.height}" prefWidth="600.0">
+      <SplitPane fx:id="sPane" dividerPositions="0.2, 0.8" prefHeight="${sPane.parent.height}" prefWidth="600.0">
         <items>
             <Accordion>
               <panes>
                 <TitledPane animated="false" text="untitled 1">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 2">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 3">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
               </panes>
             </Accordion>
-            <TabPane fx:id="tabPane" prefHeight="238.0" prefWidth="318.0" tabClosingPolicy="UNAVAILABLE">
+            <TabPane fx:id="tabPane" prefHeight="238.0" prefWidth="400.0" tabClosingPolicy="UNAVAILABLE">
 
             </TabPane>
             <Accordion>
               <panes>
                 <TitledPane animated="false" text="untitled 1">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 2">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 3">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
               </panes>

+ 18 - 8
build/tmp/compileJava/source-classes-mapping.txt

@@ -1,17 +1,27 @@
-mdd/client/Main.java
- mdd.client.Main
+mdd/client/ConnectableType.java
+ mdd.client.ConnectableType
 mdd/client/HelloWorldServer.java
  mdd.client.HelloWorldServer
-mdd/client/WorkBench.java
- mdd.client.WorkBench
-mdd/client/Output.java
- mdd.client.Output
+mdd/client/Main.java
+ mdd.client.Main
+mdd/client/Processor.java
+ mdd.client.Processor
+mdd/client/GUIEventHandler.java
+ mdd.client.GUIEventHandler
+mdd/client/IGUIEventClient.java
+ mdd.client.IGUIEventClient
+mdd/client/Connection.java
+ mdd.client.Connection
 mdd/client/Connectable.java
  mdd.client.Connectable
  mdd.client.Connectable$1
 mdd/client/Input.java
  mdd.client.Input
-mdd/client/FXMLDocumentController.java
- mdd.client.FXMLDocumentController
 mdd/client/Module.java
  mdd.client.Module
+mdd/client/Output.java
+ mdd.client.Output
+mdd/client/WorkBench.java
+ mdd.client.WorkBench
+mdd/client/FXMLDocumentController.java
+ mdd.client.FXMLDocumentController

+ 141 - 6
src/main/java/mdd/client/Connectable.java

@@ -1,23 +1,62 @@
 package mdd.client;
 
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
 import javafx.event.EventHandler;
 import javafx.scene.Group;
 import javafx.scene.control.TextField;
-import javafx.scene.input.MouseButton;
-import javafx.scene.input.MouseEvent;
+import javafx.scene.input.*;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Circle;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
 
-public class Connectable extends Group {
+import javax.xml.stream.EventFilter;
+
+public class Connectable extends Group implements IGUIEventClient ,ChangeListener<Number>{
+    private GUIEventHandler _eventHandler = new GUIEventHandler();
     private Circle _border;
     private Circle _circle;
     private boolean _connected = false;
     private boolean _optimizable = false;
+    private Module _parent;
+    private ConnectableType _type;
+
+    public String ID = "";
+    public DoubleProperty x = new SimpleDoubleProperty();
+    public DoubleProperty y = new SimpleDoubleProperty();
+
+
+    public Connectable(Module parent, ConnectableType type, String id){
+        _parent = parent;
+        _type = type;
+        ID = id;
+
+        _parent.translateXProperty().addListener(this);
+        _parent.translateYProperty().addListener(this);
+
+        _parent.hlayout.translateXProperty().addListener(this);
+        _parent.hlayout.translateYProperty().addListener(this);
+
+        if (_type == ConnectableType.INPUT){
+            _parent.inputs.layoutXProperty().addListener(this);
+            _parent.inputs.layoutYProperty().addListener(this);
+        }
+        else{
+            _parent.outputs.layoutXProperty().addListener(this);
+            _parent.outputs.layoutYProperty().addListener(this);
+        }
+
+        layoutXProperty().addListener(this);
+        layoutYProperty().addListener(this);
 
-    public Connectable(){
         _border = new Circle(0,0, 7);
         _border.setFill(Color.BLACK);
         _circle = new Circle(0,0,5);
@@ -30,7 +69,7 @@ public class Connectable extends Group {
                 if(e.getButton() == MouseButton.SECONDARY) {
                     if (!_connected){
                         _optimizable = !_optimizable;
-                        updateCircle();
+                        updateColor();
                     }
                 }
 
@@ -38,9 +77,53 @@ public class Connectable extends Group {
         });
 
         getChildren().addAll(_border, _circle);
+
+        _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());
+            db.setContent(content);
+            //e.consume();
+        });
+
+        _circle.addEventHandler(DragEvent.DRAG_OVER, e -> {
+            Dragboard db = e.getDragboard();
+            if (db.hasString()) {
+                e.acceptTransferModes(TransferMode.MOVE);
+            }
+            e.consume();
+        });
+
+        _circle.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();
+                }
+                JSONArray jsonList = new JSONArray();
+                jsonList.add(json);
+                jsonList.add(generateJSON());
+
+                ClipboardContent content = new ClipboardContent();
+                content.putString(jsonList.toString());
+                db.setContent(content);
+
+                System.out.println("Dropped: " + db.getString());
+                success = true;
+            }
+            //e.setDropCompleted(success);
+            //e.consume();
+        });
     }
 
-    private void updateCircle(){
+    private void updateColor(){
         if (_connected){
             _circle.setFill(Color.YELLOW);
         } else if (_optimizable) {
@@ -50,4 +133,56 @@ public class Connectable extends Group {
         }
     }
 
+    private JSONObject generateJSON(){
+        JSONObject json = new JSONObject();
+        if (_type == ConnectableType.INPUT){
+            json.put("type", "INPUT");
+        }else if(_type == ConnectableType.OUTPUT){
+            json.put("type", "OUTPUT");
+        }else{
+            json.put("type", "ANYTHING");
+        }
+
+        JSONArray listID = new JSONArray();
+        listID.add(ID);
+        listID.add(_parent.ID);
+        json.put("ID", listID);
+
+        return json;
+    }
+
+    public void setConnected(boolean state){
+        if (state != _connected){
+            _connected = state;
+            updateColor();
+        }
+    }
+
+    @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());
+        }
+        else{
+            x.setValue(_parent.getTranslateX()+_parent.outputs.getLayoutX()+_parent.hlayout.getTranslateX()+getLayoutX());
+            y.setValue(_parent.getTranslateY()+_parent.outputs.getLayoutY()+_parent.hlayout.getTranslateY()+getLayoutY());
+        }
+    }
+
+    @Override
+    public GUIEventHandler getGUIEventHandler() {
+        return _eventHandler;
+    }
+
+    @Override
+    public void setGUIEventHandler(GUIEventHandler eventHandler) {
+        _eventHandler = eventHandler;
+        _eventHandler.addEventListener(this);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+
+    }
 }

+ 1 - 0
src/main/java/mdd/client/ConnectableType.java

@@ -1,4 +1,5 @@
 package mdd.client;
 
 public enum ConnectableType {
+    INPUT, OUTPUT
 }

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

@@ -1,4 +1,41 @@
 package mdd.client;
 
-public class Connection {
+import javafx.scene.shape.Line;
+import org.json.simple.JSONObject;
+
+
+public class Connection extends Line implements IGUIEventClient {
+    private GUIEventHandler _eventHandler = new GUIEventHandler();
+    private Input _in;
+    private Output _out;
+
+    public Connection(Input in, Output out){
+        super(0,0,100,100);
+        _in = in;
+        _out = out;
+        System.out.println("Connection: "+ in.x.toString());
+        this.startXProperty().bind(in.x);
+        this.startYProperty().bind(in.y);
+
+        this.endXProperty().bind(out.x);
+        this.endYProperty().bind(out.y);
+
+        in.setConnected(true);
+        out.setConnected(true);
+    }
+
+    @Override
+    public GUIEventHandler getGUIEventHandler() {
+        return _eventHandler;
+    }
+
+    @Override
+    public void setGUIEventHandler(GUIEventHandler eventHandler) {
+        _eventHandler = eventHandler;
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+
+    }
 }

+ 7 - 15
src/main/java/mdd/client/FXMLDocumentController.java

@@ -2,6 +2,7 @@ package mdd.client;
 
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
+import javafx.scene.control.SplitPane;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
 import javafx.scene.layout.AnchorPane;
@@ -14,31 +15,22 @@ import java.util.ResourceBundle;
 public class FXMLDocumentController implements Initializable {
     @FXML
     private TabPane tabPane;
+    @FXML
+    private SplitPane sPane;
 
     @Override
     public void initialize(URL location, ResourceBundle resources) {
         System.out.println("Loading...");
-
-        Tab tab = new Tab();
-        tab.setText("new tab");
-
-        AnchorPane pane = new AnchorPane(new Module());
-        pane.setMinHeight(0.0f);
-        pane.setMinWidth(0.0f);
-        pane.setPrefHeight(1800.0f);
-        pane.setPrefWidth(2000.0f);
-
         WorkBench bench = new WorkBench();
-        bench.setPrefSize(200.0f, 200.0f);
-
-        bench.setContent(pane);
+        //bench.setContent();
         /*pane.setMinHeight(0.0f);
         pane.setMinWidth(0.0f);
         pane.setPrefHeight(180.0f);
         pane.setPrefWidth(200.0f);//*/
                 // minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"
-        tab.setContent(bench);
-        tabPane.getTabs().add(tab);
+
+        tabPane.getTabs().add(bench);
+
         //tabPane.getTabs().get(0).setContent(new Rectangle(200,200, Color.LIGHTSTEELBLUE));
     }
 

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

@@ -0,0 +1,28 @@
+package mdd.client;
+
+
+import org.json.simple.JSONObject;
+
+import java.util.Vector;
+
+public class GUIEventHandler {
+    private Vector<IGUIEventClient> _clients = new Vector<IGUIEventClient>();
+    public GUIEventHandler(){
+
+    }
+
+    public void addEventListener(IGUIEventClient client){
+        _clients.add(client);
+    }
+
+    public void removeEventListener(IGUIEventClient client){
+        _clients.remove(client);
+    }
+
+    public void publishEvent(String event, JSONObject args){
+        for (IGUIEventClient client : _clients) {
+            client.processGUIEvent(event, args);
+        }
+    };
+}
+

+ 9 - 0
src/main/java/mdd/client/IGUIEventClient.java

@@ -0,0 +1,9 @@
+package mdd.client;
+
+import org.json.simple.JSONObject;
+
+public interface IGUIEventClient {
+    GUIEventHandler getGUIEventHandler();
+    void setGUIEventHandler(GUIEventHandler eventHandler);
+    void processGUIEvent(String event, JSONObject args);
+}

+ 8 - 2
src/main/java/mdd/client/Input.java

@@ -10,8 +10,8 @@ public class Input  extends Connectable {
     private Text _label;
     private TextField _input;
 
-    public Input(){
-        super();
+    public Input(Module parent, String id){
+        super(parent, ConnectableType.INPUT, id);
         _label = new Text("TEST");
         _label.setFont(new Font("Arial", 15));
         _label.setFill(Color.WHITE);
@@ -25,4 +25,10 @@ public class Input  extends Connectable {
 
         getChildren().add(vbox);
     }
+
+    public void setConnected(boolean state){
+        super.setConnected(state);
+        _input.setVisible(!state);
+        _input.setManaged(!state);
+    }
 }

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

@@ -1,10 +1,10 @@
 package mdd.client;
 
-import javafx.geometry.Insets;
+
 import javafx.geometry.Point2D;
-import com.sun.javafx.geom.RoundRectangle2D;
 import javafx.scene.Group;
-import javafx.scene.control.Label;
+import javafx.scene.Node;
+import javafx.scene.input.KeyEvent;
 import javafx.scene.input.MouseButton;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.HBox;
@@ -13,32 +13,46 @@ import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
-import org.json.JSONObject;
+import org.json.simple.JSONObject;
+
+import java.util.Vector;
 
 
-public class Module extends Group {
+public class Module extends Group implements IGUIEventClient{
     private boolean _dragged = false;
-    private Point2D _old_pos;
     private Point2D _pos = new Point2D(0.0f,0.0f);
+    private GUIEventHandler _eventHandler = new GUIEventHandler();
+
+    public String ID = "";
+    public HBox hlayout = new HBox();
+    public VBox inputs = new VBox();
+    public VBox outputs = new VBox();
+    public boolean isSelected = false;
 
-    public Module(){
+    public Module(String id){
+        ID = id;
         Rectangle titlebar;
         Rectangle background;
         Text caption;
-        VBox inputs = new VBox(new Input(), new Input(), new Input());
-        VBox outputs = new VBox(new Output(), new Output(), new Output());
+        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"));
 
         inputs.setSpacing(10);
 
         outputs.setSpacing(10);
 
 
-        HBox hbox = new HBox(inputs, outputs);
-        hbox.setSpacing(20);
-        hbox.setTranslateX(-7);
-        hbox.setTranslateY(30);
+        hlayout.getChildren().addAll(inputs, outputs);
+        hlayout.setSpacing(20);
+        hlayout.setTranslateX(-7);
+        hlayout.setTranslateY(30);
 
-        System.out.println(hbox.getPrefWidth());
+        //System.out.println("[Module]: pressed: "+ hbox.getPrefWidth());
 
         //JSONObject parameters
         titlebar = new Rectangle(0.0f, 0.0f, 150-20, 20.0f);
@@ -56,52 +70,113 @@ public class Module extends Group {
         caption.setY(15);
 
 
-        getChildren().addAll( background, titlebar, caption, hbox);
+        getChildren().addAll( background, titlebar, caption, hlayout);
 
-        addEventFilter(MouseEvent.MOUSE_CLICKED, e -> {
-            if(e.getButton() == MouseButton.PRIMARY) {
 
+
+        addEventHandler(MouseEvent.MOUSE_PRESSED, e -> {
+            System.out.println("[Module]: press event filter detected!");
+            if(e.getButton() == MouseButton.PRIMARY) {
+                isSelected = true;
+                System.out.println("[Module]: select: " + ID);
+                JSONObject json = new JSONObject();
+                json.put("id", id);
+                _eventHandler.publishEvent("MOUSE_PRESSED", json);
+                _pos = new Point2D(e.getSceneX(), e.getSceneY());
             }
             if(e.getButton() == MouseButton.SECONDARY) {
 
             }
+            e.consume();
         });
 
-        addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
-            System.out.println("[Module]: press event detected!");
+        addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> {
+            //System.out.println("[Module]: dragg event detected!");
             if(e.getButton() == MouseButton.PRIMARY) {
-                if (!_dragged){
-                    _old_pos = new Point2D(e.getSceneX(), e.getSceneY());
-                }
+                setTranslateX(getTranslateX()+(e.getSceneX()-_pos.getX()));
+                setTranslateY(getTranslateY()+(e.getSceneY()-_pos.getY()));
+                _pos = new Point2D( e.getSceneX(),  e.getSceneY());
             }
             if(e.getButton() == MouseButton.SECONDARY) {
 
             }
         });
+    }
 
-        addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> {
-            //System.out.println("[Module]: dragg event detected!");
-            if(e.getButton() == MouseButton.PRIMARY) {
-                _dragged = true;
+    public void addInput(Input in){
+        in.setGUIEventHandler(_eventHandler);
+        inputs.getChildren().add(in);
+    }
+
+    public void addOutput(Output out){
+        out.setGUIEventHandler(_eventHandler);
+        outputs.getChildren().add(out);
+    }
+
+    public Input getInput(String id){
+        for (Node node : inputs.getChildren()){
+            if(node instanceof Input){
+                Input in = (Input) node;
+                if (in.ID.equals(id)){
+                    return in;
+                }
             }
-            if(e.getButton() == MouseButton.SECONDARY) {
 
+        }
+        System.out.println("[Module]: getInput: WRONG ID!");
+        return new Input(this,"");
+    }
+
+    public Output getOutput(String id){
+        for (Node node : outputs.getChildren()){
+            if(node instanceof Output){
+                Output out = (Output) node;
+                if (out.ID.equals(id)){
+                    return out;
+                }
             }
-        });
 
-        addEventFilter(MouseEvent.MOUSE_RELEASED, e -> {
-            System.out.println("[Module]: release event detected!");
-            if(e.getButton() == MouseButton.PRIMARY) {
-                _dragged = false;
-                System.out.print("[Module]: got: "); System.out.print(e.getSceneX()); System.out.print(" | "); System.out.print(e.getSceneY());
-                System.out.println();
-                _pos = new Point2D(_pos.getX()+ e.getSceneX() - _old_pos.getX(), _pos.getY() + e.getSceneY() - _old_pos.getY());
-                setTranslateX(_pos.getX());
-                setTranslateY(_pos.getY());
+        }
+        System.out.println("[Module]: getOutput: WRONG ID!");
+        return new Output(this,"");
+    }
+
+    public GUIEventHandler getGUIEventHandler(){
+        return _eventHandler;
+    }
+
+    public void setGUIEventHandler(GUIEventHandler eventHandler){
+        _eventHandler = eventHandler;
+        for (Node node : inputs.getChildren()){
+            if(node instanceof Input){
+                Input in = (Input) node;
+                in.setGUIEventHandler(_eventHandler);
             }
-            if(e.getButton() == MouseButton.SECONDARY) {
 
+        }
+
+        for (Node node : outputs.getChildren()){
+            if(node instanceof Output){
+                Output out = (Output) node;
+                out.setGUIEventHandler(_eventHandler);
             }
-        });
+
+        }
+        _eventHandler.addEventListener(this);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+        if (event == "MOUSE_PRESSED"){
+            JSONObject json = new JSONObject();
+            json.put("id", ID);
+
+            if (!args.equals(json)){
+                if (isSelected){
+                    System.out.println("[Module]: deselect: " + ID);
+                }
+                isSelected = false;
+            }
+        }
     }
 }

+ 2 - 2
src/main/java/mdd/client/Output.java

@@ -7,8 +7,8 @@ import javafx.scene.text.Text;
 public class Output extends Connectable {
     private Text _label;
 
-    public Output(){
-        super();
+    public Output(Module parent, String id){
+        super(parent, ConnectableType.OUTPUT, id);
         _label = new Text("TEST");
         _label.setFont(new Font("Arial", 15));
         _label.setFill(Color.WHITE);

+ 122 - 1
src/main/java/mdd/client/Processor.java

@@ -1,4 +1,125 @@
 package mdd.client;
 
-public class Processor {
+import javafx.event.EventHandler;
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.input.*;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+public class Processor extends Module{
+    private Group modules = new Group();
+    private Group connections = new Group();
+    public Group all = new Group(connections, modules);
+    public Module selected = new Module("-1");
+    private GUIEventHandler _eventHandler = new GUIEventHandler();
+
+    public Processor(String id) {
+        super( id);
+        //setFocusTraversable(true);
+        setOnKeyPressed(e -> {
+            System.out.println("[Processor]: pressed:");
+            System.out.println("[Processor]: pressed: " + e.getText());
+            if (isSelected) {
+                JSONObject json = new JSONObject();
+                json.put("id", ID);
+                _eventHandler.publishEvent("OPEN_PROCESSOR", json);
+            }
+        });
+
+        modules.addEventHandler(DragEvent.DRAG_DROPPED, e -> {
+            Dragboard db = e.getDragboard();
+            boolean success = false;
+            if (db.hasString()) {
+                JSONParser parser = new JSONParser();
+                JSONArray jsonList = null;
+                try {
+                    jsonList = (JSONArray)parser.parse(db.getString());
+                } catch (ParseException parseException) {
+                    parseException.printStackTrace();
+                }
+
+                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");
+                    for (Object o : jsonList) {
+                        JSONObject json = (JSONObject) o;
+                        if (json.containsKey("type")) {
+                            String type = json.get("type").toString();
+                            if (type.equals("INPUT")) {
+                                System.out.println("[WorkBench] Dropped found type = " + "INPUT");
+                                foundInput = true;
+                                JSONArray idList = (JSONArray) json.get("ID");
+                                in = getModule(idList.get(1).toString()).getInput(idList.get(0).toString());
+                            } else if (type.equals("OUTPUT")) {
+                                System.out.println("[WorkBench] Dropped found type = " + "OUTPUT");
+                                foundOutput = true;
+                                JSONArray idList = (JSONArray) json.get("ID");
+                                out = getModule(idList.get(1).toString()).getOutput(idList.get(0).toString());
+                            }
+                        }
+                    }
+                    if (foundInput && foundOutput){
+                        System.out.println("[WorkBench] Dropped: success!");
+                        connections.getChildren().add(new Connection(in, out));
+                        success = true;
+                    }
+
+                }
+
+                System.out.println("[WorkBench] Dropped: " + db.getString());
+
+            }
+            e.setDropCompleted(success);
+            e.consume();
+        });
+    }
+
+    public Module getModule(String id){
+        for (Node node : modules.getChildren()){
+            if (node instanceof Module){
+                Module m = (Module)node;
+                if (m.ID.equals(id)){
+                    return m;
+                }
+            }
+        }
+        return new  Module("");
+    }
+
+    public void setGUIEventHandler(GUIEventHandler eventHandler){
+        _eventHandler = eventHandler;
+        for (Node node : inputs.getChildren()){
+            if(node instanceof Input){
+                Input in = (Input) node;
+                in.setGUIEventHandler(_eventHandler);
+            }
+
+        }
+
+        for (Node node : outputs.getChildren()){
+            if(node instanceof Output){
+                Output out = (Output) node;
+                out.setGUIEventHandler(_eventHandler);
+            }
+
+        }
+        _eventHandler.addEventListener(this);
+    }
+
+    public void addModule(Module module){
+        module.setGUIEventHandler(getGUIEventHandler());
+        modules.getChildren().add(module);
+    }
+
+    public void addConnection(Connection connection){
+        connection.setGUIEventHandler(getGUIEventHandler());
+        connections.getChildren().add(connection);
+    }
 }

+ 59 - 1
src/main/java/mdd/client/WorkBench.java

@@ -1,10 +1,68 @@
 package mdd.client;
 
+import javafx.geometry.Point2D;
 import javafx.scene.control.ScrollPane;
+import javafx.scene.control.Tab;
+import javafx.scene.input.*;
+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;
+
+public class WorkBench extends Tab implements IGUIEventClient{
+    private ScrollPane _scrollPane;
+    private Processor _processor;
+    private Point2D _pos = new Point2D(0.0f,0.0f);
+    private GUIEventHandler _eventHandler = new GUIEventHandler();
 
-public class WorkBench extends ScrollPane {
 
     public WorkBench(){
         super();
+        _processor = new Processor("");
+        init();
+    }
+
+    public WorkBench(Processor processor){
+        super();
+        _processor = processor;
+        init();
+        //getTabPane()
+    }
+
+    private void init(){
+        loadExample();
+        setId(_processor.ID);
+        _scrollPane = new ScrollPane(_processor.all);
+        setContent(_scrollPane);
+
+        //getTabPane()
+    }
+
+    private void loadExample(){
+        _processor.addModule(new Module("1"));
+        _processor.addModule(new Module("2"));
+        _processor.addModule(new Processor("3"));
+
+        _processor.addConnection(new Connection(_processor.getModule("1").getInput("1"), _processor.getModule("3").getOutput("1")));
+    }
+
+    @Override
+    public GUIEventHandler getGUIEventHandler() {
+        return _eventHandler;
+    }
+
+    @Override
+    public void setGUIEventHandler(GUIEventHandler eventHandler) {
+        _eventHandler = eventHandler;
+        _processor.setGUIEventHandler(_eventHandler);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+        if (event == "OPEN_PROCESSOR"){
+            getTabPane().getTabs().add(new WorkBench((Processor) _processor.getModule(args.get("id").toString())));
+        }
     }
 }

+ 8 - 8
src/main/resources/mdd/client/main.fxml

@@ -13,45 +13,45 @@
            <Menu fx:id="mAbout" text="About">
            </Menu>
        </MenuBar>
-      <SplitPane fx:id="sPane" dividerPositions="0.2591973244147157, 0.8010033444816054" prefHeight="${sPane.parent.height}" prefWidth="600.0">
+      <SplitPane fx:id="sPane" dividerPositions="0.2, 0.8" prefHeight="${sPane.parent.height}" prefWidth="600.0">
         <items>
             <Accordion>
               <panes>
                 <TitledPane animated="false" text="untitled 1">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 2">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 3">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
               </panes>
             </Accordion>
-            <TabPane fx:id="tabPane" prefHeight="238.0" prefWidth="318.0" tabClosingPolicy="UNAVAILABLE">
+            <TabPane fx:id="tabPane" prefHeight="238.0" prefWidth="400.0" tabClosingPolicy="UNAVAILABLE">
 
             </TabPane>
             <Accordion>
               <panes>
                 <TitledPane animated="false" text="untitled 1">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 2">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
                 <TitledPane animated="false" text="untitled 3">
                   <content>
-                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="100.0" />
                   </content>
                 </TitledPane>
               </panes>