Bläddra i källkod

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

dominik.rieder 8 år sedan
förälder
incheckning
0cd888c9aa

BIN
res/Images/Thumbs.db


BIN
res/Images/upper_node.png


+ 41 - 7
src/classes/CpsUpperNode.java

@@ -3,13 +3,13 @@ package classes;
 import java.util.ArrayList;
 import java.util.HashMap;
 
-public class CpsUpperNode extends AbstractCpsObject{
+public class CpsUpperNode extends AbstractCpsObject {
 
 	private ArrayList<AbstractCpsObject> nodes;
 	private ArrayList<CpsEdge> nodeEdges;
 	private ArrayList<CpsEdge> oldEdges;
 	private HashMap<Integer, Integer> nodesIdx;
-	
+
 	public CpsUpperNode(String nodeName) {
 		super(nodeName);
 		this.setConnections(new ArrayList<CpsEdge>());
@@ -19,7 +19,7 @@ public class CpsUpperNode extends AbstractCpsObject{
 		this.setNodes(new ArrayList<AbstractCpsObject>());
 		this.setNodeEdges(new ArrayList<CpsEdge>());
 		this.setOldEdges(new ArrayList<CpsEdge>());
-		this.setNodesIdx(new HashMap<Integer,Integer>());
+		this.setNodesIdx(new HashMap<Integer, Integer>());
 		// TODO Auto-generated constructor stub
 	}
 
@@ -31,7 +31,8 @@ public class CpsUpperNode extends AbstractCpsObject{
 	}
 
 	/**
-	 * @param nodes the nodes to set
+	 * @param nodes
+	 *            the nodes to set
 	 */
 	public void setNodes(ArrayList<AbstractCpsObject> nodes) {
 		this.nodes = nodes;
@@ -45,7 +46,8 @@ public class CpsUpperNode extends AbstractCpsObject{
 	}
 
 	/**
-	 * @param nodeEdges the nodeEdges to set
+	 * @param nodeEdges
+	 *            the nodeEdges to set
 	 */
 	public void setNodeEdges(ArrayList<CpsEdge> nodeEdges) {
 		this.nodeEdges = nodeEdges;
@@ -59,7 +61,8 @@ public class CpsUpperNode extends AbstractCpsObject{
 	}
 
 	/**
-	 * @param oldEdges the oldEdges to set
+	 * @param oldEdges
+	 *            the oldEdges to set
 	 */
 	public void setOldEdges(ArrayList<CpsEdge> oldEdges) {
 		this.oldEdges = oldEdges;
@@ -73,10 +76,41 @@ public class CpsUpperNode extends AbstractCpsObject{
 	}
 
 	/**
-	 * @param nodesIdx the nodesIdx to set
+	 * @param nodesIdx
+	 *            the nodesIdx to set
 	 */
 	public void setNodesIdx(HashMap<Integer, Integer> nodesIdx) {
 		this.nodesIdx = nodesIdx;
 	}
 
+	public ArrayList<HolonObject> getNumHolonObj() {
+		ArrayList<HolonObject> onlyHolonObj = new ArrayList<HolonObject>();
+		for (AbstractCpsObject temp : getNodes()) {
+			if (temp instanceof HolonObject) {
+				onlyHolonObj.add((HolonObject) temp);
+			}
+		}
+		return onlyHolonObj;
+	}
+
+	public ArrayList<HolonSwitch> getNumSwitches() {
+		ArrayList<HolonSwitch> onlySwitsches = new ArrayList<HolonSwitch>();
+		for (AbstractCpsObject temp : getNodes()) {
+			if (temp instanceof HolonSwitch) {
+				onlySwitsches.add((HolonSwitch) temp);
+			}
+		}
+		return onlySwitsches;
+	}
+
+	public ArrayList<CpsUpperNode> getNumUpperNodes() {
+		ArrayList<CpsUpperNode> onlyUpperNodes = new ArrayList<CpsUpperNode>();
+		for (AbstractCpsObject temp : getNodes()) {
+			if (temp instanceof CpsUpperNode) {
+				onlyUpperNodes.add((CpsUpperNode) temp);
+			}
+		}
+		return onlyUpperNodes;
+	}
+
 }

+ 61 - 0
src/classes/TrackedDataSet.java

@@ -0,0 +1,61 @@
+package classes;
+
+import java.awt.Color;
+
+public class TrackedDataSet {
+
+	//Property Integers
+	public static  final int CONSUMPTION = 0;
+	public static final int PRODUCTION = 1;
+	public static final int ACTIVATED_ELEMENTS = 2;
+	public static final int ON_OFF = 3;
+	
+	//Variables of the Data Set
+	private AbstractCpsObject cps;
+	private int property;
+	private Color color;
+
+	//Value for each timeStep
+	
+	private float values[];
+	
+	/**
+	 * Data Set for the StatisticGraoh
+	 * 
+	 * @param cps
+	 *            the cps Object
+	 * @param property
+	 *            which value should be tracked
+	 * @param color
+	 *            color of the line in the graph
+	 */
+	public TrackedDataSet(AbstractCpsObject cps, int property, Color color) {
+		this.cps = cps;
+		this.property = property;
+		this.color = color;
+		this.values = new float[100];
+		for (int i = 0; i < values.length; i++) {
+			values[i] = -1;
+		}
+	}
+
+	public AbstractCpsObject getCpsObject() {
+		return this.cps;
+	}
+
+	public int getProperty() {
+		return this.property;
+	}
+
+	public Color getColor() {
+		return this.color;
+	}
+	
+	public float[] getValues() {
+		return this.values;
+	}
+	
+	public void setValAt(float val, int at){
+		this.values[at] = val;
+	}
+}

+ 52 - 2
src/ui/controller/CanvasController.java

@@ -5,13 +5,14 @@ import java.util.ArrayList;
 
 import classes.CpsEdge;
 import classes.CpsNode;
+import classes.CpsUpperNode;
 import classes.AbstractCpsObject;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.Position;
-import interfaces.CategoryListener;
 import interfaces.ObjectListener;
 import ui.model.Model;
+import ui.view.UpperNodeCanvas;
 
 /**
  * Controller for the Canvas.
@@ -56,7 +57,7 @@ public class CanvasController {
 	 */
 	public void addNewObject(AbstractCpsObject object) {
 		object.setSav("CVS");
-		//object.setConnections(new ArrayList<CpsEdge>());
+		// object.setConnections(new ArrayList<CpsEdge>());
 		addObject(object);
 	}
 
@@ -124,6 +125,8 @@ public class CanvasController {
 		edge.getA().getConnections().remove(edge);
 		edge.getB().getConnections().remove(edge);
 		model.getEdgesOnCanvas().remove(edge);
+		if (edge.getA() instanceof CpsUpperNode || edge.getB() instanceof CpsUpperNode)
+			handleUpperNodes(edge);
 	}
 
 	/**
@@ -220,4 +223,51 @@ public class CanvasController {
 
 		model.getSelectedCpsObjects().clear();
 	}
+
+	/**
+	 * In Case if a One or Both Side of the to Removing Edge is a CpsUpperNode
+	 * @param edge
+	 * @param upperNode
+	 */
+	public void handleUpperNodes(CpsEdge edge) {
+		CpsUpperNode upper = null;
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
+
+		// wenn A ist upperNOde
+		if (edge.getA() instanceof CpsUpperNode) {
+
+			upper = (CpsUpperNode) edge.getA();
+
+			//wenn in OldEdges eine B enhält
+			for (CpsEdge cpsEdge : upper.getOldEdges()) {
+				if (cpsEdge.getA().equals(edge.getB()) || cpsEdge.getB().equals(edge.getB()))
+					toDelete.add(cpsEdge);
+			}
+			//lösche alle Edges mit B
+			upper.getOldEdges().removeAll(toDelete);
+			//lösche hier alle Connections
+			for (CpsEdge cpsEdge : toDelete) {
+				cpsEdge.getA().getConnections().remove(cpsEdge);
+				cpsEdge.getB().getConnections().remove(cpsEdge);
+			}
+			toDelete.clear();
+		}
+		//Hier analog
+		if (edge.getB() instanceof CpsUpperNode) {
+
+			upper = (CpsUpperNode) edge.getB();
+
+			for (CpsEdge cpsEdge : upper.getOldEdges()) {
+				if (cpsEdge.getA().equals(edge.getA()) || cpsEdge.getB().equals(edge.getA()))
+					toDelete.add(cpsEdge);
+			}
+			upper.getOldEdges().removeAll(toDelete);
+			for (CpsEdge cpsEdge : toDelete) {
+				cpsEdge.getA().getConnections().remove(cpsEdge);
+				cpsEdge.getB().getConnections().remove(cpsEdge);
+			}
+			toDelete.clear();
+		}
+
+	}
 }

+ 14 - 10
src/ui/controller/Control.java

@@ -686,7 +686,7 @@ public class Control {
 	public void setCanvasY(int canvasY) {
 		globalController.setCanvasY(canvasY);
 	}
-	
+
 	public void setMaxCapacity(float cap) {
 		globalController.setMaxCapacity(cap);
 	}
@@ -731,7 +731,7 @@ public class Control {
 	public void removeTrackingObj(HolonObject obj) {
 		statsController.removeTrackingObj(obj);
 	}
-	
+
 	/**
 	 * Controlling Nodes of Nodes
 	 */
@@ -739,28 +739,32 @@ public class Control {
 	public void addUpperNode(String nodeName, CpsUpperNode upperNode) {
 		nodeController.doUpperNode(nodeName, upperNode);
 	}
-	
+
 	public void delUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
 		nodeController.undoUpperNode(node, upperNode);
 	}
-	
+
 	public void addObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
 		nodeController.addObjectInUpperNode(object, upperNode);
 	}
-	
+
 	public void delObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
 		nodeController.deleteObjectInUpperNode(object, upperNode);
 	}
-	
+
 	public void addEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
 		nodeController.addEdge(edge, upperNode);
 	}
-	
+
 	public void delEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
 		nodeController.deleteEdge(edge, upperNode);
 	}
-	
-	public void connectNodes(AbstractCpsObject a, AbstractCpsObject b, CpsUpperNode node) {
-		nodeController.connectNodes(a, b, node);
+
+	public void connectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		nodeController.connectNodes(edge, upperNode);
+	}
+
+	public void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		nodeController.disconnectNodes(edge, upperNode);
 	}
 }

+ 30 - 16
src/ui/controller/NodeController.java

@@ -69,7 +69,7 @@ public class NodeController {
 	private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
 
 		ArrayList<AbstractCpsObject> nodes = node.getNodes();
-		// ArrayList<CpsEdge> nodeEdges = node.getNodeEdges();
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
 		// Put all selected Nodes into the Upper Node
 		for (Iterator<AbstractCpsObject> it = model.getSelectedCpsObjects().iterator(); it.hasNext();) {
@@ -90,16 +90,19 @@ public class NodeController {
 
 			// kopiere edge in UpperNode
 			if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) {
+				toDelete.add(edge);
 				addEdge(edge, node);
 			}
 
 		}
+
+		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
 		// Lösche dann die Edges aus der nächst höheren schicht
 		for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
 			if (upperNode == null)
-				cvs.deleteObjectOnCanvas(abs);
+				removeForNodeOfNode(abs, null);
 			else
-				deleteObjectInUpperNode(abs, upperNode);
+				removeForNodeOfNode(abs, upperNode);
 		}
 
 	}
@@ -122,7 +125,8 @@ public class NodeController {
 	}
 
 	/**
-	 * Look for adjacent Nodes connected with the new CpsUpperNode and make Connections
+	 * Look for adjacent Nodes connected with the new CpsUpperNode and make
+	 * Connections
 	 * 
 	 * @param node
 	 * @param upperNode
@@ -131,7 +135,7 @@ public class NodeController {
 
 		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
 		ArrayList<Float> maxCapacity = new ArrayList<>();
-		
+
 		ArrayList<CpsEdge> oldEdges = node.getOldEdges();
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
@@ -199,7 +203,7 @@ public class NodeController {
 		// TODO Auto-generated method stub
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
-		//für jede Edge aus upperNode die Node enthält tu sie in toDelete
+		// für jede Edge aus upperNode die Node enthält tu sie in toDelete
 		for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
 				.iterator(); it.hasNext();) {
 
@@ -208,7 +212,7 @@ public class NodeController {
 				toDelete.add(edge);
 
 		}
-		//lösch alle Edges die in toDelete sind und wiederherstell alte Edges
+		// lösch alle Edges die in toDelete sind und wiederherstell alte Edges
 		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
 		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
 	}
@@ -319,6 +323,13 @@ public class NodeController {
 		return pos;
 	}
 
+	private void removeForNodeOfNode(AbstractCpsObject obj, CpsUpperNode upperNode) {
+
+		mpC.decIdx(obj.getID(), (upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()));
+		(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).remove(obj.getID());
+		(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
+	}
+
 	/**
 	 * Add a Object into a CpsUpperNode
 	 * 
@@ -345,7 +356,7 @@ public class NodeController {
 					e = p;
 				}
 			}
-			if (!model.getClipboradObjects().contains(cps)) {
+			if (!model.getClipboradObjects().contains(cps) && !(cps instanceof CpsUpperNode)) {
 				cps.getConnectedTo().remove(e);
 			}
 			upperNode.getNodeEdges().remove(e);
@@ -362,8 +373,6 @@ public class NodeController {
 	 * @param upperNode
 	 */
 	public void addEdge(CpsEdge edge, CpsUpperNode upperNode) {
-		edge.getA().getConnections().add(edge);
-		edge.getB().getConnections().add(edge);
 		upperNode.getNodeEdges().add(edge);
 	}
 
@@ -377,6 +386,8 @@ public class NodeController {
 		edge.getA().getConnections().remove(edge);
 		edge.getB().getConnections().remove(edge);
 		upperNode.getNodeEdges().remove(edge);
+		if (edge.getA() instanceof CpsUpperNode || edge.getB() instanceof CpsUpperNode)
+			cvs.handleUpperNodes(edge);
 	}
 
 	/**
@@ -385,14 +396,17 @@ public class NodeController {
 	 * @param a
 	 * @param b
 	 */
-	public void connectNodes(AbstractCpsObject a, AbstractCpsObject b, CpsUpperNode node) {
+	public void connectNodes(CpsEdge edge, CpsUpperNode upperNode) {
 		// mache hier Connections in A und B rein
 		// mache diese Edge auch in OldEdges rein des aktuellen CpsUpperNodes
-		
-		 CpsEdge edge = new CpsEdge(a, b, model.getMaxCapacity());
-		 edge.getA().getConnections().add(edge);
-		 edge.getB().getConnections().add(edge);
-		 node.getOldEdges().add(edge);
+		upperNode.getOldEdges().add(edge);
+	}
+
+	public void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		edge.getA().getConnections().remove(edge);
+		edge.getB().getConnections().remove(edge);
+		if (upperNode != null)
+			upperNode.getOldEdges().remove(edge);
 	}
 
 }

+ 79 - 0
src/ui/controller/UpdateController.java

@@ -1,6 +1,7 @@
 package ui.controller;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import classes.AbstractCpsObject;
 import classes.HolonElement;
@@ -119,4 +120,82 @@ public class UpdateController {
 		return obtTemp;
 	}
 
+	/**
+	 * Search for actual selected HolonElement.
+	 * 
+	 * @param obj
+	 *            selected HolonObject, if obj==null means multi-selection
+	 *            active
+	 * @param yValue
+	 *            Y-Coord in the HolonElementsTable
+	 * @param toMultiHash
+	 *            0 means no MultiSelection, 1 means MultiSelection without
+	 *            Control, 2 means MultiSelection with Control
+	 * @return the selected HolonElement
+	 */
+	public HolonElement getActualHolonElement(HolonObject obj, int yValue, int toMultiHash,
+			ArrayList<PropertyTable> tables) {
+		final int yTemp = (int) Math.floor(yValue / 16);
+		int rowsTotal = 0;
+		// Filter for search --> single and multi selection
+		if (obj == null) {
+			rowsTotal = tables.get(1).getRowCount();
+		} else {
+			rowsTotal = tables.get(0).getRowCount();
+		}
+		// search for the clicked HolonObject and HolonElement --> in the
+		// HolonElementTable
+		HolonObject obtTemp = null;
+		HolonElement toReturnEle = null;
+		int id = 0;
+		if (rowsTotal != 0 && rowsTotal > yTemp) {
+			// Multi-Selection search
+			if (obj == null) {
+				String tempStringObj = tables.get(1).getValueAt(yTemp, 0).toString();
+				int idTempObj = Integer.parseInt(tempStringObj.split(", ")[1]);
+				obtTemp = (HolonObject) controller.searchByID(idTempObj);
+				id = Integer.parseInt(tables.get(1).getValueAt(yTemp, 1).toString());
+				ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
+				if (model.getEleToDelete().containsKey(idTempObj) && toMultiHash == 2) {
+					eleTemp = model.getEleToDelete().get(idTempObj);
+					if (!eleTemp.contains(obtTemp.searchElementById(id))) {
+						eleTemp.add(obtTemp.searchElementById(id));
+						model.getEleToDelete().replace(idTempObj, eleTemp);
+					}
+				} else if (toMultiHash == 2) {
+					eleTemp.add(obtTemp.searchElementById(id));
+					model.getEleToDelete().put(idTempObj, eleTemp);
+				} else if (toMultiHash == 1) {
+					model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
+					eleTemp.add(obtTemp.searchElementById(id));
+					model.getEleToDelete().put(idTempObj, eleTemp);
+				} else if (toMultiHash == 0) {
+					toReturnEle = obtTemp.searchElementById(id);
+				}
+			} // Single-Selection search
+			else {
+				model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
+				id = Integer.parseInt(tables.get(0).getValueAt(yTemp, 0).toString());
+				toReturnEle = obj.searchElementById(id);
+			}
+			model.setSelectedHolonElement(toReturnEle);
+			return toReturnEle;
+		} // If no HolonObject selected
+		else {
+			model.setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
+			model.setSelectedHolonElement(null);
+			return null;
+		}
+	}
+
+	/**
+	 * Getter for selected CpsObject.
+	 * 
+	 * @return selected CpsObject
+	 */
+	public AbstractCpsObject getActualCps() {
+		int tempID = model.getSelectedObjectID();
+		AbstractCpsObject tempCps = controller.searchByID(tempID);
+		return tempCps;
+	}
 }

+ 51 - 5
src/ui/model/Model.java

@@ -16,6 +16,9 @@ import interfaces.CategoryListener;
 import interfaces.GraphListener;
 import interfaces.ObjectListener;
 import ui.view.Console;
+import ui.view.DefaulTable;
+import ui.view.PropertyTable;
+import ui.view.DefaulTable;
 
 /**
  * The Class Model is the class where everything is saved. All changes made to
@@ -24,7 +27,7 @@ import ui.view.Console;
  * @author Gruppe14
  *
  */
-public class Model{
+public class Model {
 
 	// Global Variables
 	private int canvasX = 1000;
@@ -41,7 +44,8 @@ public class Model{
 	private ArrayList<AbstractCpsObject> selectedObjects = new ArrayList<AbstractCpsObject>();
 	private ArrayList<AbstractCpsObject> clipboardObjects = new ArrayList<AbstractCpsObject>();
 	private Console console;
-	//Capacity for Edge
+	private HashMap<Integer, ArrayList<HolonElement>> eleToDelete;
+	// Capacity for Edge
 	private float maxCapacity;
 
 	private ArrayList<GraphListener> graphListeners = new ArrayList<GraphListener>();
@@ -89,6 +93,10 @@ public class Model{
 	private List<CategoryListener> categoryListeners;
 	private List<ObjectListener> objectListeners;
 
+	private PropertyTable tableModelHolonElementMulti;
+	private PropertyTable tableModelHolonElementSingle;
+	private DefaulTable tableModelProperties;
+	public String[] colNames = { "Field", "Information" };
 	/*
 	 * Object that runs the Algorithm
 	 */
@@ -109,6 +117,11 @@ public class Model{
 		setCvsObjIdx(new HashMap<Integer, Integer>());
 		setClipboradObjects(new ArrayList<AbstractCpsObject>());
 		setTrackingObj(new ArrayList<HolonObject>());
+		setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
+		setSingleTable(new PropertyTable());
+		setMultiTable(new PropertyTable());
+		setPropertyTable(new DefaulTable(1000, colNames.length));
+		getPropertyTable().setColumnIdentifiers(colNames);
 	}
 
 	/**
@@ -527,7 +540,8 @@ public class Model{
 	}
 
 	/**
-	 * @param maxCapacity the maxCapacity to set
+	 * @param maxCapacity
+	 *            the maxCapacity to set
 	 */
 	public void setMaxCapacity(float maxCapacity) {
 		this.maxCapacity = maxCapacity;
@@ -660,11 +674,43 @@ public class Model{
 		graphListeners.add(gl);
 	}
 
-	public void addObjectsToGraphListeners(){
-		for(GraphListener gl : graphListeners){
+	public void setEleToDelete(HashMap<Integer, ArrayList<HolonElement>> theHash) {
+		this.eleToDelete = theHash;
+	}
+
+	public HashMap<Integer, ArrayList<HolonElement>> getEleToDelete() {
+		return this.eleToDelete;
+	}
+
+	public void setSingleTable(PropertyTable pt) {
+		this.tableModelHolonElementSingle = pt;
+	}
+
+	public PropertyTable getSingleTable() {
+		return this.tableModelHolonElementSingle;
+	}
+
+	public PropertyTable getMultiTable() {
+		return this.tableModelHolonElementMulti;
+	}
+
+	public void setMultiTable(PropertyTable pt) {
+		this.tableModelHolonElementMulti = pt;
+	}
+
+	public void addObjectsToGraphListeners() {
+		for (GraphListener gl : graphListeners) {
 			gl.addTrackedObject(trackingObj);
 			gl.repaintGraph();
 		}
 	}
 
+	public DefaulTable getPropertyTable() {
+		return this.tableModelProperties;
+	}
+
+	public void setPropertyTable(DefaulTable pt) {
+		this.tableModelProperties = pt;
+	}
+
 }

+ 12 - 6
ui/view/DefaulTable.java

@@ -16,10 +16,12 @@ public class DefaulTable extends DefaultTableModel {
 	/**
 	 * Constructor.
 	 * 
-	 * @param rows the Rows
-	 * @param cols the Cols
+	 * @param rows
+	 *            the Rows
+	 * @param cols
+	 *            the Cols
 	 */
-	DefaulTable(int rows, int cols) { // constructor
+	public DefaulTable(int rows, int cols) { // constructor
 		super(rows, cols);
 		this.editableCells = new boolean[rows][cols];
 	}
@@ -31,9 +33,13 @@ public class DefaulTable extends DefaultTableModel {
 
 	/**
 	 * Set Cell Editable.
-	 * @param row the Rows
-	 * @param col the Cols
-	 * @param value true or false
+	 * 
+	 * @param row
+	 *            the Rows
+	 * @param col
+	 *            the Cols
+	 * @param value
+	 *            true or false
 	 */
 	public void setCellEditable(int row, int col, boolean value) {
 		this.editableCells[row][col] = value; // set cell true/false

+ 145 - 207
ui/view/GUI.java

@@ -78,6 +78,7 @@ import classes.HolonSwitch;
 import classes.HolonTransformer;
 import classes.IdCounter;
 import classes.IdCounterElem;
+import classes.TrackedDataSet;
 import interfaces.CategoryListener;
 import ui.controller.Control;
 import ui.controller.UpdateController;
@@ -126,7 +127,7 @@ public class GUI<E> implements CategoryListener {
 
 	private splitPane statSplitPane;
 	private JScrollPane statScrollPane;
-	private UpperNodeCanvas unc;;
+	private UpperNodeCanvas unc;
 
 	private final JLabel maxGraph = new JLabel("100%");
 	private final JLabel medGraph = new JLabel("50%");
@@ -134,7 +135,6 @@ public class GUI<E> implements CategoryListener {
 	private final JLabel elementGraph = new JLabel("None ");
 	private final ArrayList<HolonElement> selectedElements = new ArrayList<HolonElement>();
 	private String holonEleNamesDisplayed = "None ";
-	private HashMap<Integer, ArrayList<HolonElement>> eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
 	private final JTree tree = new JTree();
 	/******************************************
 	 ************* Right Container*************
@@ -152,8 +152,6 @@ public class GUI<E> implements CategoryListener {
 	// Table for HolonElements --> all cells are editable
 	private JTable tableHolonElement = new JTable();
 	// Model for single or multi selection
-	private PropertyTable tableModelHolonElementMulti = new PropertyTable();
-	private PropertyTable tableModelHolonElementSingle = new PropertyTable();
 	private final JPanel scrollElements = new JPanel();
 	private JScrollPane tableHolonElementScrollPane = new JScrollPane();
 
@@ -184,7 +182,6 @@ public class GUI<E> implements CategoryListener {
 		}
 	};
 	private JPanel graphLabel = new JPanel();
-	private DefaulTable tableModelProperties;
 	private final JScrollPane scrollProperties = new JScrollPane();
 
 	// In this section is the graph for the selected HolonElement of the clicked
@@ -261,14 +258,14 @@ public class GUI<E> implements CategoryListener {
 
 	private String[] columnNamesMulti = { "Object", "Nr.", "Device", "Energy", "Quantity", "Activated" };
 	private String[] columnNamesSingle = { "Nr.", "Device", "Energy", "Quantity", "Activated" };
-	private String[] colNames = { "Field", "Information" };
+	private ArrayList<PropertyTable> tables = new ArrayList<PropertyTable>();
 	private String[] comboBoxCat = { "Category", "Object", "Switch" };
 	private String warningText = "Warning";
 	private String saveBeforeNew = "Do you want to save your current data?";
 	private String eraseCategory = "Do you really want to delete the Category ";
 	private String selectObjBeforeErase = "Please select a Category or an Object in order to delete something.";
 
-	UpdateController updCon;
+	private UpdateController updCon;
 
 	/**
 	 * Create the application.
@@ -626,8 +623,8 @@ public class GUI<E> implements CategoryListener {
 		// Set up of the HolonElements section
 		// Two different Models: Multi for multi-selection mode and Single for
 		// single-selection mode (CPS-Object)
-		tableModelHolonElementMulti.setColumnIdentifiers(columnNamesMulti);
-		tableModelHolonElementSingle.setColumnIdentifiers(columnNamesSingle);
+		model.getMultiTable().setColumnIdentifiers(columnNamesMulti);
+		model.getSingleTable().setColumnIdentifiers(columnNamesSingle);
 		tableHolonElement.setBorder(null);
 		tableHolonElement.setFillsViewportHeight(true);
 		tableHolonElement.setCellSelectionEnabled(true);
@@ -643,9 +640,7 @@ public class GUI<E> implements CategoryListener {
 		panelHolonEl.add(toolBarHolonEl);
 
 		// Set up of the Properties section
-		tableModelProperties = new DefaulTable(1000, colNames.length);
-		tableModelProperties.setColumnIdentifiers(colNames);
-		tableProperties.setModel(tableModelProperties);
+		tableProperties.setModel(model.getPropertyTable());
 		tableProperties.setFillsViewportHeight(true);
 		tableProperties.setCellSelectionEnabled(true);
 		tableProperties.setColumnSelectionAllowed(true);
@@ -667,6 +662,8 @@ public class GUI<E> implements CategoryListener {
 		scrollGraph.setRowHeaderView(graphLabel);
 		scrollGraph.setColumnHeaderView(toolBarGraph);
 
+		tables.add(model.getSingleTable());
+		tables.add(model.getMultiTable());
 		/***********************
 		 * HolonElement Table Actions
 		 **********************/
@@ -676,19 +673,19 @@ public class GUI<E> implements CategoryListener {
 		btnAddHolEL.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
 				if (model.getSelectedCpsObjects().size() == 1) {
-					AbstractCpsObject tempCpsObject = getActualCps();
+					AbstractCpsObject tempCpsObject = updCon.getActualCps();
 					if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
 							&& tempCpsObject.getID() != 0) {
 						addElementPopUp = new AddElementPopUp();
-						addElementPopUp.setActualCps(getActualCps());
+						addElementPopUp.setActualCps(updCon.getActualCps());
 						addElementPopUp.setVisible(true);
 						HolonElement ele = addElementPopUp.getElement();
 						if (ele != null) {
 							controller.addElementCanvasObject(tempCpsObject.getID(), ele.getEleName(), ele.getAmount(),
 									ele.getEnergy());
 						}
-						updCon.refreshTableHolonElement(tableModelHolonElementMulti, tableModelHolonElementSingle);
-						updCon.refreshTableProperties(tableModelProperties);
+						updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+						updCon.refreshTableProperties(model.getPropertyTable());
 						controller.calculateStateForTimeStep(model.getCurIteration());
 					}
 				}
@@ -702,28 +699,28 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent arg0) {
 				// For Single Selection of CpsObject
 				if (model.getSelectedCpsObjects().size() == 1) {
-					if (getActualCps().getClass() == HolonObject.class) {
-						HolonObject obj = (HolonObject) getActualCps();
+					if (updCon.getActualCps().getClass() == HolonObject.class) {
+						HolonObject obj = (HolonObject) updCon.getActualCps();
 						for (HolonElement e : selectedElements) {
 							controller.deleteElementCanvas(obj.getID(), e.getId());
-							updCon.refreshTableHolonElement(tableModelHolonElementMulti, tableModelHolonElementSingle);
-							updCon.refreshTableProperties(tableModelProperties);
+							updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+							updCon.refreshTableProperties(model.getPropertyTable());
 							controller.calculateStateForTimeStep(model.getCurIteration());
 							// Names displayed in graph are not updated
 						}
-						eleToDelete.clear();
+						model.getEleToDelete().clear();
 						selectedElements.clear();
 					}
 					// For MultiSelection of CpsObject
 				} else if (model.getSelectedCpsObjects().size() > 1) {
-					for (Integer i : eleToDelete.keySet()) {
-						for (HolonElement e : eleToDelete.get(i)) {
+					for (Integer i : model.getEleToDelete().keySet()) {
+						for (HolonElement e : model.getEleToDelete().get(i)) {
 							controller.deleteElementCanvas(i, e.getId());
 						}
 					}
-					updCon.refreshTableHolonElement(tableModelHolonElementMulti, tableModelHolonElementSingle);
-					updCon.refreshTableProperties(tableModelProperties);
-					eleToDelete.clear();
+					updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+					updCon.refreshTableProperties(model.getPropertyTable());
+					model.getEleToDelete().clear();
 					selectedElements.clear();
 				}
 				elementGraph.setText("None ");
@@ -736,14 +733,14 @@ public class GUI<E> implements CategoryListener {
 		 */
 		tableHolonElement.addMouseListener(new MouseAdapter() {
 			public void mousePressed(MouseEvent e) {
-				HolonObject obj = (HolonObject) getActualCps();
+				HolonObject obj = (HolonObject) updCon.getActualCps();
 				yValueElements = e.getY();
 				HolonElement ele = null;
 				// Search for current clicked HolonElement
 				if (model.getSelectedCpsObjects().size() == 1) {
-					ele = getActualHolonElement(obj, yValueElements, 0);
+					ele = updCon.getActualHolonElement(obj, yValueElements, 0, tables);
 				} else {
-					ele = getActualHolonElement(null, yValueElements, 0);
+					ele = updCon.getActualHolonElement(null, yValueElements, 0, tables);
 				}
 				// Multi-Selection of HolonElements through control button +
 				// mouse click
@@ -757,12 +754,12 @@ public class GUI<E> implements CategoryListener {
 						}
 						unitGraph.repaintWithNewElement(selectedElements);
 					}
-					getActualHolonElement(null, yValueElements, 2);
+					updCon.getActualHolonElement(null, yValueElements, 2, tables);
 				} // if no control-button pressed but a HolonElement choose
 				else if (ele != null) {
 					selectedElements.clear();
 					selectedElements.add(ele);
-					getActualHolonElement(null, yValueElements, 1);
+					updCon.getActualHolonElement(null, yValueElements, 1, tables);
 					holonEleNamesDisplayed = ele.getEleName() + " ";
 					unitGraph.repaintWithNewElement(selectedElements);
 				} // If any empty space is clicked
@@ -803,18 +800,18 @@ public class GUI<E> implements CategoryListener {
 					if (model.getSelectedCpsObjects().size() > 1) {
 						int selectedValueX = (int) Math.floor(xThis / (tableHolonElement.getWidth() / 6));
 						int selectedValueBX = (int) Math.floor(xBThis / (tableHolonElement.getWidth() / 6));
-						if (updCon.getHolonObj(yMouse, tableModelHolonElementMulti) != null) {
+						if (updCon.getHolonObj(yMouse, model.getMultiTable()) != null) {
 							// For last column (boolean with a checkbox)
 							if (selectedValueBX == 5) {
-								HolonElement eleBTemp = getActualHolonElement(null, yBMouse, 0);
-								String newBStuff = tableModelHolonElementMulti
-										.getValueAt(selectedValueBY, selectedValueBX).toString();
+								HolonElement eleBTemp = updCon.getActualHolonElement(null, yBMouse, 0, tables);
+								String newBStuff = model.getMultiTable().getValueAt(selectedValueBY, selectedValueBX)
+										.toString();
 								Boolean bTemp = Boolean.parseBoolean(newBStuff);
 								eleBTemp.setActive(bTemp);
 							} else {
 								// Update of HolonElement
-								HolonElement eleTemp = getActualHolonElement(null, yMouse, 0);
-								String newStuff = tableModelHolonElementMulti.getValueAt(selectedValueY, selectedValueX)
+								HolonElement eleTemp = updCon.getActualHolonElement(null, yMouse, 0, tables);
+								String newStuff = model.getMultiTable().getValueAt(selectedValueY, selectedValueX)
 										.toString();
 								// Name update
 								if (selectedValueX == 2) {
@@ -836,19 +833,21 @@ public class GUI<E> implements CategoryListener {
 					else if (model.getSelectedCpsObjects().size() == 1) {
 						int selectedValueX = (int) Math.floor(xThis / (tableHolonElement.getWidth() / 5));
 						int selectedValueBX = (int) Math.floor(xBThis / (tableHolonElement.getWidth() / 5));
-						if (getActualCps() != null && getActualCps().getClass() == HolonObject.class) {
+						if (updCon.getActualCps() != null && updCon.getActualCps().getClass() == HolonObject.class) {
 							// For last column (boolean with a checkbox)
 							if (selectedValueBX == 4) {
-								HolonElement eleBTemp = getActualHolonElement((HolonObject) getActualCps(), yBMouse, 0);
-								String newBStuff = tableModelHolonElementSingle
-										.getValueAt(selectedValueBY, selectedValueBX).toString();
+								HolonElement eleBTemp = updCon
+										.getActualHolonElement((HolonObject) updCon.getActualCps(), yBMouse, 0, tables);
+								String newBStuff = model.getSingleTable().getValueAt(selectedValueBY, selectedValueBX)
+										.toString();
 								Boolean bTemp = Boolean.parseBoolean(newBStuff);
 								eleBTemp.setActive(bTemp);
 							} else {
 								// Update of HolonElement
-								HolonElement eleTemp = getActualHolonElement((HolonObject) getActualCps(), yMouse, 0);
-								String newStuff = tableModelHolonElementSingle
-										.getValueAt(selectedValueY, selectedValueX).toString();
+								HolonElement eleTemp = updCon.getActualHolonElement((HolonObject) updCon.getActualCps(),
+										yMouse, 0, tables);
+								String newStuff = model.getSingleTable().getValueAt(selectedValueY, selectedValueX)
+										.toString();
 								// Name update
 								if (selectedValueX == 1) {
 									eleTemp.setEleName(newStuff);
@@ -864,8 +863,8 @@ public class GUI<E> implements CategoryListener {
 							}
 						}
 					}
-					updCon.refreshTableProperties(tableModelProperties);
-					tableModelHolonElementSingle.fireTableDataChanged();
+					updCon.refreshTableProperties(model.getPropertyTable());
+					model.getSingleTable().fireTableDataChanged();
 					controller.calculateStateForTimeStep(model.getCurIteration());
 					unitGraph.repaint();
 				} catch (Exception e) {
@@ -902,35 +901,35 @@ public class GUI<E> implements CategoryListener {
 					Point mousePos = tableProperties.getMousePosition();
 					int selValueY = (int) Math.floor(yProThis / 16);
 					int selValueX = (int) Math.floor(xProThis / (tableProperties.getWidth() / 2));
-					if (getActualCps() != null) {
-						temp = tableModelProperties.getValueAt(selValueY, selValueX);
-						if (getActualCps() instanceof HolonSwitch) {
-							btemp = tableModelProperties.getValueAt(mousePos.y / tableProperties.getRowHeight(),
+					if (updCon.getActualCps() != null) {
+						temp = model.getPropertyTable().getValueAt(selValueY, selValueX);
+						if (updCon.getActualCps() instanceof HolonSwitch) {
+							btemp = model.getPropertyTable().getValueAt(mousePos.y / tableProperties.getRowHeight(),
 									mousePos.x / (tableProperties.getWidth() / 2));
 							if (mousePos.y / tableProperties.getRowHeight() == 0) {
-								getActualCps().setName(btemp.toString());
+								updCon.getActualCps().setName(btemp.toString());
 							} else if (mousePos.y / tableProperties.getRowHeight() == 2) {
 								Boolean bbTemp = Boolean.parseBoolean(btemp.toString());
-								((HolonSwitch) getActualCps()).setManualMode(bbTemp);
+								((HolonSwitch) updCon.getActualCps()).setManualMode(bbTemp);
 								if (bbTemp) {
-									tableModelProperties.setCellEditable(3, 1, true);
+									model.getPropertyTable().setCellEditable(3, 1, true);
 								} else {
-									tableModelProperties.setCellEditable(3, 1, false);
+									model.getPropertyTable().setCellEditable(3, 1, false);
 								}
 							} else if (mousePos.y / tableProperties.getRowHeight() == 3) {
-								if (((HolonSwitch) getActualCps()).getManualMode()) {
-									tableModelProperties.setCellEditable(3, 1, true);
+								if (((HolonSwitch) updCon.getActualCps()).getManualMode()) {
+									model.getPropertyTable().setCellEditable(3, 1, true);
 									Boolean bTemp = Boolean.parseBoolean(temp.toString());
-									((HolonSwitch) getActualCps()).setManualState(bTemp);
+									((HolonSwitch) updCon.getActualCps()).setManualState(bTemp);
 								}
 							}
 						} // else if (getActualCps() instanceof
 							// AbstractCpsObject) {
-						getActualCps().setName(temp.toString());
+						updCon.getActualCps().setName(temp.toString());
 						// }
 					} else {
-						temp = tableModelProperties.getValueAt(selValueY, selValueX);
-						btemp = tableModelProperties.getValueAt(mousePos.y / tableProperties.getRowHeight(),
+						temp = model.getPropertyTable().getValueAt(selValueY, selValueX);
+						btemp = model.getPropertyTable().getValueAt(mousePos.y / tableProperties.getRowHeight(),
 								mousePos.x / (tableProperties.getWidth() / 2));
 						if (selValueY == 2) {
 							Float ftemp;
@@ -1026,22 +1025,25 @@ public class GUI<E> implements CategoryListener {
 							int x = (int) unc.getMousePosition().getX();
 							int y = (int) unc.getMousePosition().getY();
 
-							AbstractCpsObject h = null;
-							if (tempCps instanceof HolonObject) {
-								h = new HolonObject(tempCps);
-							}
-							if (tempCps instanceof HolonSwitch) {
-								h = new HolonSwitch(tempCps);
-							}
-							if (tempCps instanceof HolonTransformer) {
-								h = new HolonTransformer(tempCps);
-							}
+							if (x > unc.borderPos) {
 
-							h.setPosition(x, y);
+								AbstractCpsObject h = null;
+								if (tempCps instanceof HolonObject) {
+									h = new HolonObject(tempCps);
+								}
+								if (tempCps instanceof HolonSwitch) {
+									h = new HolonSwitch(tempCps);
+								}
+								if (tempCps instanceof HolonTransformer) {
+									h = new HolonTransformer(tempCps);
+								}
+
+								h.setPosition(x, y);
 
-							controller.addObjUpperNode(h, unc.upperNode);
-							unc.invalidate();
-							unc.repaint();
+								controller.addObjUpperNode(h, unc.upperNode);
+								unc.invalidate();
+								unc.repaint();
+							}
 						} else {
 							int x = (int) canvas.getMousePosition().getX();
 							int y = (int) canvas.getMousePosition().getY();
@@ -1088,8 +1090,8 @@ public class GUI<E> implements CategoryListener {
 							.getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
 					if (selectedNode.getLevel() == 2) {
 						controller.searchCategoryObject(selectedNode.getParent().toString(), selectedNode.toString());
-						updCon.deleteRows(tableModelHolonElementSingle);
-						updCon.deleteRows(tableModelHolonElementMulti);
+						updCon.deleteRows(model.getSingleTable());
+						updCon.deleteRows(model.getMultiTable());
 						// if (selected instanceof HolonObject && selected !=
 						// null) {
 						// selected = (HolonObject) selected;
@@ -1222,11 +1224,11 @@ public class GUI<E> implements CategoryListener {
 					unitGraph.empty();
 					elementGraph.setText(Languages.getLanguage()[25]);
 				}
-				temp = getActualCps();
+				temp = updCon.getActualCps();
 				// Erase old data in the PropertyTable
-				if (tableModelProperties.getRowCount() > 0) {
-					for (int i = tableModelProperties.getRowCount() - 1; i > -1; i--) {
-						tableModelProperties.removeRow(i);
+				if (model.getPropertyTable().getRowCount() > 0) {
+					for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
+						model.getPropertyTable().removeRow(i);
 					}
 				}
 				if (e.isControlDown() && temp != null) {
@@ -1240,44 +1242,55 @@ public class GUI<E> implements CategoryListener {
 				if (temp != null) {
 					// Name of the CpsObject
 					Object[] tempName = { Languages.getLanguage()[72], temp.getName() };
-					tableModelProperties.addRow(tempName);
+					model.getPropertyTable().addRow(tempName);
 					// Id of the CpsObject
 					Object[] tempId = { "ID", temp.getID() };
-					tableModelProperties.addRow(tempId);
+					model.getPropertyTable().addRow(tempId);
 					// For HolonObjects the Total Energy (production or
 					// consumption) is calculated
 					if (temp instanceof HolonObject) {
-						updCon.refreshTableHolonElement(tableModelHolonElementMulti, tableModelHolonElementSingle);
+						updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
 						Object[] tempEnergy = { Languages.getLanguage()[73], ((HolonObject) temp).getCurrentEnergy() };
-						tableModelProperties.addRow(tempEnergy);
-						tableModelProperties.setCellEditable(0, 1, true);
-						tableModelProperties.setCellEditable(2, 1, false);
-						tableModelProperties.setCellEditable(3, 1, false);
+						model.getPropertyTable().addRow(tempEnergy);
+						model.getPropertyTable().setCellEditable(0, 1, true);
+						model.getPropertyTable().setCellEditable(2, 1, false);
+						model.getPropertyTable().setCellEditable(3, 1, false);
 					} // For HolonSwitches is showed the actual status (active
 						// or inactive)
 					else if (temp instanceof HolonSwitch) {
-						updCon.deleteRows(tableModelHolonElementSingle);
-						updCon.deleteRows(tableModelHolonElementMulti);
+						updCon.deleteRows(model.getSingleTable());
+						updCon.deleteRows(model.getMultiTable());
 						Object[] tempMode = { Languages.getLanguage()[74], ((HolonSwitch) temp).getManualMode() };
-						tableModelProperties.addRow(tempMode);
+						model.getPropertyTable().addRow(tempMode);
 						if (((HolonSwitch) temp).getManualMode()) {
 							Object[] tempActive = { Languages.getLanguage()[75],
 									((HolonSwitch) temp).getActiveManual() };
-							tableModelProperties.addRow(tempActive);
-							tableModelProperties.setCellEditable(3, 1, true);
+							model.getPropertyTable().addRow(tempActive);
+							model.getPropertyTable().setCellEditable(3, 1, true);
 						} else {
 							Object[] tempActive = { Languages.getLanguage()[75],
 									((HolonSwitch) temp).getActiveAt()[model.getCurIteration()] };
-							tableModelProperties.addRow(tempActive);
-							tableModelProperties.setCellEditable(3, 1, false);
+							model.getPropertyTable().addRow(tempActive);
+							model.getPropertyTable().setCellEditable(3, 1, false);
 						}
 						unitGraph.repaintWithNewSwitch((HolonSwitch) temp);
 						elementGraph.setText(temp.getName());
-						tableModelProperties.setCellEditable(0, 1, true);
-						tableModelProperties.setCellEditable(2, 1, true);
+						model.getPropertyTable().setCellEditable(0, 1, true);
+						model.getPropertyTable().setCellEditable(2, 1, true);
+					} else if (temp instanceof CpsUpperNode) {
+						updCon.deleteRows(model.getSingleTable());
+						updCon.deleteRows(model.getMultiTable());
+						Object[] numEle = { "Number of Elements", ((CpsUpperNode) temp).getNodes().size() };
+						Object[] numObj = { "Number of HolonObject", ((CpsUpperNode) temp).getNumHolonObj().size() };
+						Object[] numSwi = { "Number of HolonSwitch", ((CpsUpperNode) temp).getNumSwitches().size() };
+						Object[] numUpp = { "Number of UpperNodes", ((CpsUpperNode) temp).getNumUpperNodes().size() };
+						model.getPropertyTable().addRow(numEle);
+						model.getPropertyTable().addRow(numObj);
+						model.getPropertyTable().addRow(numSwi);
+						model.getPropertyTable().addRow(numUpp);
 					} else {
-						updCon.deleteRows(tableModelHolonElementSingle);
-						updCon.deleteRows(tableModelHolonElementMulti);
+						updCon.deleteRows(model.getSingleTable());
+						updCon.deleteRows(model.getMultiTable());
 					}
 					// For Objects the only editable cell is the name
 					ArrayList<CpsEdge> tempArray = temp.getConnections();
@@ -1291,22 +1304,22 @@ public class GUI<E> implements CategoryListener {
 									Object[] tempConnection = { temp.getName() + Languages.getLanguage()[76],
 											temp2.getA().getName() + Languages.getLanguage()[77]
 													+ temp2.getA().getID() };
-									tableModelProperties.addRow(tempConnection);
+									model.getPropertyTable().addRow(tempConnection);
 								} else {
 									Object[] tempConnection = { temp.getName() + Languages.getLanguage()[76],
 											temp2.getB().getName() + Languages.getLanguage()[77]
 													+ temp2.getB().getID() };
-									tableModelProperties.addRow(tempConnection);
+									model.getPropertyTable().addRow(tempConnection);
 								}
 							} else {
 								if (temp.getID() != temp2.getA().getID()) {
 									Object[] tempConnection = { "", temp2.getA().getName() + Languages.getLanguage()[77]
 											+ temp2.getA().getID() };
-									tableModelProperties.addRow(tempConnection);
+									model.getPropertyTable().addRow(tempConnection);
 								} else {
 									Object[] tempConnection = { "", temp2.getB().getName() + Languages.getLanguage()[77]
 											+ temp2.getB().getID() };
-									tableModelProperties.addRow(tempConnection);
+									model.getPropertyTable().addRow(tempConnection);
 								}
 							}
 						}
@@ -1317,30 +1330,30 @@ public class GUI<E> implements CategoryListener {
 					Object[] tempName = { Languages.getLanguage()[72],
 							Languages.getLanguage()[78] + model.getSelectedEdge().getA().getName()
 									+ Languages.getLanguage()[79] + model.getSelectedEdge().getB().getName() };
-					tableModelProperties.addRow(tempName);
+					model.getPropertyTable().addRow(tempName);
 					// Current Flow displayed
 					Object[] tempFlow = { Languages.getLanguage()[80], model.getSelectedEdge().getFlow() };
-					tableModelProperties.addRow(tempFlow);
+					model.getPropertyTable().addRow(tempFlow);
 					// Max Capacity displayed
 					Object[] tempCapacity = { Languages.getLanguage()[81], model.getSelectedEdge().getCapacity() };
-					tableModelProperties.addRow(tempCapacity);
+					model.getPropertyTable().addRow(tempCapacity);
 					// Status displayed
 					Object[] tempStatus = { Languages.getLanguage()[82], model.getSelectedEdge().getState() };
-					tableModelProperties.addRow(tempStatus);
+					model.getPropertyTable().addRow(tempStatus);
 					// For edges, the only possible editable cell is the max
 					// flow
-					tableModelProperties.setCellEditable(0, 1, false);
-					tableModelProperties.setCellEditable(2, 1, true);
-					tableModelProperties.setCellEditable(3, 1, true);
-				} else if (getActualCps() == null) {
-					updCon.deleteRows(tableModelHolonElementSingle);
-					updCon.deleteRows(tableModelHolonElementMulti);
+					model.getPropertyTable().setCellEditable(0, 1, false);
+					model.getPropertyTable().setCellEditable(2, 1, true);
+					model.getPropertyTable().setCellEditable(3, 1, true);
+				} else if (updCon.getActualCps() == null) {
+					updCon.deleteRows(model.getSingleTable());
+					updCon.deleteRows(model.getMultiTable());
 				} // Update of the HolonElementTable (Single- or
 					// Multi-Selection)
 				if (model.getSelectedCpsObjects().size() > 1) {
-					tableHolonElement.setModel(tableModelHolonElementMulti);
+					tableHolonElement.setModel(model.getMultiTable());
 				} else if (model.getSelectedCpsObjects().size() == 1) {
-					tableHolonElement.setModel(tableModelHolonElementSingle);
+					tableHolonElement.setModel(model.getSingleTable());
 				}
 				// New Tab with NodeOfNode
 				if (doubleClick() && temp instanceof CpsUpperNode) {
@@ -1350,12 +1363,12 @@ public class GUI<E> implements CategoryListener {
 
 			@Override
 			public void mouseReleased(MouseEvent e) {
-				updCon.refreshTableHolonElement(tableModelHolonElementMulti, tableModelHolonElementSingle);
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+				updCon.refreshTableProperties(model.getPropertyTable());
 				if (model.getSelectedCpsObjects().size() > 1) {
-					tableHolonElement.setModel(tableModelHolonElementMulti);
+					tableHolonElement.setModel(model.getMultiTable());
 				} else if (model.getSelectedCpsObjects().size() == 1) {
-					tableHolonElement.setModel(tableModelHolonElementSingle);
+					tableHolonElement.setModel(model.getSingleTable());
 				}
 			}
 
@@ -1502,7 +1515,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				Languages.setLanguage(0);
 				refreshLanguages();
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableProperties(model.getPropertyTable());
 			}
 		});
 		spanishBtn.addActionListener(new ActionListener() {
@@ -1511,7 +1524,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				Languages.setLanguage(1);
 				refreshLanguages();
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableProperties(model.getPropertyTable());
 			}
 		});
 		germanBtn.addActionListener(new ActionListener() {
@@ -1520,7 +1533,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				Languages.setLanguage(2);
 				refreshLanguages();
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableProperties(model.getPropertyTable());
 			}
 		});
 		czechBtn.addActionListener(new ActionListener() {
@@ -1529,7 +1542,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				Languages.setLanguage(3);
 				refreshLanguages();
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableProperties(model.getPropertyTable());
 			}
 		});
 		chineseBtn.addActionListener(new ActionListener() {
@@ -1538,7 +1551,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent e) {
 				Languages.setLanguage(4);
 				refreshLanguages();
-				updCon.refreshTableProperties(tableModelProperties);
+				updCon.refreshTableProperties(model.getPropertyTable());
 				;
 			}
 		});
@@ -1778,84 +1791,6 @@ public class GUI<E> implements CategoryListener {
 		return frmCyberPhysical;
 	}
 
-	/**
-	 * Getter for selected CpsObject.
-	 * 
-	 * @return selected CpsObject
-	 */
-	private AbstractCpsObject getActualCps() {
-		int tempID = model.getSelectedObjectID();
-		AbstractCpsObject tempCps = controller.searchByID(tempID);
-		return tempCps;
-	}
-
-	/**
-	 * Search for actual selected HolonElement.
-	 * 
-	 * @param obj
-	 *            selected HolonObject, if obj==null means multi-selection
-	 *            active
-	 * @param yValue
-	 *            Y-Coord in the HolonElementsTable
-	 * @param toMultiHash
-	 *            0 means no MultiSelection, 1 means MultiSelection without
-	 *            Control, 2 means MultiSelection with Control
-	 * @return the selected HolonElement
-	 */
-	private HolonElement getActualHolonElement(HolonObject obj, int yValue, int toMultiHash) {
-		final int yTemp = (int) Math.floor(yValue / 16);
-		int rowsTotal = 0;
-		// Filter for search --> single and multi selection
-		if (obj == null) {
-			rowsTotal = tableModelHolonElementMulti.getRowCount();
-		} else {
-			rowsTotal = tableModelHolonElementSingle.getRowCount();
-		}
-		// search for the clicked HolonObject and HolonElement --> in the
-		// HolonElementTable
-		HolonObject obtTemp = null;
-		HolonElement toReturnEle = null;
-		int id = 0;
-		if (rowsTotal != 0 && rowsTotal > yTemp) {
-			// Multi-Selection search
-			if (obj == null) {
-				String tempStringObj = tableModelHolonElementMulti.getValueAt(yTemp, 0).toString();
-				int idTempObj = Integer.parseInt(tempStringObj.split(", ")[1]);
-				obtTemp = (HolonObject) controller.searchByID(idTempObj);
-				id = Integer.parseInt(tableModelHolonElementMulti.getValueAt(yTemp, 1).toString());
-				ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
-				if (eleToDelete.containsKey(idTempObj) && toMultiHash == 2) {
-					eleTemp = eleToDelete.get(idTempObj);
-					if (!eleTemp.contains(obtTemp.searchElementById(id))) {
-						eleTemp.add(obtTemp.searchElementById(id));
-						eleToDelete.replace(idTempObj, eleTemp);
-					}
-				} else if (toMultiHash == 2) {
-					eleTemp.add(obtTemp.searchElementById(id));
-					eleToDelete.put(idTempObj, eleTemp);
-				} else if (toMultiHash == 1) {
-					eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
-					eleTemp.add(obtTemp.searchElementById(id));
-					eleToDelete.put(idTempObj, eleTemp);
-				} else if (toMultiHash == 0) {
-					toReturnEle = obtTemp.searchElementById(id);
-				}
-			} // Single-Selection search
-			else {
-				eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
-				id = Integer.parseInt(tableModelHolonElementSingle.getValueAt(yTemp, 0).toString());
-				toReturnEle = obj.searchElementById(id);
-			}
-			model.setSelectedHolonElement(toReturnEle);
-			return toReturnEle;
-		} // If no HolonObject selected
-		else {
-			eleToDelete = new HashMap<Integer, ArrayList<HolonElement>>();
-			model.setSelectedHolonElement(null);
-			return null;
-		}
-	}
-
 	/**
 	 * Adds a Popup.
 	 * 
@@ -1910,14 +1845,14 @@ public class GUI<E> implements CategoryListener {
 		for (int i = 0; i < columnNamesMulti.length; i++) {
 			columnNamesMulti[i] = tempArray[i + 17];
 		}
-		tableModelHolonElementMulti.setColumnIdentifiers(columnNamesMulti);
+		model.getMultiTable().setColumnIdentifiers(columnNamesMulti);
 		for (int i = 0; i < columnNamesSingle.length; i++) {
 			columnNamesSingle[i] = tempArray[i + 18];
 		}
-		tableModelHolonElementSingle.setColumnIdentifiers(columnNamesSingle);
-		colNames[0] = tempArray[23];
-		colNames[1] = tempArray[24];
-		tableModelProperties.setColumnIdentifiers(colNames);
+		model.getSingleTable().setColumnIdentifiers(columnNamesSingle);
+		model.colNames[0] = tempArray[23];
+		model.colNames[1] = tempArray[24];
+		model.getPropertyTable().setColumnIdentifiers(model.colNames);
 		// Graph
 		elementGraph.setText(tempArray[25]);
 		holonEleNamesDisplayed = tempArray[25];
@@ -1981,6 +1916,7 @@ public class GUI<E> implements CategoryListener {
 		// check if tab already open for clicked NodeOfNode
 		boolean dupl = false;
 		for (int i = 2; i < tabbedPane.getTabCount() && dupl == false; i++) {
+			System.out.println(i);
 			if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport().getComponent(0)).upperNode
 					.getID() == temp.getID()) {
 				dupl = true;
@@ -1995,10 +1931,12 @@ public class GUI<E> implements CategoryListener {
 			unc.addMouseListener(new MouseAdapter() {
 				@Override
 				public void mousePressed(MouseEvent e) {
-					temp = unc.tempCps;
+					temp = ((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport().getComponent(0)).tempCps;
 					if (doubleClick() && temp instanceof CpsUpperNode) {
 						openNewUpperNodeTab();
+						System.out.println("done");
 					}
+					// updCon.refreshTableProperties(table);
 				}
 			});
 

+ 18 - 14
ui/view/MyCanvas.java

@@ -86,7 +86,6 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 
 	// contains the value of the Capacity for new created Edges
 
-
 	/**
 	 * Constructor.
 	 * 
@@ -158,9 +157,12 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 							controller.addTrackingObj((HolonObject) o);
 							((HolonObject) o).updateTrackingInfo();
 						}
+						controller.addTextToConsole("Tracking: ", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getName(), Color.BLUE, 12, true, false, false);
+						controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getID(), Color.RED, 12, true, false, true);
 					}
 				}
-				System.out.println(controller.getTrackingObj());
 			}
 		});
 
@@ -185,9 +187,12 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 							((HolonObject) o).setTrackingProd(new float[100]);
 							((HolonObject) o).setTrackingCons(new float[100]);
 						}
+						controller.addTextToConsole("Untracking: ", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getName(), Color.BLUE, 12, true, false, false);
+						controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getID(), Color.RED, 12, true, false, true);
 					}
 				}
-				System.out.println(controller.getTrackingObj());
 			}
 		});
 
@@ -199,16 +204,16 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
 					controller.delCanvasObject(cps);
 					// Remove UpperNodeTab if UpperNode deleted
-					if(cps instanceof CpsUpperNode){
+					if (cps instanceof CpsUpperNode) {
 						JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
 						for (int i = 2; i < tabbedPane.getTabCount(); i++) {
-							if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport().getComponent(0)).upperNode
-									.getID() == cps.getID()) {
+							if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
+									.getComponent(0)).upperNode.getID() == cps.getID()) {
 								tabbedPane.remove(i);
-								i = tabbedPane.getTabCount();				
+								i = tabbedPane.getTabCount();
 							}
 						}
-					}	
+					}
 				}
 				model.getSelectedCpsObjects().clear();
 				tempCps = null;
@@ -467,13 +472,13 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		dataSelected = null;
 		edgeHighlight = null;
 		controller.setSelecteEdge(null);
-		
+		System.out.println(model.getEdgesOnCanvas().size());
 		// Object Selection
 		for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 			cx = cps.getPosition().x;
 			cy = cps.getPosition().y;
 			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
-				tempCps = cps;				
+				tempCps = cps;
 				controller.addTextToConsole("Selected: ", Color.BLACK, 12, false, false, false);
 				controller.addTextToConsole("" + cps.getName(), Color.BLUE, 12, true, false, false);
 				controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
@@ -694,14 +699,15 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 			cy = cps.getPosition().y;
 			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
 
-				objectTT.setTipText(cps.getName() + ", " + cps.getID());
 				objectTT.setLocation(cx, cy + controller.getScale());
+				objectTT.setTipText(cps.getName() + ", " + cps.getID());
+
 				on = true;
 			}
 		}
 		if (!on) {
-			objectTT.setLocation(-200, -200);
 			objectTT.setTipText("");
+			objectTT.setLocation(-200, -200);
 		}
 	}
 
@@ -860,8 +866,6 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		return false;
 	}
 
-
-
 	/**
 	 * Set if Information should be shown.
 	 * 

+ 149 - 57
ui/view/StatisticGraph.java

@@ -12,6 +12,8 @@ import javax.swing.JPanel;
 
 import classes.HolonElement;
 import classes.HolonObject;
+import classes.HolonSwitch;
+import classes.TrackedDataSet;
 import ui.controller.Control;
 import ui.model.Model;
 
@@ -31,9 +33,6 @@ public class StatisticGraph extends JPanel {
 	// is the Simulation running?
 	private boolean isSimRunning;
 
-	// Colours
-	private ArrayList<Color> colors = new ArrayList<>();
-
 	// model and controller
 	private Model model;
 	private Control controller;
@@ -43,8 +42,7 @@ public class StatisticGraph extends JPanel {
 	GeneralPath path = new GeneralPath();
 
 	// Data
-	private ArrayList<HolonObject> objects = new ArrayList<>();
-	private ArrayList<GeneralPath> objPaths = new ArrayList<>();
+	private ArrayList<TrackedDataSet> objects = new ArrayList<>();
 
 	/**
 	 * Constructor.
@@ -56,18 +54,7 @@ public class StatisticGraph extends JPanel {
 	 */
 	public StatisticGraph(final Model model, Control control) {
 		this.controller = control;
-		this.model = model;
-		colors.add(Color.BLUE);
-		colors.add(Color.RED);
-		colors.add(Color.GREEN);
-		colors.add(Color.CYAN);
-		colors.add(Color.ORANGE);
-		colors.add(Color.PINK);
-		colors.add(Color.MAGENTA);
-		colors.add(Color.YELLOW);
-		
-		
-		
+
 		this.setBackground(Color.WHITE);
 	}
 
@@ -96,42 +83,37 @@ public class StatisticGraph extends JPanel {
 			g2.drawLine(0, i, this.getWidth(), i);
 		}
 
-		// Reset?
-		if (!isSimRunning && model.getIsSimulation()) {
-			for (int i = 0; i < objects.size(); i++) {
-				objPaths.get(i).reset();
-				objPaths.get(i).moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
-						convertToCanvasY(Math.abs(objects.get(i).getCurrentEnergy())));
-			}
-		}
-
 		isSimRunning = model.getIsSimulation();
 
 		// if sim is on
 		if (isSimRunning) {
-			maximum = 0;
-			for (HolonObject obj : objects) {
-				if (maximum <= (Math.abs(obj.getCurrentEnergy()))) {
-					maximum = (Math.abs(obj.getCurrentEnergy()));
-				}
-			}
+			g2.setStroke(new BasicStroke(3));
 
-			for (int i = 0; i < objects.size(); i++) {
-				g2.setColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
-						(int) (Math.random() * 255)));
-				objPaths.get(i).lineTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
-						convertToCanvasY(Math.abs(getEnergyAtCurrentTimeStep(objects.get(i)))));
-				objPaths.get(i).moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
-						convertToCanvasY(Math.abs(getEnergyAtCurrentTimeStep(objects.get(i)))));
+			// Calculate the Maximum
+			calcMaximum();
 
+			// Calculate values for each set and add them
+			addValues();
+
+			//Create Paths and draw them
+			for (TrackedDataSet set : objects) {
+				path.reset();
+				switch (set.getProperty()) {
+				case TrackedDataSet.CONSUMPTION:
+				case TrackedDataSet.PRODUCTION:
+				case TrackedDataSet.ACTIVATED_ELEMENTS:
+					createPathFloats(set);
+					break;
+				case TrackedDataSet.ON_OFF:
+					createPathBooleans(set);
+					break;
+				default:
+					break;
+				}
+				g2.setColor(set.getColor());
+				g2.draw(path);
 			}
 		}
-		g2.setStroke(new BasicStroke(3));
-		for (int i = 0; i < objPaths.size(); i++) {
-			g2.setColor(colors.get(i));
-			g2.draw(objPaths.get(i));
-		}
-
 	}
 
 	/**
@@ -140,13 +122,9 @@ public class StatisticGraph extends JPanel {
 	 * @param obj
 	 *            the Object to add
 	 */
-	public void addObject(HolonObject obj) {
-		if (objects.size() < MAX_OBJECTS && !objects.contains(obj)) {
-			objects.add((HolonObject) obj);
-			objPaths.add(new GeneralPath());
-			objPaths.get(objPaths.size() - 1)
-					.moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1, convertToCanvasY(Math
-							.abs(objects.get(objects.size() - 1).getCurrentEnergyAtTimeStep(model.getCurIteration()))));
+	public void addObject(TrackedDataSet set) {
+		if (objects.size() < MAX_OBJECTS && !objects.contains(set)) {
+			objects.add(set);
 		}
 	}
 
@@ -156,10 +134,9 @@ public class StatisticGraph extends JPanel {
 	 * @param obj
 	 *            the Object to remove
 	 */
-	public void removeObject(HolonObject obj) {
-		if (objects.contains(obj)) {
-			objPaths.remove(objects.indexOf(obj));
-			objects.remove(obj);
+	public void removeObject() {
+		for (TrackedDataSet set : objects) {
+			controller.addTextToConsole("Function not available");
 		}
 	}
 
@@ -173,7 +150,7 @@ public class StatisticGraph extends JPanel {
 	public double convertToCanvasY(float d) {
 		return Math.abs((this.getHeight() - (d * (this.getHeight() / maximum))));
 	}
-	
+
 	/**
 	 * Does take into account which timestep is watched, calculates the max
 	 * values.
@@ -190,4 +167,119 @@ public class StatisticGraph extends JPanel {
 		return temp;
 	}
 
+	/**
+	 * Calculate the Max Value of the Graph
+	 */
+	private void calcMaximum() {
+		maximum = 0;
+		for (TrackedDataSet set : objects) {
+			int val = 0;
+			switch (set.getProperty()) {
+			case TrackedDataSet.CONSUMPTION:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() < 0) {
+						val += h.getEnergy();
+					}
+				}
+				val *= -1;
+				break;
+			case TrackedDataSet.PRODUCTION:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() > 0) {
+						val += h.getEnergy();
+					}
+				}
+
+				break;
+			case TrackedDataSet.ACTIVATED_ELEMENTS:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() < 0) {
+						val += h.getAmount();
+					}
+				}
+				break;
+			default:
+				break;
+			}
+			if (val > maximum) {
+				maximum = val;
+			}
+		}
+	}
+
+	/**
+	 * Add the Current Values to each set
+	 */
+	private void addValues() {
+		for (TrackedDataSet set : objects) {
+			switch (set.getProperty()) {
+			case TrackedDataSet.CONSUMPTION:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() < 0) {
+						set.setValAt(-h.getEnergyAt()[model.getCurIteration()], model.getCurIteration());
+					}
+				}
+				break;
+			case TrackedDataSet.PRODUCTION:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() > 0) {
+						set.setValAt(h.getEnergyAt()[model.getCurIteration()], model.getCurIteration());
+					}
+				}
+
+				break;
+			case TrackedDataSet.ACTIVATED_ELEMENTS:
+				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
+					if (h.getEnergy() < 0) {
+
+					}
+				}
+				break;
+			case TrackedDataSet.ON_OFF:
+				if (((HolonSwitch) set.getCpsObject()).getState()) {
+					set.setValAt(1, model.getCurIteration());
+				} else {
+					set.setValAt(0, model.getCurIteration());
+				}
+				break;
+			default:
+				break;
+			}
+		}
+	}
+
+	/**
+	 * create Path with floats
+	 * 
+	 * @param set
+	 */
+	private void createPathFloats(TrackedDataSet set) {
+		boolean init = true;
+		for (int i = 0; i < set.getValues().length - 1; i++) {
+			if (init && set.getValues()[i] != -1) {
+				path.moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
+						convertToCanvasY(Math.abs(set.getValues()[i])));
+			}
+			path.lineTo(model.getCurIteration() * this.getWidth() / model.getIterations(),
+					convertToCanvasY(Math.abs(set.getValues()[i + 1])));
+		}
+	}
+
+	/**
+	 * create Path with booleans(0 and 1)
+	 * 
+	 * @param set
+	 */
+	private void createPathBooleans(TrackedDataSet set) {
+		boolean init = true;
+		for (int i = 0; i < set.getValues().length - 1; i++) {
+			if (init && set.getValues()[i] != -1) {
+				path.moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
+						convertToCanvasY((float) (set.getValues()[i] * maximum)));
+			}
+			path.lineTo(model.getCurIteration() * this.getWidth() / model.getIterations(),
+					convertToCanvasY((float) (set.getValues()[i + 1] * maximum)));
+		}
+	}
+
 }

+ 229 - 39
ui/view/UpperNodeCanvas.java

@@ -38,6 +38,7 @@ import classes.HolonSwitch;
 import classes.Position;
 import classes.SubNet;
 import ui.controller.Control;
+import ui.controller.UpdateController;
 import ui.model.Model;
 
 /**
@@ -58,7 +59,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	private int cx, cy;
 	private int sx, sy; // Mark Coords
 	private float scalediv20;
-	private int borderPos = 0; // Border Position
+	public int borderPos = 0; // Border Position
 
 	// Path
 	public String path;
@@ -89,13 +90,15 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	public JMenuItem itemUngroup = new JMenuItem("Ungroup");
 	public JMenuItem itemTrack = new JMenuItem("Track");
 	public JMenuItem itemUntrack = new JMenuItem("Untrack");
-	// private JToolTip objectTT = new JToolTip();
+	private JToolTip objectTT = new JToolTip();
 
 	private Point mousePosition = new Point(); // Mouse Position when
 												// rightclicked
 
 	// contains the value of the Capacity for new created Edges
 
+	private UpdateController updCon;
+
 	/**
 	 * Constructor.
 	 * 
@@ -105,7 +108,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);
 		this.controller = control;
 		this.model = mod;
 		this.upperNode = UpperNode;
@@ -114,6 +117,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		// this.add(breadCrumb);
 		scalediv20 = model.getScale() / 20;
 
+		// Cps objecte aus dem border links schieben
+		borderPos = (int) (model.getScale() + scalediv20 + scalediv20 + 10);
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
 			if (cps.getPosition().x < model.getScaleDiv2() + borderPos + 5) {
 				cps.setPosition(new Position(borderPos + 5, cps.getPosition().y));
@@ -122,7 +127,6 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 		showedInformation[0] = true;
 		showedInformation[1] = true;
-		control.setMaxCapacity(10000);
 
 		popmenu.add(itemCut);
 		popmenu.add(itemCopy);
@@ -142,6 +146,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		itemUngroup.setEnabled(false);
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
+		updCon = new UpdateController(model, controller);
 
 		itemGroup.addActionListener(new ActionListener() {
 			@Override
@@ -159,7 +164,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			}
 		});
 
-		itemTrack.addActionListener(new ActionListener() {
+		itemUntrack.addActionListener(new ActionListener() {
+
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
@@ -172,16 +178,21 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 								}
 							}
 						}
-						if (!found) {
-							controller.addTrackingObj((HolonObject) o);
-							((HolonObject) o).updateTrackingInfo();
+						if (found) {
+							// Removed from tracking array and tracking
+							// information reseted
+							controller.removeTrackingObj((HolonObject) o);
+							((HolonObject) o).setTrackingProd(new float[100]);
+							((HolonObject) o).setTrackingCons(new float[100]);
 						}
+						controller.addTextToConsole("Untracking: ", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getName(), Color.BLUE, 12, true, false, false);
+						controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
+						controller.addTextToConsole("" + o.getID(), Color.RED, 12, true, false, true);
 					}
 				}
-				System.out.println(controller.getTrackingObj());
 			}
 		});
-
 		itemUntrack.addActionListener(new ActionListener() {
 
 			@Override
@@ -305,8 +316,24 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		if (drawEdge) {
 			g2.setColor(Color.BLACK);
 			g2.setStroke(new BasicStroke(2));
-			g2.drawLine(tempCps.getPosition().x + controller.getScaleDiv2(),
-					tempCps.getPosition().y + controller.getScaleDiv2(), x, y);
+
+			// If TempCps is an outside Object
+			if (!upperNode.getNodes().contains(tempCps)) {
+				int count = 0;
+				for (CpsEdge e : upperNode.getConnections()) {
+					if (e.getA().equals(tempCps)) {
+						g2.drawLine(borderPos >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
+								+ (model.getScale() + scalediv20 + 10) * count), x, y);
+					} else if (e.getB().equals(tempCps)) {
+						g2.drawLine(borderPos >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
+								+ (model.getScale() + scalediv20 + 10) * count), x, y);
+					}
+					count++;
+				}
+			} else {
+				g2.drawLine(tempCps.getPosition().x + controller.getScaleDiv2(),
+						tempCps.getPosition().y + controller.getScaleDiv2(), x, y);
+			}
 		}
 
 		for (CpsEdge con : upperNode.getNodeEdges()) {
@@ -576,6 +603,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		edgeHighlight = null;
 		controller.setSelecteEdge(null);
 		// Object Selection
+
 		if (e.getX() > borderPos) {
 			for (AbstractCpsObject cps : upperNode.getNodes()) {
 				cx = cps.getPosition().x;
@@ -587,7 +615,19 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
 					controller.addTextToConsole("" + cps.getID(), Color.RED, 12, true, false, true);
 					dragging = true;
-					controller.setSelectedObjectID(tempCps.getID());
+					if (e.isControlDown() && tempCps != null) {
+						System.out.println(tempCps.getName() + " " + tempCps.getID());
+						if (model.getSelectedCpsObjects().contains(tempCps)) {
+							controller.deleteSelectedObject(tempCps);
+						} else {
+							controller.addSelectedObject(tempCps);
+						}
+					} else {
+						System.out.println("HEre");
+						controller.setSelectedObjectID(tempCps.getID());
+						model.getSelectedCpsObjects().clear();
+						controller.addSelectedObject(tempCps);
+					}
 					// If drawing an Edge (CTRL down)
 					if (tempCps.getClass() == HolonObject.class) {
 						HolonObject tempObj = ((HolonObject) tempCps);
@@ -597,9 +637,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 						drawEdge = true;
 						dragging = false;
 					}
+					break;
 				}
 			}
 		} else {
+			// look for objects connected to uppernode
 			int count = 0;
 			for (CpsEdge ed : upperNode.getConnections()) {
 				AbstractCpsObject cps;
@@ -631,8 +673,16 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			}
 		}
 
+		if (e.isControlDown() && tempCps != null) {
+			if (model.getSelectedCpsObjects().contains(tempCps)) {
+				controller.deleteSelectedObject(tempCps);
+			} else {
+				controller.addSelectedObject(tempCps);
+			}
+		}
+
 		// Selection of CpsObject
-		model.setSelectedCpsObject(tempCps);
+		// model.setSelectedCpsObject(tempCps);
 
 		// Edge Selection
 		if (tempCps == null) {
@@ -642,6 +692,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
 				model.getSelectedCpsObjects().clear();
 			}
+			updCon.deleteRows(model.getMultiTable());
+			updCon.deleteRows(model.getSingleTable());
 		}
 
 		if (edgeHighlight == null && tempCps == null) {
@@ -649,7 +701,12 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			sy = e.getY();
 			doMark = true;
 		}
-
+		for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
+			System.out.println(temp.getName() + " " + temp.getID());
+		}
+		System.out.println("");
+		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
+		updCon.refreshTableProperties(model.getPropertyTable());
 		repaint();
 	}
 
@@ -773,9 +830,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 					tempCps.setPosition(x, y); // Drag Position
 					// TipText Position and name
-					// objectTT.setTipText(tempCps.getName() + ", " +
-					// tempCps.getID());
-					// objectTT.setLocation(x, y + controller.getScale());
+					objectTT.setTipText(tempCps.getName() + ", " + tempCps.getID());
+					objectTT.setLocation(x, y + controller.getScale());
 
 					// All Selected Objects
 					for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
@@ -784,8 +840,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 							y = (int) (cps.getPosition().y + yDist);
 
 							// Make sure its in bounds
-							if (x <= 0)
-								x = 0;
+							if (x < borderPos + 5)
+								x = borderPos + 5;
 							else if (x > this.getWidth() - controller.getScale())
 								x = this.getWidth() - controller.getScale();
 							if (y <= 0)
@@ -824,6 +880,34 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 				}
 			}
+			int count = 0;
+			for (CpsEdge ed : upperNode.getConnections()) {
+				AbstractCpsObject cps = null;
+				if (ed.getA().equals(upperNode)) {
+					cps = ed.getB();
+				} else {
+					cps = ed.getA();
+				}
+
+				int x1 = sx, x2 = x, y1 = sy, y2 = y;
+
+				if (sx >= x) {
+					x1 = x;
+					x2 = sx;
+				}
+				if (sy >= y) {
+					y1 = y;
+					y2 = sy;
+				}
+
+				if (x1 <= borderPos >> 1
+						&& y1 <= (int) (5 + (model.getScale() + scalediv20 + 10) * count) + model.getScaleDiv2()
+						&& x2 >= borderPos >> 1 && y2 >= (int) (5 + (model.getScale() + scalediv20 + 10) * count)) {
+					tempSelected.add(cps);
+
+				}
+				count++;
+			}
 		}
 
 		repaint();
@@ -835,37 +919,73 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		x = e.getX();
 		y = e.getY();
 		// Everytghing for the tooltip :)
-		/*
-		 * boolean on = false; for (AbstractCpsObject cps :
-		 * upperNode.getNodes()) {
-		 * 
-		 * cx = cps.getPosition().x; cy = cps.getPosition().y; if (x -
-		 * controller.getScale() <= cx && y - controller.getScale() <= cy && x
-		 * >= cx && y >= cy) {
-		 * 
-		 * objectTT.setTipText(cps.getName() + ", " + cps.getID());
-		 * objectTT.setLocation(cx, cy + controller.getScale()); on = true; } }
-		 * if (!on) { objectTT.setLocation(-200, -200); objectTT.setTipText("");
-		 * }
-		 */
+
+		boolean on = false;
+		for (AbstractCpsObject cps : upperNode.getNodes()) {
+
+			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;
+			}
+		}
+		int count = 0;
+		for (CpsEdge ed : upperNode.getConnections()) {
+
+			AbstractCpsObject cps;
+			if (ed.getA().equals(this.upperNode)) {
+				cps = ed.getB();
+			} else {
+				cps = ed.getA();
+			}
+
+			cx = borderPos >> 1;
+			cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
+			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
+
+				objectTT.setLocation(cx - model.getScaleDiv2(), cy + controller.getScale());
+				objectTT.setTipText(cps.getName() + ", " + cps.getID());
+
+				on = true;
+			}
+			count++;
+		}
+
+		if (!on) {
+			objectTT.setTipText("");
+			// objectTT.setLocation(-200, -200);
+		}
+
 	}
 
 	/**
 	 * Draws or Deletes an Edge.
 	 */
 	private void drawDeleteEdge() {
-		boolean node = true;
+		boolean node = true; // new node?
 		boolean newEdge = true;
 		boolean onEdge = true;
 		boolean deleteNode = false;
+		boolean outsideCon = !upperNode.getNodes().contains(tempCps); // Connection
+																		// to
+																		// the
+																		// outside
+		boolean found = false;
 		CpsEdge e = null;
 		AbstractCpsObject tempCPS = null;
 
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
+
 			cx = cps.getPosition().x;
 			cy = cps.getPosition().y;
+
 			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
 					&& cps != tempCps) {
+				found = true;
 				node = false;
 				onEdge = false;
 				for (CpsEdge p : tempCps.getConnections()) {
@@ -875,7 +995,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					}
 				}
 				if (!newEdge) {
-					controller.delEdgeUpperNode(e, upperNode);
+					if (outsideCon) {
+						controller.disconnectNodes(e, upperNode);
+					} else {
+						controller.delEdgeUpperNode(e, upperNode);
+					}
 					// Node ohne Edge?
 					if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
 						tempCps = e.getA();
@@ -888,10 +1012,67 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				}
 				if (newEdge) {
 					e = new CpsEdge(cps, tempCps, model.getMaxCapacity());
-					controller.addEdgeUpperNode(e, upperNode);
+					if (outsideCon) {
+						controller.connectNodes(e, upperNode);
+					} else {
+						controller.addEdgeUpperNode(e, upperNode);
+					}
 				}
 			}
 		}
+		if (!found) {
+			int count = 0;
+			for (CpsEdge ed : upperNode.getConnections()) {
+				AbstractCpsObject cps = null;
+				if (ed.getA().equals(upperNode)) {
+					cps = ed.getB();
+				} else {
+					cps = ed.getA();
+				}
+
+				cx = borderPos >> 1;
+				cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
+
+				if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
+						&& cps != tempCps) {
+					outsideCon = true;
+					node = false;
+					onEdge = false;
+					for (CpsEdge p : tempCps.getConnections()) {
+						if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
+							newEdge = false;
+							e = p;
+						}
+					}
+					if (!newEdge) {
+						if (outsideCon) {
+							controller.disconnectNodes(e, upperNode);
+						} else {
+							controller.delEdgeUpperNode(e, upperNode);
+						}
+						// Node ohne Edge?
+						if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
+							tempCps = e.getA();
+							deleteNode = true;
+						}
+						if (e.getB().getClass() == CpsNode.class && e.getB().getConnections().isEmpty()) {
+							tempCPS = e.getB();
+							deleteNode = true;
+						}
+					}
+					if (newEdge) {
+						CpsEdge edge = new CpsEdge(cps, tempCps, model.getMaxCapacity());
+						if (outsideCon) {
+							controller.connectNodes(edge, upperNode);
+						} else {
+							controller.addEdgeUpperNode(edge, upperNode);
+						}
+					}
+				}
+				count++;
+			}
+		}
+
 		// Edge auf eine Edge gezogen?
 		if (onEdge) {
 			CpsEdge p = mousePositionOnEdge(x, y);
@@ -917,14 +1098,19 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				e2 = new CpsEdge(n, k, model.getMaxCapacity());
 
 				controller.delEdgeUpperNode(p, upperNode);
-				controller.addEdgeUpperNode(e, upperNode);
+				if (outsideCon) {
+					controller.connectNodes(e, upperNode);
+				} else {
+					controller.addEdgeUpperNode(e, upperNode);
+				}
+
 				controller.addEdgeUpperNode(e1, upperNode);
 				controller.addEdgeUpperNode(e2, upperNode);
 			}
 		}
 
 		// ins leere Gedragged
-		if (node) {
+		if (node && x > borderPos) {
 			CpsNode n = new CpsNode("Node");
 
 			n.setPosition(x - model.getScaleDiv2(), y - model.getScaleDiv2());
@@ -932,7 +1118,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 			e = new CpsEdge(n, tempCps, model.getMaxCapacity());
 
-			controller.addEdgeUpperNode(e, upperNode);
+			if (outsideCon) {
+				controller.connectNodes(e, upperNode);
+			} else {
+				controller.addEdgeUpperNode(e, upperNode);
+			}
 		}
 
 		// Wenn ein Node ohne Connections da ist