Browse Source

Merge branch 'master' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons

dominik.rieder 7 years ago
parent
commit
14b296dba9

+ 0 - 1
.classpath

@@ -3,7 +3,6 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="res"/>
 	<classpathentry excluding="src/|res/" kind="src" path=""/>
-	<classpathentry kind="lib" path="jars/json-simple-1.1.1.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="lib" path="jars/CpsAlgorithm.jar"/>

+ 10 - 2
src/TypeAdapter/ColorAdapter.java

@@ -6,6 +6,7 @@ import java.lang.reflect.Type;
 import com.google.gson.JsonDeserializationContext;
 import com.google.gson.JsonDeserializer;
 import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.google.gson.JsonParseException;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSerializationContext;
@@ -16,13 +17,20 @@ public class ColorAdapter implements JsonSerializer<Color>, JsonDeserializer<Col
 	@Override
 	public Color deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
 		// TODO Auto-generated method stub
-		return new Color(arg0.getAsInt());
+		JsonObject object = arg0.getAsJsonObject();
+		return new Color(object.get("R").getAsInt(), object.get("G").getAsInt(), object.get("B").getAsInt());
+		
 	}
 
 	@Override
 	public JsonElement serialize(Color arg0, Type arg1, JsonSerializationContext arg2) {
 		// TODO Auto-generated method stub
-		return new JsonPrimitive(Integer.toHexString(arg0.getRGB()));
+		JsonObject object = new JsonObject();
+		object.add("R", new JsonPrimitive(arg0.getRed()));
+		object.add("G", new JsonPrimitive(arg0.getGreen()));
+		object.add("B", new JsonPrimitive(arg0.getBlue()));
+		
+		return object;
 	}
 
 }

+ 1 - 1
src/TypeAdapter/PositionAdapter.java

@@ -26,7 +26,7 @@ public class PositionAdapter implements JsonSerializer<Position>, JsonDeserializ
 			String arg = arg0.getAsString();
 			int mid = arg.indexOf(':');
 			int x = Integer.parseInt(arg.substring(0, mid));
-			int y = Integer.parseInt(arg.substring(mid + 1, arg.length() - 1));
+			int y = Integer.parseInt(arg.substring(mid + 1, arg.length()));
 			return new Position(x, y);
 
 		} catch (Exception e) {

+ 27 - 3
src/classes/HolonBody.java

@@ -1,6 +1,7 @@
 package classes;
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Graphics2D;
 
@@ -16,8 +17,8 @@ public class HolonBody implements Comparable<HolonBody> {
 	public void setId(int id) {
 		this.id = id;
 	}
-	
-	public int getId(){
+
+	public int getId() {
 		return id;
 	}
 
@@ -40,7 +41,8 @@ public class HolonBody implements Comparable<HolonBody> {
 				(int) (2 * getRadius()), (int) (2 * getRadius()));
 		g2.setFont(new Font("TimesRoman", Font.PLAIN, (int) radius));
 		g2.setColor(Color.WHITE);
-		g2.drawString(info, position.getX() - g2.getFontMetrics().stringWidth(info)/2, position.getY() + g2.getFontMetrics().getHeight()/3 );
+		g2.drawString(info, position.getX() - g2.getFontMetrics().stringWidth(info) / 2,
+				position.getY() + g2.getFontMetrics().getHeight() / 3);
 	}
 
 	public void setRadius(float radius) {
@@ -142,4 +144,26 @@ public class HolonBody implements Comparable<HolonBody> {
 		}
 	}
 
+	public int compareSizeTo(HolonBody body) {
+		if (this.getRadius() > body.getRadius()) {
+			return 1;
+		} else if (this.getRadius() < body.getRadius()) {
+			return -1;
+		} else {
+			return 0;
+		}
+	}
+
+	public int compareDistTo(HolonBody body, Dimension center) {
+		float thisDist = (float) Math.sqrt(Math.pow(center.getWidth()-this.position.getX(),2)+Math.pow(center.getHeight()-this.position.getY(), 2));
+		float bodyDist = (float) Math.sqrt(Math.pow(center.getWidth()-body.position.getX(),2)+Math.pow(center.getHeight()-body.position.getY(), 2));
+		if (thisDist > bodyDist) {
+			return 1;
+		} else if (thisDist < bodyDist) {
+			return -1;
+		} else {
+			return 0;
+		}
+	}
+
 }

+ 5 - 2
src/classes/HolonElement.java

@@ -45,9 +45,9 @@ public class HolonElement {
 	 * Energy at each point of the graph with 100 predefined points. At the
 	 * beginning, it starts with all values at energy
 	 */
-	private float[] energyAt = new float[100];
+	private float[] energyAt;
 	// Points on the UnitGraph
-	LinkedList<Point> graphPoints = new LinkedList<>();
+	LinkedList<Point> graphPoints;
 
 	/**
 	 * Create a new HolonElement with a user-defined name, amount of the same
@@ -67,6 +67,7 @@ public class HolonElement {
 		setActive(true);
 		setSign(energy);
 		setEnergyAt(energy);
+		setGraphPoints(new LinkedList<>());
 		setId(IdCounterElem.nextId());
 	}
 
@@ -86,6 +87,7 @@ public class HolonElement {
 		for (int i = 0; i < energyAt.length; i++) {
 			energyAt[i] = element.getEnergyAt()[i];
 		}
+		setGraphPoints(new LinkedList<>());
 		for (Point p : element.getGraphPoints()) {
 			this.graphPoints.add(new Point((int) p.getX(), (int) p.getY()));
 		}
@@ -110,6 +112,7 @@ public class HolonElement {
 	 *            the value
 	 */
 	public void setEnergyAt(float energy) {
+		this.energyAt = new float[100];
 		for (int i = 0; i < energyAt.length; i++) {
 			this.energyAt[i] = energy;
 		}

+ 4 - 0
src/classes/HolonSwitch.java

@@ -62,6 +62,7 @@ public class HolonSwitch extends AbstractCpsObject {
 		setAutoState(true);
 		setActiveAt(true);
 		setManualMode(false);
+		setGraphPoints(new LinkedList<>());
 	}
 
 	/**
@@ -75,9 +76,11 @@ public class HolonSwitch extends AbstractCpsObject {
 		super.setName(obj.getName());
 		setManualState(((HolonSwitch)obj).getActiveManual());
 		setAutoState(true);
+		setActiveAt(true);
 		for (int i = 0; i < activeAt.length; i++) {
 			activeAt[i] = ((HolonSwitch)obj).getActiveAt()[i];
 		}
+		setGraphPoints(new LinkedList<>());
 		for (Point p :((HolonSwitch)obj).getGraphPoints()) {
 			this.graphPoints.add(new Point((int)p.getX(), (int)p.getY()));
 		}
@@ -213,6 +216,7 @@ public class HolonSwitch extends AbstractCpsObject {
 	 *            the default value
 	 */
 	public void setActiveAt(boolean active) {
+		activeAt = new boolean[100];
 		for (int i = 0; i < activeAt.length; i++) {
 			this.activeAt[i] = active;
 		}

+ 1 - 0
src/ui/controller/CanvasController.java

@@ -169,6 +169,7 @@ public class CanvasController {
 				tCps = new CpsNode("Node");
 			}
 			tCps.setPosition(new Position(p.x + (cps.getPosition().x - x), p.y + (cps.getPosition().y - y)));
+			tCps.setSav(cps.getSav());
 			tempList.add(tCps);
 			addObject(tCps);
 			// MODEL.getSelectedCpsObjects().add(tCps);

+ 3 - 3
src/ui/controller/Control.java

@@ -59,13 +59,13 @@ public class Control {
 		this.canvasController = new CanvasController(model, multiPurposeController);
 		this.globalController = new GlobalController(model);
 		this.storeController = new StoreController(model);
-		this.loadController = new LoadController(model, categoryController, canvasController, objectController,
-				globalController, multiPurposeController);
+		this.nodeController = new NodeController(model, canvasController, multiPurposeController);
+		this.loadController = new LoadController(model, categoryController, canvasController, objectController, nodeController, multiPurposeController);
 		this.simulationManager = new SimulationManager(model);
 		this.autoSaveController = new AutoSaveController(model);
 		this.consoleController = new ConsoleController(model);
 		this.statsController = new StatsController(model);
-		this.nodeController = new NodeController(model, canvasController, multiPurposeController);
+
 		autoPath = System.getProperty("user.home") + "/HolonGUI/Autosave/";
 		File dest = new File(autoPath);
 		// deleteDirectory(dest);

+ 316 - 182
src/ui/controller/LoadController.java

@@ -1,27 +1,32 @@
 package ui.controller;
 
+import java.awt.Color;
 import java.awt.Point;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
-
-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.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import TypeAdapter.AbstractCpsObjectAdapter;
+import TypeAdapter.ColorAdapter;
+import TypeAdapter.PositionAdapter;
 import classes.Category;
 import classes.CpsEdge;
-import classes.CpsNode;
+import classes.CpsUpperNode;
 import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
-import classes.HolonTransformer;
 import classes.IdCounter;
+import classes.Position;
 import ui.model.Model;
 
 /**
@@ -33,16 +38,26 @@ public class LoadController {
 	/**
 	 * enum Mode.
 	 */
-	public enum Mode {
-		ALL, CATEGORY, CANVAS
+	public enum MODE {
+		COMPLETE, PARTIAL
+	}
+
+	public enum EDGETYPE {
+		CANVAS, CONNECTION, NODE, OLD
+	}
+
+	public enum GRAPHTYPE {
+		SWITCH, ELEMENT
 	}
 
 	private Model model;
 	private CategoryController cgC;
 	private CanvasController cvsC;
 	private ObjectController objC;
-	private GlobalController global;
+	private NodeController uppC;
 	private MultiPurposeController mpC;
+	private Gson gson;
+	private JsonParser parser;
 
 	/**
 	 * Constructor.
@@ -59,14 +74,14 @@ public class LoadController {
 	 *            MultiPurposeController
 	 */
 	public LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj,
-			GlobalController global, MultiPurposeController mp) {
+			NodeController uppC, MultiPurposeController mp) {
 		this.model = model;
 		this.cgC = cg;
 		this.cvsC = cvs;
 		this.objC = obj;
-		this.global = global;
+		this.uppC = uppC;
 		this.mpC = mp;
-
+		initGson();
 	}
 
 	/**
@@ -78,238 +93,357 @@ public class LoadController {
 	 *             exception
 	 */
 	public void readJson(String path) throws IOException {
-		JSONParser parser = new JSONParser();
-		JSONObject json = new JSONObject();
-		try {
-			json = (JSONObject) parser.parse(new FileReader(path));
-		} catch (ParseException ex) {
-			// TODO Auto-generated catch block
-			ex.printStackTrace();
-		}
 
-		ArrayList<String> obj = new ArrayList<>();
-		ArrayList<String> ele = new ArrayList<>();
-		ArrayList<String> edge = new ArrayList<>();
-		ArrayList<String> gp = new ArrayList<>();
+		JsonObject json = (JsonObject) parser.parse(new FileReader(path));
+		// get all keys via stream
+		List<String> keys = getKeys(json);
+		List<String> edges = keys.stream().filter(key -> key.contains("EDGE"))
+				.collect(Collectors.toCollection(ArrayList::new));
 
-		Mode mode = Mode.valueOf(json.get("MODE").toString());
+		HashMap<Integer, AbstractCpsObject> objDispatch = new HashMap<>();
+		HashMap<Integer, HolonElement> eleDispatch = new HashMap<>();
 
-		if (mode.equals(Mode.ALL) || mode.equals(Mode.CATEGORY)) {
-			model.setCgIdx(new HashMap<String, Integer>());
-			model.setCategories(new ArrayList<Category>());
-		}
-		if (mode.equals(Mode.ALL) || mode.equals(Mode.CANVAS)) {
-			model.setCvsObjIdx(new HashMap<Integer, Integer>());
-			model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
-			model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
-		}
+		initialize(keys, json);
+		distribute(keys, json, objDispatch, eleDispatch);
+		distEdges(edges, json, objDispatch);
 
-		for (Object key : json.keySet()) {
-			if (key.equals("CG"))
-				readCategory((JSONArray) json.get(key));
-			else if (key.equals("ID"))
-				IdCounter.setCounter(Integer.parseInt(json.get(key.toString()).toString()));
-//			else if	(key.equals("SIZEX"))
-//				global.setCanvasX(Integer.parseInt(json.get(key.toString()).toString()));
-//			else if (key.equals("SIZEY"))
-//				global.setCanvasY(Integer.parseInt(json.get(key.toString()).toString()));
-			else if (key.toString().contains("CGO") || key.toString().contains("CVSO"))
-				obj.add(key.toString());
-			else if (key.toString().contains("CGE") || key.toString().contains("CVSE"))
-				ele.add(key.toString());
-			else if (key.toString().contains("EDGE"))
-				edge.add(key.toString());
-			else if (key.toString().contains("CGGP") || key.toString().contains("CVSGP"))
-				gp.add(key.toString());
+	}
 
+	/**
+	 * distribute the Edges 
+	 * @param edges
+	 * @param json
+	 * @param objDispatch
+	 */
+	private void distEdges(List<String> edges, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch) {
+		// TODO Auto-generated method stub
+
+		for (String edge : edges) {
+			if (edge.contains("CVSEDGE"))
+				loadEdge(EDGETYPE.CANVAS, json.get(edge), objDispatch);
+			if (edge.contains("CONNEDGE"))
+				loadEdge(EDGETYPE.CONNECTION, json.get(edge), objDispatch);
+			if (edge.contains("NODE"))
+				loadEdge(EDGETYPE.NODE, json.get(edge), objDispatch);
+			if (edge.contains("OLD"))
+				loadEdge(EDGETYPE.OLD, json.get(edge), objDispatch);
 		}
-
-		Collections.sort(obj);
-		Collections.sort(ele);
-		Collections.sort(edge);
-		Collections.sort(gp);
-
-		dispatch(obj, json);
-		dispatch(ele, json);
-		dispatch(edge, json);
-		dispatch(gp, json);
-
 	}
-
+	
 	/**
-	 * dispatch the Keys into the right processing.
-	 * 
-	 * @param input
-	 *            input
+	 * Distribute the given keys for right processing
+	 * @param keys
 	 * @param json
-	 *            Json
+	 * @param objDispatch
+	 * @param eleDispatch
 	 */
-	public void dispatch(ArrayList<String> input, JSONObject json) {
-
-		for (String str : input) {
-			if (str.contains("CGO")) {
-				readCategoryObject((JSONArray) json.get(str));
-			} else if (str.contains("CVSO")) {
-				readCanvasObject((JSONArray) json.get(str));
-			} else if (str.contains("CGE") || str.contains("CVSE")) {
-				readElement((JSONArray) json.get(str));
-			} else if (str.contains("EDGE")) {
-				readEdge((JSONArray) json.get(str));
-			} else if (str.contains("CGGP") || str.contains("CVSGP")) {
-				readElementGraph((JSONArray) json.get(str));
-			}
+	private void distribute(List<String> keys, JsonObject json, HashMap<Integer, AbstractCpsObject> objDispatch,
+			HashMap<Integer, HolonElement> eleDispatch) {
+		// TODO Auto-generated method stub
+		for (String key : keys) {
+			if (key.contains("CATEGORY"))
+				loadCategory(json.get(key));
+			if (key.contains("CGOBJECT"))
+				loadCategoryObject(json.get(key));
+			if (key.contains("CGELEMENT"))
+				loadCategoryElements(json.get(key));
+			if (key.contains("CVSOBJECT"))
+				loadCanvasObject(json.get(key), objDispatch);
+			if (key.contains("CVSELEMENT"))
+				loadCanvasElements(json.get(key), objDispatch, eleDispatch);
+			if (key.contains("SWUNITGRAPH"))
+				loadUnitGraph(GRAPHTYPE.SWITCH, json.get(key), objDispatch, null);
+			if (key.contains("ELEUNITGRAPH"))
+				loadUnitGraph(GRAPHTYPE.ELEMENT, json.get(key), null, eleDispatch);
 		}
 
 	}
 
 	/**
-	 * Read all Categories from the JSON file.
+	 * Init the Global Parameters
 	 * 
-	 * @param arr
-	 *            JSONArray
+	 * @param keys
+	 * @param json
 	 */
-	public void readCategory(JSONArray arr) {
+	private void initialize(List<String> keys, JsonObject json) {
 
-		Iterator<Object> i = arr.iterator();
+		switch (MODE.valueOf(json.get("MODE").getAsString())) {
+		case COMPLETE:
+			model.setCgIdx(new HashMap<String, Integer>());
+			model.setCategories(new ArrayList<Category>());
+			model.setCvsObjIdx(new HashMap<Integer, Integer>());
+			model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
+			model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
+			model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
+			model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
+			break;
+		case PARTIAL:
+			model.setCvsObjIdx(new HashMap<Integer, Integer>());
+			model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
+			model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
+			break;
 
-		while (i.hasNext()) {
-			cgC.addNewCategory(next(i));
+		default:
+			break;
 		}
+		IdCounter.setCounter(json.get("IDCOUNTER").getAsInt());
 	}
 
 	/**
-	 * Read all Objects in Category from the JSON File.
+	 * Load a given Category
 	 * 
-	 * @param arr
-	 *            JSON Array
+	 * @param jsonElement
 	 */
-	public void readCategoryObject(JSONArray arr) {
-		Iterator<Object> i = arr.iterator();
+	private void loadCategory(JsonElement jsonElement) {
+		// TODO Auto-generated method stub
+		cgC.addCategory(new Category(jsonElement.getAsString()));
+	}
 
-		String type = next(i);
+	/**
+	 * Load a given Object in Category by Deserialization
+	 * 
+	 * @param jsonElement
+	 */
+	private void loadCategoryObject(JsonElement jsonElement) {
+		// TODO Auto-generated method stub
+		AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
+		initObjects(temp);
 
-		if (type.equals("HolonObject")) {
-			cgC.addNewHolonObject(mpC.searchCat(next(i)), next(i), new ArrayList<HolonElement>(), next(i));
-		} else if (type.equals("HolonTransformer")) {
-			cgC.addNewHolonTransformer(mpC.searchCat(next(i)), next(i), next(i));
-		} else if (type.equals("HolonSwitch")) {
-			cgC.addNewHolonSwitch(mpC.searchCat(next(i)), next(i), next(i));
-		}
+		cgC.addObject(mpC.searchCat(temp.getSav()), temp);
+	}
 
+	/**
+	 * Load a given Element in Category by Deserialization
+	 * 
+	 * @param jsonElement
+	 */
+	private void loadCategoryElements(JsonElement jsonElement) {
+		// TODO Auto-generated method stub
+		HolonElement temp = gson.fromJson(jsonElement.getAsJsonObject().get("properties").getAsJsonObject(),
+				HolonElement.class);
+		initElements(temp);
+		objC.addElementIntoCategoryObject(temp.getSav(), temp.getObj(), temp);
 	}
 
 	/**
-	 * Read all Objects in Canvas from JSON File.
+	 * Load a given Object in Canvas by Deserialization
 	 * 
-	 * @param arr
-	 *            JSON Array
+	 * @param jsonElement
+	 * @param objDispatch
 	 */
-	public void readCanvasObject(JSONArray arr) {
-		Iterator<Object> i = arr.iterator();
-		AbstractCpsObject cps = null;
-
-		String type = next(i);
-
-		if (type.equals("HolonObject")) {
-			cps = new HolonObject(next(i));
-		} else if (type.equals("HolonTransformer")) {
-			cps = new HolonTransformer(next(i));
-		} else if (type.equals("HolonSwitch")) {
-			cps = new HolonSwitch(next(i));
-		} else if (type.equals("CpsNode")) {
-			cps = new CpsNode(next(i));
+	private void loadCanvasObject(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch) {
+		// TODO Auto-generated method stub
+		AbstractCpsObject temp = gson.fromJson(jsonElement.getAsJsonObject(), AbstractCpsObject.class);
+		initObjects(temp);
+		// if its stored before on the canvas just put it there
+		if (temp.getSav().equals("CVS")) {
+			cvsC.addObject(temp);
+
+		} else {
+			// else look up the table and put it into the right Uppernode
+			CpsUpperNode temp2 = (CpsUpperNode) objDispatch.get(Integer.parseInt(temp.getSav()));
+			uppC.addObjectInUpperNode(temp, temp2);
 		}
 
-		cps.setName(next(i));
-		cps.setID(Integer.parseInt(next(i)));
-		cps.setImage(next(i));
-		cps.setPosition(Integer.parseInt(next(i)), Integer.parseInt(next(i)));
+		objDispatch.put(temp.getID(), temp);
 
-		cvsC.addNewObject(cps);
 	}
+	
+	/**
+	 * Load a given Element in Canvas by Deserialization
+	 * @param jsonElement
+	 * @param objDispatch
+	 * @param eleDispatch
+	 */
+	private void loadCanvasElements(JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
+			HashMap<Integer, HolonElement> eleDispatch) {
+		// TODO Auto-generated method stub
+
+		JsonObject object = jsonElement.getAsJsonObject();
+		
+		HolonElement temp = gson.fromJson(object.get("properties"), HolonElement.class);
+		initElements(temp);
+		//id which Object it was stored before
+		int stored = object.get("ID").getAsInt();
+		//lookup that object
+		HolonObject temp2 = (HolonObject) objDispatch.get(stored);
+		//add it
+		objC.addElement(temp2, temp);
+		//store element also inside a table
+		eleDispatch.put(temp.getId(), temp);
+	}
+	
+	/**
+	 * Load a given Edge by Deserialization
+	 * @param type
+	 * @param jsonElement
+	 * @param objDispatch
+	 */
+	private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch) {
+		// TODO Auto-generated method stub
+		JsonObject object = jsonElement.getAsJsonObject();
+		CpsEdge temp = gson.fromJson(object.get("properties"), CpsEdge.class);
+		initCpsEdge(temp);
+		//look for A and B inside the Table
+		temp.setA(objDispatch.get(object.get("A").getAsInt()));
+		temp.setB(objDispatch.get(object.get("B").getAsInt()));
+
+		int sav = 0;
+
+		switch (type) {
+		case CANVAS:
+			//if in canvas add it into the canvas but delete connection before
+			model.getEdgesOnCanvas().add(temp);
+			temp.getA().getConnections().remove(temp);
+			temp.getB().getConnections().remove(temp);
+			break;
+		case CONNECTION:
+			//if no duplicates in connection store them into the given A and B
+			if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getA().getConnections()))
+				temp.getA().getConnections().add(temp);
+			if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getB().getConnections()))
+				temp.getB().getConnections().add(temp);
+			break;
+		case NODE:
+			// put it into given nodeofnode
+			sav = object.get("ID").getAsInt();
+			((CpsUpperNode) objDispatch.get(sav)).getNodeEdges().add(temp);
+			break;
+		case OLD:
+			//same as above
+			sav = object.get("ID").getAsInt();
+			((CpsUpperNode) objDispatch.get(sav)).getOldEdges().add(temp);
+			break;
+		default:
+			break;
+		}
 
+	}
+	
 	/**
-	 * Read all Elements in Category and Canvas from JSON File.
-	 * 
-	 * @param arr
-	 *            JSON Array
+	 * Load a Unitgraph by Deserialization
+	 * @param type
+	 * @param jsonElement
+	 * @param objDispatch
+	 * @param eleDispatch
 	 */
-	public void readElement(JSONArray arr) {
-		Iterator<Object> i = arr.iterator();
+	private void loadUnitGraph(GRAPHTYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCpsObject> objDispatch,
+			HashMap<Integer, HolonElement> eleDispatch) {
+		// TODO Auto-generated method stub
+
+		JsonObject object = jsonElement.getAsJsonObject();
+		List<String> keys = getKeys(object);
+		String p = null;
+		int mid, x, y = 0;
+
+		LinkedList<Point> graphpoint = new LinkedList<>();
+		int sav = 0;
+		//foreach Point in the graph restore it
+		for (String k : keys) {
+			if (!k.equals("ID")) {
+				p = object.get(k).getAsString();
+				mid = p.indexOf(':');
+				x = Integer.parseInt(p.substring(0, mid));
+				y = Integer.parseInt(p.substring(mid + 1, p.length()));
+				graphpoint.add(new Point(x, y));
+			} else
+				//else its an ID
+				sav = object.get(k).getAsInt();
 
-		String sav = next(i);
-		String obj = next(i);
+		}
 
-		HolonElement ele = new HolonElement(next(i), Integer.parseInt(next(i)), Float.parseFloat(next(i)));
+		switch (type) {
+		case SWITCH:
+			HolonSwitch sw = (HolonSwitch) objDispatch.get(sav);
+			sw.setGraphPoints(graphpoint);
+			break;
+		case ELEMENT:
+			HolonElement ele = eleDispatch.get(sav);
+			ele.setGraphPoints(graphpoint);
+			break;
+		default:
+			break;
+		}
+	}
 
-		if (sav.equals("CVS")) {
-			ele.setActive(convert(Integer.parseInt(next(i))));
-			objC.addElementIntoCanvasObject((HolonObject) mpC.searchByID(Integer.parseInt(obj)), ele);
-		} else
-			objC.addElementIntoCategoryObject(sav, obj, ele);
+	/**
+	 * Initialize the Gson with wanted parameters
+	 */
+	private void initGson() {
+		// TODO Auto-generated method stub
+		GsonBuilder builder = new GsonBuilder();
+		builder.serializeNulls();
+		builder.registerTypeAdapter(AbstractCpsObject.class, new AbstractCpsObjectAdapter());
+		builder.registerTypeAdapter(Position.class, new PositionAdapter());
+		builder.registerTypeAdapter(Color.class, new ColorAdapter());
+		// use the builder and make a instance of the Gson
+		this.gson = builder.create();
+		this.parser = new JsonParser();
 	}
 
 	/**
-	 * Read.
+	 * Init new Arrays which havent been serialized along the object
 	 * 
-	 * @param arr
-	 *            JSON Array
+	 * @param obj
 	 */
-	public void readEdge(JSONArray arr) {
-		Iterator<Object> i = arr.iterator();
+	private void initObjects(AbstractCpsObject obj) {
+
+		obj.setConnections(new ArrayList<>());
+		obj.setTags(new ArrayList<>());
+		obj.setPseudoTags(new ArrayList<>());
 
-		CpsEdge edge = new CpsEdge(mpC.searchByID(Integer.parseInt(next(i))),
-				mpC.searchByID(Integer.parseInt(next(i))));
-		edge.setCapacity(Float.parseFloat(next(i)));
-		edge.setFlow(Float.parseFloat(next(i)));
+		if (obj instanceof HolonObject) {
+			((HolonObject) obj).setElements(new ArrayList<HolonElement>());
+			((HolonObject) obj).setEleIdx(new HashMap<String, Integer>());
+
+			((HolonObject) obj).setTrackingProd(new float[100]);
+			((HolonObject) obj).setTrackingCons(new float[100]);
+		}
 
-		cvsC.addEdgeOnCanvas(edge);
+		if (obj instanceof HolonSwitch) {
+			((HolonSwitch) obj).setActiveAt(true);
+			((HolonSwitch) obj).setGraphPoints(new LinkedList<>());
+		}
+
+		if (obj instanceof CpsUpperNode) {
+			((CpsUpperNode) obj).setNodes(new ArrayList<AbstractCpsObject>());
+			((CpsUpperNode) obj).setNodeEdges(new ArrayList<CpsEdge>());
+			((CpsUpperNode) obj).setOldEdges(new ArrayList<CpsEdge>());
+			((CpsUpperNode) obj).setNodesIdx(new HashMap<Integer, Integer>());
+		}
 	}
 
 	/**
-	 * Read the Element Graph.
+	 * Init Elements
 	 * 
-	 * @param arr
-	 *            JSON Array
+	 * @param ele
 	 */
-	public void readElementGraph(JSONArray arr) {
-		Iterator<Object> i = arr.iterator();
-
-		String sav = next(i);
-		HolonElement ele;
-
-		if (sav.equals("CVS")) {
-			ele = mpC.searchEle((HolonObject) mpC.searchByID(Integer.parseInt(next(i))), next(i));
-			while (i.hasNext())
-				ele.getGraphPoints().add(new Point(Integer.parseInt(next(i)), Integer.parseInt(next(i))));
-		} else {
-			ele = mpC.searchEle((HolonObject) mpC.searchCatObj(mpC.searchCat(sav), next(i)), next(i));
-			while (i.hasNext())
-				ele.getGraphPoints().add(new Point(Integer.parseInt(next(i)), Integer.parseInt(next(i))));
-		}
+	private void initElements(HolonElement ele) {
 
+		ele.setEnergyAt(ele.getEnergy());
+		ele.setGraphPoints(new LinkedList<>());
 	}
 
 	/**
-	 * Get the Next Element from an Iterator.
+	 * Init Edges
 	 * 
-	 * @param i
-	 *            Iterator
-	 * @return next Element from the Iterator
+	 * @param edge
 	 */
-	public String next(Iterator<Object> i) {
-		return i.next().toString();
+	private void initCpsEdge(CpsEdge edge) {
+		edge.setTags(new ArrayList<>());
+		edge.setPseudoTag(new ArrayList<>());
+		edge.setA(null);
+		edge.setB(null);
 	}
 
 	/**
-	 * converting saved Integers into Booleans.
+	 * Get Set of Keys
 	 * 
-	 * @param x
-	 *            integer
-	 * @return boolean
+	 * @param json
+	 * @return
 	 */
-	public boolean convert(int x) {
-		return x == 1 ? true : false;
+	private List<String> getKeys(JsonObject json) {
+		return json.entrySet().stream().map(i -> i.getKey()).collect(Collectors.toCollection(ArrayList::new));
 	}
 
 }

+ 9 - 2
src/ui/controller/NodeController.java

@@ -314,7 +314,7 @@ public class NodeController {
 	 * @param list
 	 * @return
 	 */
-	private boolean lookforDuplicates(AbstractCpsObject a, AbstractCpsObject b, ArrayList<CpsEdge> list) {
+	public boolean lookforDuplicates(AbstractCpsObject a, AbstractCpsObject b, ArrayList<CpsEdge> list) {
 		for (CpsEdge cpsEdge : list) {
 			if ((a.equals(cpsEdge.getA()) && b.equals(cpsEdge.getB()))
 					|| (b.equals(cpsEdge.getA()) && a.equals(cpsEdge.getB())))
@@ -476,7 +476,7 @@ public class NodeController {
 	 * @param upperNode
 	 */
 	public void addObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
-		object.setSav("UPPER" + upperNode.getID());
+		object.setSav("" + upperNode.getID());
 		upperNode.getNodesIdx().put(object.getID(), upperNode.getNodes().size());
 		upperNode.getNodes().add(object);
 	}
@@ -548,4 +548,11 @@ public class NodeController {
 			upperNode.getOldEdges().remove(edge);
 	}
 
+	private void refreshSave(ArrayList<AbstractCpsObject> list, CpsUpperNode upperNode) {
+
+		for (AbstractCpsObject abs : list) {
+			abs.setSav("" + upperNode.getID());
+		}
+	}
+
 }

+ 73 - 69
src/ui/controller/StoreController.java

@@ -6,19 +6,10 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.JsonPrimitive;
-import com.google.gson.stream.JsonWriter;
-
 import TypeAdapter.AbstractCpsObjectAdapter;
 import TypeAdapter.ColorAdapter;
 import TypeAdapter.PositionAdapter;
@@ -30,10 +21,8 @@ import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
-import classes.HolonTransformer;
 import classes.IdCounter;
 import classes.Position;
-import classes.TrackedDataSet;
 import sun.misc.Queue;
 import ui.model.Model;
 
@@ -76,7 +65,6 @@ public class StoreController {
 	 */
 	public StoreController(Model model) {
 		this.model = model;
-		initNumeration();
 		initGson();
 	}
 
@@ -92,19 +80,19 @@ public class StoreController {
 	 */
 	public void writeSaveFile(String path) throws IOException {
 
+		initNumeration();
 		JsonObject file = new JsonObject();
-
 		initialize(MODE.COMPLETE, file);
 		storeCategory(file);
 		storeCanvas(file);
 
 		FileWriter writer = new FileWriter(path);
 		writer.write(gson.toJson(file));
-		
+
 		writer.flush();
 		writer.close();
 	}
-	
+
 	/**
 	 * Writes the Autosave File.
 	 * 
@@ -115,14 +103,14 @@ public class StoreController {
 	 */
 	public void writeAutosaveFile(String path) throws IOException {
 
-		
+		initNumeration();
 		JsonObject file = new JsonObject();
 		initialize(MODE.PARTIAL, file);
 		storeCanvas(file);
-		
+
 		FileWriter writer = new FileWriter(path);
 		writer.write(gson.toJson(file));
-		
+
 		writer.flush();
 		writer.close();
 	}
@@ -139,13 +127,13 @@ public class StoreController {
 		switch (mode) {
 		case COMPLETE:
 			file.add("MODE", new JsonPrimitive(mode.name()));
-			file.add("IDCounter", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
 			file.add("CANVAS_SIZE_X", new JsonPrimitive(model.getCanvasX()));
 			file.add("CANVAS_SIZE_Y", new JsonPrimitive(model.getCanvasY()));
 			break;
 		case PARTIAL:
 			file.add("MODE", new JsonPrimitive(mode.name()));
-			file.add("IDCounter", new JsonPrimitive(IdCounter.getCounter()));
+			file.add("IDCOUNTER", new JsonPrimitive(IdCounter.getCounter()));
 			break;
 
 		default:
@@ -160,147 +148,168 @@ public class StoreController {
 	 */
 	private void storeCategory(JsonObject file) {
 		// TODO Auto-generated method stub
+		// forall categories store them into the jsontree
 		for (Category cat : model.getCategories()) {
 			String key = "CATEGORY" + getNumerator(NUMTYPE.CATEGORY);
+
 			file.add(key, new JsonPrimitive(cat.getName()));
+			// forall object in the category store them into the jsontree
 			for (AbstractCpsObject obj : cat.getObjects()) {
-				file.add("CATEGORY.OBJECT" + getNumerator(NUMTYPE.OBJECT),
-						new JsonPrimitive(gson.toJson(obj, AbstractCpsObject.class)));
+				file.add("CGOBJECT" + getNumerator(NUMTYPE.OBJECT), gson.toJsonTree(obj, AbstractCpsObject.class));
+				// if its a holonobject add elements too
 				if (obj instanceof HolonObject)
-					elementsToJson(TYPE.CATEGORY, gson, file, obj);
+					elementsToJson(TYPE.CATEGORY, file, obj);
 			}
 		}
 	}
 
 	/**
 	 * Travers through all Objects via BFS and Stores everything relevant
-
+	 * 
 	 * @param file
 	 */
 	private void storeCanvas(JsonObject file) {
 		// TODO Auto-generated method stub
 		Queue<AbstractCpsObject> queue = new Queue<>();
 		AbstractCpsObject u = null;
-
-		edgeToJson(EDGETYPE.CANVAS, gson, file, 0, model.getEdgesOnCanvas());
-
+		// put all objects into queue since there is not starting object
 		for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 			queue.enqueue(cps);
 		}
-
+		// while quene not empty
 		while (!queue.isEmpty()) {
 			try {
+				// u = current node
 				u = queue.dequeue();
 			} catch (InterruptedException e) {
 				// TODO Auto-generated catch block
 				e.printStackTrace();
 			}
-			String key = "CANVAS.OBJECT" + getNumerator(NUMTYPE.OBJECT);
-			file.add(key, new JsonPrimitive(gson.toJson(u, AbstractCpsObject.class)));
-			edgeToJson(EDGETYPE.CONNECTION, gson, file, u.getID(), u.getConnections());
-
+			// add currentnode into jsontree
+			String key = "CVSOBJECT" + getNumerator(NUMTYPE.OBJECT);
+			file.add(key, gson.toJsonTree(u, AbstractCpsObject.class));
+			// and its connections too
+			edgeToJson(EDGETYPE.CONNECTION, file, u.getID(), u.getConnections());
+			// if holonobject elements too
 			if (u instanceof HolonObject)
-				elementsToJson(TYPE.CANVAS, gson, file, u);
+				elementsToJson(TYPE.CANVAS, file, u);
+			// if switch graphpoints too
 			if (u instanceof HolonSwitch)
-				unitgraphToJson(GRAPHTYPE.SWITCH, gson, file, u.getID(), ((HolonSwitch) u).getGraphPoints());
+				if (((HolonSwitch) u).getGraphPoints().size() != 0)
+					unitgraphToJson(GRAPHTYPE.SWITCH, file, u.getID(), ((HolonSwitch) u).getGraphPoints());
+			// if uppernode put all nodes inside the uppernode into queue
 			if (u instanceof CpsUpperNode) {
 				for (AbstractCpsObject adjacent : ((CpsUpperNode) u).getNodes()) {
 					queue.enqueue(adjacent);
 
 				}
-				edgeToJson(EDGETYPE.NODE, gson, file, u.getID(), ((CpsUpperNode) u).getNodeEdges());
-				edgeToJson(EDGETYPE.OLD, gson, file, u.getID(), ((CpsUpperNode) u).getOldEdges());
+				// dont forget to add the nodeedges and oldedges
+				edgeToJson(EDGETYPE.NODE, file, u.getID(), ((CpsUpperNode) u).getNodeEdges());
+				edgeToJson(EDGETYPE.OLD, file, u.getID(), ((CpsUpperNode) u).getOldEdges());
 			}
 		}
-		
-		datasetToJson(gson, file);
+		// lastly add canvasedges into json
+		edgeToJson(EDGETYPE.CANVAS, file, 0, model.getEdgesOnCanvas());
 
 	}
 
 	/**
+	 * Stores Category or Canvas Elements into Json
 	 * 
 	 * @param type
 	 * @param gson
 	 * @param file
 	 * @param obj
 	 */
-	private void elementsToJson(TYPE type, Gson gson, JsonObject file, AbstractCpsObject obj) {
+	private void elementsToJson(TYPE type, JsonObject file, AbstractCpsObject obj) {
 		// TODO Auto-generated method stub
 		JsonObject temp = new JsonObject();
-
+		String key = null;
+		// forall elements store them into json and include the id of the object
 		for (HolonElement ele : ((HolonObject) obj).getElements()) {
-			temp.add("properties", new JsonPrimitive(gson.toJson(ele)));
+			temp.add("properties", gson.toJsonTree(ele));
 			temp.add("ID", new JsonPrimitive(obj.getID()));
-			if (ele.getEnergyAt().length != 0)
-				unitgraphToJson(GRAPHTYPE.ELEMENT, gson, file, ele.getId(), ele.getGraphPoints());
-
-			file.add(type.name() + ".OBJECT.ELEMENT" + getNumerator(NUMTYPE.ELEMENT), gson.toJsonTree(temp));
+			//switch for deciding the key
+			switch (type) {
+			case CANVAS:
+				key = "CVSELEMENT" + getNumerator(NUMTYPE.ELEMENT);
+				break;
+			case CATEGORY:
+				key = "CGELEMENT" + getNumerator(NUMTYPE.ELEMENT);
+				break;
+			default:
+				break;
+			}
+			file.add(key, gson.toJsonTree(temp));
+			//if there are gps add them into
+			if (ele.getGraphPoints().size() != 0)
+				unitgraphToJson(GRAPHTYPE.ELEMENT, file, ele.getId(), ele.getGraphPoints());
 			temp = new JsonObject();
 		}
 
 	}
 
 	/**
-	 * 
+	 * Put the UnitGraphs of Switches or Elements into Json
 	 * @param ele
 	 */
-	private void unitgraphToJson(GRAPHTYPE type, Gson gson, JsonObject file, int id, LinkedList<Point> graph) {
+	private void unitgraphToJson(GRAPHTYPE type, JsonObject file, int id, LinkedList<Point> graph) {
 
 		JsonObject temp = new JsonObject();
 		String key = null;
-
+		//forall points add them
 		for (int i = 0; i < graph.size(); i++) {
-			temp.add("" + i, new JsonPrimitive(graph.get(i).getX() + ":" + graph.get(i).getY()));
+			temp.add("" + i, new JsonPrimitive(graph.get(i).x + ":" + graph.get(i).y));
 		}
-
+		//decide key
 		switch (type) {
 		case SWITCH:
-			key = "SWITCH.UNIGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
+			key = "SWUNITGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
 			break;
 		case ELEMENT:
-			key = "ELEMENT.UNIGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
+			key = "ELEUNITGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
 			break;
 		default:
 			break;
 		}
-
+		//add id of element so it can be found again
 		temp.add("ID", new JsonPrimitive(id));
 
 		file.add(key, gson.toJsonTree(temp));
 	}
 
 	/**
-	 * 
+	 * Canvas-Edge, Connections, Node-Edge and Old-Edges to json
 	 * @param type
-	 * @param gson
 	 * @param file
 	 * @param id
 	 * @param arr
 	 */
-	private void edgeToJson(EDGETYPE type, Gson gson, JsonObject file, int id, ArrayList<CpsEdge> arr) {
+	private void edgeToJson(EDGETYPE type, JsonObject file, int id, ArrayList<CpsEdge> arr) {
 		// TODO Auto-generated method stub
 		String k = null;
 		JsonObject temp = new JsonObject();
 
 		for (CpsEdge edge : arr) {
-
-			temp.add("properties", new JsonPrimitive(gson.toJson(edge)));
+			//add properties and only the ids from a and b
+			temp.add("properties", gson.toJsonTree(edge));
 			temp.add("A", new JsonPrimitive(edge.getA().getID()));
 			temp.add("B", new JsonPrimitive(edge.getB().getID()));
 
+			//Key and occasionally the id of Uppernode 
 			switch (type) {
 			case CANVAS:
-				k = "CANVAS.EDGE" + getNumerator(NUMTYPE.EDGE);
+				k = "CVSEDGE" + getNumerator(NUMTYPE.EDGE);
 				break;
 			case CONNECTION:
-				k = "CANVAS.OBJECT.CONNECTION" + getNumerator(NUMTYPE.CONNECTION);
+				k = "CONNEDGE" + getNumerator(NUMTYPE.CONNECTION);
 				break;
 			case NODE:
-				k = "CANVAS.UPPERNODE.EDGE" + getNumerator(NUMTYPE.NODEEDGE);
+				k = "NODEEDGE" + getNumerator(NUMTYPE.NODEEDGE);
 				temp.add("ID", new JsonPrimitive(id));
 				break;
 			case OLD:
-				k = "CANVAS.UPPERNODE.OLD" + getNumerator(NUMTYPE.OLDEDGE);
+				k = "OLDEDGE" + getNumerator(NUMTYPE.OLDEDGE);
 				temp.add("ID", new JsonPrimitive(id));
 				break;
 			default:
@@ -312,11 +321,6 @@ public class StoreController {
 		}
 
 	}
-	
-	private void datasetToJson(Gson gson, JsonObject file) {
-		JsonObject temp = new JsonObject();
-		
-	}
 
 	/**
 	 * Initialize the Gson with wanted parameters
@@ -331,14 +335,14 @@ public class StoreController {
 		// use the builder and make a instance of the Gson
 		this.gson = builder.create();
 	}
-	
+
 	/**
 	 * Just initialize the Numerators for the Json Keys. Maybe bad Style..
 	 */
 	private void initNumeration() {
 		this.nCat = this.nObj = this.nEle = this.nEdge = this.nConn = this.nNodeEdge = this.nOldEdge = 0;
 	}
-	
+
 	/**
 	 * Get the wanted numerator and increment it
 	 * 

+ 4 - 1
src/ui/controller/UpdateController.java

@@ -361,7 +361,9 @@ public class UpdateController {
 	 */
 	public void paintHolonBody(int id) {
 		if (id != -1) {
-			SubNet sub = controller.getSimManager().getSubNets().get(id);
+			 ArrayList<SubNet> subs = controller.getSimManager().getSubNets();
+			if(!subs.isEmpty()){
+			SubNet sub = subs.get(id);
 			Object[] tempId = { "ID", id };
 			model.getPropertyTable().addRow(tempId);
 			Object[] tempObj = { "Nr. of Objects", sub.getObjects().size() };
@@ -370,6 +372,7 @@ public class UpdateController {
 			model.getPropertyTable().addRow(tempEdg);
 			Object[] tempSwi = { "Nr. of Switches", sub.getSwitches().size() };
 			model.getPropertyTable().addRow(tempSwi);
+			}
 		}
 	}
 

+ 18 - 6
src/ui/view/GUI.java

@@ -995,6 +995,7 @@ public class GUI<E> implements CategoryListener {
 									mousePos.x / (tableProperties.getWidth() / 2));
 							if (mousePos.y / tableProperties.getRowHeight() == 0) {
 								updCon.getActualCps().setName(btemp.toString());
+
 							} else if (mousePos.y / tableProperties.getRowHeight() == 2) {
 								Boolean bbTemp = Boolean.parseBoolean(btemp.toString());
 								((HolonSwitch) updCon.getActualCps()).setManualMode(bbTemp);
@@ -1010,9 +1011,18 @@ public class GUI<E> implements CategoryListener {
 									((HolonSwitch) updCon.getActualCps()).setManualState(bTemp);
 								}
 							}
-						} // else if (getActualCps() instanceof
-							// AbstractCpsObject) {
+						}
 						updCon.getActualCps().setName(temp.toString());
+						if (updCon.getActualCps() instanceof CpsUpperNode) {
+							for (int index = 3; index < tabbedPane.getTabCount(); index++) {
+								UpperNodeCanvas unc = ((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponent(index))
+										.getViewport().getComponent(0));
+								if (unc.upperNode.getID() == updCon.getActualCps().getID()) {
+									tabbedPane.setTitleAt(index, unc.upperNode.getName());
+									tabbedPane.updateUI();
+								}
+							}
+						}
 						// }
 					} else {
 						temp = model.getPropertyTable().getValueAt(selValueY, selValueX);
@@ -1045,6 +1055,7 @@ public class GUI<E> implements CategoryListener {
 		 */
 		resetGraphBtn.setBorder(new LineBorder(Color.BLACK));
 		resetGraphBtn.addActionListener(new ActionListener() {
+
 			public void actionPerformed(ActionEvent arg0) {
 				unitGraph.reset();
 			}
@@ -1306,6 +1317,11 @@ public class GUI<E> implements CategoryListener {
 		canvas.addMouseListener(new MouseAdapter() {
 			@Override
 			public void mousePressed(MouseEvent e) {
+
+			}
+
+			@Override
+			public void mouseReleased(MouseEvent e) {
 				holonEleNamesDisplayed = Languages.getLanguage()[25];
 				// If any empty space is clicked
 				if (temp == null || temp.getID() != model.getSelectedObjectID()) {
@@ -1337,10 +1353,6 @@ public class GUI<E> implements CategoryListener {
 				if (doubleClick() && MouseEvent.BUTTON3 != e.getButton() && temp instanceof CpsUpperNode) {
 					openNewUpperNodeTab();
 				}
-			}
-
-			@Override
-			public void mouseReleased(MouseEvent e) {
 				if (model.getSelectedCpsObjects().size() > 1) {
 					model.getTableHolonElement().setModel(model.getMultiTable());
 				} else if (model.getSelectedCpsObjects().size() == 1) {

+ 78 - 17
src/ui/view/HolonCanvas.java

@@ -5,7 +5,6 @@ import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
-import java.awt.ScrollPane;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
@@ -14,21 +13,17 @@ import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
 
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 
-import classes.AbstractCpsObject;
 import classes.Constants;
 import classes.HolonBody;
-import classes.HolonObject;
 import classes.SubNet;
+import classes.Vector2d;
 import ui.controller.Control;
 import ui.model.Model;
-import javax.swing.JTextArea;
-import java.awt.List;
-
-import javax.swing.JComboBox;
-import javax.swing.JMenuBar;
 
 public class HolonCanvas extends JPanel implements MouseWheelListener, MouseListener {
 
@@ -63,11 +58,18 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 	private int comboChoice = 0;
 	private String info;
 	private int bodyNr;
+	private final JLabel lblBodyInfo = new JLabel("Holon Info:");
+	private JCheckBox chckbxSort = new JCheckBox("sort by size");
+	private ArrayList<HolonBody> sortedSize = new ArrayList<>();
+	private ArrayList<HolonBody> sortedDist = new ArrayList<>();
+	private boolean sizeChange = false;
 
 	public HolonCanvas(Model mod, Control control) {
 		// Wire up Events
 		this.controller = control;
 		this.model = mod;
+
+		add(lblBodyInfo);
 		this.add(combo);
 		subnets = controller.getSimManager().getSubNets();
 		subCount = subnets.size();
@@ -88,6 +90,8 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 			}
 		});
 		this.addMouseListener(this);
+
+		add(chckbxSort);
 	}
 
 	// Start Render and Update Threads
@@ -101,6 +105,7 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 						(int) (Math.random() * 255)));
 			}
 		}
+		// check if subnets have changed
 		if (!controller.getSimManager().getSubNets().equals(subnets)) {
 			subnets = controller.getSimManager().getSubNets();
 			subCount = subnets.size();
@@ -108,7 +113,7 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 			maxX = center.width;
 			maxY = center.height;
 			addNewBodies(subCount);
-
+			sizeChange = true;
 		}
 
 		currentTime = System.currentTimeMillis();
@@ -121,7 +126,12 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 			totalElapsedTime = 0;
 		}
 
+		// check if HolonBodys should bes sorted after size
+		if (chckbxSort.isSelected() && sizeChange) {
+			rearrangeAfterSize();
+		}
 		updateBodies(elapsedTime / 1000f);
+
 		render(g);
 
 		try {
@@ -136,9 +146,29 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 		repaint();
 	}
 
+	// sort the HolonBodys after size
+	private void rearrangeAfterSize() {
+		sizeChange = false;
+		HolonBody tmp = null;
+		int j = 0;
+		sortedSize.addAll(bodies); 
+		insertionSizeSort(sortedSize);
+		sortedDist.addAll(bodies);
+
+		ArrayList<Vector2d> pos = insertionDistSort(sortedDist);
+		for (int i = 0; i < subCount; i++) {
+			for (j = 0; j < subCount; j++) {
+				if (sortedSize.get(subCount - 1 - i).getId() == bodies.get(j).getId()) {
+					bodies.get(j).position  = pos.get(i);
+					break;
+				}
+			}
+		}
+	}
+
 	// updates the bodies according to the changes of subnets
 	private void addNewBodies(int subCount) {
-
+		// find correct color for existing HolonBodys
 		ArrayList<HolonBody> newBodies = new ArrayList<>();
 		for (int i = 0; i < subCount; i++) {
 			for (int j = 0; j < bodies.size(); j++) {
@@ -158,9 +188,10 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 		}
 
 		bodies = newBodies;
+		// adding new HolonBodys
 		for (int i = bodies.size(); i < subCount; i++) {
 			float radius = (subnets.get(i).getObjects().size() * 5 + 10) * controller.getHolonBodyScale() / 100;
-			HolonBody temp = new HolonBody(maxX+1, maxY+1, radius,
+			HolonBody temp = new HolonBody(maxX + 1, maxY + 1, radius,
 					(float) Math.pow((subnets.get(i).getObjects().size() + 1) * 5, 3), model.getSubNetColors().get(i));
 			temp.setId(i);
 			bodies.add(temp);
@@ -170,7 +201,6 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 			if (bodies.get(i).position.getY() > maxY)
 				maxY = (int) newBodies.get(i).position.getY();
 		}
-
 	}
 
 	public void render(Graphics g) {
@@ -241,6 +271,36 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 		}
 	}
 
+	// Insertion sort for subnet size
+	private void insertionSizeSort(ArrayList<HolonBody> a) {
+		for (int p = 1; p < subCount; p++) {
+			HolonBody tmp = a.get(p);
+			int j = p;
+
+			for (; j > 0 && tmp.compareSizeTo(a.get(j - 1)) < 0; j--)
+				a.set(j, a.get(j - 1));
+
+			a.set(j, (HolonBody) tmp);
+		}
+	}
+
+	// Insertion sort for HolonBody distance
+	private ArrayList<Vector2d> insertionDistSort(ArrayList<HolonBody> a) {
+		ArrayList<Vector2d> pos = new ArrayList<>();
+		for (int p = 1; p < subCount; p++) {
+			HolonBody tmp = a.get(p);
+			int j = p;
+
+			for (; j > 0 && tmp.compareDistTo(a.get(j - 1), center) < 0; j--)
+				a.set(j, a.get(j - 1));
+
+			a.set(j, (HolonBody) tmp);
+		}
+		for (int i = 0; i < subCount; i++)
+			pos.add(a.get(i).position);
+		return pos;
+	}
+
 	public void checkCollisions() {
 		insertionSort(bodies);
 
@@ -264,12 +324,13 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 
 	}
 
+	// calc the center of the canvas
 	public void calcCenter() {
 		center = this.getSize();
 		center.height /= 2;
 		center.width /= 2;
 	}
-
+	
 	@Override
 	public void mouseWheelMoved(MouseWheelEvent e) {
 		controller.setHolonBodyScale(model.getHolonBodyScale() + (-e.getScrollAmount() * e.getWheelRotation()));
@@ -302,7 +363,8 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 			float cr = bodies.get(i).getRadius();
 			if (e.getX() - cr <= cx && e.getY() - cr <= cy && e.getX() + cr >= cx && e.getY() + cr >= cy) {
 				controller.addSelectedHolonBody(bodies.get(i).getId());
-			}else{
+				break;
+			} else {
 				controller.addSelectedHolonBody(-1);
 			}
 		}
@@ -312,5 +374,4 @@ public class HolonCanvas extends JPanel implements MouseWheelListener, MouseList
 	public void mouseReleased(MouseEvent e) {
 		// TODO Auto-generated method stub
 	}
-
-}
+}

+ 37 - 17
src/ui/view/MyCanvas.java

@@ -21,12 +21,12 @@ import java.util.Timer;
 import java.util.TimerTask;
 
 import javax.swing.ImageIcon;
+import javax.swing.JLabel;
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
-import javax.swing.JToolTip;
 
 import classes.CpsEdge;
 import classes.CpsNode;
@@ -86,8 +86,9 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	public JMenuItem itemUngroup = new JMenuItem(Languages.getLanguage()[100]);
 	public JMenuItem itemTrack = new JMenuItem(Languages.getLanguage()[101]);
 	public JMenuItem itemUntrack = new JMenuItem(Languages.getLanguage()[102]);
-	private JToolTip objectTT = new JToolTip();
-
+	private boolean toolTip; // Tooltip on or off
+	private Position toolTipPos = new Position(); //Tooltip Position
+	private String toolTipText = "";
 	private Point mousePosition = new Point(); // Mouse Position when
 												// rightclicked
 
@@ -113,8 +114,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	 *            the Controller
 	 */
 	public MyCanvas(Model mod, Control control) {
-		this.add(objectTT);
-		objectTT.setVisible(false);
+		toolTip = false;
 		this.controller = control;
 		this.model = mod;
 
@@ -345,6 +345,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 							}
 						}
 					}
+					toolTip = false;
 				}
 				model.getSelectedCpsObjects().clear();
 				tempCps = null;
@@ -396,6 +397,9 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 		g2.setRenderingHints(rh);
 
+		img = new ImageIcon(this.getClass().getResource("/Button_Images/FlagES.png")).getImage();
+		g2.drawImage(img, 0, 0, model.getCanvasX(), model.getCanvasY(),
+				null);
 		// Test SubNet Coloring
 		int i = 0;
 		for (SubNet s : controller.getSimManager().getSubNets()) {
@@ -600,6 +604,16 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 
 		}
 
+		
+		if (toolTip) {
+			g2.setColor(new Color(255, 215, 100));
+			g2.setStroke(new BasicStroke(1));
+			JLabel tempLabel = new JLabel(toolTipText);
+			g2.fillRect(toolTipPos.x, toolTipPos.y, 100, 15);
+			g2.setColor(Color.BLACK);
+			g2.drawRect(toolTipPos.x, toolTipPos.y, 100, 15);
+			g2.drawString(toolTipText, toolTipPos.x+2, toolTipPos.y+12);
+		}
 		// Dragg Highlighting
 		if (doMark) {
 			g2.setColor(Color.BLACK);
@@ -618,14 +632,16 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 
 	@Override
 	public void mouseClicked(MouseEvent e) {
-		if (model.getPropertyTable().getRowCount() > 0) {
-			for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
-				model.getPropertyTable().removeRow(i);
+		if (e.getButton() == e.BUTTON1) {
+			if (model.getPropertyTable().getRowCount() > 0) {
+				for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
+					model.getPropertyTable().removeRow(i);
+				}
 			}
+			updCon.paintProperties(tempCps);
+			updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+			updCon.refreshTableProperties(model.getPropertyTable());
 		}
-		updCon.paintProperties(tempCps);
-		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
-		updCon.refreshTableProperties(model.getPropertyTable());
 	}
 
 	@Override
@@ -809,8 +825,10 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 
 				tempCps.setPosition(x, y); // Drag Position
 				// TipText Position and name
-				objectTT.setTipText(tempCps.getName() + ", " + tempCps.getID());
-				objectTT.setLocation(x, y + controller.getScale());
+				toolTip = true;
+				toolTipText =  tempCps.getName()+", "+tempCps.getID();
+				toolTipPos.x = tempCps.getPosition().x-2;
+				toolTipPos.y = tempCps.getPosition().y + model.getScale();
 
 				// All Selected Objects
 				for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
@@ -874,16 +892,18 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 			cx = cps.getPosition().x;
 			cy = cps.getPosition().y;
 			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
-				objectTT.setLocation(cx, cy + controller.getScale());
-				objectTT.setTipText(cps.getName() + ", " + cps.getID());
 				on = true;
+				toolTipPos.x = cps.getPosition().x-2;
+				toolTipPos.y = cps.getPosition().y+ model.getScale();
+				toolTipText =  cps.getName()+", "+cps.getID();
 			}
 		}
 		if (on) {
-			objectTT.setVisible(true);
+			toolTip = true;
 		} else {
-			objectTT.setVisible(false);
+			toolTip = false;
 		}
+		repaint();
 	}
 
 	/**

+ 93 - 10
src/ui/view/StatisticGraph.java

@@ -4,18 +4,11 @@ import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
-import java.awt.Image;
 import java.awt.RenderingHints;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.geom.GeneralPath;
 import java.util.ArrayList;
 
-import javax.swing.ImageIcon;
 import javax.swing.JPanel;
-import javax.swing.Timer;
-
-import com.sun.media.jfxmedia.track.Track;
 
 import classes.AbstractCpsObject;
 import classes.CpsUpperNode;
@@ -117,6 +110,10 @@ public class StatisticGraph extends JPanel {
 				case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
 				case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
 				case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
+				case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
+				case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
+				case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
+				case TrackedDataSet.AMOUNT_BROKEN_EDGES:
 					createPathFloats(set);
 					break;
 				case TrackedDataSet.ON_OFF:
@@ -125,6 +122,7 @@ public class StatisticGraph extends JPanel {
 				case TrackedDataSet.PERCENT_SUPPLIED:
 				case TrackedDataSet.PERCENT_NOT_SUPPLIED:
 				case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+				case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
 					createPathPercent(set);
 					break;
 				default:
@@ -264,6 +262,37 @@ public class StatisticGraph extends JPanel {
 					eCount = 0;
 				}
 				break;
+			case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					if (val < sub.getObjects().size()) {
+						val = sub.getObjects().size();
+					}
+				}
+				break;
+			case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					float tempVal = -getMaxTotalConsumption(new ArrayList<>(sub.getObjects()));
+					if (val < tempVal) {
+						val = tempVal;
+					}
+				}
+				break;
+			case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					float tempVal = getMaxTotalProduction(new ArrayList<>(sub.getObjects()));
+					if (val < tempVal) {
+						val = tempVal;
+					}
+				}
+				break;
+			case TrackedDataSet.AMOUNT_BROKEN_EDGES:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					val += sub.getSwitches().size();
+				}
+				break;
+			case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
+				val = 1;
+				break;
 			default:
 				maximum = 0;
 				break;
@@ -376,7 +405,61 @@ public class StatisticGraph extends JPanel {
 						val += obj.getElements().size();
 					}
 				}
-				val /=controller.getSimManager().getSubNets().size();
+				val /= controller.getSimManager().getSubNets().size();
+				set.setValAt(val, model.getCurIteration());
+				break;
+			case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					for (HolonObject obj : sub.getObjects()) {
+						if (obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) > 0) {
+							val++;
+						}
+					}
+				}
+				val /= controller.getSimManager().getSubNets().size();
+				set.setValAt(val, model.getCurIteration());
+				break;
+			case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					val += -getTotalConsumptionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
+							model.getCurIteration());
+				}
+				val /= controller.getSimManager().getSubNets().size();
+				set.setValAt(val, model.getCurIteration());
+				break;
+			case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					val += (getTotalProductionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
+							model.getCurIteration())
+							+ getTotalConsumptionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
+									model.getCurIteration()));
+				}
+				val /= controller.getSimManager().getSubNets().size();
+				set.setValAt(val, model.getCurIteration());
+				break;
+			case TrackedDataSet.AMOUNT_BROKEN_EDGES:
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					for (HolonSwitch s : sub.getSwitches()) {
+						if (s.getState()) {
+							val++;
+						}
+					}
+				}
+				set.setValAt(val, model.getCurIteration());
+				break;
+			case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
+				float prod = 0;
+				float cons = 0;
+				for (SubNet sub : controller.getSimManager().getSubNets()) {
+					for (HolonObject obj : sub.getObjects()) {
+						if (obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) > 0) {
+							prod++;
+						} else if(obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) < 0) {
+							cons++;
+						}
+					}
+				}
+				val = prod/(prod+cons);
 				set.setValAt(val, model.getCurIteration());
 				break;
 			default:
@@ -567,8 +650,8 @@ public class StatisticGraph extends JPanel {
 
 		return stateObjectss / count;
 	}
-	
-	public ArrayList<TrackedDataSet> getDataSets(){
+
+	public ArrayList<TrackedDataSet> getDataSets() {
 		return dataSets;
 	}
 

+ 55 - 49
src/ui/view/UpperNodeCanvas.java

@@ -121,7 +121,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	 *            the Controller
 	 */
 	public UpperNodeCanvas(Model mod, Control control, CpsUpperNode UpperNode, String parentPath) {
-		//this.add(objectTT);
+		// this.add(objectTT);
 		objectTT.setVisible(false);
 		this.controller = control;
 		this.model = mod;
@@ -161,7 +161,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
 		updCon = new UpdateController(model, controller);
-		
+
 		itemGroup.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
@@ -231,7 +231,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 						break;
 					}
 				}
-				
+
 				savePos = new ArrayList<>();
 				animCps = ((CpsUpperNode) tempCps).getNodes();
 				controller.delUpperNode((CpsUpperNode) tempCps, upperNode);
@@ -348,7 +348,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
 					if (upperNode.getNodes().contains(cps)) {
 						controller.delObjUpperNode(cps, upperNode);
-						// Removes the object from the tracked objects, in case it was tracked
+						// Removes the object from the tracked objects, in case
+						// it was tracked
 						controller.removeTrackingObj(cps);
 						// Remove UpperNodeTab if UpperNode deleted
 						if (cps instanceof CpsUpperNode) {
@@ -463,7 +464,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		for (CpsEdge con : upperNode.getNodeEdges()) {
 			if (con.getA().getID() != model.getSelectedObjectID() && con.getB().getID() != model.getSelectedObjectID()
 					&& con != edgeHighlight) {
-				if(con.getConnected() == 0){
+				if (con.getConnected() == 0) {
 					if (con.getState()) {
 						g2.setColor(Color.GREEN);
 						if (con.getCapacity() != -1) {
@@ -473,7 +474,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 						g2.setColor(Color.RED);
 						g2.setStroke(new BasicStroke(2));
 					}
-				}else{
+				} else {
 					g2.setColor(Color.DARK_GRAY);
 					g2.setStroke(new BasicStroke(2));
 				}
@@ -482,7 +483,6 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 						con.getB().getPosition().x + controller.getScaleDiv2(),
 						con.getB().getPosition().y + controller.getScaleDiv2());
 
-				
 				if (con.getCapacity() == -1) {
 					maxCap = Character.toString('\u221e');
 				} else if (con.getCapacity() == -2) {
@@ -491,14 +491,18 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					maxCap = String.valueOf(con.getCapacity());
 				}
 				if (showedInformation[0]) {
-					if(con.getConnected() == 0 || con.getConnected() == 1){
+					if (con.getConnected() == 0 || con.getConnected() == 1) {
 						g2.drawString(con.getFlow() + "/" + maxCap,
-								(con.getA().getPosition().x + con.getB().getPosition().x) / 2 + controller.getScaleDiv2(),
-								(con.getA().getPosition().y + con.getB().getPosition().y) / 2 + controller.getScaleDiv2());
-					}else{
-						g2.drawString("not connected", 
-								(con.getA().getPosition().x + con.getB().getPosition().x) / 2 + controller.getScaleDiv2(),
-								(con.getA().getPosition().y + con.getB().getPosition().y) / 2 + controller.getScaleDiv2());
+								(con.getA().getPosition().x + con.getB().getPosition().x) / 2
+										+ controller.getScaleDiv2(),
+								(con.getA().getPosition().y + con.getB().getPosition().y) / 2
+										+ controller.getScaleDiv2());
+					} else {
+						g2.drawString("not connected",
+								(con.getA().getPosition().x + con.getB().getPosition().x) / 2
+										+ controller.getScaleDiv2(),
+								(con.getA().getPosition().y + con.getB().getPosition().y) / 2
+										+ controller.getScaleDiv2());
 					}
 				}
 			}
@@ -523,7 +527,6 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 							con.getB().getPosition().x + controller.getScaleDiv2(),
 							con.getB().getPosition().y + controller.getScaleDiv2());
 
-					
 					if (con.getCapacity() == -1) {
 						maxCap = Character.toString('\u221e');
 					} else if (con.getCapacity() == -2) {
@@ -532,18 +535,18 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 						maxCap = String.valueOf(con.getCapacity());
 					}
 					if (showedInformation[0]) {
-						if(con.getConnected() == 0 || con.getConnected() == 1){
+						if (con.getConnected() == 0 || con.getConnected() == 1) {
 							g2.drawString(con.getFlow() + "/" + maxCap,
 									(con.getA().getPosition().x + con.getB().getPosition().x) / 2
-										+ controller.getScaleDiv2(),
+											+ controller.getScaleDiv2(),
 									(con.getA().getPosition().y + con.getB().getPosition().y) / 2
-										+ controller.getScaleDiv2());
-						}else{
+											+ controller.getScaleDiv2());
+						} else {
 							g2.drawString("not connected",
 									(con.getA().getPosition().x + con.getB().getPosition().x) / 2
-										+ controller.getScaleDiv2(),
+											+ controller.getScaleDiv2(),
 									(con.getA().getPosition().y + con.getB().getPosition().y) / 2
-										+ controller.getScaleDiv2());
+											+ controller.getScaleDiv2());
 						}
 					}
 				}
@@ -559,8 +562,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					edgeHighlight.getA().getPosition().y + controller.getScaleDiv2(),
 					edgeHighlight.getB().getPosition().x + controller.getScaleDiv2(),
 					edgeHighlight.getB().getPosition().y + controller.getScaleDiv2());
-			
-			
+
 			if (edgeHighlight.getCapacity() == -1) {
 				maxCap = Character.toString('\u221e');
 			} else if (edgeHighlight.getCapacity() == -2) {
@@ -580,10 +582,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		// Objects in upper node
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
 			// Border Highlighting
-			if(showedInformation[3]){
+			if (showedInformation[3]) {
 				g2.setColor(cps.getBorderColor());
 				if (g2.getColor() != Color.WHITE) {
-					g2.fillRect((int) (cps.getPosition().x - scalediv20 - 3), (int) (cps.getPosition().y - scalediv20 - 3),
+					g2.fillRect((int) (cps.getPosition().x - scalediv20 - 3),
+							(int) (cps.getPosition().y - scalediv20 - 3),
 							(int) (controller.getScale() + ((scalediv20 + 3) * 2)),
 							(int) (controller.getScale() + ((scalediv20 + 3) * 2)));
 				}
@@ -667,7 +670,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			}
 
 			// Border Highlighting
-			if(showedInformation[3]){
+			if (showedInformation[3]) {
 				g2.setColor(cps.getBorderColor());
 				if (g2.getColor() != Color.WHITE) {
 					g2.fillRect((int) ((borderPos >> 1) - model.getScaleDiv2() - scalediv20) - 3,
@@ -839,30 +842,32 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		// model.setSelectedCpsObject(tempCps);
 
 		// Edge Selection
-		if (tempCps == null) {
-			edgeHighlight = mousePositionOnEdge(x, y);
-			controller.setSelecteEdge(edgeHighlight);
-			controller.setSelectedObjectID(0);
-			if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-				model.getSelectedCpsObjects().clear();
+		if (e.getButton() == e.BUTTON1) {
+			if (tempCps == null) {
+				edgeHighlight = mousePositionOnEdge(x, y);
+				controller.setSelecteEdge(edgeHighlight);
+				controller.setSelectedObjectID(0);
+				if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
+					model.getSelectedCpsObjects().clear();
+				}
+				updCon.deleteRows(model.getMultiTable());
+				updCon.deleteRows(model.getSingleTable());
 			}
-			updCon.deleteRows(model.getMultiTable());
-			updCon.deleteRows(model.getSingleTable());
-		}
 
-		if (edgeHighlight == null && tempCps == null) {
-			sx = e.getX();
-			sy = e.getY();
-			doMark = true;
+			if (edgeHighlight == null && tempCps == null) {
+				sx = e.getX();
+				sy = e.getY();
+				doMark = true;
+			}
+			// System.out.println("Selected Objects");
+			// for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
+			// System.out.println(temp.getName() + " " + temp.getID());
+			// }
+			updCon.paintProperties(tempCps);
+			updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+			updCon.refreshTableProperties(model.getPropertyTable());
+			repaint();
 		}
-		// System.out.println("Selected Objects");
-		// for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
-		// System.out.println(temp.getName() + " " + temp.getID());
-		// }
-		updCon.paintProperties(tempCps);
-		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
-		updCon.refreshTableProperties(model.getPropertyTable());
-		repaint();
 	}
 
 	@Override
@@ -1376,12 +1381,13 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		showedInformation[0] = connection;
 		showedInformation[1] = object;
 	}
-	
+
 	/**
 	 * copies a set of given informations
+	 * 
 	 * @param informations
 	 */
-	public void setShowedInformation(boolean[] informations){
+	public void setShowedInformation(boolean[] informations) {
 		showedInformation = informations;
 	}