Explorar o código

visualisation

Willi Zschiebsch %!s(int64=4) %!d(string=hai) anos
pai
achega
d9fde3f922

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

@@ -109,7 +109,7 @@ public class Client implements IGUIEventClient
     }
 
     public Client(){
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(0);
         _eventHandler.addEventListener(this, 10);
         try{
             context = new ZContext();

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

@@ -19,15 +19,18 @@ public class Configuration extends Group {
     private String _topic = "";
     private JSONObject jparent_id;
     protected GUIEventHandler _eventHandler;
+    protected int _index;
 
-    Configuration(String topic, Module parent, String key, JSONObject json){
+    Configuration(String topic, Module parent, String key, JSONObject json, int handler_index){
+        _index = handler_index;
         jparent_id = parent.getJSONIdentifier();
         _name = key;
         _topic = topic;
         setUp(json);
     }
 
-    Configuration(String topic, JSONObject parent_id, String key, JSONObject json){
+    Configuration(String topic, JSONObject parent_id, String key, JSONObject json, int handler_index){
+        _index = handler_index;
         jparent_id = parent_id;
         _name = key;
         _topic = topic;
@@ -36,7 +39,7 @@ public class Configuration extends Group {
 
 
     private void setUp(JSONObject json){
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
 
         if (json.containsKey("options")){
             ObservableList<String> options = FXCollections.observableArrayList();

+ 2 - 1
src/main/java/mdd/client/FXMLDocumentController.java

@@ -16,8 +16,9 @@ import java.net.URL;
 import java.util.ResourceBundle;
 
 public class FXMLDocumentController implements Initializable {
-    private GUIEventHandler _eventhandler = GUIEventHandler.getEventHandler();
+    private GUIEventHandler _eventhandler = GUIEventHandler.getEventHandler(0);
     private Optimizer _optimizer = new Optimizer();
+    private PassiveProcessorView _view = new PassiveProcessorView();
     @FXML
     public Workshop workshop;
     @FXML

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

@@ -8,7 +8,7 @@ import java.util.*;
 import java.util.concurrent.ConcurrentSkipListMap;
 
 public class GUIEventHandler {
-    private static GUIEventHandler _handler = new GUIEventHandler();
+    private static Vector<GUIEventHandler> _handler = new Vector<>();
     private ConcurrentSkipListMap<Integer,Vector<IGUIEventClient>> _priorities = new ConcurrentSkipListMap<>();
 
     public GUIEventHandler(){
@@ -60,8 +60,11 @@ public class GUIEventHandler {
         publishEvent(0,event, args);
     }
 
-    public static GUIEventHandler getEventHandler(){
-        return _handler;
+    public static GUIEventHandler getEventHandler(int index){
+        while(_handler.size() <= index){
+            _handler.add(new GUIEventHandler());
+        }
+        return _handler.get(index);
     }
 }
 

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

@@ -29,7 +29,7 @@ public class GUIMain extends Application implements IGUIEventClient{
 
     @Override
     public void start(Stage primaryStage){
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(0);
 
         Parent root = null;
         FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));

+ 11 - 5
src/main/java/mdd/client/Module.java

@@ -60,10 +60,12 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
     public boolean isSelected = false;
 
     protected boolean moveable = true;
+    protected int _index;
 
-    public Module(JSONObject json){
+    public Module(JSONObject json, int handler_index){
+        _index = handler_index;
         setFocusTraversable(true);
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         _eventHandler.addEventListener(this, 5);
 
         inputs.setSpacing(10);
@@ -202,7 +204,7 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
                 JSONObject jconfig = (JSONObject) jconfigs.get(key);
                 Label clabel = new Label(key);
                 configs.add(clabel,0,counter);
-                configs.add(new Configuration("configure", this, key, jconfig),1,counter);
+                configs.add(new Configuration("configure", this, key, jconfig, _index),1,counter);
                 ++counter;
             }
         }
@@ -266,10 +268,10 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         for (int i = 0; i < size; ++i){
             JSONObject jobj = (JSONObject)jarray.get(i);
             if (ctype == ConnectableType.INPUT){
-                connectables.add(new Input(this,jobj));
+                connectables.add(new Input(this,jobj, _index));
             }
             else{
-                connectables.add(new Output(this,jobj));
+                connectables.add(new Output(this,jobj, _index));
             }
         }
     }
@@ -358,6 +360,10 @@ public class Module extends Group implements IGUIEventClient, ChangeListener<Bou
         }
     }
 
+    public int getHandlerIndex(){
+        return _index;
+    }
+
     @Override
     public void close() throws Exception {
         _eventHandler.removeEventListener(this);

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

@@ -26,7 +26,7 @@ private ScrollPane scrollpane = new ScrollPane();
 
     public Optimizer(){
         super();
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(0);
         _eventHandler.addEventListener(this, 5);
 
         setTitle("Optimizer");
@@ -46,7 +46,7 @@ private ScrollPane scrollpane = new ScrollPane();
         });
 
         MenuItem mi_dia = new MenuItem("Diagramm");
-        mi_list.setOnAction(new EventHandler<ActionEvent>() {
+        mi_dia.setOnAction(new EventHandler<ActionEvent>() {
             public void handle(ActionEvent t) {
                 scrollpane.setContent(pDiagramm);
             }

+ 39 - 0
src/main/java/mdd/client/PassiveProcessorView.java

@@ -0,0 +1,39 @@
+package mdd.client;
+
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.stage.Stage;
+import org.json.simple.JSONObject;
+
+
+public class PassiveProcessorView extends Stage implements IGUIEventClient {
+    private Workshop workshop  = new Workshop(1);
+    private PropertyManager manager = new PropertyManager(1);
+    private SplitPane splitPane = new SplitPane();
+
+    protected GUIEventHandler _eventHandler;
+
+    public PassiveProcessorView(){
+        super();
+        _eventHandler = GUIEventHandler.getEventHandler(1);
+        _eventHandler.addEventListener(this, 10);
+
+        setTitle("Process View");
+
+        splitPane.getItems().addAll(workshop, manager);
+        Scene scene = new Scene(splitPane, 450, 450);
+        scene.getStylesheets().add(String.valueOf(getClass().getResource("dark-theme.css")));
+        setScene(scene);
+        splitPane.setDividerPositions(0.7);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+        if (event.equals("OPEN")) {
+            JSONObject jmsg = new JSONObject();
+            jmsg.put("processor", args);
+            _eventHandler.publishEvent("load",jmsg);
+            show();
+        }
+    }
+}

+ 11 - 11
src/main/java/mdd/client/Processor.java

@@ -26,8 +26,8 @@ public class Processor extends Module{
     public Connection temp_connection = new Connection();
     private Connectable connectable;
 
-    public Processor(JSONObject json){
-        super(json);
+    public Processor(JSONObject json, int handler_index){
+        super(json, handler_index);
         Type = "processor";
 
         modules.addEventHandler(MouseEvent.DRAG_DETECTED, e -> {
@@ -145,9 +145,9 @@ public class Processor extends Module{
             for (Object o : (JSONArray) json.get("modules")){
                 JSONObject jobj = (JSONObject) o;
                 if (jobj.get("type").equals("module")){
-                    modules.getChildren().add(new Module(jobj));
+                    modules.getChildren().add(new Module(jobj, _index));
                 }else if(jobj.get("type").equals("processor")){
-                    modules.getChildren().add(new Processor(jobj));
+                    modules.getChildren().add(new Processor(jobj, _index));
                 }
             }
         }
@@ -162,7 +162,7 @@ public class Processor extends Module{
                     for (int i = 0; i < jparam_in.size(); ++i){
                         JSONObject jmod = (JSONObject)jparam_in.get(i);
                         jmod.put("inputs", null);
-                        params_in.getChildren().add(new Parameter(jmod));
+                        params_in.getChildren().add(new Parameter(jmod, _index));
                     }
                 }
             }
@@ -173,7 +173,7 @@ public class Processor extends Module{
                     for (int i = 0; i < jparam_out.size(); ++i){
                         JSONObject jmod = (JSONObject)jparam_out.get(i);
                         jmod.put("outputs", null);
-                        params_out.getChildren().add(new Parameter(jmod));
+                        params_out.getChildren().add(new Parameter(jmod, _index));
                     }
                 }
             }
@@ -193,7 +193,7 @@ public class Processor extends Module{
                     Module mout = getModule(((JSONArray)jout.get("prefix")).get(lsize).toString());
                     Input in = min.getInput(jin.get("key").toString()+jin.get("appendix").toString());
                     Output out = mout.getOutput(jout.get("key").toString()+jout.get("appendix").toString());
-                    Connection con = new Connection(in, out);
+                    Connection con = new Connection(in, out, _index);
                     if (min instanceof Parameter || mout instanceof Parameter){
                         con.setVisible(false);
                         con.setManaged(false);
@@ -366,17 +366,17 @@ public class Processor extends Module{
                                     }
                                 }
                             }
-                            connections.getChildren().add(new Connection(in, out));
+                            connections.getChildren().add(new Connection(in, out, _index));
                             break;
                         case "module":
                             if (jobj.get("key").toString().equals("Parameter")){
-                                params_in.getChildren().add(new Module(jobj));
+                                params_in.getChildren().add(new Module(jobj, _index));
                             }else {
-                                modules.getChildren().add(new Module(jobj));
+                                modules.getChildren().add(new Module(jobj, _index));
                             }
                             break;
                         case "processor":
-                            modules.getChildren().add(new Processor(jobj));
+                            modules.getChildren().add(new Processor(jobj, _index));
                             break;
                     }
                     break;

+ 14 - 2
src/main/java/mdd/client/PropertyManager.java

@@ -13,10 +13,22 @@ public class PropertyManager extends ScrollPane implements IGUIEventClient{
     private JSONObject jsel  = new JSONObject();
     private TitledPane pane1;
     private TitledPane pane2;
+    protected int _index;
 
     public PropertyManager(){
         super();
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _index = 0;
+        configure();
+    }
+
+    public PropertyManager(int handler_index){
+        super();
+        _index = handler_index;
+        configure();
+    }
+
+    private void configure(){
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         _eventHandler.addEventListener(this);
         Accordion accordion = new Accordion();
         GridPane grid = new GridPane();
@@ -52,7 +64,7 @@ public class PropertyManager extends ScrollPane implements IGUIEventClient{
             }
             Label clabel = new Label(key);
             glayout.add(clabel,0,counter);
-            glayout.add(new Configuration(topic, jsel, key, jconfig),1,counter);
+            glayout.add(new Configuration(topic, jsel, key, jconfig, _index),1,counter);
             ++counter;
         }
 

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

@@ -20,7 +20,7 @@ public class Toolbox extends ScrollPane implements IGUIEventClient{
 
     public Toolbox(){
         super();
-        _eventhandler = GUIEventHandler.getEventHandler();
+        _eventhandler = GUIEventHandler.getEventHandler(0);
         _eventhandler.addEventListener(this);
         Accordion accordion = new Accordion();
         GridPane grid = new GridPane();

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

@@ -20,18 +20,19 @@ public class WorkBench extends Tab implements IGUIEventClient{
     private GUIEventHandler _eventHandler;
     private SplitPane _sp_in_main_out;
     private ParameterList _gp_in, _gp_out;
+    protected int _index;
 
     public WorkBench(Processor processor){
         super(processor.Name);
-
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _index = processor.getHandlerIndex();
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         _eventHandler.addEventListener(this);
         _processor = processor;
         setId(_processor.getAsPrefix().toString());
         _sp_in_main_out = new SplitPane();
         _scrollPane = new ScrollPane(_processor.all);
-        _gp_in = new ParameterList(_processor, "input");
-        _gp_out = new ParameterList(_processor, "output");
+        _gp_in = new ParameterList(_processor, "input", _index);
+        _gp_out = new ParameterList(_processor, "output", _index);
         _sp_in_main_out.getItems().addAll(_gp_in, _scrollPane,_gp_out);
         _sp_in_main_out.setDividerPositions(0.1f, 0.9f);
         setContent(_sp_in_main_out);

+ 14 - 2
src/main/java/mdd/client/Workshop.java

@@ -16,10 +16,22 @@ import java.util.Vector;
 public class Workshop extends TabPane implements IGUIEventClient {
     private GUIEventHandler _eventHandler;
     private Processor _main_processor;
+    protected int _index;
 
     public Workshop(){
         super();
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _index = 0;
+        configure();
+    }
+
+    public Workshop(int handler_index){
+        super();
+        _index = handler_index;
+        configure();
+    }
+
+    private void configure(){
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         _eventHandler.addEventListener(this);
 
         addEventHandler(DragEvent.DRAG_OVER, e -> {
@@ -99,7 +111,7 @@ public class Workshop extends TabPane implements IGUIEventClient {
             if(args.containsKey("processor")){
                 JSONObject jargs = (JSONObject) args.get("processor");
                 System.out.println("[Workshop]: load " +jargs.toString());
-                _main_processor = new Processor(jargs);
+                _main_processor = new Processor(jargs, _index);
                 showMainProcessor();
             }
         }

+ 4 - 2
src/main/java/mdd/client/connectable/Connectable.java

@@ -52,9 +52,11 @@ public class Connectable extends GridPane implements IGUIEventClient,ChangeListe
     public DoubleProperty x = new SimpleDoubleProperty();
     public DoubleProperty y = new SimpleDoubleProperty();
 
+    protected int _index;
 
-    public Connectable(Module parent, ConnectableType type, JSONObject json){
-        _eventHandler = GUIEventHandler.getEventHandler();
+    public Connectable(Module parent, ConnectableType type, JSONObject json, int handler_index){
+        _index = handler_index;
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         _eventHandler.addEventListener(this);
         _parent = parent;
         _type = type;

+ 2 - 2
src/main/java/mdd/client/connectable/Connection.java

@@ -17,9 +17,9 @@ public class Connection extends Line implements IGUIEventClient {
         super();
     }
 
-    public Connection(Input in, Output out){
+    public Connection(Input in, Output out, int handler_index){
         super(0,0,100,100);
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(handler_index);
         _eventHandler.addEventListener(this);
         this.in = in;
         this.out = out;

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

@@ -13,8 +13,8 @@ import org.json.simple.JSONObject;
 public class Input  extends Connectable {
     private TextField _input;
 
-    public Input(Module parent, JSONObject json){
-        super(parent, ConnectableType.INPUT, json);
+    public Input(Module parent, JSONObject json, int handler_index){
+        super(parent, ConnectableType.INPUT, json, handler_index);
         add(_connection,0,0);
         add(_label,1,0);
         add(_input,1,1);

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

@@ -8,8 +8,8 @@ import org.json.simple.JSONObject;
 
 public class Output extends Connectable {
 
-    public Output(Module parent, JSONObject json){
-        super(parent, ConnectableType.OUTPUT, json);
+    public Output(Module parent, JSONObject json, int handler_index){
+        super(parent, ConnectableType.OUTPUT, json, handler_index);
         add(_connection,1,0);
         add(_label,0,0);
         setAlignment(Pos.CENTER_RIGHT);

+ 2 - 2
src/main/java/mdd/client/connectable/Parameter.java

@@ -5,8 +5,8 @@ import org.json.simple.JSONObject;
 
 public class Parameter extends Module {
 
-    public Parameter(JSONObject json){
-        super(json);
+    public Parameter(JSONObject json, int handler_index){
+        super(json, handler_index);
         moveable = false;
     }
 }

+ 4 - 2
src/main/java/mdd/client/connectable/ParameterList.java

@@ -22,11 +22,13 @@ public class ParameterList extends ScrollPane implements IGUIEventClient {
     public Processor _processor;
     private VBox params = new VBox();
     private String _type;
+    protected int _index;
 
-    public ParameterList(Processor processor, String type){
+    public ParameterList(Processor processor, String type, int handler_index){
+        _index = handler_index;
         _type = type;
         _processor = processor;
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(_index);
         if (_type.equals("input")){
             params = _processor.params_in;
         }else {

+ 250 - 2
src/main/java/mdd/client/optimization/PDiagramm.java

@@ -1,16 +1,239 @@
 package mdd.client.optimization;
 
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ObservableList;
+import javafx.scene.Node;
+import javafx.scene.chart.LineChart;
+import javafx.scene.chart.NumberAxis;
+import javafx.scene.chart.ScatterChart;
+import javafx.scene.chart.XYChart;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
 import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
+import mdd.client.GUIEventHandler;
 
-public class PDiagramm extends HBox implements IPlotCallback {
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public class PDiagramm extends VBox implements IPlotCallback {
     private DataModel _data;
 
     private int _table = 0;
+    int x_id = 0, y_id = 0;
+
+    private ComboBox<String> CBDiagramm = new ComboBox<>(), CBKey1 = new ComboBox<>(), CBKey2 = new ComboBox<>();
+
+    private NumberAxis xAxis_line = new NumberAxis();
+    private NumberAxis xAxis_point = new NumberAxis();
+    private NumberAxis yAxis_line = new NumberAxis();
+    private NumberAxis yAxis_point = new NumberAxis();
+
+    Comparator<XYChart.Data<Number, Number>> data_compaire = Comparator.comparingDouble(d -> d.getXValue().doubleValue());
+
+    private LineChart<Number,Number> lineChart = new LineChart<>(xAxis_line, yAxis_line);
+    private ScatterChart<Number,Number> pointChart = new ScatterChart<>(xAxis_point,yAxis_point);
+
+    final XYChart.Series<Number, Number> series_all = new XYChart.Series<>(), series_min = new XYChart.Series<>(), series_max = new XYChart.Series<>();
+
 
     public PDiagramm(DataModel data){
         _data = data;
         _data.addPlotter(this);
-        setSpacing(30);
+
+        HBox hbox = new HBox();
+        hbox.setSpacing(10f);
+        HBox hbox1 = new HBox();
+        hbox1.getChildren().add(new Label("Select Diagramm: "));
+        hbox1.getChildren().add(CBDiagramm);
+        hbox.getChildren().add(hbox1);
+
+        HBox hbox2 = new HBox();
+        hbox2.getChildren().add(new Label("Select x-Axis: "));
+        hbox2.getChildren().add(CBKey1);
+        hbox.getChildren().add(hbox2);
+
+        HBox hbox3 = new HBox();
+        hbox3.getChildren().add(new Label("Select y-Axis: "));
+        hbox3.getChildren().add(CBKey2);
+        hbox.getChildren().add(hbox3);
+        getChildren().add(hbox);
+
+        if (_data.size() > _table){
+            Vector<String> skeys = _data.get(_table).getKeys();
+            if (skeys != null){
+                for(int i = 0; i < skeys.size(); ++i){
+                    String nkey = skeys.get(i);
+                    CBKey1.getItems().add(nkey);
+                    CBKey2.getItems().add(nkey);
+                }
+            }
+
+            for (int i = 0; i < _data.get(_table).size(); ++i){
+                insertData(_data.get(_table).get(i));
+            }
+        }
+
+        ObservableList<String> slist = CBDiagramm.getItems();
+        slist.add("Points");
+        slist.add("Line");
+
+        CBDiagramm.valueProperty().addListener((ov, t, t1) -> {
+            if (getChildren().size() >1){
+                getChildren().remove(1);
+            }
+            if (t1.equals("Points")) {
+               getChildren().add(pointChart);
+            }
+            else{
+                getChildren().add(lineChart);
+            }
+        });
+
+        CBDiagramm.getSelectionModel().select(1);
+
+        CBKey1.valueProperty().addListener((ov, t, t1) -> {
+            xAxis_line.setLabel(t1);
+            xAxis_point.setLabel(t1);
+            if (_data.size() > _table) {
+                Vector<String> skeys1 = _data.get(_table).getKeys();
+                if (skeys1 != null) {
+                    for (int i = 0; i < skeys1.size(); ++i) {
+                        if (t1.equals(skeys1.get(i))) {
+                            x_id = i;
+                            break;
+                        }
+                    }
+
+                    series_min.getData().clear();
+                    series_max.getData().clear();
+
+                    for (int i = 0; i < _data.get(_table).size(); ++i) {
+                        IData idata = _data.get(_table).get(i);
+                        series_all.getData().get(i).setXValue(idata.getValue(x_id));
+                        insertMinData(idata);
+                        insertMaxData(idata);
+                    }
+                    sortData();
+                }
+            }
+        });
+        CBKey1.getSelectionModel().select(0);
+
+        CBKey2.valueProperty().addListener((ov, t, t1) -> {
+            yAxis_line.setLabel(t1);
+            yAxis_point.setLabel(t1);
+            if (_data.size() > _table) {
+                Vector<String> skeys12 = _data.get(_table).getKeys();
+                if (skeys12 != null) {
+                    for (int i = 0; i < skeys12.size(); ++i) {
+                        if (t1.equals(skeys12.get(i))) {
+                            y_id = i;
+                            break;
+                        }
+                    }
+                    ObservableList<XYChart.Data<Number, Number>> smindata = series_min.getData();
+                    ObservableList<XYChart.Data<Number, Number>> smaxdata = series_max.getData();
+
+                    for (int i = 0; i < _data.get(_table).size(); ++i) {
+                        IData idata = _data.get(_table).get(i);
+                        series_all.getData().get(i).setYValue(idata.getValue(y_id));
+                        updateMinYArg(smindata, (Permutation)idata);
+                        updateMaxYArg(smaxdata, (Permutation)idata);
+                    }
+                }
+            }
+        });
+        CBKey2.getSelectionModel().select(0);
+
+        series_all.setName("data");
+        series_min.setName("min");
+        series_max.setName("max");
+
+        pointChart.getData().addAll(series_all);
+        lineChart.getData().addAll(series_min, series_max);
+    }
+
+    protected void addEvent(XYChart.Data data, Permutation per){
+        Node node = data.getNode();
+        if (node != null && per.jprocessor != null){
+            node.setOnMouseClicked(mouseEvent -> {
+                System.out.println("CALLED");
+                GUIEventHandler.getEventHandler(1).publishEvent(10,"OPEN", per.jprocessor);
+            });
+        }
+    }
+
+    private void insertData( IData data){
+        if (data instanceof Permutation){
+            XYChart.Data<Number, Number> xydata=  new XYChart.Data<>(data.getValue(x_id), data.getValue(y_id));
+            series_all.getData().add(xydata);
+            addEvent(xydata, (Permutation) data);
+        }
+    }
+
+    private void insertMinData( IData data){
+        if (data instanceof Permutation){
+            Permutation per = (Permutation)data;
+            double x = data.getValue(x_id);
+            double y = data.getValue(y_id);
+            if (containsXArg(series_min.getData(), x)){
+                updateMinYArg(series_min.getData(), per);
+            }else{
+                series_min.getData().add(new XYChart.Data<>(x, y));
+            }
+        }
+    }
+
+    private void insertMaxData( IData data){
+        if (data instanceof Permutation){
+            Permutation per = (Permutation)data;
+            double x = data.getValue(x_id);
+            double y = data.getValue(y_id);
+            if (containsXArg(series_max.getData(), x)){
+                updateMaxYArg(series_max.getData(), per);
+            }else{
+                XYChart.Data<Number, Number> xydata=  new XYChart.Data<>(x, y);
+                series_max.getData().add(xydata);
+            }
+        }
+    }
+
+    private void sortData(){
+        series_min.getData().sort(data_compaire);
+        series_max.getData().sort(data_compaire);
+        //series_all.getData().sort(data_compaire);
+    }
+
+    private boolean containsXArg(final ObservableList<XYChart.Data<Number, Number>> list, final Double x){
+        return list.stream().filter(o -> o.getXValue().equals(x)).findFirst().isPresent();
+    }
+
+    private void updateMinYArg(final ObservableList<XYChart.Data<Number, Number>> list, Permutation per){
+        double x = per.getValue(x_id);
+        double y = per.getValue(y_id);
+        list.stream().filter(o -> o.getXValue().equals(x)).forEach(
+                o -> {
+                    if (o.getYValue().doubleValue()> y){
+                        o.setYValue(y);
+                        addEvent(o, per);
+                    }
+                }
+        );
+    }
+    private void updateMaxYArg(final ObservableList<XYChart.Data<Number, Number>> list, Permutation per){
+        double x = per.getValue(x_id);
+        double y = per.getValue(y_id);
+        list.stream().filter(o -> o.getXValue().equals(x)).forEach(
+                o -> {
+                    if (o.getYValue().doubleValue()<y){
+                        o.setYValue(y);
+                        addEvent(o, per);
+                    }
+                }
+        );
     }
 
     @Override
@@ -18,6 +241,25 @@ public class PDiagramm extends HBox implements IPlotCallback {
         if (table != _table){
             return;
         }
+        IData idata = _data.get(_table).get(data);
+        if (idata instanceof Permutation){
+            Permutation pdata = (Permutation) idata;
+            if (key == x_id){
+                series_all.getData().get(data).setXValue(idata.getValue(x_id));
+            }else if (key == y_id){
+                series_all.getData().get(data).setYValue(idata.getValue(y_id));
+            }
+            addEvent(series_all.getData().get(data), pdata);
+            series_min.getData().clear();
+            series_max.getData().clear();
+
+            for (int i = 0; i < _data.get(_table).size(); ++i) {
+                IData iData = _data.get(_table).get(i);
+                insertMinData(idata);
+                insertMaxData(idata);
+            }
+            sortData();
+        }
     }
 
     @Override
@@ -25,6 +267,10 @@ public class PDiagramm extends HBox implements IPlotCallback {
         if (table != _table){
             return;
         }
+        IData idata = _data.get(_table).get(data);
+        insertData(idata);
+        insertMinData(idata);
+        insertMaxData(idata);
     }
 
     @Override
@@ -32,5 +278,7 @@ public class PDiagramm extends HBox implements IPlotCallback {
         if (table != _table){
             return;
         }
+        CBKey1.getItems().add(key);
+        CBKey2.getItems().add(key);
     }
 }

+ 7 - 13
src/main/java/mdd/client/optimization/PListElement.java

@@ -2,9 +2,11 @@ package mdd.client.optimization;
 
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
+import javafx.event.EventHandler;
 import javafx.geometry.Bounds;
 import javafx.scene.Group;
 import javafx.scene.control.Label;
+import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.GridPane;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
@@ -18,7 +20,7 @@ import java.util.Set;
 import java.util.TreeMap;
 import java.util.Vector;
 
-public class PListElement extends Group implements IGUIEventClient, ChangeListener<Bounds> {
+public class PListElement extends Group implements ChangeListener<Bounds> {
     private GridPane header = new GridPane();
     private VBox dna = new VBox();
     private Rectangle titlebar;
@@ -31,8 +33,7 @@ public class PListElement extends Group implements IGUIEventClient, ChangeListen
     Label _time = new Label();
 
     public PListElement(Permutation per){
-        _eventHandler = GUIEventHandler.getEventHandler();
-        _eventHandler.addEventListener(this, 5);
+        _eventHandler = GUIEventHandler.getEventHandler(1);
         setFocusTraversable(true);
         dna.setSpacing(10);
         dna.setTranslateX(5);
@@ -79,6 +80,9 @@ public class PListElement extends Group implements IGUIEventClient, ChangeListen
                         case 0:
                         case 1:
                             _status.setText("status: ok");
+                            addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
+                                _eventHandler.publishEvent(10, "OPEN", per.jprocessor);
+                            });
                             break;
                         default:
                             _status.setText("status: unknown " + per.getValue(id).shortValue());
@@ -114,14 +118,4 @@ public class PListElement extends Group implements IGUIEventClient, ChangeListen
         background.setWidth(width);
         background.setHeight(dna.getTranslateY()+dna.getHeight()+10);
     }
-
-    @Override
-    public void processGUIEvent(String event, JSONObject args) {
-
-    }
-
-    @Override
-    public void close() throws Exception {
-
-    }
 }

+ 7 - 2
src/main/java/mdd/client/optimization/Permutation.java

@@ -23,7 +23,7 @@ public class Permutation implements IData, IGUIEventClient {
 
     public Permutation(long gen, JSONObject json){
         step = gen;
-        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler = GUIEventHandler.getEventHandler(0);
         _eventHandler.addEventListener(this, 5);
         setValue("step", (double)gen);
         configure(json);
@@ -121,7 +121,12 @@ public class Permutation implements IData, IGUIEventClient {
             }
         }
         if(json.containsKey("processor")){
-            jprocessor = (JSONObject) json.get("processor");
+            JSONParser parser = new JSONParser();
+            try {
+                jprocessor = (JSONObject) parser.parse(json.get("processor").toString());
+            }catch (ParseException e){
+                jprocessor = (JSONObject)json.get("processor");
+            }
         }
     }