Parcourir la source

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

Teh-Hai Julian Zheng il y a 7 ans
Parent
commit
7c27727aee

+ 11 - 0
src/classes/Constants.java

@@ -0,0 +1,11 @@
+package classes;
+
+public class Constants {
+
+	// Environment Constants
+
+	public static float gravity = 2000f;  // pixels per second
+	public static float restitution = 0.85f;
+	public static float epsilon = 0.000009f;
+
+}

+ 15 - 0
src/classes/CpsEdge.java

@@ -24,6 +24,12 @@ public class CpsEdge {
 	 * repair it is through manual change (setStateEdge)
 	 */
 	boolean isWorking;
+	
+	/*
+	 * Is true when a Connection to an Group Object, is connected inside the Group. 
+	 * Is false when not
+	 */
+	boolean isConnected;
 	// for internal use --> flow of electricity (simulation state)
 	ArrayList<Integer> tags;
 	// for internal use --> flow of electricity (simulation state)
@@ -70,6 +76,7 @@ public class CpsEdge {
 		this.maxCapacity = maxCap;
 		flow = 0;
 		isWorking = true;
+		isConnected = true;
 		pseudoTags = new ArrayList<Integer>();
 	}
 
@@ -260,5 +267,13 @@ public class CpsEdge {
 			}
 		}
 	}
+	
+	public boolean getConnected(){
+		return isConnected;
+	}
+	
+	public void setConnected(boolean state){
+		isConnected = state;
+	}
 
 }

+ 11 - 0
src/classes/CpsUpperNode.java

@@ -113,4 +113,15 @@ public class CpsUpperNode extends AbstractCpsObject {
 		return onlyUpperNodes;
 	}
 
+	public AbstractCpsObject searchObj(int ID) {
+		AbstractCpsObject result = null;
+		for (AbstractCpsObject obj : getNodes()) {
+			if (obj.getID() == ID) {
+				result = obj;
+				break;
+			}
+		}
+		return result;
+	}
+
 }

+ 129 - 0
src/classes/HolonBody.java

@@ -0,0 +1,129 @@
+package classes;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+
+public class HolonBody implements Comparable<HolonBody> {
+
+	public Vector2d velocity;
+	public Vector2d position;
+	private float mass;
+	private float radius;
+	private float angularVel;
+	private float orientation = 45f;
+	private Color color;
+
+	public HolonBody(float x, float y, float radius, float mass, Color color) {
+		this.velocity = new Vector2d(0, 0);
+		this.position = new Vector2d(x, y);
+		this.setMass(mass);
+		this.setRadius(radius);
+		this.color = color;
+	}
+
+	
+	public void draw(Graphics2D g2) {
+
+		g2.setColor(color);
+		g2.fillOval((int) (position.getX() - getRadius()), (int) (position.getY() - getRadius()),
+				(int) (2 * getRadius()), (int) (2 * getRadius()));
+
+	}
+
+	public void setRadius(float radius) {
+		this.radius = radius;
+	}
+
+	public float getRadius() {
+		return radius;
+	}
+
+	public boolean colliding(HolonBody body) {
+		float xd = position.getX() - body.position.getX();
+		float yd = position.getY() - body.position.getY();
+
+		float sumRadius = getRadius() + body.getRadius();
+		float sqrRadius = sumRadius * sumRadius;
+
+		float distSqr = (xd * xd) + (yd * yd);
+
+		if (distSqr <= sqrRadius) {
+			return true;
+		}
+
+		return false;
+
+	}
+
+	public void resolveCollision(HolonBody body) {
+
+		// get the mtd
+		Vector2d delta = (position.subtract(body.position));
+		float r = getRadius() + body.getRadius();
+		float dist2 = delta.dot(delta);
+
+		if (dist2 > r * r)
+			return; // they aren't colliding
+
+		float d = delta.getLength();
+
+		Vector2d mtd;
+		if (d != 0.0f) {
+			// minimum translation distance to push bodies apart after
+			// intersecting
+			mtd = delta.multiply(((getRadius() + body.getRadius()) - d) / d);
+
+		} else {
+			// Special case. Bodies are exactly on top of eachother. Don't want
+			// to divide by zero.
+			d = body.getRadius() + getRadius() - 1.0f;
+			delta = new Vector2d(body.getRadius() + getRadius(), 0.0f);
+
+			mtd = delta.multiply(((getRadius() + body.getRadius()) - d) / d);
+		}
+
+		// resolve intersection
+		float im1 = 1 / getMass(); // inverse mass quantities
+		float im2 = 1 / body.getMass();
+
+		// push-pull them apart
+		position = position.add(mtd.multiply(im1 / (im1 + im2)));
+		body.position = body.position.subtract(mtd.multiply(im2 / (im1 + im2)));
+
+		// impact speed
+		Vector2d v = (this.velocity.subtract(body.velocity));
+		float vn = v.dot(mtd.normalize());
+
+		// sphere intersecting but moving away from each other already
+		if (vn > 0.0f)
+			return;
+
+		// collision impulse
+		float i = (-(1.0f + Constants.restitution) * vn) / (im1 + im2);
+		Vector2d impulse = mtd.multiply(i);
+
+		// change in momentum
+		this.velocity = this.velocity.add(impulse.multiply(im1));
+		body.velocity = body.velocity.subtract(impulse.multiply(im2));
+
+	}
+
+	private void setMass(float mass) {
+		this.mass = mass;
+	}
+
+	private float getMass() {
+		return mass;
+	}
+
+	public int compareTo(HolonBody body) {
+		if (this.position.getX() - this.getRadius() > body.position.getX() - body.getRadius()) {
+			return 1;
+		} else if (this.position.getX() - this.getRadius() < body.position.getX() - body.getRadius()) {
+			return -1;
+		} else {
+			return 0;
+		}
+	}
+
+}

+ 1 - 1
src/classes/HolonElement.java

@@ -65,7 +65,7 @@ public class HolonElement {
 	 * @param element
 	 *            element to copy
 	 */
-	public HolonElement(HolonElement element) {
+	public HolonElement(HolonElement element)	 {
 		setEleName(element.getEleName());
 		setAmount(element.getAmount());
 		setEnergy(element.getEnergy());

+ 7 - 1
src/classes/HolonObject.java

@@ -31,8 +31,14 @@ public class HolonObject extends AbstractCpsObject {
 	/* Array for tracking Consumption */
 	private float[] trackingCons;
 	/*
-	 * 0 = no energy, 1 = not supplied, 2 = supplied, 3 producer
+	 * 0 = no energy, 1 = not supplied, 2 = supplied, 3 producer, 4 Partially Supplied
 	 */
+	public final static int NO_ENERGY = 0;
+	public final static int NOT_SUPPLIED = 1;
+	public final static int SUPPLIED = 2;
+	public final static int PRODUCER = 3;
+	public final static int PARTIALLY_SUPPLIED = 4;
+	
 	private int state = 0;
 
 	/**

+ 15 - 1
src/classes/SubNet.java

@@ -12,7 +12,7 @@ public class SubNet {
 	private ArrayList<HolonObject> subNetObjects;
 	private ArrayList<CpsEdge> subNetEdges;
 	private ArrayList<HolonSwitch> subNetSwitches;
-
+	private Position pos;
 	/**
 	 * Constructor for a Subnet.
 	 * 
@@ -54,4 +54,18 @@ public class SubNet {
 	public ArrayList<HolonSwitch> getSwitches() {
 		return subNetSwitches;
 	}
+
+
+	public Position getPos() {
+		return pos;
+	}
+
+	public void setPos(Position pos) {
+		this.pos = pos;
+	}
+	
+	public void setPos(int x, int y){
+		this.pos.x = x;
+		this.pos.y = y;
+	}
 }

+ 7 - 0
src/classes/TrackedDataSet.java

@@ -9,6 +9,13 @@ public class TrackedDataSet {
 	public static final int PRODUCTION = 1;
 	public static final int ACTIVATED_ELEMENTS = 2;
 	public static final int ON_OFF = 3;
+	public static final int TOTAL_PRODUCTION = 4;
+	public static final int TOTAL_CONSUMPTION = 5;
+	public static final int PERCENT_SUPPLIED = 6;
+	public static final int PERCENT_NOT_SUPPLIED = 7;
+	public static final int PERCENT_PARTIAL_SUPPLIED = 8;
+	public static final int GRID_PRODUCTION = 9;
+	public static final int GRID_CONSUMPTION = 10;
 	
 	//Variables of the Data Set
 	private AbstractCpsObject cps;

+ 108 - 0
src/classes/Vector2d.java

@@ -0,0 +1,108 @@
+package classes;
+
+public class Vector2d {
+
+	private float x;
+	private float y;
+
+	public Vector2d()
+	{
+		this.setX(0);
+		this.setY(0);
+	}
+
+	public Vector2d(float x, float y)
+	{
+		this.setX(x);
+		this.setY(y);
+	}
+
+	public void setX(float x) {
+		this.x = x;
+	}
+
+	public float getX() {
+		return x;
+	}
+
+	public void setY(float y) {
+		this.y = y;
+	}
+
+	public float getY() {
+		return y;
+	}
+
+	public void set(float x, float y)
+	{
+		this.setX(x);
+		this.setY(y);
+	}
+
+
+	public float dot(Vector2d v2)
+	{
+		float result = 0.0f;
+		result = this.getX() * v2.getX() + this.getY() * v2.getY();
+		return result;
+	}
+
+	public float getLength()
+	{
+		return (float)Math.sqrt(getX()*getX() + getY()*getY());
+	}
+
+	public float getDistance(Vector2d v2)
+	{
+		return (float) Math.sqrt((v2.getX() - getX()) * (v2.getX() - getX()) + (v2.getY() - getY()) * (v2.getY() - getY()));
+	}
+
+
+	public Vector2d add(Vector2d v2)
+	{
+		Vector2d result = new Vector2d();
+		result.setX(getX() + v2.getX());
+		result.setY(getY() + v2.getY());
+		return result;
+	}
+
+	public Vector2d subtract(Vector2d v2)
+	{
+		Vector2d result = new Vector2d();
+		result.setX(this.getX() - v2.getX());
+		result.setY(this.getY() - v2.getY());
+		return result;
+	}
+
+	public Vector2d multiply(float scaleFactor)
+	{
+		Vector2d result = new Vector2d();
+		result.setX(this.getX() * scaleFactor);
+		result.setY(this.getY() * scaleFactor);
+		return result;
+	}
+
+	public Vector2d normalize()
+	{
+		float len = getLength();
+		if (len != 0.0f)
+		{
+			this.setX(this.getX() / len);
+			this.setY(this.getY() / len);
+		}
+		else
+		{
+			this.setX(0.0f);
+			this.setY(0.0f);
+		}
+
+		return this;
+	}
+
+	public String toString()
+	{
+		return "X: " + getX() + " Y: " + getY();
+	}
+
+
+}

+ 3 - 2
src/interfaces/GraphListener.java

@@ -2,12 +2,13 @@ package interfaces;
 
 import java.util.ArrayList;
 
-import classes.HolonObject;
+import classes.AbstractCpsObject;
 
 public interface GraphListener {
 	
 	public void repaintTree();
 	
-	public void addTrackedObject(ArrayList<HolonObject> hlList);
+	public void addTrackedObject(ArrayList<AbstractCpsObject> hlList);
+	
 
 }

+ 29 - 11
src/ui/controller/Control.java

@@ -15,6 +15,7 @@ import classes.CpsUpperNode;
 import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
+import classes.HolonSwitch;
 import interfaces.CategoryListener;
 import ui.model.Model;
 import ui.view.MyCanvas;
@@ -109,7 +110,7 @@ public class Control {
 	public AbstractCpsObject searchByID(int id) {
 		return multiPurposeController.searchByID(id);
 	}
-	
+
 	/**
 	 * Search for Object by ID in upperNode
 	 * 
@@ -721,28 +722,26 @@ public class Control {
 		}
 	}
 
-	/**
-	 * Set Tracking Objects
-	 */
-	public void setTrackingObj(ArrayList<HolonObject> objArr) {
+	// ========================= MANAGING TRACKED OBJECTS ====================
+
+	public void setTrackingObj(ArrayList<AbstractCpsObject> objArr) {
 		statsController.setTrackingObj(objArr);
 	}
 
-	/**
-	 * Get Tracking Objects
-	 */
-	public ArrayList<HolonObject> getTrackingObj() {
+	public ArrayList<AbstractCpsObject> getTrackingObj() {
 		return statsController.getTrackingObj();
 	}
 
-	public void addTrackingObj(HolonObject obj) {
+	public void addTrackingObj(AbstractCpsObject obj) {
 		statsController.addTrackingObj(obj);
 	}
 
-	public void removeTrackingObj(HolonObject obj) {
+	public void removeTrackingObj(AbstractCpsObject obj) {
 		statsController.removeTrackingObj(obj);
 	}
 
+	// ========================== MANAGING TRACKED OBJECTS END ================
+
 	/**
 	 * Controlling Nodes of Nodes
 	 */
@@ -778,4 +777,23 @@ public class Control {
 	public void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
 		nodeController.disconnectNodes(edge, upperNode);
 	}
+
+	/**
+	 * Get the number of HolonObjects in the given List
+	 * 
+	 * @param list
+	 */
+	public int getNumberHolonObjects(ArrayList<AbstractCpsObject> list) {
+		return objectController.getNumberHolonObjects(list);
+	}
+	
+	/**
+	 * Get the number of HolonObjects with the given state in the given List
+	 * 
+	 * @param list
+	 * @param state
+	 */
+	public int getNumberStateObjects(ArrayList<AbstractCpsObject> list, int state) {
+		return objectController.getNumberStateObjects(list, state);
+	}
 }

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

@@ -8,7 +8,6 @@ import classes.AbstractCpsObject;
 import classes.CpsEdge;
 import classes.CpsUpperNode;
 import classes.Position;
-import javafx.collections.ListChangeListener;
 import ui.model.Model;
 import ui.view.UpperNodeCanvas;
 

+ 48 - 2
src/ui/controller/ObjectController.java

@@ -3,6 +3,7 @@ package ui.controller;
 import java.util.ArrayList;
 
 import classes.Category;
+import classes.CpsUpperNode;
 import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
@@ -86,7 +87,11 @@ public class ObjectController {
 	 */
 	public void addNewElementIntoCanvasObject(int id, String element, int amount, float energy) {
 		HolonElement ele = new HolonElement(element, amount, energy);
-		addElementIntoCanvasObject((HolonObject) mpC.searchByID(id), ele);
+		if ((HolonObject) mpC.searchByID(id) == null) {
+			addElementIntoCanvasObject((HolonObject) model.getSelectedCpsObjects().get(0), ele);
+		} else {
+			addElementIntoCanvasObject((HolonObject) mpC.searchByID(id), ele);
+		}
 	}
 
 	/**
@@ -172,9 +177,11 @@ public class ObjectController {
 	 */
 	public void deleteElementInCanvas(int id, int eleid) {
 		HolonObject object = (HolonObject) mpC.searchByID(id);
+		if (object == null) {
+			object = (HolonObject) model.getSelectedCpsObjects().get(0);
+		}
 		HolonElement element = mpC.searchEleById(object, eleid);
 		// mpC.searchEle(object, ele);
-		System.out.println(object.getName() + " and " + element.getEleName());
 		deleteElement(object, element);
 	}
 
@@ -215,4 +222,43 @@ public class ObjectController {
 	public void setClipboardObjects(ArrayList<AbstractCpsObject> list) {
 		model.setClipboradObjects(list);
 	}
+
+	/**
+	 * Get the number of HolonObjects in the given List
+	 * 
+	 * @param list
+	 */
+	public int getNumberHolonObjects(ArrayList<AbstractCpsObject> list) {
+		int val = 0;
+
+		for (AbstractCpsObject obj : list) {
+			if (obj instanceof HolonObject) {
+				val++;
+			} else if (obj instanceof CpsUpperNode) {
+				val += getNumberHolonObjects(((CpsUpperNode) obj).getNodes());
+			}
+		}
+		return val;
+	}
+
+	/**
+	 * Get the number of HolonObjects with the given state in the given List
+	 * 
+	 * @param list
+	 * @param state
+	 */
+	public int getNumberStateObjects(ArrayList<AbstractCpsObject> list, int state) {
+		int val = 0;
+
+		for (AbstractCpsObject obj : list) {
+			if (obj instanceof HolonObject) {
+				if (((HolonObject) obj).getState() == state || (state == 2 && ((HolonObject) obj).getState() == 3)) {
+					val++;
+				}
+			} else if (obj instanceof CpsUpperNode) {
+				val += getNumberStateObjects(((CpsUpperNode) obj).getNodes(), state);
+			}
+		}
+		return val;
+	}
 }

+ 7 - 5
src/ui/controller/StatsController.java

@@ -2,8 +2,10 @@ package ui.controller;
 
 import java.util.ArrayList;
 
+import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
+import classes.HolonSwitch;
 import ui.model.Model;
 
 public class StatsController {
@@ -15,21 +17,21 @@ public class StatsController {
 
 	}
 
-	public void setTrackingObj(ArrayList<HolonObject> objArr) {
+	public void setTrackingObj(ArrayList<AbstractCpsObject> objArr) {
 		model.setTrackingObj(objArr);
 	}
 
-	public ArrayList<HolonObject> getTrackingObj() {
+	public ArrayList<AbstractCpsObject> getTrackingObj() {
 		return model.getTrackingObj();
 	}
 
-	public void addTrackingObj(HolonObject obj) {
+	public void addTrackingObj(AbstractCpsObject obj) {
 		model.getTrackingObj().add(obj);
 		model.addObjectsToGraphListeners();
 	}
 
-	public void removeTrackingObj(HolonObject obj) {
-		ArrayList<HolonObject> objArr = model.getTrackingObj();
+	public void removeTrackingObj(AbstractCpsObject obj) {
+		ArrayList<AbstractCpsObject> objArr = model.getTrackingObj();
 		objArr.remove(obj);
 		model.setTrackingObj(objArr);
 		model.addObjectsToGraphListeners();

+ 22 - 8
src/ui/controller/UpdateController.java

@@ -85,7 +85,6 @@ public class UpdateController {
 	public void refreshTableHolonElement(PropertyTable multiTable, PropertyTable singleTable) {
 		// Update of the Information about the HolonElements - only for
 		// HolonObjects
-
 		if (model.getSelectedCpsObjects().size() > 1) {
 			deleteRows(multiTable);
 			fillElementTable(model.getSelectedCpsObjects(), multiTable);
@@ -160,7 +159,9 @@ public class UpdateController {
 			if (obj == null) {
 				String tempStringObj = tables.get(1).getValueAt(yTemp, 0).toString();
 				int idTempObj = Integer.parseInt(tempStringObj.split(", ")[1]);
-				obtTemp = (HolonObject) controller.searchByID(idTempObj);
+				if (model.getSelectedCpsObjects() != null) {
+					obtTemp = (HolonObject) getHolonObjSelected(idTempObj);
+				}
 				id = Integer.parseInt(tables.get(1).getValueAt(yTemp, 1).toString());
 				ArrayList<HolonElement> eleTemp = new ArrayList<HolonElement>();
 				if (model.getEleToDelete().containsKey(idTempObj) && toMultiHash == 2) {
@@ -201,12 +202,17 @@ public class UpdateController {
 	 * @return selected CpsObject
 	 */
 	public AbstractCpsObject getActualCps() {
-		int tempID = model.getSelectedObjectID();
-		System.out.println(model.getSelectedObjectID());
-		AbstractCpsObject tempCps = controller.searchByID(tempID);
+		AbstractCpsObject tempCps = null;
+		if (model.getSelectedCpsObjects().size() == 1) {
+			tempCps = model.getSelectedCpsObjects().get(0);
+		} else {
+			int tempID = model.getSelectedObjectID();
+			// System.out.println(model.getSelectedObjectID());
+			tempCps = controller.searchByID(tempID);
+		}
 		return tempCps;
 	}
-	
+
 	/**
 	 * Getter for selected CpsObject.
 	 * 
@@ -217,8 +223,6 @@ public class UpdateController {
 		AbstractCpsObject tempCps = controller.searchByIDUpperNode(tempID, canvas.upperNode);
 		return tempCps;
 	}
-	
-	
 
 	public void paintProperties(AbstractCpsObject obj) {
 		if (obj != null) {
@@ -336,4 +340,14 @@ public class UpdateController {
 		}
 	}
 
+	public AbstractCpsObject getHolonObjSelected(int id) {
+		AbstractCpsObject obj = null;
+		for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
+			if (o.getID() == id) {
+				obj = o;
+			}
+		}
+		return obj;
+	}
+
 }

+ 9 - 8
src/ui/model/Model.java

@@ -14,6 +14,7 @@ import classes.CpsEdge;
 import classes.AbstractCpsObject;
 import classes.HolonElement;
 import classes.HolonObject;
+import classes.HolonSwitch;
 import interfaces.CategoryListener;
 import interfaces.GraphListener;
 import interfaces.ObjectListener;
@@ -72,10 +73,10 @@ public class Model {
 	private ArrayList<Category> categories;
 
 	/*
-	 * Array of all HolonObj, that should be tracked through out the statistics
+	 * Array of all HolonObj and HolonSwitches, that should be tracked through out the statistics
 	 * tab
 	 */
-	private ArrayList<HolonObject> trackingObj;
+	private ArrayList<AbstractCpsObject> trackedObjects;
 
 	/*
 	 * Array of all CpsObjects in our canvas. It is set by default as an empty
@@ -121,7 +122,7 @@ public class Model {
 		setCgIdx(new HashMap<String, Integer>());
 		setCvsObjIdx(new HashMap<Integer, Integer>());
 		setClipboradObjects(new ArrayList<AbstractCpsObject>());
-		setTrackingObj(new ArrayList<HolonObject>());
+		setTrackingObj(new ArrayList<AbstractCpsObject>());
 		setEleToDelete(new HashMap<Integer, ArrayList<HolonElement>>());
 		setSingleTable(new PropertyTable());
 		setMultiTable(new PropertyTable());
@@ -668,12 +669,12 @@ public class Model {
 		return this.subNetColors;
 	}
 
-	public void setTrackingObj(ArrayList<HolonObject> toTrack) {
-		trackingObj = toTrack;
+	public void setTrackingObj(ArrayList<AbstractCpsObject> toTrack) {
+		trackedObjects = toTrack;
 	}
 
-	public ArrayList<HolonObject> getTrackingObj() {
-		return trackingObj;
+	public ArrayList<AbstractCpsObject> getTrackingObj() {
+		return trackedObjects;
 	}
 
 	public void addGraphListener(GraphListener gl) {
@@ -706,7 +707,7 @@ public class Model {
 
 	public void addObjectsToGraphListeners() {
 		for (GraphListener gl : graphListeners) {
-			gl.addTrackedObject(trackingObj);
+			gl.addTrackedObject(trackedObjects);
 			gl.repaintTree();
 		}
 	}

+ 34 - 8
src/ui/view/GUI.java

@@ -118,7 +118,7 @@ public class GUI<E> implements CategoryListener {
 
 	private final JScrollPane canvasSP = new JScrollPane();
 	private final JScrollPane scrollPane1 = new JScrollPane();
-	private final JScrollPane holonSP = new JScrollPane();
+	// private final JScrollPane holonSP = new JScrollPane();
 	private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
 	private final JPanel panelTapped_SimMenu = new JPanel();
 	private JPopupMenu popmenuEdit = new JPopupMenu();
@@ -392,6 +392,7 @@ public class GUI<E> implements CategoryListener {
 
 			@Override
 			public void actionPerformed(ActionEvent e) {
+
 				model.getSelectedCpsObjects().clear();
 				// Uppernode Canvas?
 				if (((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
@@ -449,6 +450,16 @@ public class GUI<E> implements CategoryListener {
 						.getComponent(0) instanceof MyCanvas) {
 					for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
 						controller.delCanvasObject(cps);
+						// Remove UpperNodeTab if UpperNode deleted
+						if (cps instanceof CpsUpperNode) {
+							for (int i = 3; i < tabbedPane.getTabCount(); i++) {
+								if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
+										.getComponent(0)).upperNode.getID() == cps.getID()) {
+									tabbedPane.remove(i);
+									i = tabbedPane.getTabCount();
+								}
+							}
+						}
 					}
 					canvas.repaint();
 				}
@@ -717,6 +728,7 @@ public class GUI<E> implements CategoryListener {
 			public void actionPerformed(ActionEvent arg0) {
 				if (model.getSelectedCpsObjects().size() == 1) {
 					AbstractCpsObject tempCpsObject = updCon.getActualCps();
+					System.out.println(tempCpsObject.getName());
 					if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
 							&& tempCpsObject.getID() != 0) {
 						addElementPopUp = new AddElementPopUp();
@@ -766,6 +778,7 @@ public class GUI<E> implements CategoryListener {
 					model.getEleToDelete().clear();
 					selectedElements.clear();
 				}
+				updCon.refreshTableProperties(model.getPropertyTable());
 				elementGraph.setText("None ");
 				holonEleNamesDisplayed = "None ";
 			}
@@ -776,8 +789,11 @@ public class GUI<E> implements CategoryListener {
 		 */
 		model.getTableHolonElement().addMouseListener(new MouseAdapter() {
 			public void mousePressed(MouseEvent e) {
-				HolonObject obj = (HolonObject) updCon.getActualCps();
-				System.out.println(obj);
+				HolonObject obj = null;
+				if (model.getSelectedCpsObjects().size() == 1
+						&& model.getSelectedCpsObjects().get(0) instanceof HolonObject) {
+					obj = (HolonObject) updCon.getActualCps();
+				}
 				yValueElements = e.getY();
 				HolonElement ele = null;
 				// Search for current clicked HolonElement
@@ -1283,6 +1299,10 @@ public class GUI<E> implements CategoryListener {
 						controller.addSelectedObject(temp);
 					}
 				}
+				if (temp instanceof HolonSwitch) {
+					unitGraph.repaintWithNewSwitch((HolonSwitch) temp);
+					unitGraph.fillArrayofBooleans();
+				}
 				// Write new data in the PropertyTable
 				updCon.paintProperties(temp);
 				// New Tab with NodeOfNode
@@ -1579,7 +1599,7 @@ public class GUI<E> implements CategoryListener {
 		splitPaneCanvasConsole.setLeftComponent(panelTapped_SimMenu);
 		tabbedPane.addTab("View", canvasSP);
 		tabbedPane.addTab("Statistics", statScrollPane);
-		tabbedPane.addTab("Holon", holonSP);
+		tabbedPane.addTab("Holon", holonCanvas);
 
 		splitPaneCanvasConsole.setRightComponent(console);
 		splitPane1.setLeftComponent(splitPaneCanvasConsole);
@@ -1594,7 +1614,7 @@ public class GUI<E> implements CategoryListener {
 		splitGraphHolonEl.setTopComponent(scrollGraph);
 		splitGraphHolonEl.setBottomComponent(scrollElements);
 		canvasSP.setViewportView(canvas);
-		holonSP.setViewportView(holonCanvas);
+		// holonSP.setViewportView(holonCanvas);
 		panelTapped_SimMenu.setLayout(new BorderLayout());
 		panelTapped_SimMenu.add(simMenu, BorderLayout.NORTH);
 		panelTapped_SimMenu.add(tabbedPane);
@@ -1612,7 +1632,7 @@ public class GUI<E> implements CategoryListener {
 		splitGraphHolonEl.setBorder(null);
 		panelHolonEl.setBorder(null);
 		canvasSP.setBorder(null);
-		holonSP.setBorder(null);
+		// holonSP.setBorder(null);
 
 		tableHolonElementScrollPane.setBorder(null);
 
@@ -1877,12 +1897,18 @@ public class GUI<E> implements CategoryListener {
 			unc.addMouseListener(new MouseAdapter() {
 				@Override
 				public void mousePressed(MouseEvent e) {
+					unitGraph.empty();
+					holonEleNamesDisplayed = "None ";
+					elementGraph.setText(holonEleNamesDisplayed);
 					temp = ((UpperNodeCanvas) ((JScrollPane) tabbedPane.getSelectedComponent()).getViewport()
 							.getComponent(0)).tempCps;
-					if (doubleClick()&& MouseEvent.BUTTON3 != e.getButton() && temp instanceof CpsUpperNode) {
+					if (doubleClick() && MouseEvent.BUTTON3 != e.getButton() && temp instanceof CpsUpperNode) {
 						openNewUpperNodeTab();
 					}
-					// updCon.refreshTableProperties(table);
+					if (temp instanceof HolonSwitch) {
+						unitGraph.repaintWithNewSwitch((HolonSwitch) temp);
+						unitGraph.fillArrayofBooleans();
+					}
 				}
 			});
 

+ 194 - 65
src/ui/view/HolonCanvas.java

@@ -1,65 +1,194 @@
-/**
- * 
- */
-package ui.view;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.RenderingHints;
-
-import javax.swing.ImageIcon;
-import javax.swing.JPanel;
-
-import classes.HolonObject;
-import classes.SubNet;
-import ui.controller.Control;
-import ui.model.Model;
-
-/**
- * This class shows the holon view
- * 
- * @author Gruppe14
- *
- */
-public class HolonCanvas extends JPanel {
-	private static final long serialVersionUID = 1L;
-	// edge Object Start Point
-	private Model model;
-	private final Control controller;
-	Graphics2D g2; // For Painting
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param mod
-	 *            the Model
-	 * @param control
-	 *            the Controller
-	 */
-	public HolonCanvas(Model mod, Control control) {
-		this.controller = control;
-		this.model = mod;
-	}
-
-	public void paintComponent(Graphics g) {
-		super.paintComponent(g);
-		// Rendering
-		g2 = (Graphics2D) g;
-		RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-		g2.setRenderingHints(rh);
-
-		int i = 0;
-		int k = 0;
-		// Objects
-		for (SubNet s : controller.getSimManager().getSubNets()) {
-			// draw image
-			g2.setColor(model.getSubNetColors().get(k));
-			g2.fillOval(10 + i, 10 + i, controller.getScale() * s.getObjects().size() / 4,
-					controller.getScale() * s.getObjects().size() / 4);
-			k += 1;
-			i += 20;
-		}
-	}
-}
+package ui.view;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.util.ArrayList;
+
+import javax.swing.JPanel;
+
+import classes.Constants;
+import classes.HolonBody;
+import classes.SubNet;
+import ui.controller.Control;
+import ui.model.Model;
+
+public class HolonCanvas extends JPanel {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	// Rendering
+	private Graphics2D g2;
+
+	// Ball objects
+	private ArrayList<HolonBody> bodies = new ArrayList<>();
+	private HolonBody currentBall;
+	private int subCount;
+
+	// Frames
+	private int currentFrameRate;
+
+	long previousTime = System.currentTimeMillis();
+	long currentTime = previousTime;
+	long elapsedTime;
+	long totalElapsedTime = 0;
+	int frameCount = 0;
+	private Dimension center;
+	private ArrayList<SubNet> subnets;
+
+	private Control controller;
+	private Model model;
+
+	public HolonCanvas(Model mod, Control control) {
+		// Wire up Events
+		this.controller = control;
+		this.model = mod;
+		subnets = controller.getSimManager().getSubNets();
+		subCount = subnets.size();
+		previousTime = System.currentTimeMillis();
+		currentTime = previousTime;
+		totalElapsedTime = 0;
+		frameCount = 0;
+	}
+
+	// Start Render and Update Threads
+
+	public void paintComponent(Graphics g) {
+		super.paintComponent(g);
+
+		if (!controller.getSimManager().getSubNets().equals(subnets)) {
+			subnets = controller.getSimManager().getSubNets();
+			subCount = subnets.size();
+			bodies = new ArrayList<>();
+			createBodies(subCount);
+		}
+
+		currentTime = System.currentTimeMillis();
+		elapsedTime = (currentTime - previousTime); // elapsed time in seconds
+		totalElapsedTime += elapsedTime;
+
+		if (totalElapsedTime > 1000) {
+			currentFrameRate = frameCount;
+			frameCount = 0;
+			totalElapsedTime = 0;
+		}
+
+		updateGame(elapsedTime / 1000f);
+		render(g);
+
+		try {
+			// Thread.sleep(getFpsDelay(maxFrameRate));
+			Thread.sleep(5);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		previousTime = currentTime;
+		frameCount++;
+		repaint();
+	}
+
+	
+	private void createBodies(int subCount) {
+		calcCenter();
+		
+		for(int i = 0; i<subCount; i++){
+			HolonBody temp = new HolonBody(center.width+i, center.height+i, subnets.get(i).getObjects().size()*5+10, subnets.get(i).getObjects().size()*5+10, model.getSubNetColors().get(i));
+			bodies.add(temp);
+		}
+	}
+
+	public void render(Graphics g) {
+		// System.out.printf("Width: %d Height: %d\n", getWidth(), getHeight());
+
+		// Create BufferStrategy for rendering/drawing
+		this.g2 = (Graphics2D) g;
+
+		// Turn on anti-aliasing
+		this.g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+		// Render Background
+		this.g2.setColor(Color.WHITE);
+		this.g2.fillRect(0, 0, getWidth(), getHeight());
+
+		// Render Game Objects
+		for (int i = 0; i < subCount; i++) {
+			bodies.get(i).draw(this.g2);
+		}
+
+		HolonBody tempBall = currentBall;
+		if (tempBall != null)
+			tempBall.draw(this.g2);
+
+	}
+
+	public void updateGame(float elapsedSeconds) {
+
+		// step the position of movable objects based off their velocity/gravity
+		// and elapsedTime
+		calcCenter();
+		for (int i = 0; i < subCount; i++) {
+			bodies.get(i).position.setX((float) (bodies.get(i).position.getX() + (bodies.get(i).velocity.getX() * (elapsedSeconds))
+					- ((bodies.get(i).position.getX() - center.getWidth()) / 50)));
+			bodies.get(i).position.setY((float) (bodies.get(i).position.getY() + (bodies.get(i).velocity.getY() * (elapsedSeconds))
+					- ((bodies.get(i).position.getY() - center.getHeight()) / 50)));
+
+			if (Math.abs(bodies.get(i).velocity.getX()) < Constants.epsilon)
+				bodies.get(i).velocity.setX(0);
+			if (Math.abs(bodies.get(i).velocity.getY()) < Constants.epsilon)
+				bodies.get(i).velocity.setY(0);
+
+		}
+
+		checkCollisions();
+
+	}
+
+	// Insertion sort for Sweep and Prune
+	public void insertionSort(ArrayList<HolonBody> a) {
+		for (int p = 1; p < subCount; p++) {
+			Comparable tmp = a.get(p);
+			int j = p;
+
+			for (; j > 0 && tmp.compareTo(a.get(j - 1)) < 0; j--)
+				a.set(j, a.get(j - 1));
+
+			a.set(j, (HolonBody) tmp);
+		}
+	}
+
+	public void checkCollisions() {
+		insertionSort(bodies);
+
+		for (int i = 0; i < subCount; i++) {		
+			// Ball to Ball collision
+			for (int j = i + 1; j < subCount; j++) {
+				if ((bodies.get(i).position.getX() + bodies.get(i).getRadius()) < (bodies.get(j).position.getX()
+						- bodies.get(j).getRadius()))
+					break;
+
+				if ((bodies.get(i).position.getY() + bodies.get(i).getRadius()) < (bodies.get(j).position.getY()
+						- bodies.get(j).getRadius())
+						|| (bodies.get(j).position.getY() + bodies.get(j).getRadius()) < (bodies.get(i).position.getY()
+								- bodies.get(i).getRadius()))
+					continue;
+
+				bodies.get(i).resolveCollision(bodies.get(j));
+
+			}
+		}
+
+	}
+
+	public void calcCenter() {
+		center = this.getSize();
+		center.height /= 2;
+		center.width /= 2;
+	}
+
+}

+ 44 - 26
src/ui/view/MyCanvas.java

@@ -64,7 +64,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	ArrayList<HolonElement> dataSelected = new ArrayList<HolonElement>();
 	ArrayList<AbstractCpsObject> tempSelected = new ArrayList<AbstractCpsObject>();
 
-	private boolean[] showedInformation = new boolean[3];
+	private boolean[] showedInformation = new boolean[4];
 	private boolean dragging = false; // for dragging
 	private boolean dragged = false; // if an object/objects was/were dragged
 	private boolean drawEdge = false; // for drawing edges
@@ -118,6 +118,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 
 		showedInformation[0] = true;
 		showedInformation[1] = true;
+		showedInformation[2] = false;
 		control.setMaxCapacity(10000);
 
 		popmenu.add(itemCut);
@@ -200,6 +201,15 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				// save old Position
+				JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
+				for (int i = 3; i < tabbedPane.getTabCount(); i++) {
+					if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
+							.getComponent(0)).upperNode.getID() == ((CpsUpperNode) tempCps).getID()) {
+						tabbedPane.remove(i);
+						break;
+					}
+				}
+				
 				savePos = new ArrayList<>();
 				animCps = ((CpsUpperNode) tempCps).getNodes();
 				controller.delUpperNode((CpsUpperNode) tempCps, null);
@@ -250,29 +260,28 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				animT.start();
 			}
 		});
-
+		
+		//adds the selected object(s) to the statistic panel
 		itemTrack.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
-					if (o instanceof HolonObject) {
-						boolean found = false;
-						if (controller.getTrackingObj() != null) {
-							for (HolonObject obj : controller.getTrackingObj()) {
-								if (obj.getID() == o.getID()) {
-									found = true;
-								}
-							}
+					boolean found = false;
+					if (controller.getTrackingObj() != null) {
+						if(controller.getTrackingObj().contains(o)){
+							found = true;
 						}
-						if (!found) {
-							controller.addTrackingObj((HolonObject) o);
+					}
+					if (!found) {
+						controller.addTrackingObj(o);
+						if(o instanceof HolonObject){
 							((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);
 					}
+					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);
 				}
 			}
 		});
@@ -285,9 +294,11 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 					if (o instanceof HolonObject) {
 						boolean found = false;
 						if (controller.getTrackingObj() != null) {
-							for (HolonObject obj : controller.getTrackingObj()) {
-								if (obj.getID() == o.getID()) {
-									found = true;
+							for (AbstractCpsObject obj : controller.getTrackingObj()) {
+								if(obj instanceof HolonObject){
+									if (obj.getID() == o.getID()) {
+										found = true;
+									}
 								}
 							}
 						}
@@ -314,10 +325,11 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				// Remove the selected Object objects
 				for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
 					controller.delCanvasObject(cps);
+					controller.removeTrackingObj(cps);
 					// Remove UpperNodeTab if UpperNode deleted
 					if (cps instanceof CpsUpperNode) {
 						JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
-						for (int i = 2; i < tabbedPane.getTabCount(); i++) {
+						for (int i = 3; i < tabbedPane.getTabCount(); i++) {
 							if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
 									.getComponent(0)).upperNode.getID() == cps.getID()) {
 								tabbedPane.remove(i);
@@ -384,10 +396,11 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				controller.addSubNetColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
 						(int) (Math.random() * 255)));
 			}
-
+			if(showedInformation[2]){
 			for (HolonObject cps : s.getObjects()) {
 				cps.setBorderColor(model.getSubNetColors().get(i));
 			}
+			}
 			i++;
 		}
 
@@ -491,13 +504,14 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		// Objects
 		for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 			// Border Highlighting
+			if(showedInformation[2]){
 			g2.setColor(cps.getBorderColor());
 			if (g2.getColor() != Color.WHITE) {
 				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)));
 			}
-
+			}
 			// node image
 			if (cps instanceof CpsNode && (cps == tempCps || model.getSelectedCpsObject() == cps
 					|| model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps))) {
@@ -663,14 +677,17 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 					itemUngroup.setEnabled(true);
 				else
 					itemUngroup.setEnabled(false);
-
+				/*
 				if (!(tempCps instanceof HolonSwitch)) {
 					itemTrack.setEnabled(true);
 					itemUntrack.setEnabled(true);
 				} else {
-					itemTrack.setEnabled(false);
-					itemUntrack.setEnabled(false);
+				*/
+					itemTrack.setEnabled(true);
+					itemUntrack.setEnabled(true);
+					/*
 				}
+				*/
 				if (model.getSelectedCpsObjects().size() == 0) {
 					controller.addSelectedObject(tempCps);
 				}
@@ -984,9 +1001,10 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	 * @param object
 	 *            boolean for objects
 	 */
-	public void setShowedInformation(boolean connection, boolean object) {
+	public void setShowedInformation(boolean connection, boolean object, boolean border) {
 		showedInformation[0] = connection;
 		showedInformation[1] = object;
+		showedInformation[2] = border;
 	}
 
 	/**

+ 14 - 7
src/ui/view/ShowedInformationPopUp.java

@@ -26,6 +26,7 @@ public class ShowedInformationPopUp extends JDialog {
 	private MyCanvas canvas;
 	private JCheckBox objectEnergyCheckbox;
 	private JCheckBox connectionCheckbox;
+	private JCheckBox colorizedBorderCheckbox;
 
 	/**
 	 * Constructor.
@@ -37,7 +38,7 @@ public class ShowedInformationPopUp extends JDialog {
 		super((java.awt.Frame) null, true);
 		setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
 		this.setTitle(Languages.getLanguage()[31]);
-		setBounds(100, 100, 400, 169);
+		setBounds(100, 100, 400, 220);
 		getContentPane().setLayout(new BorderLayout());
 		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
 		getContentPane().add(contentPanel, BorderLayout.CENTER);
@@ -56,11 +57,12 @@ public class ShowedInformationPopUp extends JDialog {
 		connectionCheckbox.setSelected(canvas.getShowedInformation()[0]);
 		btnOk.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
-				setInformation(connectionCheckbox.isSelected(), objectEnergyCheckbox.isSelected());
+				setInformation(connectionCheckbox.isSelected(), objectEnergyCheckbox.isSelected(),
+						colorizedBorderCheckbox.isSelected());
 				dispose();
 			}
 		});
-		btnOk.setBounds(169, 98, 82, 23);
+		btnOk.setBounds(171, 147, 82, 23);
 		contentPanel.add(btnOk);
 
 		JButton btnCancel = new JButton(Languages.getLanguage()[34]);
@@ -70,20 +72,25 @@ public class ShowedInformationPopUp extends JDialog {
 				dispose();
 			}
 		});
-		btnCancel.setBounds(70, 98, 89, 23);
+		btnCancel.setBounds(72, 147, 89, 23);
 		contentPanel.add(btnCancel);
+		
+		colorizedBorderCheckbox = new JCheckBox("Show colorized Border for Objects");
+		colorizedBorderCheckbox.setBounds(19, 96, 195, 23);
+		contentPanel.add(colorizedBorderCheckbox);
+		colorizedBorderCheckbox.setSelected(canvas.getShowedInformation()[2]);
 	}
 
 	/**
 	 * Set the Information true or false.
 	 * 
 	 * @param connection
-	 *            conecction Information
+	 *            conection Information
 	 * @param object
 	 *            Object Information
 	 */
-	private void setInformation(boolean connection, boolean object) {
-		canvas.setShowedInformation(connection, object);
+	private void setInformation(boolean connection, boolean object, boolean borders) {
+		canvas.setShowedInformation(connection, object, borders);
 		canvas.repaint();
 	}
 }

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

@@ -15,6 +15,8 @@ import javax.swing.ImageIcon;
 import javax.swing.JPanel;
 import javax.swing.Timer;
 
+import classes.AbstractCpsObject;
+import classes.CpsUpperNode;
 import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
@@ -30,7 +32,7 @@ public class StatisticGraph extends JPanel {
 	private static final long serialVersionUID = 1L;
 
 	// Maximum y Value
-	double maximum = 0;
+	float maximum = 0;
 
 	// is the Simulation running?
 	private boolean isSimRunning;
@@ -57,7 +59,7 @@ public class StatisticGraph extends JPanel {
 	public StatisticGraph(final Model model, Control control) {
 		this.controller = control;
 		this.model = model;
-		
+
 		this.setBackground(Color.WHITE);
 	}
 
@@ -105,11 +107,18 @@ public class StatisticGraph extends JPanel {
 				case TrackedDataSet.CONSUMPTION:
 				case TrackedDataSet.PRODUCTION:
 				case TrackedDataSet.ACTIVATED_ELEMENTS:
+				case TrackedDataSet.TOTAL_PRODUCTION:
+				case TrackedDataSet.TOTAL_CONSUMPTION:
 					createPathFloats(set);
 					break;
 				case TrackedDataSet.ON_OFF:
 					createPathBooleans(set);
 					break;
+				case TrackedDataSet.PERCENT_SUPPLIED:
+				case TrackedDataSet.PERCENT_NOT_SUPPLIED:
+				case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+					createPathPercent(set);
+					break;
 				default:
 					break;
 				}
@@ -138,7 +147,7 @@ public class StatisticGraph extends JPanel {
 	 *            the id of the Object to remove
 	 */
 	public void removeObject(int id) {
-			objects.remove(id);
+		objects.remove(id);
 	}
 
 	/**
@@ -174,12 +183,12 @@ public class StatisticGraph extends JPanel {
 	public void calcMaximum() {
 		maximum = 0;
 		for (TrackedDataSet set : objects) {
-			int val = 0;
+			float val = 0;
 			switch (set.getProperty()) {
 			case TrackedDataSet.CONSUMPTION:
 				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
 					if (h.getEnergy() < 0) {
-						val += h.getEnergy()*h.getAmount();
+						val += h.getEnergy() * h.getAmount();
 					}
 				}
 				val *= -1;
@@ -187,7 +196,7 @@ public class StatisticGraph extends JPanel {
 			case TrackedDataSet.PRODUCTION:
 				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
 					if (h.getEnergy() > 0) {
-						val += h.getEnergy()*h.getAmount();
+						val += h.getEnergy() * h.getAmount();
 					}
 				}
 
@@ -200,6 +209,18 @@ public class StatisticGraph extends JPanel {
 			case TrackedDataSet.ON_OFF:
 				val = 1;
 				break;
+			case TrackedDataSet.TOTAL_PRODUCTION:
+				val = getMaxTotalProduction(model.getObjectsOnCanvas());
+				break;
+			case TrackedDataSet.TOTAL_CONSUMPTION:
+				val = getMaxTotalConsumption(model.getObjectsOnCanvas());
+				val *= -1;
+				break;
+			case TrackedDataSet.PERCENT_SUPPLIED:
+			case TrackedDataSet.PERCENT_NOT_SUPPLIED:
+			case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+				val = 1;
+				break;
 			default:
 				break;
 			}
@@ -207,7 +228,7 @@ public class StatisticGraph extends JPanel {
 				maximum = val;
 			}
 		}
-		((StatisticGraphPanel)this.getParent()).setMaximumLabel(maximum);
+		((StatisticGraphPanel) this.getParent()).setMaximumLabel(maximum);
 	}
 
 	/**
@@ -220,7 +241,7 @@ public class StatisticGraph extends JPanel {
 			case TrackedDataSet.CONSUMPTION:
 				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
 					if (h.getEnergy() < 0 && h.getActive()) {
-						val += Math.abs(h.getEnergyAt()[model.getCurIteration()])*h.getAmount();
+						val += Math.abs(h.getEnergyAt()[model.getCurIteration()]) * h.getAmount();
 					}
 					set.setValAt(val, model.getCurIteration());
 				}
@@ -228,7 +249,7 @@ public class StatisticGraph extends JPanel {
 			case TrackedDataSet.PRODUCTION:
 				for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
 					if (h.getEnergy() > 0 && h.getActive()) {
-						val += Math.abs(h.getEnergyAt()[model.getCurIteration()])*h.getAmount();
+						val += Math.abs(h.getEnergyAt()[model.getCurIteration()]) * h.getAmount();
 					}
 					set.setValAt(val, model.getCurIteration());
 				}
@@ -257,6 +278,21 @@ public class StatisticGraph extends JPanel {
 					}
 				}
 				break;
+			case TrackedDataSet.TOTAL_PRODUCTION:
+				set.setValAt(getTotalProductionAt(model.getObjectsOnCanvas(), model.getCurIteration()), model.getCurIteration());
+				break;
+			case TrackedDataSet.TOTAL_CONSUMPTION:
+				set.setValAt(-getTotalConsumptionAt(model.getObjectsOnCanvas(), model.getCurIteration()), model.getCurIteration());
+				break;
+			case TrackedDataSet.PERCENT_SUPPLIED:
+				set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.SUPPLIED), model.getCurIteration());
+				break;
+			case TrackedDataSet.PERCENT_NOT_SUPPLIED:
+				set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.NOT_SUPPLIED), model.getCurIteration());
+				break;
+			case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+				set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.PARTIALLY_SUPPLIED), model.getCurIteration());
+				break;
 			default:
 				break;
 			}
@@ -272,7 +308,7 @@ public class StatisticGraph extends JPanel {
 		boolean init = true;
 		path.moveTo(0, 0);
 		for (int i = 0; i < model.getCurIteration(); i++) {
-			if (init && set.getValues()[i] != -1 ) {
+			if (init && set.getValues()[i] != -1) {
 				path.moveTo(i * this.getWidth() / model.getIterations() - 1, convertToCanvasY(set.getValues()[i]));
 				init = false;
 			}
@@ -311,5 +347,133 @@ public class StatisticGraph extends JPanel {
 			}
 		}
 	}
+	
+	/**
+	 * create Path for percent values
+	 * 
+	 * @param set
+	 */
+	private void createPathPercent(TrackedDataSet set) {
+		boolean init = true;
+		path.moveTo(0, 0);
+		for (int i = 0; i < model.getCurIteration(); i++) {
+			if (init && set.getValues()[i] != -1) {
+				path.moveTo(i * this.getWidth() / model.getIterations() - 1, convertToCanvasY(set.getValues()[i]*maximum));
+				init = false;
+			}
+			if (!init) {
+				if (set.getValues()[i + 1] != -1) {
+					path.lineTo((i + 1) * this.getWidth() / model.getIterations(),
+							convertToCanvasY(set.getValues()[i + 1]*maximum));
+				} else {
+					break;
+				}
+			}
+
+		}
+	}
+	
+	/**
+	 * get the max total production of the given Objects
+	 *
+	 *  @param objects List of Objects
+	 */
+	private float getMaxTotalProduction(ArrayList<AbstractCpsObject> objects) {
+		float val = 0;
+		
+		for (AbstractCpsObject obj: objects) {
+			if (obj instanceof HolonObject) {
+				for (HolonElement ele: ((HolonObject) obj).getElements()) {
+					if (ele.getEnergy() > 0) {
+						val += ele.getEnergy() * ele.getAmount();
+					}
+				}
+			} else if (obj instanceof CpsUpperNode) {
+				val += getMaxTotalProduction(((CpsUpperNode) obj).getNodes());
+			}
+		}
+		return val;
+	}
+	
+	/**
+	 * get the max total consumption of the given Objects
+	 *
+	 *  @param objects List of Objects
+	 */
+	private float getMaxTotalConsumption(ArrayList<AbstractCpsObject> objects) {
+		float val = 0;
+		
+		for (AbstractCpsObject obj: objects) {
+			if (obj instanceof HolonObject) {
+				for (HolonElement ele: ((HolonObject) obj).getElements()) {
+					if (ele.getEnergy() < 0) {
+						val += ele.getEnergy() * ele.getAmount();
+					}
+				}
+			} else if (obj instanceof CpsUpperNode) {
+				val += getMaxTotalConsumption(((CpsUpperNode) obj).getNodes());
+			}
+		}
+		return val;
+	}
+	
+	/**
+	 * get the max total production of the given Objects
+	 *
+	 *  @param objects List of Objects
+	 *  @param tStep
+	 */
+	private float getTotalProductionAt(ArrayList<AbstractCpsObject> objects, int tStep) {
+		float val = 0;
+		
+		for (AbstractCpsObject obj: objects) {
+			if (obj instanceof HolonObject) {
+				for (HolonElement ele: ((HolonObject) obj).getElements()) {
+					if (ele.getEnergyAt()[tStep] > 0 && ele.getActive()) {
+						val += ele.getEnergyAt()[tStep] * ele.getAmount();
+					}
+				}
+			} else if (obj instanceof CpsUpperNode) {
+				val += getTotalProductionAt(((CpsUpperNode) obj).getNodes(), tStep);
+			}
+		}
+		return val;
+	}
+	
+	/**
+	 * get the total consumption of the given Objects at the given timestep
+	 *
+	 *  @param objects List of Objects
+	 *  @param tStep
+	 */
+	private float getTotalConsumptionAt(ArrayList<AbstractCpsObject> objects, int tStep) {
+		float val = 0;
+		
+		for (AbstractCpsObject obj: objects) {
+			if (obj instanceof HolonObject) {
+				for (HolonElement ele: ((HolonObject) obj).getElements()) {
+					if (ele.getEnergyAt()[tStep] < 0 && ele.getActive()) {
+						val += ele.getEnergyAt()[tStep] * ele.getAmount();
+					}
+				}
+			} else if (obj instanceof CpsUpperNode) {
+				val += getTotalConsumptionAt(((CpsUpperNode) obj).getNodes(), tStep);
+			}
+		}
+		return val;
+	}
+	
+	/**
+	 * get the Percentage of how many objects with the given state are in the given List
+	 *
+	 *  @param objects List of Objects
+	 */
+	private float getPercentState(ArrayList<AbstractCpsObject> objects, int state) {
+		float count = controller.getNumberHolonObjects(objects);
+		float stateObjectss= controller.getNumberStateObjects(objects, state);
+		
+		
+		return stateObjectss/count;
+	}
 
 }

+ 22 - 3
src/ui/view/StatisticGraphPanel.java

@@ -102,7 +102,7 @@ public class StatisticGraphPanel extends JPanel {
 					JFileChooser fileChooser = new JFileChooser();
 					if (fileChooser.showSaveDialog(new JFrame()) == JFileChooser.APPROVE_OPTION) {
 						String file = fileChooser.getSelectedFile().getPath();
-						ImageIO.write(img, "jpg", new File(file+".jpg"));
+						ImageIO.write(img, "jpg", new File(file + ".jpg"));
 					}
 				} catch (IOException e1) {
 					// TODO Auto-generated catch block
@@ -168,11 +168,30 @@ public class StatisticGraphPanel extends JPanel {
 		case TrackedDataSet.ON_OFF:
 			property = "on//off";
 			break;
+		case TrackedDataSet.TOTAL_PRODUCTION:
+			property = "total production";
+			break;
+		case TrackedDataSet.TOTAL_CONSUMPTION:
+			property = "total consumption";
+			break;
+		case TrackedDataSet.PERCENT_SUPPLIED:
+			property = "Percentage of supplied";
+			break;
+		case TrackedDataSet.PERCENT_NOT_SUPPLIED:
+			property = "Percentage of not supplied";
+			break;
+		case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+			property = "Percentage of partial supplied";
+			break;
 		default:
 			break;
 		}
-
-		JLabel b = new JLabel(set.getCpsObject().getName() + ": " + property);
+		JLabel b;
+		if (set.getCpsObject() != null) {
+			b = new JLabel(set.getCpsObject().getID() + ", " + set.getCpsObject().getName() + ": " + property);
+		} else {
+			b = new JLabel(property);
+		}
 		b.setBackground(set.getColor());
 		int color = Math.max(Math.max(set.getColor().getRed(), set.getColor().getGreen()), set.getColor().getBlue());
 		if (color <= 128) {

+ 0 - 231
src/ui/view/StatisticPane.java

@@ -1,231 +0,0 @@
-package ui.view;
-
-import javax.swing.DefaultListModel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import javax.swing.GroupLayout;
-import javax.swing.GroupLayout.Alignment;
-import javax.swing.GroupLayout.Group;
-import javax.swing.JLabel;
-import java.awt.Font;
-import javax.swing.JCheckBox;
-import javax.swing.LayoutStyle.ComponentPlacement;
-import java.awt.Color;
-import javax.swing.SwingConstants;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-
-import classes.HolonObject;
-import interfaces.GraphListener;
-import ui.controller.Control;
-import ui.model.Model;
-
-import javax.swing.JComboBox;
-import javax.swing.JButton;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.awt.event.ActionEvent;
-
-public class StatisticPane extends JPanel implements GraphListener{
-	private JScrollPane listScrollPane = new JScrollPane();
-    private JList objectList;
-    private DefaultListModel listModel =  new DefaultListModel();
-    private Model model;
-    private Control controller;
-    //private StatisticGraph statGraph1;
-    private JPanel statGraph1;
-    //private StatisticGraph statGraph2;
-    private JPanel statGraph2;
-    private HashMap<String, HolonObject> objectHashMap = new HashMap<String, HolonObject>();
-    private JLabel nameThreshHolder;
-    private GroupLayout groupLayout;
-    
-    
-    public StatisticPane(Model m, Control c){
-    	model = m;
-    	controller = c;
-    	objectList = new JList(listModel);
-    	listScrollPane.setViewportView(objectList);
-    	
-    	JLabel lblOverallStatistics = new JLabel("Overall Statistics:");
-    	lblOverallStatistics.setFont(new Font("Tahoma", Font.PLAIN, 13));
-    	
-    	JCheckBox chckbxNewCheckBox = new JCheckBox("total consumption");
-    	chckbxNewCheckBox.setForeground(Color.RED);
-    	
-    	JCheckBox chckbxNewCheckBox_1 = new JCheckBox("total production");
-    	chckbxNewCheckBox_1.setForeground(Color.BLUE);
-    	
-    	JLabel lblObject = new JLabel("Object:");
-    	lblObject.setFont(new Font("Tahoma", Font.PLAIN, 13));
-    	
-    	JLabel lblName = new JLabel("Name:");
-    	
-    	nameThreshHolder = new JLabel("...");
-    	nameThreshHolder.setHorizontalAlignment(SwingConstants.LEFT);
-    	
-    	JCheckBox checkBox = new JCheckBox("total consumption");
-    	checkBox.setForeground(Color.RED);
-    	
-    	JCheckBox checkBox_1 = new JCheckBox("total production");
-    	checkBox_1.setForeground(Color.BLUE);
-    	
-    	//statGraph1 = new StatisticGraph(model, controller);
-    	statGraph1 = new JPanel();
-    	
-    	JButton btnRefresh = new JButton("Refresh Tracked Objects");
-    	btnRefresh.addActionListener(new ActionListener() {
-    		public void actionPerformed(ActionEvent e) {
-    			refreshTrackedList();
-    		}
-    	});
-    	
-    	//statGraph2 = new StatisticGraph(model, controller);
-    	statGraph2 = new JPanel();
-    	
-    	JButton btnUntrack = new JButton("Untrack");
-    	btnUntrack.addActionListener(new ActionListener() {
-    		public void actionPerformed(ActionEvent e) {
-    			controller.getTrackingObj().remove(objectHashMap.get(nameThreshHolder.getText()));
-    			refreshTrackedList();
-    			nameThreshHolder.setText("...");
-    		}
-    	});
-    	
-    	JButton btnAddGraph = new JButton("add Graph");
-    	btnAddGraph.addActionListener(new ActionListener() {
-    		public void actionPerformed(ActionEvent e) {
-    			JPanel tmp = new JPanel();
-    		}
-    	});
-    	
-    	/*
-		Group gr = groupLayout.createParallelGroup();
-		for(int i = 0; i < 4; i++){
-			gr.addComponent(statGraph2, GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE);
-		}
-		*/
-    	groupLayout = new GroupLayout(this);
-    	groupLayout.setHorizontalGroup(
-    		groupLayout.createParallelGroup(Alignment.LEADING)
-    			.addGroup(groupLayout.createSequentialGroup()
-    				.addContainerGap()
-    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE)
-    						.addGap(323))
-    					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    						.addGroup(groupLayout.createSequentialGroup()
-    							.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    								.addGroup(groupLayout.createSequentialGroup()
-    									.addGap(10)
-    									.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    										.addGroup(groupLayout.createSequentialGroup()
-    											.addComponent(lblName)
-    											.addPreferredGap(ComponentPlacement.RELATED)
-    											.addComponent(nameThreshHolder, GroupLayout.PREFERRED_SIZE, 107, GroupLayout.PREFERRED_SIZE))
-    										.addComponent(checkBox, GroupLayout.PREFERRED_SIZE, 111, GroupLayout.PREFERRED_SIZE)
-    										.addComponent(checkBox_1, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE)))
-    								.addComponent(lblOverallStatistics, GroupLayout.PREFERRED_SIZE, 126, GroupLayout.PREFERRED_SIZE)
-    								.addGroup(groupLayout.createSequentialGroup()
-    									.addGap(10)
-    									.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    										.addComponent(chckbxNewCheckBox_1)
-    										.addComponent(chckbxNewCheckBox)))
-    								.addComponent(lblObject, GroupLayout.PREFERRED_SIZE, 56, GroupLayout.PREFERRED_SIZE)
-    								.addGroup(groupLayout.createSequentialGroup()
-    									.addComponent(btnUntrack)
-    									.addGap(18)
-    									.addComponent(btnAddGraph)))
-    							.addGap(125)
-    							.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    								.addComponent(statGraph2, GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)
-    								.addComponent(statGraph1, GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)))
-    						.addGroup(groupLayout.createSequentialGroup()
-    							.addComponent(btnRefresh)
-    							.addContainerGap(349, Short.MAX_VALUE)))))
-    	);
-    	groupLayout.setVerticalGroup(
-    		groupLayout.createParallelGroup(Alignment.LEADING)
-    			.addGroup(groupLayout.createSequentialGroup()
-    				.addGap(17)
-    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addComponent(lblOverallStatistics)
-    						.addPreferredGap(ComponentPlacement.UNRELATED)
-    						.addComponent(chckbxNewCheckBox)
-    						.addPreferredGap(ComponentPlacement.RELATED)
-    						.addComponent(chckbxNewCheckBox_1))
-    					.addComponent(statGraph1, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE))
-    				.addGap(41)
-    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addComponent(lblObject)
-    						.addPreferredGap(ComponentPlacement.UNRELATED)
-    						.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
-    							.addComponent(lblName)
-    							.addComponent(nameThreshHolder))
-    						.addPreferredGap(ComponentPlacement.RELATED)
-    						.addComponent(checkBox)
-    						.addPreferredGap(ComponentPlacement.RELATED)
-    						.addComponent(checkBox_1)
-    						.addPreferredGap(ComponentPlacement.UNRELATED)
-    						.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
-    							.addComponent(btnUntrack)
-    							.addComponent(btnAddGraph))
-    						.addGap(30)
-    						.addComponent(btnRefresh)
-    						.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-    						.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 160, GroupLayout.PREFERRED_SIZE)
-    						.addPreferredGap(ComponentPlacement.RELATED))
-    					.addComponent(statGraph2, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE))
-    				.addContainerGap(89, GroupLayout.PREFERRED_SIZE))
-    	);
-    	setLayout(groupLayout);
-    	
-    	objectList.addListSelectionListener(new ListSelectionListener(){
-    		
-    		@Override
-    		public void valueChanged(ListSelectionEvent arg0){
-    			if(objectList.getSelectedValue() != null){
-    			nameThreshHolder.setText(objectList.getSelectedValue().toString());
-    			}
-    		}
-    	});
-
-    }
-    
-    public void refreshTrackedList(){
-		listModel.removeAllElements();
-		objectHashMap.clear();
-		for(int i = 0; i < controller.getTrackingObj().size(); i++){
-			String name = controller.getTrackingObj().get(i).getName() + " " +
-			controller.getTrackingObj().get(i).getID();
-			
-			listModel.addElement(name);
-			objectHashMap.put(name, controller.getTrackingObj().get(i));
-			if(i < 8){
-				//statGraph1.addObject(controller.getTrackingObj().get(i));
-			}
-		}
-    }
-    public void updateGraphs(){
-    	statGraph1.repaint();
-    }
-
-	@Override
-	public void repaintTree() {
-		// TODO Auto-generated method stub
-		statGraph1.repaint();
-	}
-
-	@Override
-	public void addTrackedObject(ArrayList<HolonObject> hl) {
-		// TODO Auto-generated method stub
-		
-	}
-}

+ 11 - 10
src/ui/view/UpperNodeCanvas.java

@@ -171,9 +171,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					if (o instanceof HolonObject) {
 						boolean found = false;
 						if (controller.getTrackingObj() != null) {
-							for (HolonObject obj : controller.getTrackingObj()) {
-								if (obj.getID() == o.getID()) {
-									found = true;
+							for (AbstractCpsObject obj : controller.getTrackingObj()) {
+								if(obj instanceof HolonObject){
+									if (obj.getID() == o.getID()) {
+										found = true;
+									}	
 								}
 							}
 						}
@@ -198,9 +200,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					if (o instanceof HolonObject) {
 						boolean found = false;
 						if (controller.getTrackingObj() != null) {
-							for (HolonObject obj : controller.getTrackingObj()) {
-								if (obj.getID() == o.getID()) {
-									found = true;
+							for (AbstractCpsObject obj : controller.getTrackingObj()) {
+								if(obj instanceof HolonObject){
+									if (obj.getID() == o.getID()) {
+										found = true;
+									}
 								}
 							}
 						}
@@ -584,7 +588,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 	@Override
 	public void mouseClicked(MouseEvent e) {
-
+		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
 	}
 
 	@Override
@@ -711,9 +715,6 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	@Override
 	public void mouseReleased(MouseEvent e) {
 		dragging = false;
-		// updCon.refreshTableHolonElement(model.getMultiTable(),
-		// model.getSingleTable());
-		// updCon.refreshTableProperties(model.getPropertyTable());
 		if (model.getSelectedCpsObjects().size() > 1) {
 			model.getTableHolonElement().setModel(model.getMultiTable());
 		} else if (model.getSelectedCpsObjects().size() == 1) {

+ 184 - 41
src/ui/view/splitPane.java

@@ -23,7 +23,10 @@ import javax.swing.tree.TreeNode;
 
 import DataSets.GraphDataSet;
 import DataSets.PropertyDataSet;
+import classes.AbstractCpsObject;
+import classes.CpsUpperNode;
 import classes.HolonObject;
+import classes.HolonSwitch;
 import classes.TrackedDataSet;
 import interfaces.GraphListener;
 import ui.controller.Control;
@@ -54,23 +57,57 @@ import java.awt.BorderLayout;
 
 public class splitPane extends JSplitPane implements GraphListener {
 	// 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;
-
+	public static final int CONS_OBJ_INT = 0;
+	public static final int PROD_OBJ_INT = 1;
+	public static final int ACTIVE_ELEMENTS_INT = 2;
+	public static final int SW_ACTIVE_INT = 3;
+	public static final int PROD_HOLON_INT = 4;
+	public static final int CONS_HOLON_INT = 5;
+	public static final int SUPPLIED_INT = 6;
+	public static final int NOT_SUPPLIED_INT = 7;
+	public static final int PART_SUPPLIED_INT = 8;
+	public static final int GRID_PROD_INT = 9;
+	public static final int GRID_CONS_INT = 10;
+	public static final int NR_SUBNETS_INT = 11;
+	
+	// Property Strings
+	public static final String TOT_PROD_HOLON = "total Holon Production";
+	public static final String TOT_CONS_HOLON = "total Holon Consumption";
+	public static final String SUPPLIED_OBJ = "Percentage of supplied Objects";
+	public static final String NOT_SUPPLIED_OBJ = "Percentage of not supplied Objects";
+	public static final String PART_SUPPLIED_OBJ = "Percentage of partially supplied Objects";
+	public static final String NR_SUBNETS = "number of Subnets";
+	
+	public static final String TOT_PROD_OBJ = "total Production";
+	public static final String TOT_CONS_OBJ = "total Consumption";
+	public static final String NR_ACTIVE_ELEMENTS = "active Elements";
+	
+	public static final String SW_ACTIVE = "active";
+	
+	public static final String TOT_PROD_GRID = "total Grid Production";
+	public static final String TOT_CONS_GRID = "total Grid Consumption";
+	
+	// editable textfields
 	private JTextField graphNrTxtField;
 	private JTextField redField;
 	private JTextField greenField;
 	private JTextField blueField;
+	
+	// Tree Properties
 	private JTree objectTree;
 	private DefaultTreeModel treeModel;
 	private DefaultMutableTreeNode objectsNode;
-	private DefaultMutableTreeNode wholeHolon;
+	private DefaultMutableTreeNode mainGrid;
+	private DefaultMutableTreeNode switchesNode;
+	private DefaultMutableTreeNode gridsNode;
+	
 	private Hashtable<String, GraphDataSet> objectHashtable;
 	private Hashtable<String, StatisticGraphPanel> graphHashtable;
+	private Hashtable<String, PropertyDataSet> holonHashtable;
 	private Hashtable<String, Integer> propValTable;
 	private JPanel colorPanel;
+	
+	//contains information about a selected property
 	private PropertyDataSet currentProperty = new PropertyDataSet();
 	private JComboBox colorComboBox;
 	private Control controller;
@@ -83,10 +120,29 @@ public class splitPane extends JSplitPane implements GraphListener {
 		this.controller = cont;
 		objectHashtable = new Hashtable<String, GraphDataSet>();
 		graphHashtable = new Hashtable<String, StatisticGraphPanel>();
+		
+		holonHashtable = new Hashtable<String, PropertyDataSet>();
+		holonHashtable.put(TOT_PROD_HOLON, new PropertyDataSet());
+		holonHashtable.put(TOT_CONS_HOLON, new PropertyDataSet());
+		holonHashtable.put(SUPPLIED_OBJ, new PropertyDataSet());
+		holonHashtable.put(NOT_SUPPLIED_OBJ, new PropertyDataSet());
+		holonHashtable.put(PART_SUPPLIED_OBJ, new PropertyDataSet());
+		holonHashtable.put(NR_SUBNETS, new PropertyDataSet());
+		
+		//propValTable associates the Strings to the numbers
 		propValTable = new Hashtable<String, Integer>();
-		propValTable.put("total Production", PRODUCTION);
-		propValTable.put("total Consumption", CONSUMPTION);
-		propValTable.put("number of activated Elements", ACTIVATED_ELEMENTS);
+		propValTable.put(TOT_PROD_OBJ, PROD_OBJ_INT);
+		propValTable.put(TOT_CONS_OBJ, CONS_OBJ_INT);
+		propValTable.put(NR_ACTIVE_ELEMENTS, ACTIVE_ELEMENTS_INT);
+		propValTable.put(SW_ACTIVE, SW_ACTIVE_INT);
+		propValTable.put(TOT_PROD_HOLON, PROD_HOLON_INT);
+		propValTable.put(TOT_CONS_HOLON, CONS_HOLON_INT);
+		propValTable.put(SUPPLIED_OBJ, SUPPLIED_INT);
+		propValTable.put(NOT_SUPPLIED_OBJ, NOT_SUPPLIED_INT);
+		propValTable.put(PART_SUPPLIED_OBJ, PART_SUPPLIED_INT);
+		propValTable.put(TOT_PROD_GRID, GRID_PROD_INT);
+		propValTable.put(TOT_CONS_GRID, GRID_CONS_INT);
+		propValTable.put(NR_SUBNETS, NR_SUBNETS_INT);
 
 		JScrollPane dataPane = new JScrollPane();
 		setLeftComponent(dataPane);
@@ -94,6 +150,10 @@ public class splitPane extends JSplitPane implements GraphListener {
 		dataPane.setViewportView(panel);
 
 		JScrollPane treeScrollPane = new JScrollPane();
+		
+		
+		//================= LABLES ON THE LEFT SIDE =================//
+		
 		JLabel lblObject = new JLabel("Object(s):");
 
 		showObjectlbl = new JLabel("...");
@@ -105,7 +165,12 @@ public class splitPane extends JSplitPane implements GraphListener {
 		JLabel lblGraph = new JLabel("Graph:");
 
 		JLabel lblColor = new JLabel("Color:");
-
+		
+		//================= LABLES END ===============================//
+		
+		
+		//================= COLOR COMBOBOX ===========================//
+		
 		colorComboBox = new JComboBox();
 		colorComboBox.addItem("");
 		colorComboBox.addItem("Red");
@@ -174,6 +239,8 @@ public class splitPane extends JSplitPane implements GraphListener {
 			}
 
 		});
+		
+		// ==================== COLORBOX END ==========================//
 
 		// ====================GRAPH NR TEXTFIELD======================//
 		graphNrTxtField = new JTextField();
@@ -363,6 +430,9 @@ public class splitPane extends JSplitPane implements GraphListener {
 		JLabel lblG = new JLabel("G:");
 
 		JLabel lblB = new JLabel("B:");
+		
+		
+		//======================== ADD BUTTON =============================//
 
 		JButton btnAdd = new JButton("Add");
 		btnAdd.addActionListener(new ActionListener() {
@@ -372,7 +442,7 @@ public class splitPane extends JSplitPane implements GraphListener {
 				if (selectedNode == null) {
 					return;
 				} else {
-					if (selectedNode.getLevel() == 3) {
+					if (selectedNode.getLevel() == 3 || (selectedNode.getLevel() == 2 && selectedNode.getParent().toString().equals("Main Grid") )) {
 						StatisticGraphPanel tmp = null;
 						if (graphNrTxtField.getText().length() > 0) {
 							if (!graphHashtable.containsKey(graphNrTxtField.getText())
@@ -391,8 +461,12 @@ public class splitPane extends JSplitPane implements GraphListener {
 							}
 							String object = ((DefaultMutableTreeNode) selectedNode.getParent()).toString();
 							String property = selectedNode.toString();
+							AbstractCpsObject absCps = null;
+							if(!object.equals("Main Grid")){
 							GraphDataSet dataSet = objectHashtable.get(object);
-							TrackedDataSet tds = new TrackedDataSet(dataSet.getObject(), propValTable.get(property),
+							absCps = dataSet.getObject();
+							}
+							TrackedDataSet tds = new TrackedDataSet(absCps, propValTable.get(property),
 									currentProperty.getColor());
 							graphHashtable.get(graphNrTxtField.getText()).addObjec(tds);
 						}
@@ -400,10 +474,16 @@ public class splitPane extends JSplitPane implements GraphListener {
 				}
 			}
 		});
+		
+		//============================== ADD BUTTON END ==============================//
 
 		colorPanel = new JPanel();
 		colorPanel.setBorder(new LineBorder(new Color(0, 0, 0)));
 		colorPanel.setBackground(Color.WHITE);
+		
+		
+		//================== LAYOUT FOR COMPONENTS ON THE LEFT SIDE ==================//
+		
 		GroupLayout gl_panel = new GroupLayout(panel);
 		gl_panel.setHorizontalGroup(gl_panel.createParallelGroup(Alignment.LEADING)
 				.addGroup(gl_panel.createSequentialGroup().addContainerGap().addGroup(gl_panel
@@ -475,24 +555,37 @@ public class splitPane extends JSplitPane implements GraphListener {
 								.addComponent(colorPanel, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
 								.addPreferredGap(ComponentPlacement.RELATED).addComponent(btnAdd)
 								.addContainerGap(35, Short.MAX_VALUE)));
-
+		
+		//======================== LAYOUT END ================================//
+		
+		
+		//======================== TREE STRUCTURE=============================//
+		
 		objectTree = new JTree();
 		treeModel = (DefaultTreeModel) objectTree.getModel();
 		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Statistics");
-		wholeHolon = new DefaultMutableTreeNode("whole Holon");
-		wholeHolon.add(new DefaultMutableTreeNode("total Production"));
-		wholeHolon.add(new DefaultMutableTreeNode("total Consumption"));
-		wholeHolon.add(new DefaultMutableTreeNode("Percentage of Supplied Objects"));
-		wholeHolon.add(new DefaultMutableTreeNode("Percentage of not Supplied Objects"));
-		wholeHolon.add(new DefaultMutableTreeNode("Percentage of partially Supplied Objects"));
+		mainGrid = new DefaultMutableTreeNode("Main Grid");
+		mainGrid.add(new DefaultMutableTreeNode(TOT_PROD_HOLON));
+		mainGrid.add(new DefaultMutableTreeNode(TOT_CONS_HOLON));
+		mainGrid.add(new DefaultMutableTreeNode(SUPPLIED_OBJ));
+		mainGrid.add(new DefaultMutableTreeNode(NOT_SUPPLIED_OBJ));
+		mainGrid.add(new DefaultMutableTreeNode(PART_SUPPLIED_OBJ));
+		mainGrid.add(new DefaultMutableTreeNode(NR_SUBNETS));
 
 		objectsNode = new DefaultMutableTreeNode("Objects");
-		DefaultMutableTreeNode defaultNode = new DefaultMutableTreeNode("empty");
-
-		objectsNode.add(defaultNode);
+		objectsNode.add(new DefaultMutableTreeNode("empty"));
+		
+		switchesNode = new DefaultMutableTreeNode("Switches");
+		switchesNode.add(new DefaultMutableTreeNode("empty"));
+		
+		gridsNode = new DefaultMutableTreeNode("Groups");
+		gridsNode.add(new DefaultMutableTreeNode("empty"));
+		
 		treeModel.setRoot(root);
-		root.add(wholeHolon);
+		root.add(mainGrid);
 		root.add(objectsNode);
+		root.add(switchesNode);
+		root.add(gridsNode);
 		objectTree.setModel(treeModel);
 
 		treeScrollPane.setViewportView(objectTree);
@@ -507,7 +600,7 @@ public class splitPane extends JSplitPane implements GraphListener {
 						.getLastSelectedPathComponent();
 				if (selectedNode.getLevel() == 2 && !selectedNode.getParent().toString().equals("whole Holon")) {
 					String object = selectedNode.toString();
-					controller.removeTrackingObj((HolonObject) objectHashtable.get(object).getObject());
+					controller.removeTrackingObj(objectHashtable.get(object).getObject());
 				}
 			}
 		});
@@ -531,16 +624,29 @@ public class splitPane extends JSplitPane implements GraphListener {
 					if (selectedNode.getLevel() == 1) {
 						disableFields();
 						currentProperty = null;
+						graphNrTxtField.setText("");
 						showObjectlbl.setText(selectedNode.toString());
 					}
 					if (selectedNode.getLevel() == 2) {
-						if (((DefaultMutableTreeNode) selectedNode.getParent()).toString().equals("whole Holon")) {
+						if (((DefaultMutableTreeNode) selectedNode.getParent()).toString().equals("Main Grid")) {
 							enableFields();
-							showPropertylbl.setText(selectedNode.toString());
-							showObjectlbl.setText(selectedNode.getParent().toString());
+							String object = selectedNode.getParent().toString();
+							String property = selectedNode.toString();
+							currentProperty = holonHashtable.get(property);
+							Color color = currentProperty.getColor();
+							
+							redField.setText(Integer.toString(color.getRed()));
+							greenField.setText(Integer.toString(color.getGreen()));
+							blueField.setText(Integer.toString(color.getBlue()));
+							
+							showPropertylbl.setText(property);
+							showObjectlbl.setText(object);
+							graphNrTxtField.setText(currentProperty.getAssignedGraph());
+							colorPanel.setBackground(color);
 						} else {
 							disableFields();
 							currentProperty = null;
+							graphNrTxtField.setText("");
 							showObjectlbl.setText(selectedNode.toString());
 						}
 					}
@@ -563,6 +669,10 @@ public class splitPane extends JSplitPane implements GraphListener {
 			}
 
 		});
+		
+		//========================= TREE STRUCTURE END ============================//
+		
+		
 		panel.setLayout(gl_panel);
 
 		JScrollPane graphScrollPane = new JScrollPane();
@@ -575,34 +685,68 @@ public class splitPane extends JSplitPane implements GraphListener {
 		graphScrollPane.setViewportView(graphPanel);
 		repaintTree();
 	}
+	
+	//=============================== END CONSTRUCTOR ==============================//
 
+	
+	//=============================== METHODS ======================================//
 	@Override
 	public void repaintTree() {
 		treeModel.reload();
 	}
 
 	@Override
-	public void addTrackedObject(ArrayList<HolonObject> hlList) {
+	public void addTrackedObject(ArrayList<AbstractCpsObject> hlList) {
 		objectsNode.removeAllChildren();
+		switchesNode.removeAllChildren();
+		gridsNode.removeAllChildren();
 		objectHashtable.clear();
 		if (hlList.size() > 0 && hlList != null) {
-			for (HolonObject hO : hlList) {
-				Hashtable<String, PropertyDataSet> tmpHash = new Hashtable<String, PropertyDataSet>();
-				String name = hO.getName() + " " + hO.getID();
+			for (AbstractCpsObject abs : hlList) {
+				String name = abs.getName() + " " + abs.getID();
 				DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(name);
-				tmp.add(new DefaultMutableTreeNode("total Production"));
-				tmp.add(new DefaultMutableTreeNode("total Consumption"));
-				tmp.add(new DefaultMutableTreeNode("number of activated Elements"));
-				tmpHash.put("total Production", new PropertyDataSet());
-				tmpHash.put("total Consumption", new PropertyDataSet());
-				tmpHash.put("number of activated Elements", new PropertyDataSet());
-				GraphDataSet gS = new GraphDataSet(hO, tmpHash);
+				Hashtable<String, PropertyDataSet> tmpHash = new Hashtable<String, PropertyDataSet>();
+
+				//HolonObjects
+				if(abs instanceof HolonObject){
+					tmp.add(new DefaultMutableTreeNode(TOT_PROD_OBJ));
+					tmp.add(new DefaultMutableTreeNode(TOT_CONS_OBJ));
+					tmp.add(new DefaultMutableTreeNode(NR_ACTIVE_ELEMENTS));
+					tmpHash.put(TOT_PROD_OBJ, new PropertyDataSet());
+					tmpHash.put(TOT_CONS_OBJ, new PropertyDataSet());
+					tmpHash.put(NR_ACTIVE_ELEMENTS, new PropertyDataSet());
+					objectsNode.add(tmp);
+				}
+				
+				//HolonSwitches
+				if(abs instanceof HolonSwitch){
+					tmp.add(new DefaultMutableTreeNode(SW_ACTIVE));
+					tmpHash.put(SW_ACTIVE, new PropertyDataSet());
+					switchesNode.add(tmp);
+				}
+				
+				//NodesOfNodes
+				if(abs instanceof CpsUpperNode){
+					tmp.add(new DefaultMutableTreeNode(TOT_PROD_GRID));
+					tmp.add(new DefaultMutableTreeNode(TOT_CONS_GRID));
+					tmpHash.put(TOT_PROD_GRID, new PropertyDataSet());
+					tmpHash.put(TOT_CONS_GRID, new PropertyDataSet());
+					gridsNode.add(tmp);
+				}
+				
+				GraphDataSet gS = new GraphDataSet(abs, tmpHash);
 				objectHashtable.put(name, gS);
-				objectsNode.add(tmp);
 			}
-		} else {
+		}
+		if(objectsNode.getChildCount() == 0){
 			objectsNode.add(new DefaultMutableTreeNode("empty"));
 		}
+		if(switchesNode.getChildCount() == 0){
+			switchesNode.add(new DefaultMutableTreeNode("empty"));
+		}
+		if(gridsNode.getChildCount() == 0){
+			gridsNode.add(new DefaultMutableTreeNode("empty"));
+		}
 
 	}
 
@@ -615,7 +759,6 @@ public class splitPane extends JSplitPane implements GraphListener {
 		redField.setText("");
 		greenField.setText("");
 		blueField.setText("");
-		// graphNrTxtField.setText("");
 		colorComboBox.setSelectedIndex(0);
 	}