Browse Source

Outliner working.

Tom Troppmann 2 years ago
parent
commit
eb6d7f66cd

BIN
res/Button_Images/element.png


BIN
res/Button_Images/holon.png


+ 2 - 2
src/Connection/ConnectPhysical.java

@@ -412,8 +412,8 @@ public class ConnectPhysical implements AddOn{
 						return;
 					}
 					//House exist
-					List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room1Keyword)).collect(Collectors.toList());
-					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getEleName().contains(room2Keyword)).collect(Collectors.toList());
+					List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room1Keyword)).collect(Collectors.toList());
+					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room2Keyword)).collect(Collectors.toList());
 					
 					if(elementsOfRoom1.isEmpty()){
 						if(onlyOnChange) {

+ 312 - 312
src/Connection/socket/Server.java

@@ -1,312 +1,312 @@
-package Connection.socket;
-import java.net.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import classes.HolonElement;
-import classes.HolonObject;
-import ui.controller.Control;
-
-import java.io.*;
-
-public class Server implements Runnable{
-	private ServerSocket serverSocket;
-    private Socket clientSocket;
-    private DataOutputStream out;
-    private DataInputStream in;
-    private boolean stopped = false;		
-    private boolean connection = false;
-    private ui.view.Console console;
-    
-    
-    private HolonObject observed;
-	private HolonObjectModel modelField;
-    private HolonObjectModel newModelField;
-	private Control control;
-    
-    public Server(int port, ui.view.Console console, HolonObject observed, Control control) throws IOException {
-    	this.observed = observed;
-    	this.console = console;
-    	this.control = control;
-    	//Bind Port
-    	serverSocket = new ServerSocket(port);
-        //Wait for Connection
-    	Thread serverThread = new Thread(this);
-        serverThread.start();
-        this.modelField = createModel();
-        this.newModelField = createModel();
-        
-        
-    }
- 
-    public void stopServer() throws IOException {
-    	stopped = true;
-        stopConnection();
-        if(serverSocket != null)serverSocket.close();
-		console.println("Server Closed");
-    }
-
-	private void stopConnection() throws IOException {
-		connection = false;
-		if(in != null)in.close();
-		if(out != null)out.close();
-		if(clientSocket != null)clientSocket.close();
-	}
-
-	@Override
-	public void run() {
-		while(!stopped) {
-			try {
-			//Wait for new Connection
-			console.println("Wait for Connection..");
-			clientSocket = serverSocket.accept();
-			console.println("Connection from " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
-			connection = true;
-			out = new DataOutputStream(clientSocket.getOutputStream());
-			in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
-			if(observed == null) stopConnection();	
-			this.modelField = createModel();
-			Thread updateThread = new Thread(new UpdateLoop());
-			updateThread.start();
-			//InputLoop
-			try {
-				inputLoop();
-			}catch(EOFException e){
-				console.println("Connection Closed");
-			}
-			stopConnection();	
-			}
-			catch(SocketException e){
-				//ServerSocket is closed
-				stopped = true;
-			}
-			catch (IOException e) {
-				e.printStackTrace();
-			}
-			connection = false;
-		}
-	}
-
-	private void inputLoop() throws IOException {
-		while (connection) {
-			//WaitForInput
-			byte inputByte = in.readByte();
-			//UpdateHoleg
-			if (inputByte == Command.SetAmount) {
-				if(observed == null) stopConnection();
-				console.println("Res: [" + inputByte + "] -> SetAmount");
-				int index = in.readInt();
-				int amount = in.readInt();
-				modelField.getElements().get(index).amount = amount;
-				observed.getElements().get(index).setAmount(amount);
-				
-			}else if (inputByte == Command.SetEnable) {
-				if(observed == null) stopConnection();
-				console.println("Res: [" + inputByte + "] -> SetEnable");
-				int index = in.readInt();
-				boolean enabled = in.readBoolean();
-				modelField.getElements().get(index).enabled = enabled;
-				observed.getElements().get(index).setActive(enabled);
-			}else if (inputByte == Command.IncreaseAmount) {
-				if(observed == null) stopConnection();
-				console.println("Res: [" + inputByte + "] -> IncreaseAmount");
-				int index = in.readInt();
-				modelField.getElements().get(index).amount++;
-				HolonElement ele = observed.getElements().get(index);
-				ele.setAmount(ele.getAmount()+1);
-				
-			}else if (inputByte == Command.DecreaseAmount) {
-				if(observed == null) stopConnection();
-				console.println("Res: [" + inputByte + "] -> DecreaseAmount");
-				int index = in.readInt();
-				modelField.getElements().get(index).amount--;
-				HolonElement ele = observed.getElements().get(index);
-				ele.setAmount(ele.getAmount()-1);
-				
-			} else{
-				console.println("Res: [" + inputByte + "] -> unknown");
-			}
-			control.calculateStateAndVisualForCurrentTimeStep();
-			control.updateCanvas();
-			control.getGui().triggerUpdateController(null);
-		}
-	}
-	
-	
-	private HolonObjectModel createModel() {
-		HolonObjectModel model = new HolonObjectModel();
-		int index = 0;
-		for(HolonElement ele :observed.getElements()) {
-			model.add(ele, index++);
-		}
-		return model;
-	}
-	
-	
-	
-	
-	
-	public class UpdateLoop implements Runnable{
-		public UpdateLoop(){
-		}
-		@Override
-		public void run() {
-			sendUpdate();
-			while(!stopped && connection) {
-				if(checkForUpdates()){
-					sendUpdate();
-				}else {
-					waitOneSecond();	
-				}
-			}
-			
-		}
-
-		private void waitOneSecond() {
-			//wait one second
-			try {
-				TimeUnit.SECONDS.sleep(1);
-			} catch (InterruptedException e) {
-			}
-		}
-
-		private boolean checkForUpdates() {
-			//TODO Delete And CheckforUpdatesReal
-			newModelField = createModel();
-			if(compareModels(modelField,newModelField)) {
-				return false;
-			}
-			modelField = newModelField;
-			return true;
-			
-		}
-		/**
-		 * Returns true if both are the same.
-		 * @param modelField
-		 * @param newModelField
-		 * @return
-		 */
-		private void sendUpdate() {
-			try {
-				if(observed == null) stopConnection();
-				console.println("Send: [" + Command.Update + "] -> Update");
-				out.writeByte(Command.Update);
-				out.writeInt(modelField.size());
-				for(HolonElementWrapper wrapper : modelField.getElements()) {
-					out.writeUTF(wrapper.name);
-					out.writeInt(wrapper.amount);
-					out.writeFloat(wrapper.energy);
-					out.writeBoolean(wrapper.enabled);
-				}
-				
-				
-				
-			} catch (IOException e) {
-				if(connection)console.println(e.getMessage());
-			}
-		}
-	}
-	
-	private boolean compareModels(HolonObjectModel model, HolonObjectModel newModel) {
-		if(model.size() != newModel.size()) {
-			return false;
-		}
-		for(int i = 0; i < model.size(); i++) {
-			if(!model.getElements().get(i).equals(newModel.getElements().get(i))) {				
-				return false;
-			}
-		}
-		return true;
-	}
-	public void setObserved(HolonObject observed) {
-		this.observed = observed;
-	}
-	
-	public class Command {
-		//InputCommands
-		public static final int SetAmount = 10;
-		public static final int SetEnable = 11;
-		public static final int IncreaseAmount = 12;
-		public static final int DecreaseAmount = 13;
-		//UpdateResiveCommands
-		public static final int Update = 20;
-	}
-	
-	
-	
-	public class HolonObjectModel {
-		//Field
-		private List<HolonElementWrapper> elements;
-		private String holonObjectName;
-		
-		//constructor
-		public HolonObjectModel(){
-			elements = new ArrayList<HolonElementWrapper>();
-		}
-		
-		
-		public void add(HolonElement ele, int index ) {
-			String name = ele.getEleName();
-			int amount =ele.getAmount();
-			float energy =  ele.getEnergyPerElement();
-			boolean enabled = ele.isActive();
-			elements.add(new HolonElementWrapper(name, amount, energy, enabled, index));
-		}
-		
-		public int size() {
-			return elements.size();
-		}
-
-		//Getter/Setter
-		public List<HolonElementWrapper> getElements() {
-			return elements;
-		}
-		
-		public String getHolonObjectName() {
-			return holonObjectName;
-		}
-		public void setHolonObjectName(String holonObjectName) {
-			this.holonObjectName = holonObjectName;
-		}
-
-	}
-	public class HolonElementWrapper{
-		public int index;
-		public String name;
-		public int amount;
-		public float energy;
-		public boolean enabled;
-		public HolonElementWrapper(){
-			
-		}
-		public HolonElementWrapper(String name, int amount, float energy, boolean enabled, int index){
-			this.name = name;
-			this.amount = amount;
-			this.energy = energy;
-			this.enabled = enabled;
-		}
-		@Override
-		public boolean equals(Object obj) {
-			if (obj == this) {
-				return true;
-			}
-			if (!(obj instanceof HolonElementWrapper)) {
-			   return false;
-			}
-			HolonElementWrapper element = (HolonElementWrapper) obj;
-			
-			
-			
-			return this.name.compareTo(element.name) == 0 &&
-				   this.amount == element.amount &&
-				   this.energy == element.energy &&
-				   this.enabled == element.enabled;
-		}
-		
-	}
-	
-	
-	
-	
-}
+package Connection.socket;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import classes.HolonElement;
+import classes.HolonObject;
+import ui.controller.Control;
+
+import java.io.*;
+
+public class Server implements Runnable{
+	private ServerSocket serverSocket;
+    private Socket clientSocket;
+    private DataOutputStream out;
+    private DataInputStream in;
+    private boolean stopped = false;		
+    private boolean connection = false;
+    private ui.view.Console console;
+    
+    
+    private HolonObject observed;
+	private HolonObjectModel modelField;
+    private HolonObjectModel newModelField;
+	private Control control;
+    
+    public Server(int port, ui.view.Console console, HolonObject observed, Control control) throws IOException {
+    	this.observed = observed;
+    	this.console = console;
+    	this.control = control;
+    	//Bind Port
+    	serverSocket = new ServerSocket(port);
+        //Wait for Connection
+    	Thread serverThread = new Thread(this);
+        serverThread.start();
+        this.modelField = createModel();
+        this.newModelField = createModel();
+        
+        
+    }
+ 
+    public void stopServer() throws IOException {
+    	stopped = true;
+        stopConnection();
+        if(serverSocket != null)serverSocket.close();
+		console.println("Server Closed");
+    }
+
+	private void stopConnection() throws IOException {
+		connection = false;
+		if(in != null)in.close();
+		if(out != null)out.close();
+		if(clientSocket != null)clientSocket.close();
+	}
+
+	@Override
+	public void run() {
+		while(!stopped) {
+			try {
+			//Wait for new Connection
+			console.println("Wait for Connection..");
+			clientSocket = serverSocket.accept();
+			console.println("Connection from " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
+			connection = true;
+			out = new DataOutputStream(clientSocket.getOutputStream());
+			in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
+			if(observed == null) stopConnection();	
+			this.modelField = createModel();
+			Thread updateThread = new Thread(new UpdateLoop());
+			updateThread.start();
+			//InputLoop
+			try {
+				inputLoop();
+			}catch(EOFException e){
+				console.println("Connection Closed");
+			}
+			stopConnection();	
+			}
+			catch(SocketException e){
+				//ServerSocket is closed
+				stopped = true;
+			}
+			catch (IOException e) {
+				e.printStackTrace();
+			}
+			connection = false;
+		}
+	}
+
+	private void inputLoop() throws IOException {
+		while (connection) {
+			//WaitForInput
+			byte inputByte = in.readByte();
+			//UpdateHoleg
+			if (inputByte == Command.SetAmount) {
+				if(observed == null) stopConnection();
+				console.println("Res: [" + inputByte + "] -> SetAmount");
+				int index = in.readInt();
+				int amount = in.readInt();
+				modelField.getElements().get(index).amount = amount;
+				observed.getElements().get(index).setAmount(amount);
+				
+			}else if (inputByte == Command.SetEnable) {
+				if(observed == null) stopConnection();
+				console.println("Res: [" + inputByte + "] -> SetEnable");
+				int index = in.readInt();
+				boolean enabled = in.readBoolean();
+				modelField.getElements().get(index).enabled = enabled;
+				observed.getElements().get(index).setActive(enabled);
+			}else if (inputByte == Command.IncreaseAmount) {
+				if(observed == null) stopConnection();
+				console.println("Res: [" + inputByte + "] -> IncreaseAmount");
+				int index = in.readInt();
+				modelField.getElements().get(index).amount++;
+				HolonElement ele = observed.getElements().get(index);
+				ele.setAmount(ele.getAmount()+1);
+				
+			}else if (inputByte == Command.DecreaseAmount) {
+				if(observed == null) stopConnection();
+				console.println("Res: [" + inputByte + "] -> DecreaseAmount");
+				int index = in.readInt();
+				modelField.getElements().get(index).amount--;
+				HolonElement ele = observed.getElements().get(index);
+				ele.setAmount(ele.getAmount()-1);
+				
+			} else{
+				console.println("Res: [" + inputByte + "] -> unknown");
+			}
+			control.calculateStateAndVisualForCurrentTimeStep();
+			control.updateCanvas();
+			control.getGui().triggerUpdateController(null);
+		}
+	}
+	
+	
+	private HolonObjectModel createModel() {
+		HolonObjectModel model = new HolonObjectModel();
+		int index = 0;
+		for(HolonElement ele :observed.getElements()) {
+			model.add(ele, index++);
+		}
+		return model;
+	}
+	
+	
+	
+	
+	
+	public class UpdateLoop implements Runnable{
+		public UpdateLoop(){
+		}
+		@Override
+		public void run() {
+			sendUpdate();
+			while(!stopped && connection) {
+				if(checkForUpdates()){
+					sendUpdate();
+				}else {
+					waitOneSecond();	
+				}
+			}
+			
+		}
+
+		private void waitOneSecond() {
+			//wait one second
+			try {
+				TimeUnit.SECONDS.sleep(1);
+			} catch (InterruptedException e) {
+			}
+		}
+
+		private boolean checkForUpdates() {
+			//TODO Delete And CheckforUpdatesReal
+			newModelField = createModel();
+			if(compareModels(modelField,newModelField)) {
+				return false;
+			}
+			modelField = newModelField;
+			return true;
+			
+		}
+		/**
+		 * Returns true if both are the same.
+		 * @param modelField
+		 * @param newModelField
+		 * @return
+		 */
+		private void sendUpdate() {
+			try {
+				if(observed == null) stopConnection();
+				console.println("Send: [" + Command.Update + "] -> Update");
+				out.writeByte(Command.Update);
+				out.writeInt(modelField.size());
+				for(HolonElementWrapper wrapper : modelField.getElements()) {
+					out.writeUTF(wrapper.name);
+					out.writeInt(wrapper.amount);
+					out.writeFloat(wrapper.energy);
+					out.writeBoolean(wrapper.enabled);
+				}
+				
+				
+				
+			} catch (IOException e) {
+				if(connection)console.println(e.getMessage());
+			}
+		}
+	}
+	
+	private boolean compareModels(HolonObjectModel model, HolonObjectModel newModel) {
+		if(model.size() != newModel.size()) {
+			return false;
+		}
+		for(int i = 0; i < model.size(); i++) {
+			if(!model.getElements().get(i).equals(newModel.getElements().get(i))) {				
+				return false;
+			}
+		}
+		return true;
+	}
+	public void setObserved(HolonObject observed) {
+		this.observed = observed;
+	}
+	
+	public class Command {
+		//InputCommands
+		public static final int SetAmount = 10;
+		public static final int SetEnable = 11;
+		public static final int IncreaseAmount = 12;
+		public static final int DecreaseAmount = 13;
+		//UpdateResiveCommands
+		public static final int Update = 20;
+	}
+	
+	
+	
+	public class HolonObjectModel {
+		//Field
+		private List<HolonElementWrapper> elements;
+		private String holonObjectName;
+		
+		//constructor
+		public HolonObjectModel(){
+			elements = new ArrayList<HolonElementWrapper>();
+		}
+		
+		
+		public void add(HolonElement ele, int index ) {
+			String name = ele.getName();
+			int amount =ele.getAmount();
+			float energy =  ele.getEnergyPerElement();
+			boolean enabled = ele.isActive();
+			elements.add(new HolonElementWrapper(name, amount, energy, enabled, index));
+		}
+		
+		public int size() {
+			return elements.size();
+		}
+
+		//Getter/Setter
+		public List<HolonElementWrapper> getElements() {
+			return elements;
+		}
+		
+		public String getHolonObjectName() {
+			return holonObjectName;
+		}
+		public void setHolonObjectName(String holonObjectName) {
+			this.holonObjectName = holonObjectName;
+		}
+
+	}
+	public class HolonElementWrapper{
+		public int index;
+		public String name;
+		public int amount;
+		public float energy;
+		public boolean enabled;
+		public HolonElementWrapper(){
+			
+		}
+		public HolonElementWrapper(String name, int amount, float energy, boolean enabled, int index){
+			this.name = name;
+			this.amount = amount;
+			this.energy = energy;
+			this.enabled = enabled;
+		}
+		@Override
+		public boolean equals(Object obj) {
+			if (obj == this) {
+				return true;
+			}
+			if (!(obj instanceof HolonElementWrapper)) {
+			   return false;
+			}
+			HolonElementWrapper element = (HolonElementWrapper) obj;
+			
+			
+			
+			return this.name.compareTo(element.name) == 0 &&
+				   this.amount == element.amount &&
+				   this.energy == element.energy &&
+				   this.enabled == element.enabled;
+		}
+		
+	}
+	
+	
+	
+	
+}

+ 1 - 1
src/addOns/Utility/HolonElementSketch.java

@@ -56,7 +56,7 @@ public class HolonElementSketch {
 		FlexibilitySketch constrain = onConstrain?onFlex:offFlex;
 		
 		
-		toCreateFlex.name = nameOfHolonObject + "_" + ele.getEleName() + (onConstrain?"_OnFlex":"_OffFlex");
+		toCreateFlex.name = nameOfHolonObject + "_" + ele.getName() + (onConstrain?"_OnFlex":"_OffFlex");
 		toCreateFlex.speed = 0;
 		toCreateFlex.setDuration(Random.nextIntegerInRange(constrain.minDuration, constrain.maxDuration+1));
 		toCreateFlex.cost = Random.nextFloatInRange(constrain.minCost, constrain.maxCost);

+ 122 - 122
src/classes/Flexibility.java

@@ -1,122 +1,122 @@
-package classes;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Predicate;
-
-import com.google.gson.annotations.Expose;
-/**
- * Representative of a flexibility for a HolonElement.
- *
- */
-public class Flexibility {
-	/** The Name of a Flexibility.*/
-	@Expose
-	public String name;
-	/** How fast in TimeSteps the Flexibility can be activated. */
-	@Expose
-	public int speed;
-	/** How high the cost for a activation are. */
-	@Expose
-	public float cost;
-	/** SHould this Flexibility be Offered when is constrainList is fulfilled the flexibility can be activated.*/
-	@Expose
-	public boolean offered;
-	/** The Duration in TimeSteps how long the Flexibility is activated.*/
-	@Expose
-	private int duration;
-	/** The Duration after a successful activation between the next possible activation.*/
-	@Expose
-	private int cooldown;
-	/** The Element this flexibility is assigned.*/
-	private HolonElement element;
-
-
-
-
-
-	/** The List of Constrains the Flexibility */
-	@Expose
-	public List<Constrain> constrainList;
-	
-	
-	public Flexibility(HolonElement element){
-		this(0 , 0.f, 1, 0, false, element);		
-	}
-	public Flexibility(int speed, float cost, int duration, int cooldown, boolean offered, HolonElement element){
-		this.speed = speed;
-		this.cost = cost;
-		setDuration(duration);
-		setCooldown(cooldown);
-		this.offered=offered;
-		this.element = element;
-		constrainList = new ArrayList<Constrain>();		
-	}
-	
-	
-	/** Checks if all assigned constrains are fulfilled. When no constrains assigned returns true.*/
-	public boolean fulfillsConstrains() {
-		//System.out.println("Fix me when other is fixed");
-		return constrainList.stream().map(constrain -> constrain.getConstrainFunction()).reduce(Predicate::and).orElse(f -> true).test(this);
-	}
-	
-	public HolonElement getElement() {
-		return element;
-	}
-	public void setElement(HolonElement element) {
-		this.element = element;
-	}
-
-	public int getDuration() {
-		return duration;
-	}
-	/** Minimum duration is 1 TimeStep.*/
-	public void setDuration(int duration) {
-		this.duration = Math.max(1, duration);
-	}
-
-	public int getCooldown() {
-		return cooldown;
-	}
-	/** No negative cooldown TimeSteps.*/
-	public void setCooldown(int cooldown) {
-		this.cooldown = Math.max(0, cooldown);
-	}
-
-	/** returns the total energy Amount accumulated over the TimeSteps.*/
-	public float magnitude() {
-		return ((float)duration) *  element.getEnergyPerElement() * element.getAmount();
-	}
-	
-	public float bringtmir(){
-		//System.out.println("Name:" +  element.getEleName() + "   BringtMir:" + (-element.getEnergyPerElement() * element.getAmount()));
-		return (constrainList.stream().map(constrain -> constrain.getName()).anyMatch(name -> name.equals("onConstrain"))?-1.0f:1.0f) * element.getEnergyPerElement() * element.getAmount();
-	}
-	public boolean isPositive() {
-		return bringtmir() >= 0;
-	}
-	public boolean isNegative() {
-		return bringtmir() < 0;
-	}
-	
-	
-	
-	public int getSpeed() {
-		return speed;
-	}
-	public void setSpeed(int speed) {
-		this.speed = speed;
-	}
-	@Override
-	public String toString() {
-		return "Flexibility: " + name + " from [HolonElement: " + element.getEleName() + " ID:" + element.getId()+"]";
-	}
-
-	
-	
-
-	
-	
-	
-	
-}
+package classes;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
+
+import com.google.gson.annotations.Expose;
+/**
+ * Representative of a flexibility for a HolonElement.
+ *
+ */
+public class Flexibility {
+	/** The Name of a Flexibility.*/
+	@Expose
+	public String name;
+	/** How fast in TimeSteps the Flexibility can be activated. */
+	@Expose
+	public int speed;
+	/** How high the cost for a activation are. */
+	@Expose
+	public float cost;
+	/** SHould this Flexibility be Offered when is constrainList is fulfilled the flexibility can be activated.*/
+	@Expose
+	public boolean offered;
+	/** The Duration in TimeSteps how long the Flexibility is activated.*/
+	@Expose
+	private int duration;
+	/** The Duration after a successful activation between the next possible activation.*/
+	@Expose
+	private int cooldown;
+	/** The Element this flexibility is assigned.*/
+	private HolonElement element;
+
+
+
+
+
+	/** The List of Constrains the Flexibility */
+	@Expose
+	public List<Constrain> constrainList;
+	
+	
+	public Flexibility(HolonElement element){
+		this(0 , 0.f, 1, 0, false, element);		
+	}
+	public Flexibility(int speed, float cost, int duration, int cooldown, boolean offered, HolonElement element){
+		this.speed = speed;
+		this.cost = cost;
+		setDuration(duration);
+		setCooldown(cooldown);
+		this.offered=offered;
+		this.element = element;
+		constrainList = new ArrayList<Constrain>();		
+	}
+	
+	
+	/** Checks if all assigned constrains are fulfilled. When no constrains assigned returns true.*/
+	public boolean fulfillsConstrains() {
+		//System.out.println("Fix me when other is fixed");
+		return constrainList.stream().map(constrain -> constrain.getConstrainFunction()).reduce(Predicate::and).orElse(f -> true).test(this);
+	}
+	
+	public HolonElement getElement() {
+		return element;
+	}
+	public void setElement(HolonElement element) {
+		this.element = element;
+	}
+
+	public int getDuration() {
+		return duration;
+	}
+	/** Minimum duration is 1 TimeStep.*/
+	public void setDuration(int duration) {
+		this.duration = Math.max(1, duration);
+	}
+
+	public int getCooldown() {
+		return cooldown;
+	}
+	/** No negative cooldown TimeSteps.*/
+	public void setCooldown(int cooldown) {
+		this.cooldown = Math.max(0, cooldown);
+	}
+
+	/** returns the total energy Amount accumulated over the TimeSteps.*/
+	public float magnitude() {
+		return ((float)duration) *  element.getEnergyPerElement() * element.getAmount();
+	}
+	
+	public float bringtmir(){
+		//System.out.println("Name:" +  element.getEleName() + "   BringtMir:" + (-element.getEnergyPerElement() * element.getAmount()));
+		return (constrainList.stream().map(constrain -> constrain.getName()).anyMatch(name -> name.equals("onConstrain"))?-1.0f:1.0f) * element.getEnergyPerElement() * element.getAmount();
+	}
+	public boolean isPositive() {
+		return bringtmir() >= 0;
+	}
+	public boolean isNegative() {
+		return bringtmir() < 0;
+	}
+	
+	
+	
+	public int getSpeed() {
+		return speed;
+	}
+	public void setSpeed(int speed) {
+		this.speed = speed;
+	}
+	@Override
+	public String toString() {
+		return "Flexibility: " + name + " from [HolonElement: " + element.getName() + " ID:" + element.getId()+"]";
+	}
+
+	
+	
+
+	
+	
+	
+	
+}

+ 30 - 14
src/classes/Holon.java

@@ -8,24 +8,33 @@ public class Holon {
 	public String name = new String();
 	private Holon parent = null;
 	public ArrayList<Holon> childHolons = new ArrayList<Holon>();
-	private List<HolonObject> objects = new ArrayList<HolonObject>();
+	private List<HolonElement> elements = new ArrayList<HolonElement>();
 	
 	public Holon(String name) {
 		this.name = name;
 	}
-	public void addHolonObject(HolonObject object) {
-		object.holon = this;
-		objects.add(object);
+	public Holon(HolonObject object) {
+		name = object.getName();
+		elements.addAll(object.getElements());
+		for(HolonElement ele : elements) {
+			ele.holon = this;
+		}
 	}
-	public void removeHolonObject(HolonObject object) {
-		object.holon = null;
-		objects.remove(object);
+	
+	
+	public void addElement(HolonElement element) {
+		element.holon = this;
+		elements.add(element);
+	}
+	public void removeElement(HolonElement element) {
+		element.holon = null;
+		elements.remove(element);
 	}
-	public int holonObjectCount() {
-		return objects.size();
+	public int elementsCount() {
+		return elements.size();
 	}
 	
-	public void addChildHolon(Holon child) {
+	public void addChild(Holon child) {
 		child.parent = this;
 		childHolons.add(child);
 	}
@@ -39,6 +48,13 @@ public class Holon {
 		child.parent = null;
 		childHolons.remove(child);
 	}
+	
+	public void removeFromParent() {
+		if(parent != null) {
+			parent.removeChildHolon(this);
+		}
+	}
+	
 	public int getChildCount() {
 		return childHolons.size();
 	}
@@ -51,8 +67,8 @@ public class Holon {
 		return Collections.unmodifiableList(childHolons);
 	}
 	
-	public List<HolonObject> getHolonObjectsView(){
-		return Collections.unmodifiableList(objects);
+	public List<HolonElement> getElementView(){
+		return Collections.unmodifiableList(elements);
 	}
 	
 	@Override
@@ -62,14 +78,14 @@ public class Holon {
 	
 	//TODO This can maybe cached
 	public int getLevel() {
-		return parent != null ? parent.getLevel() : 0;
+		return parent != null ? parent.getLevel() +  1 : 0;
 	}
 	
 	
 	public Holon cloneWithoutParent() {
 		Holon cloned = new Holon(this.name);
 		cloned.childHolons = this.childHolons;
-		cloned.objects = this.objects;
+		cloned.elements = this.elements;
 		return cloned;
 	}
 	

+ 3 - 3
src/classes/HolonElement.java

@@ -48,7 +48,7 @@ public class HolonElement implements LocalMode, GraphEditable{
     public HolonObject parentObject;
     
     
-    
+    public Holon holon = null;
     
     @Expose
     private Priority priority;
@@ -121,7 +121,7 @@ public class HolonElement implements LocalMode, GraphEditable{
     	this.priority = element.getPriority();
     	setLocalPeriod(element.getLocalPeriod());
     	setUseLocalPeriod(element.isUsingLocalPeriod());
-        setEleName(element.getEleName());
+        setEleName(element.getName());
         setLocalPeriod(element.getLocalPeriod());
         setAmount(element.getAmount());
         setEnergyPerElement(element.getEnergyPerElement());
@@ -151,7 +151,7 @@ public class HolonElement implements LocalMode, GraphEditable{
      *
      * @return the name String
      */
-    public String getEleName() {
+    public String getName() {
         return eleName;
     }
 

+ 4 - 6
src/classes/HolonObject.java

@@ -18,8 +18,6 @@ public class HolonObject extends AbstractCanvasObject {
     /* Array of all consumers */
     private ArrayList<HolonElement> elements = new ArrayList<HolonElement>();
     
-    public Holon holon = null;
-    
     
     
     
@@ -97,9 +95,9 @@ public class HolonObject extends AbstractCanvasObject {
         String objString = "Empty";
         for (HolonElement e : elements) {
             if (objString == "Empty") {
-                objString = e.getEleName();
+                objString = e.getName();
             } else {
-                objString = objString + ", " + e.getEleName();
+                objString = objString + ", " + e.getName();
             }
         }
         return objString;
@@ -130,7 +128,7 @@ public class HolonObject extends AbstractCanvasObject {
     public HolonElement searchElement(String name) {
         HolonElement ele = null;
         for (HolonElement e : getElements()) {
-            if (e.getEleName().equals(name)) {
+            if (e.getName().equals(name)) {
                 ele = e;
                 break;
             }
@@ -276,7 +274,7 @@ public class HolonObject extends AbstractCanvasObject {
             if (i != 0) {
                 sb.append(", ");
             }
-            sb.append(el.getEleName());
+            sb.append(el.getName());
         }
         sb.append("]]");
 

+ 2 - 2
src/classes/comparator/elementComparator/ElemCompOnEleName.java

@@ -7,8 +7,8 @@ public class ElemCompOnEleName extends ElementComparator {
 	@Override
 	public int compare(HolonElement a, HolonElement b) {
 
-		String eleNameA = a.getEleName();
-		String eleNameB = b.getEleName();
+		String eleNameA = a.getName();
+		String eleNameB = b.getName();
 
 		return eleNameA.compareTo(eleNameB);
 

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

@@ -50,8 +50,8 @@ public class CanvasController {
 		model.getCvsObjIdx().put(object.getId(), model.getObjectsOnCanvas().size());
 		model.getObjectsOnCanvas().add(object);
 		if(object instanceof HolonObject) {
-			Holon holon = new Holon(object.getName());
-			model.getStateHolon().addChildHolon(holon);
+			Holon holon = new Holon((HolonObject)object);
+			model.getStateHolon().addChild(holon);
 			//model.getStateHolon().addHolonObject(((HolonObject) object));
 		}
 		/**

+ 2 - 2
src/ui/controller/UpdateController.java

@@ -74,7 +74,7 @@ public class UpdateController {
 				}
 			}
 			for (HolonElement e1 : elemList) {
-				Object[] temp2 = { e1.getObjName(), e1.getId(), e1.getEleName(), e1.getEnergyPerElement(),
+				Object[] temp2 = { e1.getObjName(), e1.getId(), e1.getName(), e1.getEnergyPerElement(),
 						controller.getSimManager().getActualFlexManager().isAFlexInUseOfHolonElement(e1), e1.getAmount(), e1.isActive()};
 				table.addRow(temp2);
 			}
@@ -88,7 +88,7 @@ public class UpdateController {
 				}
 				
 				for (HolonElement e1 : elemList) {
-					Object[] temp2 = { e1.getId(), e1.getEleName(), e1.getEnergyPerElement(),
+					Object[] temp2 = { e1.getId(), e1.getName(), e1.getEnergyPerElement(),
 							controller.getSimManager().getActualFlexManager().isAFlexInUseOfHolonElement(e1), e1.getAmount(), e1.isActive()};
 					table.addRow(temp2);
 				}

+ 1 - 1
src/ui/model/Model.java

@@ -130,7 +130,7 @@ public class Model {
     private PropertyTable tableModelHolonElementSingle;
     private DefaulTable tableModelProperties;
     private HashMap<Integer, GroupNode> hashcodeMap = new HashMap<>();
-    private Holon stateHolon = new Holon("state");
+    private Holon stateHolon = new Holon("All Holons");
 
     private Gson gson;
 

+ 2 - 2
src/ui/view/AddElementPopUp.java

@@ -171,7 +171,7 @@ public class AddElementPopUp extends JDialog {
 	 */
 	public void setElement(HolonElement holonElement) {
 		hl = holonElement;
-		elementName.setText(hl.getEleName());
+		elementName.setText(hl.getName());
 		amount.setText(""+hl.getAmount());
 		providedEnergy.setText(""+hl.getEnergyPerElement());
 		checkBoxActive.setSelected(hl.isActive());
@@ -184,7 +184,7 @@ public class AddElementPopUp extends JDialog {
 	private void okAction() {
 		boolean repeated = false;
 		for (HolonElement e : ((HolonObject) tempCps).getElements()) {
-			if (elementName.getText().equals(e.getEleName())&&(hl == null || hl.getId()!=e.getId())) {
+			if (elementName.getText().equals(e.getName())&&(hl == null || hl.getId()!=e.getId())) {
 				repeated = true;
 				break;
 			}

+ 1 - 1
src/ui/view/AddObjectPopUp.java

@@ -289,7 +289,7 @@ public class AddObjectPopUp extends JDialog {
 	 */
 	private void addElement(HolonElement hl) {
 		hElements.add(hl);
-		listModel.addElement(hl.getAmount() + "x: " + hl.getEleName() + " " + hl.getEnergyPerElement() + "U");
+		listModel.addElement(hl.getAmount() + "x: " + hl.getName() + " " + hl.getEnergyPerElement() + "U");
 	}
 
 	/**

+ 3 - 3
src/ui/view/CreateTemplatePopUp.java

@@ -210,7 +210,7 @@ public class CreateTemplatePopUp extends JDialog {
 		 * Add Elements to List
 		 */
 		for (HolonElement he : template.getElements())
-			listModel.addElement(he.getAmount() + " * " + he.getEleName()
+			listModel.addElement(he.getAmount() + " * " + he.getName()
 					+ ": " + he.getMaximumEnergy() + "U");
 
 		/**
@@ -321,7 +321,7 @@ public class CreateTemplatePopUp extends JDialog {
 		popUp.setVisible(true);
 		HolonElement he = popUp.getElement();
 		if (he != null) {
-			listModel.addElement(he.getAmount() + " * " + he.getEleName()
+			listModel.addElement(he.getAmount() + " * " + he.getName()
 					+ ": " + he.getMaximumEnergy() + "U");
 			template.addElement(he);
 			he.setSaving(new Pair<>(category, textField_name.getText()));
@@ -354,7 +354,7 @@ public class CreateTemplatePopUp extends JDialog {
 		HolonElement he = popUp.getElement();
 		if (he != null) {
 			listModel.remove(index);
-			listModel.addElement(he.getAmount() + " * " + he.getEleName()
+			listModel.addElement(he.getAmount() + " * " + he.getName()
 					+ ": " + he.getMaximumEnergy() + "U");
 			template.deleteElement(index);
 			template.addElement(he);

+ 751 - 751
src/ui/view/FlexWindow.java

@@ -1,751 +1,751 @@
-package ui.view;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.Rectangle;
-import java.awt.Dialog.ModalityType;
-import java.awt.Dimension;
-import java.awt.event.ItemEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.image.BufferedImage;
-import java.math.RoundingMode;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.stream.Collectors;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JFormattedTextField;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTree;
-import javax.swing.SwingUtilities;
-import javax.swing.border.EmptyBorder;
-import javax.swing.text.NumberFormatter;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreePath;
-
-import classes.AbstractCanvasObject;
-import classes.Constrain;
-import classes.GroupNode;
-import classes.Flexibility;
-import classes.HolonElement;
-import classes.HolonElement.Priority;
-import classes.HolonObject;
-import ui.controller.Control;
-import ui.controller.FlexManager;
-import ui.controller.FlexManager.FlexState;
-import ui.controller.FlexManager.FlexWrapper;
-import ui.model.Model;
-import utility.ImageImport;
-
-
-public class FlexWindow extends JFrame {
-	private JPanel nothingSelectedPanel;
-	private JPanel selectedPanel;
-	
-	
-	private JTabbedPane contentPanel = new JTabbedPane();
-	private JScrollPane usageViewPanel;
-	
-	private Control controller;
-	private Model model;
-	
-	public boolean isClosed = false;
-	
-	//Flexibility Intermediate
-	private Flexibility intermediateFlex = new Flexibility(null);
-	private boolean offered = true, onConstrain = true, offConstrain =false;
-	
-	
-	
-	//JTree
-	private DefaultMutableTreeNode listOfAllSelectedHolonObjects;
-	private JTree stateTree;
-	private DefaultTreeModel treeModel;
-	private FlexManager flexmanager;
-	
-	//Tabs
-	String gridTabString = "Grid";
-	String orderTabString = "Order";
-	
-	//FlexToFlexWrapper()
-	
-	
-	
-	public FlexWindow(JFrame parentFrame, ui.controller.Control  controller){
-		this.intermediateFlex.name = "name";
-		this.controller = controller;
-		this.model = controller.getModel();
-		//InitWindow
-		createMenuBar();
-		initWindowPanel(parentFrame);
-		this.addWindowListener(new java.awt.event.WindowAdapter() {
-		    @Override
-		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
-		    	isClosed = true;
-		    }
-		});
-		updateSelectedPanel();
-		//this.pack();
-	}
-
-
-
-	private void initWindowPanel(JFrame parentFrame) {
-		this.setBounds(0, 0, 400, parentFrame.getHeight()>20?parentFrame.getHeight()- 20:parentFrame.getHeight());
-		this.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
-		this.setTitle("Flexibility");
-		this.setLocationRelativeTo(parentFrame);
-		this.setVisible(true);
-		//this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-		createNothingSelectedPanel();
-		createSelectedPanel();
-		createUsageViewPanel();
-		contentPanel.addTab(gridTabString, nothingSelectedPanel);
-		contentPanel.addTab(orderTabString, usageViewPanel);
-		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
-		this.setContentPane(contentPanel);
-		this.revalidate();
-		
-	}
-
-	private void createMenuBar(){
-		JMenuBar menuBar = new JMenuBar();
-		JMenu canvas = new JMenu("Canvas");
-		menuBar.add(canvas);
-		JMenuItem updateMenuItem = new JMenuItem("Update");
-		updateMenuItem.addActionListener(clicked -> updateSelectedPanel());
-		canvas.add(updateMenuItem);
-		JMenu flex = new JMenu("Flex");
-		menuBar.add(flex);
-		JMenuItem addMenuItem = new JMenuItem("Add Flexibility");
-		addMenuItem.addActionListener(clicked -> createAddDialog(null));
-		flex.add(addMenuItem);
-		JMenuItem deleteMenuItem = new JMenuItem("Delete Flexibility");
-		deleteMenuItem.addActionListener(clicked -> createDeleteDialog());
-		flex.add(deleteMenuItem);
-		
-		this.setJMenuBar(menuBar);
-	}
-	
-	
-
-	
-	private void createUsageViewPanel() {
-		flexmanager = controller.getSimManager().getActualFlexManager();
-		//GridBagApprouch
-		JPanel gridbagPanel =  new JPanel(new GridBagLayout());
-		usageViewPanel = new JScrollPane(gridbagPanel);
-		gridbagPanel.setBackground(Color.white);
-		//5breit
-		FlexState[] titles = FlexState.values();
-		
-		
-		
-		for(int i = 0; i<5; i++){
-			
-			
-			
-			
-			List<FlexWrapper> listOfFlexWithState = flexmanager.getAllFlexWrapperWithState(titles[i]);
-			JLabel label = new JLabel(titles[i].toString() + "[" + listOfFlexWithState.size()+ "]");									
-			GridBagConstraints labelC = new GridBagConstraints();
-			labelC.gridx = 1;
-			labelC.gridy = i*2;
-			labelC.anchor = GridBagConstraints.LINE_START;
-			labelC.fill = GridBagConstraints.HORIZONTAL;
-			labelC.weightx = 0.5;
-			labelC.weighty = 0.0;
-			gridbagPanel.add(label, labelC);
-			
-			JPanel listPanel = new JPanel(new GridBagLayout());
-			createFlexPanel(listPanel, listOfFlexWithState);
-			GridBagConstraints panelC = new GridBagConstraints();
-			panelC.gridx = 0;
-			panelC.gridwidth = 2;
-			panelC.gridy = i*2 +1;
-			panelC.fill = GridBagConstraints.BOTH;
-			gridbagPanel.add(listPanel, panelC);
-
-			
-			
-			JButton expandButton = new JButton("-");
-			GridBagConstraints buttonC = new GridBagConstraints();
-			buttonC.gridx = 0;
-			buttonC.gridy = i*2;
-			gridbagPanel.add(expandButton, buttonC);
-			expandButton.addActionListener(clicked -> {
-				listPanel.setVisible(!listPanel.isVisible());
-				expandButton.setText(listPanel.isVisible()?"-":"+");
-			});
-			
-		}
-		//Add Spacer
-		JLabel spacer = new JLabel();
-		GridBagConstraints c = new GridBagConstraints();
-		c.gridx = 0;
-		c.gridy = 5*2;
-		c.fill = GridBagConstraints.VERTICAL;
-		c.weightx = 0.0;
-		c.weighty = 1;
-		gridbagPanel.add(spacer, c);
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-	
-		
-		
-
-	}
-
-	
-
-
-	private void createFlexPanel(JPanel listPanel, List<FlexWrapper> flexWrapperList) {
-		listPanel.setBackground(Color.white);
-		
-		Insets insets = new Insets(2,2,2,2);
-		
-		//String[] flexesString = flexWrapperList.stream().map(flexWrapper -> flexWrapper.getFlex().name).toArray(String[]::new);
-		for(int i = 0; i < flexWrapperList.size(); i++) {
-			FlexWrapper actual = flexWrapperList.get(i);
-			GridBagConstraints c = new GridBagConstraints();
-			c.gridx = Math.floorMod(i, 5);
-			c.weightx = 0.0;	
-			c.insets = insets;
-			JButton labelButton = new JButton(actual.getFlex().name);
-			labelButton.setPreferredSize(new Dimension(70,70));
-			labelButton.setBorder(BorderFactory.createLineBorder(Color.black));
-			listPanel.add(labelButton, c);
-			labelButton.addActionListener(clicked ->{
-				actual.order();
-				controller.calculateStateAndVisualForCurrentTimeStep();
-				controller.updateCanvas();
-			});
-			labelButton.setToolTipText(createToolTipp(actual));
-		}
-		//AddSpacer
-		JLabel spacer = new JLabel();
-		GridBagConstraints c = new GridBagConstraints();
-		c.gridx = 5;
-		c.gridy = 0;
-		c.fill = GridBagConstraints.VERTICAL;
-		c.weightx = 1;
-		c.weighty = 0;
-	
-		listPanel.add(spacer, c);
-		
-	}
-
-
-	private String createToolTipp(FlexWrapper actual) {
-		String tooltipString = "<html>" +
-	"<b>" + actual.getFlex().name + "( </b>" + actual.getFlex().getElement().getEleName() + "<b> )</b><br>"
-	+ ((actual.remainingDuration() != 0)?"<i>Remaining Duration:"+ actual.remainingDuration()+"</i><br>":"") 
-	+ ((actual.remainingTimeTillActivation() != 0)?"<i>Remaining TimeTillActivation:"+ actual.remainingTimeTillActivation()+"</i><br>":"")
-	+ "Duration: " + actual.getFlex().getDuration()  + "<br>"
-	+ "Cooldown: " + actual.getFlex().getCooldown() + "<br>"
-	//+ "Speed: " + actual.getFlex().speed + "<br>"
-	+ "Cost: " + actual.getFlex().cost + "<br>"
-	+ "BrigtMir: " + actual.getFlex().bringtmir() + "<br>"
-	+ "Constrains: " + actual.getFlex().constrainList.stream().map(constrain -> constrain.getName()).collect(Collectors.joining( "," )) + "<br>"
-	+ "</html>";
-		
-		return tooltipString;
-	}
-
-
-
-	public void update() {
-		updateSelectedPanel();
-		createUsageViewPanel();
-		contentPanel.setComponentAt(contentPanel.indexOfTab(orderTabString), usageViewPanel);
-		contentPanel.revalidate();
-	}
-
-	
-	
-	
-	private void createSelectedPanel() {
-		//Liste aller Flexibilities
-		listOfAllSelectedHolonObjects = new DefaultMutableTreeNode("HolonObjects");
-		treeModel = new DefaultTreeModel(listOfAllSelectedHolonObjects);
-		stateTree = new JTree(treeModel);
-		stateTree.addMouseListener ( new MouseAdapter ()
-		    {
-		        public void mousePressed ( MouseEvent e )
-		        {
-		            if ( SwingUtilities.isRightMouseButton ( e ) )
-		            {
-		            	
-		            	
-		                TreePath pathUnderCursor = stateTree.getPathForLocation ( e.getX (), e.getY () );
-		                Rectangle pathBounds = stateTree.getUI ().getPathBounds ( stateTree, pathUnderCursor );
-		                if ( pathBounds != null && pathBounds.contains ( e.getX (), e.getY () ) )
-		                {
-		                	TreePath[] selectedPaths = stateTree.getSelectionPaths();
-			   	        	if(selectedPaths == null) {
-			   	        		stateTree.addSelectionPath(pathUnderCursor);
-			   	        	}else {
-			   	        		boolean isInselectedPaths = false;
-			   	        		for (TreePath path : stateTree.getSelectionPaths()) {
-			   	        			if(path.equals(pathUnderCursor)) {
-			   	        				isInselectedPaths = true;
-			   	        			}
-			   	        		}
-			   	        		if(!isInselectedPaths) {
-			   	        			stateTree.clearSelection();
-			   	        			stateTree.addSelectionPath(pathUnderCursor);
-			   	        		}
-			   	        	}
-		                    JPopupMenu menu = new JPopupMenu ();
-		                    JMenuItem priorityItem = new JMenuItem("EditPriorities");
-			         	    JMenuItem flexItem = new JMenuItem("AddFlex");
-			         	    
-							priorityItem.addActionListener(clicked -> {
-								Priority prio = null;
-								if (stateTree.getSelectionPaths() != null)
-									for (TreePath path : stateTree.getSelectionPaths()) {
-										Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
-												.getUserObject();
-										if (treeNodeUserObject instanceof ElementInfo) {
-											if (prio == null)
-												prio = (Priority) JOptionPane.showInputDialog(stateTree,
-														"Select the Priority:", "Priority?", JOptionPane.OK_OPTION,
-														new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)),
-														Priority.values(), "");
-											if (prio == null)
-												break;
-											ElementInfo eleInfo = (ElementInfo) treeNodeUserObject;
-											eleInfo.ele.setPriority(prio);
-											treeModel.reload((DefaultMutableTreeNode) path.getLastPathComponent());
-										}
-									}
-							});
-							flexItem.addActionListener(clicked -> {
-								TreePath path = stateTree.getSelectionPath();
-								if (path == null)
-									return;
-								Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
-										.getUserObject();
-								if (!(treeNodeUserObject instanceof ElementInfo))
-									return;
-								createAddDialog(((ElementInfo) treeNodeUserObject).ele);
-			   	        });
-			         	    
-		                    menu.add ( priorityItem );
-		                    menu.add ( flexItem );
-		                    menu.show ( stateTree, pathBounds.x, pathBounds.y + pathBounds.height );
-		                }else {
-		                	JPopupMenu menu = new JPopupMenu ();
-		                    menu.add ( new JMenuItem ( "Other Test" ) );
-		                    menu.show ( stateTree, e.getX(), e.getY() );
-		                }
-		            }
-		        }
-		    } );
-		selectedPanel = new JPanel(new BorderLayout());
-		selectedPanel.add(new JScrollPane(stateTree));
-	}
-
-
-	private void createNothingSelectedPanel() {
-		nothingSelectedPanel = new JPanel();
-		nothingSelectedPanel.setLayout(new BoxLayout(nothingSelectedPanel, BoxLayout.PAGE_AXIS));
-		JLabel nothingSelectedTextLabel = new JLabel("No HolonObject exist.");
-		nothingSelectedTextLabel.setForeground(Color.gray);
-		nothingSelectedTextLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
-		nothingSelectedPanel.add(Box.createVerticalGlue());
-		nothingSelectedPanel.add(nothingSelectedTextLabel);
-		nothingSelectedPanel.add(Box.createVerticalGlue());
-	}
-	
-	public void updateSelectedPanel() {
-		//UpdateFlexManager
-		flexmanager = controller.getSimManager().getActualFlexManager();
-		
-		listOfAllSelectedHolonObjects.removeAllChildren();
-		//Init with HolonObjects
-		for(AbstractCanvasObject aCps: model.getObjectsOnCanvas()) {
-			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
-			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
-			if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
-			listOfAllSelectedHolonObjects.add(newObjectChild);
-		}
-		treeModel.nodeStructureChanged(listOfAllSelectedHolonObjects);
-	
-		stateTree.revalidate();
-		expandAll(stateTree);
-		selectedPanel.revalidate();
-		contentPanel.setComponentAt(contentPanel.indexOfTab(gridTabString), selectedPanel);
-		contentPanel.revalidate();
-		this.revalidate();
-	}
-
-
-
-	private void expandAll(JTree tree) {
-		for(int i = 0; i< tree.getRowCount() ; i++) {
-			tree.expandRow(i);
-		}
-		
-	}
-
-
-
-	private void expandTreeUpperNode(GroupNode groupNode, DefaultMutableTreeNode root) {
-		for(AbstractCanvasObject aCps: groupNode.getNodes()) {
-			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
-			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
-			if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
-			root.add(newObjectChild);
-		}
-		
-	}
-
-
-
-	private void expandTreeHolonObject(HolonObject hObject, DefaultMutableTreeNode root) {
-		for(HolonElement hElement: hObject.getElements()) {
-			DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(new ElementInfo(hElement));
-			expandTreeFlex(hElement, newChild);
-			root.add(newChild);
-		}
-	}
-	private void expandTreeFlex(HolonElement hElement, DefaultMutableTreeNode root) {
-		for(Flexibility flex: hElement.flexList) {
-			FlexWrapper flexWrapper = this.flexmanager.getFlexWrapperFromFlexibility(flex);
-			String flexState = "";
-			if(flexWrapper != null) {
-				Color color = this.FlexStateToColor(flexWrapper.getState());
-				flexState = "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + flexWrapper.getState().name() + "</font>";
-			}
-			DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("<html>"+ flexState + " <b>" + flex.name+ "</b>" + "</html>");
-			root.add(newChild);
-		}
-	}
-	
-	
-	private void createDeleteDialog() {
-		
-		List<HolonObject> list= createListOfHolonObjects(model.getObjectsOnCanvas());
-		
-		//String test = list.stream().map(Object::toString).collect(Collectors.joining(","));
-		Object[] allFlexes = list.stream().flatMap(hObject -> hObject.getElements().stream()).flatMap(hElement -> hElement.flexList.stream()).toArray(size -> new Flexibility[size]);
-		if(allFlexes.length == 0) {
-			JOptionPane.showMessageDialog(this,
-					"No Flexibility exist.",
-					"Warning",
-					JOptionPane.WARNING_MESSAGE);
-			return;
-		}
-		
-		
-		
-		Flexibility toDeleteFlex =(Flexibility) JOptionPane.showInputDialog(this, "Select to Delete Flexibility:", "Flexibility?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , allFlexes, "");
-		if(toDeleteFlex != null) {
-			toDeleteFlex.getElement().flexList.remove(toDeleteFlex);
-			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
-			updateSelectedPanel();
-		}
-	}
-	
-	
-	
-	private List<HolonObject> createListOfHolonObjects(List<AbstractCanvasObject> objectsOnCanvas) {
-		List<HolonObject> list = new ArrayList<HolonObject>();
-		for(AbstractCanvasObject aCps :  objectsOnCanvas) {
-			if(aCps instanceof HolonObject) list.add((HolonObject) aCps);
-			else if (aCps instanceof GroupNode) list.addAll(createListOfHolonObjects(((GroupNode)aCps).getNodes()));
-		}
-		return list;
-	}
-
-
-
-	//Add Element
-	private void createAddDialog(HolonElement element){
-		if(model.getObjectsOnCanvas().isEmpty()) {
-			JOptionPane.showMessageDialog(this,
-					"No HolonObject exist.",
-					"Warning",
-					JOptionPane.WARNING_MESSAGE);
-			return;
-		}
-		JDialog addDialog = new JDialog();
-		addDialog.setTitle("Create Flexibility");
-		addDialog.setBounds(0, 0, 820, 400);	
-		addDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-		JPanel dialogPanel = new JPanel(new BorderLayout());
-		addDialog.setContentPane(dialogPanel);
-		JPanel selectionPanel = new JPanel(null);
-		dialogPanel.add(selectionPanel, BorderLayout.CENTER);
-		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-		dialogPanel.add(buttonPanel, BorderLayout.PAGE_END);
-		
-		
-		
-		
-		addDialog.setModalityType(ModalityType.APPLICATION_MODAL);
-		
-		
-
-		//Erstelle HolonObject AuswahlBox
-		HolonObject[] holonObjects = createListOfHolonObjects(model.getObjectsOnCanvas()).stream().toArray(HolonObject[]::new);
-
-		DefaultComboBoxModel<HolonObject> comboBoxModel = new DefaultComboBoxModel<HolonObject>( holonObjects );
-
-
-		JComboBox<HolonObject> holonObjectSelector = new JComboBox<HolonObject>(comboBoxModel);
-		holonObjectSelector.setBounds(10,30, 800, 30);
-		
-		DefaultComboBoxModel<HolonElement> comboBoxModelElements = new DefaultComboBoxModel<HolonElement>( holonObjects[0].getElements().stream().toArray(size -> new HolonElement[size]));
-		JComboBox<HolonElement> holonElementSelector  = new JComboBox<HolonElement>(comboBoxModelElements);
-		holonElementSelector.setBounds(10,80, 800, 30);
-		
-		
-		holonObjectSelector.addItemListener(aListener -> {
-			if(aListener.getStateChange() == ItemEvent.SELECTED) {
-				DefaultComboBoxModel<HolonElement> newComboBoxModelElements = new DefaultComboBoxModel<HolonElement>( ((HolonObject) aListener.getItem()).getElements().stream().toArray(size -> new HolonElement[size]));
-				holonElementSelector.setModel(newComboBoxModelElements);
-			}
-		});
-			
-		if(element == null) {
-			selectionPanel.add(holonObjectSelector);
-			selectionPanel.add(holonElementSelector);
-			JLabel selectObjectLabel = new JLabel("Select HolonObject:");
-			selectObjectLabel.setBounds(10, 10, 200, 20);
-			selectionPanel.add(selectObjectLabel);
-			JLabel selectElementLabel = new JLabel("Select HolonElement:");
-			selectElementLabel.setBounds(10, 60, 200, 20);
-			selectionPanel.add(selectElementLabel);
-		}
-		else {
-			JLabel selectElementLabel = new JLabel("Selected: " +element.toString());
-			selectElementLabel.setBounds(10, 60, 2000, 20);
-			selectionPanel.add(selectElementLabel);
-		}
-		
-		
-		
-		
-		
-		
-		JPanel flexAttributesBorderPanel = new  JPanel(null);
-		flexAttributesBorderPanel.setBounds(10, 120, 800, 200);
-		flexAttributesBorderPanel.setBorder(BorderFactory.createTitledBorder("Flexibility Attributes"));
-		selectionPanel.add(flexAttributesBorderPanel);	
-		JLabel flexNameLabel = new JLabel("Name:");
-		flexNameLabel.setBounds(10,20, 50, 20);
-		flexAttributesBorderPanel.add(flexNameLabel);
-		JFormattedTextField nameTextField = new JFormattedTextField(intermediateFlex.name);
-		nameTextField.addPropertyChangeListener(changed -> intermediateFlex.name = nameTextField.getText());
-		nameTextField.setBounds(80, 15, 200, 30);
-		flexAttributesBorderPanel.add(nameTextField);
-		JLabel flexSpeedLabel = new JLabel("Speed:");
-		flexSpeedLabel.setBounds(10,55, 50, 20);
-		flexAttributesBorderPanel.add(flexSpeedLabel);
-		//Integer formatter
-		NumberFormat format = NumberFormat.getIntegerInstance();
-		format.setGroupingUsed(false);
-		format.setParseIntegerOnly(true);
-		NumberFormatter integerFormatter = new NumberFormatter(format);
-		integerFormatter.setMinimum(0);
-		integerFormatter.setCommitsOnValidEdit(true);
-		
-		
-		JFormattedTextField speedTextField = new  JFormattedTextField(integerFormatter);
-		speedTextField.setValue(intermediateFlex.speed);
-		speedTextField.setToolTipText("Only positive Integer.");
-		speedTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.speed = Integer.parseInt(speedTextField.getValue().toString()));
-		speedTextField.setBounds(80, 50, 200, 30);
-		flexAttributesBorderPanel.add(speedTextField);
-		speedTextField.setEnabled(false);
-		
-		JLabel flexDurationLabel = new JLabel("Duration:");
-		flexDurationLabel.setBounds(10,90, 70, 20);
-		flexAttributesBorderPanel.add(flexDurationLabel);
-		
-		
-		NumberFormatter moreThenZeroIntegerFormater = new NumberFormatter(format);
-		moreThenZeroIntegerFormater.setMinimum(1);
-		moreThenZeroIntegerFormater.setCommitsOnValidEdit(true);
-		
-		JFormattedTextField durationTextField = new  JFormattedTextField(moreThenZeroIntegerFormater);
-		durationTextField.setValue(intermediateFlex.getDuration());
-		durationTextField.setToolTipText("Only positive Integer bigger then 0.");
-		durationTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setDuration(Integer.parseInt(durationTextField.getValue().toString())));
-		durationTextField.setBounds(80, 85, 200, 30);
-		flexAttributesBorderPanel.add(durationTextField);
-		
-		JLabel flexCostsLabel = new JLabel("Costs:");
-		flexCostsLabel.setBounds(10,125, 70, 20);
-		flexAttributesBorderPanel.add(flexCostsLabel);
-		
-		//Double Format:
-		NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
-		doubleFormat.setMinimumFractionDigits(1);
-		doubleFormat.setMaximumFractionDigits(2);
-		doubleFormat.setRoundingMode(RoundingMode.HALF_UP);
-
-		//CostFormatter:
-		NumberFormatter costsFormatter = new NumberFormatter(doubleFormat);
-		costsFormatter.setMinimum(0.0);
-		
-		JFormattedTextField costTextField = new JFormattedTextField(costsFormatter);
-		costTextField.setValue(intermediateFlex.cost);
-		costTextField.setToolTipText("Only non negative Double with DecimalSeperator Point('.').");
-		costTextField.addPropertyChangeListener(propertyChange -> intermediateFlex.cost = Float.parseFloat(costTextField.getValue().toString()));
-		costTextField.setBounds(80, 120, 200, 30);
-		flexAttributesBorderPanel.add(costTextField);
-		
-		
-		
-		JLabel flexCooldownLabel = new JLabel("Cooldown:");
-		flexCooldownLabel.setBounds(310,20, 70, 20);
-		flexAttributesBorderPanel.add(flexCooldownLabel);
-		
-		
-		JFormattedTextField cooldownTextField = new  JFormattedTextField(moreThenZeroIntegerFormater);
-		cooldownTextField.setValue(intermediateFlex.getCooldown());
-		cooldownTextField.setToolTipText("Only positive Integer.");
-		cooldownTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setCooldown(Integer.parseInt(cooldownTextField.getValue().toString())));
-		cooldownTextField.setBounds(380, 15, 200, 30);
-		flexAttributesBorderPanel.add(cooldownTextField);
-		
-		JCheckBox offeredCheckBox = new JCheckBox("Offered");
-		offeredCheckBox.setSelected(this.offered);
-		offeredCheckBox.setBounds(310, 55, 200, 20);
-		flexAttributesBorderPanel.add(offeredCheckBox);
-		
-		JCheckBox onConstrainCheckBox = new JCheckBox("On_Constrain");
-		onConstrainCheckBox.setSelected(this.onConstrain);
-		onConstrainCheckBox.setBounds(310, 80, 200, 20);
-		flexAttributesBorderPanel.add(onConstrainCheckBox);
-		
-		JCheckBox offConstrainCheckBox = new JCheckBox("Off_Constrain");
-		offConstrainCheckBox.setSelected(this.offConstrain);
-		offConstrainCheckBox.setBounds(310, 105, 200, 20);
-		flexAttributesBorderPanel.add(offConstrainCheckBox);
-		
-		
-		
-		
-		//Both cant be true....
-		onConstrainCheckBox.addActionListener(clicked -> {
-			if(onConstrainCheckBox.isSelected()) offConstrainCheckBox.setSelected(false);
-			});
-		offConstrainCheckBox.addActionListener(clicked -> {
-			if(offConstrainCheckBox.isSelected()) onConstrainCheckBox.setSelected(false);
-			});
-		
-		JButton createFlexButton = new JButton("Create");
-		createFlexButton.addActionListener(clicked -> {
-			//createFlexButton.requestFocus();
-			//createFlexButton.grabFocus();
-			HolonElement ele;
-			if(element ==null) {				
-				ele = (HolonElement) holonElementSelector.getSelectedItem();
-			}else {
-				ele =  element;
-			}
-			Flexibility toCreateFlex = new Flexibility(ele);
-			toCreateFlex.name = intermediateFlex.name;
-			toCreateFlex.speed = intermediateFlex.speed;
-			toCreateFlex.setDuration(intermediateFlex.getDuration());
-			toCreateFlex.cost = intermediateFlex.cost;
-			toCreateFlex.setCooldown(intermediateFlex.getCooldown());
-			toCreateFlex.offered=offeredCheckBox.isSelected();
-			if(onConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOnConstrain());
-			if(offConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOffConstrain());
-			
-			ele.flexList.add(toCreateFlex);
-			//save checkboxes
-			this.offered=offeredCheckBox.isSelected();
-			this.onConstrain = onConstrainCheckBox.isSelected();
-			this.offConstrain = offConstrainCheckBox.isSelected();
-			
-			
-			//if(!model.getSelectedCpsObjects().contains(holonObjectSelector.getSelectedItem()))model.getSelectedCpsObjects().add((AbstractCpsObject)holonObjectSelector.getSelectedItem());
-			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
-			
-			update();
-			addDialog.dispose();
-		});
-		buttonPanel.add(createFlexButton);
-		JButton cancelButton = new JButton("Cancel");
-		cancelButton.addActionListener(clicked -> {
-			addDialog.dispose();
-		});
-		buttonPanel.add(cancelButton);
-		
-		
-		
-		//last 
-		addDialog.setLocationRelativeTo(this);
-		addDialog.setVisible(true);
-	}
-	
-	
-	class ElementInfo {
-		HolonElement ele;
-		public ElementInfo(HolonElement ele) {
-			this.ele = ele;
-		}
-		@Override
-		public String toString() {
-			return ele.getEleName() + " Priority:" + ele.getPriority();
-		}
-	}
-	
-	public Color FlexStateToColor(FlexState state) {
-		switch(state) {
-		case IN_USE:
-			return new Color(173,247,182);
-		case NOT_OFFERED:
-			return new Color(252,245,199);
-		case OFFERED:
-			return new Color(160,206,217);
-		case ON_COOLDOWN:
-			return new Color(255,238,147);
-		case UNAVAILABLE:
-		default:
-			return new Color(255,192,159);
-		}
-	}
-	
-}
+package ui.view;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.Dialog.ModalityType;
+import java.awt.Dimension;
+import java.awt.event.ItemEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
+import java.math.RoundingMode;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JFormattedTextField;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTree;
+import javax.swing.SwingUtilities;
+import javax.swing.border.EmptyBorder;
+import javax.swing.text.NumberFormatter;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreePath;
+
+import classes.AbstractCanvasObject;
+import classes.Constrain;
+import classes.GroupNode;
+import classes.Flexibility;
+import classes.HolonElement;
+import classes.HolonElement.Priority;
+import classes.HolonObject;
+import ui.controller.Control;
+import ui.controller.FlexManager;
+import ui.controller.FlexManager.FlexState;
+import ui.controller.FlexManager.FlexWrapper;
+import ui.model.Model;
+import utility.ImageImport;
+
+
+public class FlexWindow extends JFrame {
+	private JPanel nothingSelectedPanel;
+	private JPanel selectedPanel;
+	
+	
+	private JTabbedPane contentPanel = new JTabbedPane();
+	private JScrollPane usageViewPanel;
+	
+	private Control controller;
+	private Model model;
+	
+	public boolean isClosed = false;
+	
+	//Flexibility Intermediate
+	private Flexibility intermediateFlex = new Flexibility(null);
+	private boolean offered = true, onConstrain = true, offConstrain =false;
+	
+	
+	
+	//JTree
+	private DefaultMutableTreeNode listOfAllSelectedHolonObjects;
+	private JTree stateTree;
+	private DefaultTreeModel treeModel;
+	private FlexManager flexmanager;
+	
+	//Tabs
+	String gridTabString = "Grid";
+	String orderTabString = "Order";
+	
+	//FlexToFlexWrapper()
+	
+	
+	
+	public FlexWindow(JFrame parentFrame, ui.controller.Control  controller){
+		this.intermediateFlex.name = "name";
+		this.controller = controller;
+		this.model = controller.getModel();
+		//InitWindow
+		createMenuBar();
+		initWindowPanel(parentFrame);
+		this.addWindowListener(new java.awt.event.WindowAdapter() {
+		    @Override
+		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
+		    	isClosed = true;
+		    }
+		});
+		updateSelectedPanel();
+		//this.pack();
+	}
+
+
+
+	private void initWindowPanel(JFrame parentFrame) {
+		this.setBounds(0, 0, 400, parentFrame.getHeight()>20?parentFrame.getHeight()- 20:parentFrame.getHeight());
+		this.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
+		this.setTitle("Flexibility");
+		this.setLocationRelativeTo(parentFrame);
+		this.setVisible(true);
+		//this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+		createNothingSelectedPanel();
+		createSelectedPanel();
+		createUsageViewPanel();
+		contentPanel.addTab(gridTabString, nothingSelectedPanel);
+		contentPanel.addTab(orderTabString, usageViewPanel);
+		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+		this.setContentPane(contentPanel);
+		this.revalidate();
+		
+	}
+
+	private void createMenuBar(){
+		JMenuBar menuBar = new JMenuBar();
+		JMenu canvas = new JMenu("Canvas");
+		menuBar.add(canvas);
+		JMenuItem updateMenuItem = new JMenuItem("Update");
+		updateMenuItem.addActionListener(clicked -> updateSelectedPanel());
+		canvas.add(updateMenuItem);
+		JMenu flex = new JMenu("Flex");
+		menuBar.add(flex);
+		JMenuItem addMenuItem = new JMenuItem("Add Flexibility");
+		addMenuItem.addActionListener(clicked -> createAddDialog(null));
+		flex.add(addMenuItem);
+		JMenuItem deleteMenuItem = new JMenuItem("Delete Flexibility");
+		deleteMenuItem.addActionListener(clicked -> createDeleteDialog());
+		flex.add(deleteMenuItem);
+		
+		this.setJMenuBar(menuBar);
+	}
+	
+	
+
+	
+	private void createUsageViewPanel() {
+		flexmanager = controller.getSimManager().getActualFlexManager();
+		//GridBagApprouch
+		JPanel gridbagPanel =  new JPanel(new GridBagLayout());
+		usageViewPanel = new JScrollPane(gridbagPanel);
+		gridbagPanel.setBackground(Color.white);
+		//5breit
+		FlexState[] titles = FlexState.values();
+		
+		
+		
+		for(int i = 0; i<5; i++){
+			
+			
+			
+			
+			List<FlexWrapper> listOfFlexWithState = flexmanager.getAllFlexWrapperWithState(titles[i]);
+			JLabel label = new JLabel(titles[i].toString() + "[" + listOfFlexWithState.size()+ "]");									
+			GridBagConstraints labelC = new GridBagConstraints();
+			labelC.gridx = 1;
+			labelC.gridy = i*2;
+			labelC.anchor = GridBagConstraints.LINE_START;
+			labelC.fill = GridBagConstraints.HORIZONTAL;
+			labelC.weightx = 0.5;
+			labelC.weighty = 0.0;
+			gridbagPanel.add(label, labelC);
+			
+			JPanel listPanel = new JPanel(new GridBagLayout());
+			createFlexPanel(listPanel, listOfFlexWithState);
+			GridBagConstraints panelC = new GridBagConstraints();
+			panelC.gridx = 0;
+			panelC.gridwidth = 2;
+			panelC.gridy = i*2 +1;
+			panelC.fill = GridBagConstraints.BOTH;
+			gridbagPanel.add(listPanel, panelC);
+
+			
+			
+			JButton expandButton = new JButton("-");
+			GridBagConstraints buttonC = new GridBagConstraints();
+			buttonC.gridx = 0;
+			buttonC.gridy = i*2;
+			gridbagPanel.add(expandButton, buttonC);
+			expandButton.addActionListener(clicked -> {
+				listPanel.setVisible(!listPanel.isVisible());
+				expandButton.setText(listPanel.isVisible()?"-":"+");
+			});
+			
+		}
+		//Add Spacer
+		JLabel spacer = new JLabel();
+		GridBagConstraints c = new GridBagConstraints();
+		c.gridx = 0;
+		c.gridy = 5*2;
+		c.fill = GridBagConstraints.VERTICAL;
+		c.weightx = 0.0;
+		c.weighty = 1;
+		gridbagPanel.add(spacer, c);
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+		
+		
+
+	}
+
+	
+
+
+	private void createFlexPanel(JPanel listPanel, List<FlexWrapper> flexWrapperList) {
+		listPanel.setBackground(Color.white);
+		
+		Insets insets = new Insets(2,2,2,2);
+		
+		//String[] flexesString = flexWrapperList.stream().map(flexWrapper -> flexWrapper.getFlex().name).toArray(String[]::new);
+		for(int i = 0; i < flexWrapperList.size(); i++) {
+			FlexWrapper actual = flexWrapperList.get(i);
+			GridBagConstraints c = new GridBagConstraints();
+			c.gridx = Math.floorMod(i, 5);
+			c.weightx = 0.0;	
+			c.insets = insets;
+			JButton labelButton = new JButton(actual.getFlex().name);
+			labelButton.setPreferredSize(new Dimension(70,70));
+			labelButton.setBorder(BorderFactory.createLineBorder(Color.black));
+			listPanel.add(labelButton, c);
+			labelButton.addActionListener(clicked ->{
+				actual.order();
+				controller.calculateStateAndVisualForCurrentTimeStep();
+				controller.updateCanvas();
+			});
+			labelButton.setToolTipText(createToolTipp(actual));
+		}
+		//AddSpacer
+		JLabel spacer = new JLabel();
+		GridBagConstraints c = new GridBagConstraints();
+		c.gridx = 5;
+		c.gridy = 0;
+		c.fill = GridBagConstraints.VERTICAL;
+		c.weightx = 1;
+		c.weighty = 0;
+	
+		listPanel.add(spacer, c);
+		
+	}
+
+
+	private String createToolTipp(FlexWrapper actual) {
+		String tooltipString = "<html>" +
+	"<b>" + actual.getFlex().name + "( </b>" + actual.getFlex().getElement().getName() + "<b> )</b><br>"
+	+ ((actual.remainingDuration() != 0)?"<i>Remaining Duration:"+ actual.remainingDuration()+"</i><br>":"") 
+	+ ((actual.remainingTimeTillActivation() != 0)?"<i>Remaining TimeTillActivation:"+ actual.remainingTimeTillActivation()+"</i><br>":"")
+	+ "Duration: " + actual.getFlex().getDuration()  + "<br>"
+	+ "Cooldown: " + actual.getFlex().getCooldown() + "<br>"
+	//+ "Speed: " + actual.getFlex().speed + "<br>"
+	+ "Cost: " + actual.getFlex().cost + "<br>"
+	+ "BrigtMir: " + actual.getFlex().bringtmir() + "<br>"
+	+ "Constrains: " + actual.getFlex().constrainList.stream().map(constrain -> constrain.getName()).collect(Collectors.joining( "," )) + "<br>"
+	+ "</html>";
+		
+		return tooltipString;
+	}
+
+
+
+	public void update() {
+		updateSelectedPanel();
+		createUsageViewPanel();
+		contentPanel.setComponentAt(contentPanel.indexOfTab(orderTabString), usageViewPanel);
+		contentPanel.revalidate();
+	}
+
+	
+	
+	
+	private void createSelectedPanel() {
+		//Liste aller Flexibilities
+		listOfAllSelectedHolonObjects = new DefaultMutableTreeNode("HolonObjects");
+		treeModel = new DefaultTreeModel(listOfAllSelectedHolonObjects);
+		stateTree = new JTree(treeModel);
+		stateTree.addMouseListener ( new MouseAdapter ()
+		    {
+		        public void mousePressed ( MouseEvent e )
+		        {
+		            if ( SwingUtilities.isRightMouseButton ( e ) )
+		            {
+		            	
+		            	
+		                TreePath pathUnderCursor = stateTree.getPathForLocation ( e.getX (), e.getY () );
+		                Rectangle pathBounds = stateTree.getUI ().getPathBounds ( stateTree, pathUnderCursor );
+		                if ( pathBounds != null && pathBounds.contains ( e.getX (), e.getY () ) )
+		                {
+		                	TreePath[] selectedPaths = stateTree.getSelectionPaths();
+			   	        	if(selectedPaths == null) {
+			   	        		stateTree.addSelectionPath(pathUnderCursor);
+			   	        	}else {
+			   	        		boolean isInselectedPaths = false;
+			   	        		for (TreePath path : stateTree.getSelectionPaths()) {
+			   	        			if(path.equals(pathUnderCursor)) {
+			   	        				isInselectedPaths = true;
+			   	        			}
+			   	        		}
+			   	        		if(!isInselectedPaths) {
+			   	        			stateTree.clearSelection();
+			   	        			stateTree.addSelectionPath(pathUnderCursor);
+			   	        		}
+			   	        	}
+		                    JPopupMenu menu = new JPopupMenu ();
+		                    JMenuItem priorityItem = new JMenuItem("EditPriorities");
+			         	    JMenuItem flexItem = new JMenuItem("AddFlex");
+			         	    
+							priorityItem.addActionListener(clicked -> {
+								Priority prio = null;
+								if (stateTree.getSelectionPaths() != null)
+									for (TreePath path : stateTree.getSelectionPaths()) {
+										Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
+												.getUserObject();
+										if (treeNodeUserObject instanceof ElementInfo) {
+											if (prio == null)
+												prio = (Priority) JOptionPane.showInputDialog(stateTree,
+														"Select the Priority:", "Priority?", JOptionPane.OK_OPTION,
+														new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)),
+														Priority.values(), "");
+											if (prio == null)
+												break;
+											ElementInfo eleInfo = (ElementInfo) treeNodeUserObject;
+											eleInfo.ele.setPriority(prio);
+											treeModel.reload((DefaultMutableTreeNode) path.getLastPathComponent());
+										}
+									}
+							});
+							flexItem.addActionListener(clicked -> {
+								TreePath path = stateTree.getSelectionPath();
+								if (path == null)
+									return;
+								Object treeNodeUserObject = ((DefaultMutableTreeNode) path.getLastPathComponent())
+										.getUserObject();
+								if (!(treeNodeUserObject instanceof ElementInfo))
+									return;
+								createAddDialog(((ElementInfo) treeNodeUserObject).ele);
+			   	        });
+			         	    
+		                    menu.add ( priorityItem );
+		                    menu.add ( flexItem );
+		                    menu.show ( stateTree, pathBounds.x, pathBounds.y + pathBounds.height );
+		                }else {
+		                	JPopupMenu menu = new JPopupMenu ();
+		                    menu.add ( new JMenuItem ( "Other Test" ) );
+		                    menu.show ( stateTree, e.getX(), e.getY() );
+		                }
+		            }
+		        }
+		    } );
+		selectedPanel = new JPanel(new BorderLayout());
+		selectedPanel.add(new JScrollPane(stateTree));
+	}
+
+
+	private void createNothingSelectedPanel() {
+		nothingSelectedPanel = new JPanel();
+		nothingSelectedPanel.setLayout(new BoxLayout(nothingSelectedPanel, BoxLayout.PAGE_AXIS));
+		JLabel nothingSelectedTextLabel = new JLabel("No HolonObject exist.");
+		nothingSelectedTextLabel.setForeground(Color.gray);
+		nothingSelectedTextLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
+		nothingSelectedPanel.add(Box.createVerticalGlue());
+		nothingSelectedPanel.add(nothingSelectedTextLabel);
+		nothingSelectedPanel.add(Box.createVerticalGlue());
+	}
+	
+	public void updateSelectedPanel() {
+		//UpdateFlexManager
+		flexmanager = controller.getSimManager().getActualFlexManager();
+		
+		listOfAllSelectedHolonObjects.removeAllChildren();
+		//Init with HolonObjects
+		for(AbstractCanvasObject aCps: model.getObjectsOnCanvas()) {
+			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
+			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
+			if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
+			listOfAllSelectedHolonObjects.add(newObjectChild);
+		}
+		treeModel.nodeStructureChanged(listOfAllSelectedHolonObjects);
+	
+		stateTree.revalidate();
+		expandAll(stateTree);
+		selectedPanel.revalidate();
+		contentPanel.setComponentAt(contentPanel.indexOfTab(gridTabString), selectedPanel);
+		contentPanel.revalidate();
+		this.revalidate();
+	}
+
+
+
+	private void expandAll(JTree tree) {
+		for(int i = 0; i< tree.getRowCount() ; i++) {
+			tree.expandRow(i);
+		}
+		
+	}
+
+
+
+	private void expandTreeUpperNode(GroupNode groupNode, DefaultMutableTreeNode root) {
+		for(AbstractCanvasObject aCps: groupNode.getNodes()) {
+			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
+			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
+			if(aCps instanceof GroupNode)expandTreeUpperNode((GroupNode)aCps, newObjectChild);
+			root.add(newObjectChild);
+		}
+		
+	}
+
+
+
+	private void expandTreeHolonObject(HolonObject hObject, DefaultMutableTreeNode root) {
+		for(HolonElement hElement: hObject.getElements()) {
+			DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(new ElementInfo(hElement));
+			expandTreeFlex(hElement, newChild);
+			root.add(newChild);
+		}
+	}
+	private void expandTreeFlex(HolonElement hElement, DefaultMutableTreeNode root) {
+		for(Flexibility flex: hElement.flexList) {
+			FlexWrapper flexWrapper = this.flexmanager.getFlexWrapperFromFlexibility(flex);
+			String flexState = "";
+			if(flexWrapper != null) {
+				Color color = this.FlexStateToColor(flexWrapper.getState());
+				flexState = "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + flexWrapper.getState().name() + "</font>";
+			}
+			DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("<html>"+ flexState + " <b>" + flex.name+ "</b>" + "</html>");
+			root.add(newChild);
+		}
+	}
+	
+	
+	private void createDeleteDialog() {
+		
+		List<HolonObject> list= createListOfHolonObjects(model.getObjectsOnCanvas());
+		
+		//String test = list.stream().map(Object::toString).collect(Collectors.joining(","));
+		Object[] allFlexes = list.stream().flatMap(hObject -> hObject.getElements().stream()).flatMap(hElement -> hElement.flexList.stream()).toArray(size -> new Flexibility[size]);
+		if(allFlexes.length == 0) {
+			JOptionPane.showMessageDialog(this,
+					"No Flexibility exist.",
+					"Warning",
+					JOptionPane.WARNING_MESSAGE);
+			return;
+		}
+		
+		
+		
+		Flexibility toDeleteFlex =(Flexibility) JOptionPane.showInputDialog(this, "Select to Delete Flexibility:", "Flexibility?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , allFlexes, "");
+		if(toDeleteFlex != null) {
+			toDeleteFlex.getElement().flexList.remove(toDeleteFlex);
+			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
+			updateSelectedPanel();
+		}
+	}
+	
+	
+	
+	private List<HolonObject> createListOfHolonObjects(List<AbstractCanvasObject> objectsOnCanvas) {
+		List<HolonObject> list = new ArrayList<HolonObject>();
+		for(AbstractCanvasObject aCps :  objectsOnCanvas) {
+			if(aCps instanceof HolonObject) list.add((HolonObject) aCps);
+			else if (aCps instanceof GroupNode) list.addAll(createListOfHolonObjects(((GroupNode)aCps).getNodes()));
+		}
+		return list;
+	}
+
+
+
+	//Add Element
+	private void createAddDialog(HolonElement element){
+		if(model.getObjectsOnCanvas().isEmpty()) {
+			JOptionPane.showMessageDialog(this,
+					"No HolonObject exist.",
+					"Warning",
+					JOptionPane.WARNING_MESSAGE);
+			return;
+		}
+		JDialog addDialog = new JDialog();
+		addDialog.setTitle("Create Flexibility");
+		addDialog.setBounds(0, 0, 820, 400);	
+		addDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+		JPanel dialogPanel = new JPanel(new BorderLayout());
+		addDialog.setContentPane(dialogPanel);
+		JPanel selectionPanel = new JPanel(null);
+		dialogPanel.add(selectionPanel, BorderLayout.CENTER);
+		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+		dialogPanel.add(buttonPanel, BorderLayout.PAGE_END);
+		
+		
+		
+		
+		addDialog.setModalityType(ModalityType.APPLICATION_MODAL);
+		
+		
+
+		//Erstelle HolonObject AuswahlBox
+		HolonObject[] holonObjects = createListOfHolonObjects(model.getObjectsOnCanvas()).stream().toArray(HolonObject[]::new);
+
+		DefaultComboBoxModel<HolonObject> comboBoxModel = new DefaultComboBoxModel<HolonObject>( holonObjects );
+
+
+		JComboBox<HolonObject> holonObjectSelector = new JComboBox<HolonObject>(comboBoxModel);
+		holonObjectSelector.setBounds(10,30, 800, 30);
+		
+		DefaultComboBoxModel<HolonElement> comboBoxModelElements = new DefaultComboBoxModel<HolonElement>( holonObjects[0].getElements().stream().toArray(size -> new HolonElement[size]));
+		JComboBox<HolonElement> holonElementSelector  = new JComboBox<HolonElement>(comboBoxModelElements);
+		holonElementSelector.setBounds(10,80, 800, 30);
+		
+		
+		holonObjectSelector.addItemListener(aListener -> {
+			if(aListener.getStateChange() == ItemEvent.SELECTED) {
+				DefaultComboBoxModel<HolonElement> newComboBoxModelElements = new DefaultComboBoxModel<HolonElement>( ((HolonObject) aListener.getItem()).getElements().stream().toArray(size -> new HolonElement[size]));
+				holonElementSelector.setModel(newComboBoxModelElements);
+			}
+		});
+			
+		if(element == null) {
+			selectionPanel.add(holonObjectSelector);
+			selectionPanel.add(holonElementSelector);
+			JLabel selectObjectLabel = new JLabel("Select HolonObject:");
+			selectObjectLabel.setBounds(10, 10, 200, 20);
+			selectionPanel.add(selectObjectLabel);
+			JLabel selectElementLabel = new JLabel("Select HolonElement:");
+			selectElementLabel.setBounds(10, 60, 200, 20);
+			selectionPanel.add(selectElementLabel);
+		}
+		else {
+			JLabel selectElementLabel = new JLabel("Selected: " +element.toString());
+			selectElementLabel.setBounds(10, 60, 2000, 20);
+			selectionPanel.add(selectElementLabel);
+		}
+		
+		
+		
+		
+		
+		
+		JPanel flexAttributesBorderPanel = new  JPanel(null);
+		flexAttributesBorderPanel.setBounds(10, 120, 800, 200);
+		flexAttributesBorderPanel.setBorder(BorderFactory.createTitledBorder("Flexibility Attributes"));
+		selectionPanel.add(flexAttributesBorderPanel);	
+		JLabel flexNameLabel = new JLabel("Name:");
+		flexNameLabel.setBounds(10,20, 50, 20);
+		flexAttributesBorderPanel.add(flexNameLabel);
+		JFormattedTextField nameTextField = new JFormattedTextField(intermediateFlex.name);
+		nameTextField.addPropertyChangeListener(changed -> intermediateFlex.name = nameTextField.getText());
+		nameTextField.setBounds(80, 15, 200, 30);
+		flexAttributesBorderPanel.add(nameTextField);
+		JLabel flexSpeedLabel = new JLabel("Speed:");
+		flexSpeedLabel.setBounds(10,55, 50, 20);
+		flexAttributesBorderPanel.add(flexSpeedLabel);
+		//Integer formatter
+		NumberFormat format = NumberFormat.getIntegerInstance();
+		format.setGroupingUsed(false);
+		format.setParseIntegerOnly(true);
+		NumberFormatter integerFormatter = new NumberFormatter(format);
+		integerFormatter.setMinimum(0);
+		integerFormatter.setCommitsOnValidEdit(true);
+		
+		
+		JFormattedTextField speedTextField = new  JFormattedTextField(integerFormatter);
+		speedTextField.setValue(intermediateFlex.speed);
+		speedTextField.setToolTipText("Only positive Integer.");
+		speedTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.speed = Integer.parseInt(speedTextField.getValue().toString()));
+		speedTextField.setBounds(80, 50, 200, 30);
+		flexAttributesBorderPanel.add(speedTextField);
+		speedTextField.setEnabled(false);
+		
+		JLabel flexDurationLabel = new JLabel("Duration:");
+		flexDurationLabel.setBounds(10,90, 70, 20);
+		flexAttributesBorderPanel.add(flexDurationLabel);
+		
+		
+		NumberFormatter moreThenZeroIntegerFormater = new NumberFormatter(format);
+		moreThenZeroIntegerFormater.setMinimum(1);
+		moreThenZeroIntegerFormater.setCommitsOnValidEdit(true);
+		
+		JFormattedTextField durationTextField = new  JFormattedTextField(moreThenZeroIntegerFormater);
+		durationTextField.setValue(intermediateFlex.getDuration());
+		durationTextField.setToolTipText("Only positive Integer bigger then 0.");
+		durationTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setDuration(Integer.parseInt(durationTextField.getValue().toString())));
+		durationTextField.setBounds(80, 85, 200, 30);
+		flexAttributesBorderPanel.add(durationTextField);
+		
+		JLabel flexCostsLabel = new JLabel("Costs:");
+		flexCostsLabel.setBounds(10,125, 70, 20);
+		flexAttributesBorderPanel.add(flexCostsLabel);
+		
+		//Double Format:
+		NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
+		doubleFormat.setMinimumFractionDigits(1);
+		doubleFormat.setMaximumFractionDigits(2);
+		doubleFormat.setRoundingMode(RoundingMode.HALF_UP);
+
+		//CostFormatter:
+		NumberFormatter costsFormatter = new NumberFormatter(doubleFormat);
+		costsFormatter.setMinimum(0.0);
+		
+		JFormattedTextField costTextField = new JFormattedTextField(costsFormatter);
+		costTextField.setValue(intermediateFlex.cost);
+		costTextField.setToolTipText("Only non negative Double with DecimalSeperator Point('.').");
+		costTextField.addPropertyChangeListener(propertyChange -> intermediateFlex.cost = Float.parseFloat(costTextField.getValue().toString()));
+		costTextField.setBounds(80, 120, 200, 30);
+		flexAttributesBorderPanel.add(costTextField);
+		
+		
+		
+		JLabel flexCooldownLabel = new JLabel("Cooldown:");
+		flexCooldownLabel.setBounds(310,20, 70, 20);
+		flexAttributesBorderPanel.add(flexCooldownLabel);
+		
+		
+		JFormattedTextField cooldownTextField = new  JFormattedTextField(moreThenZeroIntegerFormater);
+		cooldownTextField.setValue(intermediateFlex.getCooldown());
+		cooldownTextField.setToolTipText("Only positive Integer.");
+		cooldownTextField.addPropertyChangeListener(actionEvent -> intermediateFlex.setCooldown(Integer.parseInt(cooldownTextField.getValue().toString())));
+		cooldownTextField.setBounds(380, 15, 200, 30);
+		flexAttributesBorderPanel.add(cooldownTextField);
+		
+		JCheckBox offeredCheckBox = new JCheckBox("Offered");
+		offeredCheckBox.setSelected(this.offered);
+		offeredCheckBox.setBounds(310, 55, 200, 20);
+		flexAttributesBorderPanel.add(offeredCheckBox);
+		
+		JCheckBox onConstrainCheckBox = new JCheckBox("On_Constrain");
+		onConstrainCheckBox.setSelected(this.onConstrain);
+		onConstrainCheckBox.setBounds(310, 80, 200, 20);
+		flexAttributesBorderPanel.add(onConstrainCheckBox);
+		
+		JCheckBox offConstrainCheckBox = new JCheckBox("Off_Constrain");
+		offConstrainCheckBox.setSelected(this.offConstrain);
+		offConstrainCheckBox.setBounds(310, 105, 200, 20);
+		flexAttributesBorderPanel.add(offConstrainCheckBox);
+		
+		
+		
+		
+		//Both cant be true....
+		onConstrainCheckBox.addActionListener(clicked -> {
+			if(onConstrainCheckBox.isSelected()) offConstrainCheckBox.setSelected(false);
+			});
+		offConstrainCheckBox.addActionListener(clicked -> {
+			if(offConstrainCheckBox.isSelected()) onConstrainCheckBox.setSelected(false);
+			});
+		
+		JButton createFlexButton = new JButton("Create");
+		createFlexButton.addActionListener(clicked -> {
+			//createFlexButton.requestFocus();
+			//createFlexButton.grabFocus();
+			HolonElement ele;
+			if(element ==null) {				
+				ele = (HolonElement) holonElementSelector.getSelectedItem();
+			}else {
+				ele =  element;
+			}
+			Flexibility toCreateFlex = new Flexibility(ele);
+			toCreateFlex.name = intermediateFlex.name;
+			toCreateFlex.speed = intermediateFlex.speed;
+			toCreateFlex.setDuration(intermediateFlex.getDuration());
+			toCreateFlex.cost = intermediateFlex.cost;
+			toCreateFlex.setCooldown(intermediateFlex.getCooldown());
+			toCreateFlex.offered=offeredCheckBox.isSelected();
+			if(onConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOnConstrain());
+			if(offConstrainCheckBox.isSelected())toCreateFlex.constrainList.add(Constrain.createOffConstrain());
+			
+			ele.flexList.add(toCreateFlex);
+			//save checkboxes
+			this.offered=offeredCheckBox.isSelected();
+			this.onConstrain = onConstrainCheckBox.isSelected();
+			this.offConstrain = offConstrainCheckBox.isSelected();
+			
+			
+			//if(!model.getSelectedCpsObjects().contains(holonObjectSelector.getSelectedItem()))model.getSelectedCpsObjects().add((AbstractCpsObject)holonObjectSelector.getSelectedItem());
+			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
+			
+			update();
+			addDialog.dispose();
+		});
+		buttonPanel.add(createFlexButton);
+		JButton cancelButton = new JButton("Cancel");
+		cancelButton.addActionListener(clicked -> {
+			addDialog.dispose();
+		});
+		buttonPanel.add(cancelButton);
+		
+		
+		
+		//last 
+		addDialog.setLocationRelativeTo(this);
+		addDialog.setVisible(true);
+	}
+	
+	
+	class ElementInfo {
+		HolonElement ele;
+		public ElementInfo(HolonElement ele) {
+			this.ele = ele;
+		}
+		@Override
+		public String toString() {
+			return ele.getName() + " Priority:" + ele.getPriority();
+		}
+	}
+	
+	public Color FlexStateToColor(FlexState state) {
+		switch(state) {
+		case IN_USE:
+			return new Color(173,247,182);
+		case NOT_OFFERED:
+			return new Color(252,245,199);
+		case OFFERED:
+			return new Color(160,206,217);
+		case ON_COOLDOWN:
+			return new Color(255,238,147);
+		case UNAVAILABLE:
+		default:
+			return new Color(255,192,159);
+		}
+	}
+	
+}

+ 4 - 4
src/ui/view/GUI.java

@@ -1054,7 +1054,7 @@ public class GUI{
 					HolonElement ele = addElementPopUp.getElement();
 					if (ele != null) {
 						controller.addElementCanvasObject(
-								tempCpsObject.getId(), ele.getEleName(),
+								tempCpsObject.getId(), ele.getName(),
 								ele.getAmount(), ele.getEnergyPerElement(),
 								ele.getId());
 					}
@@ -1149,9 +1149,9 @@ public class GUI{
 							selectedElements.add(ele);
 							if (!holonEleNamesDisplayed.equals("None")) {
 								holonEleNamesDisplayed = holonEleNamesDisplayed
-										+ "; " + ele.getEleName() + " ";
+										+ "; " + ele.getName() + " ";
 							} else {
-								holonEleNamesDisplayed = ele.getEleName() + " ";
+								holonEleNamesDisplayed = ele.getName() + " ";
 							}
 							updateUnitGraph((GraphEditable)selectedElements.get(selectedElements.size()-1));
 						}
@@ -1164,7 +1164,7 @@ public class GUI{
 						selectedElements.add(ele);
 						updCon.getActualHolonElement(null, yValueElements, 1,
 								tables);
-						holonEleNamesDisplayed = ele.getEleName() + " ";
+						holonEleNamesDisplayed = ele.getName() + " ";
 						updateUnitGraph((GraphEditable)selectedElements.get(selectedElements.size()-1));
 					}
 				} else {

+ 0 - 87
src/ui/view/outliner/HolonTreeModel.java

@@ -1,87 +0,0 @@
-package ui.view.outliner;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.swing.event.TreeModelListener;
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreePath;
-
-import classes.Holon;
-
-public class HolonTreeModel implements TreeModel {
-	Holon root;
-
-	public HolonTreeModel(Holon root) {
-		this.root = root;
-	}
-	// The model knows how to return the root object of the tree 
-	@Override
-	public Object getRoot() { 
-		return root; 
-	} 
-	
-	
-	public void reload() {
-		this.notifyAll();
-	}
-	// Tell JTree whether an object in the tree is a leaf 
-	@Override
-	public boolean isLeaf(Object node) { 
-		return ((Holon)node).getChildCount() == 0; 
-	} 
-	// Tell JTree how many children a node has 
-	@Override
-	public int getChildCount(Object parent) {
-		return ((Holon)parent).getChildCount(); 
-	} 
-	// Fetch any numbered child of a node for the JTree. 
-	// Our model returns File objects for all nodes in the tree. The 
-	// JTree displays these by calling the File.toString() method.
-	@Override
-	public Object getChild(Object parent, int index) { 
-		List<Holon> children = ((Holon)parent).getChildView(); 
-		if ((children == null) || (index >= children.size())) return null; 
-		return children.get(index); 
-	} 
-	// Figure out a child's position in its parent node. 
-	@Override
-	public int getIndexOfChild(Object parent, Object child) { 
-		List<Holon> children = ((Holon)parent).getChildView(); 
-		if (children == null) return -1;
-		for(int i = 0; i < children.size(); i++) {
-			if (child.equals(children.get(i))) return i;
-		} 
-		return -1; 
-	} 
-	// This method is invoked by the JTree only for editable trees. 
-	// This TreeModel does not allow editing, so we do not implement 
-	// this method. The JTree editable property is false by default. 
-	@Override
-	public void valueForPathChanged(TreePath path, Object newvalue) {} 
-	// Since this is not an editable tree model, we never fire any events, 
-	// so we don't actually have to keep track of interested listeners 
-	@Override
-	public void addTreeModelListener(TreeModelListener l) {
-		
-	} 
-	@Override
-	public void removeTreeModelListener(TreeModelListener l) {
-		
-	}
-	public void removeNodeFromParent(Holon holon) {
-		if(holon.getParent() != null) {
-			Holon cParent = holon.getParent();
-			System.out.println("REMOVE Parent:"+ cParent + ":" + cParent.getChildView().stream().map(Object::toString).collect(Collectors.joining(", ")));
-			holon.getParent().removeChildHolon(holon);
-			System.out.println("REMOVE Parent:"+ cParent + ":" + cParent.getChildView().stream().map(Object::toString).collect(Collectors.joining(", ")));
-		}
-	}
-	public void insertNodeInto(Holon holon, Holon parent, int index) {
-		System.out.println("INSERT Parent:"+ parent + ":" + parent.getChildView().stream().map(Object::toString).collect(Collectors.joining(", ")));
-		parent.addChildHolon(holon, index);
-		System.out.println("INSERT Parent:"+ parent + ":" + parent.getChildView().stream().map(Object::toString).collect(Collectors.joining(", ")));
-		
-	} 
-
-}

+ 0 - 216
src/ui/view/outliner/HolonTreeTransferHandler.java

@@ -1,216 +0,0 @@
-package ui.view.outliner;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.JComponent;
-import javax.swing.JTree;
-import javax.swing.TransferHandler;
-import javax.swing.tree.TreePath;
-
-import classes.Holon;
-
-
-class HolonTreeTransferHandler extends TransferHandler {
-    DataFlavor nodesFlavor;
-    DataFlavor[] flavors = new DataFlavor[1];
-    Holon[] nodesToRemove;
-
-    public HolonTreeTransferHandler() {
-        try {
-            String mimeType = DataFlavor.javaJVMLocalObjectMimeType +
-                              ";class=\"" +
-                classes.Holon.class.getName() +
-                              "\"";
-            nodesFlavor = new DataFlavor(mimeType);
-            flavors[0] = nodesFlavor;
-        } catch(ClassNotFoundException e) {
-            System.out.println("ClassNotFound: " + e.getMessage());
-        }
-    }
-
-    public boolean canImport(TransferHandler.TransferSupport support) {
-        if(!support.isDrop()) {
-            return false;
-        }
-        support.setShowDropLocation(true);
-        if(!support.isDataFlavorSupported(nodesFlavor)) {
-            return false;
-        }
-        // Do not allow a drop on the drag source selections.
-        JTree.DropLocation dl =
-                (JTree.DropLocation)support.getDropLocation();
-        JTree tree = (JTree)support.getComponent();
-        int dropRow = tree.getRowForPath(dl.getPath());
-        int[] selRows = tree.getSelectionRows();
-        for(int i = 0; i < selRows.length; i++) {
-            if(selRows[i] == dropRow) {
-                return false;
-            }
-        }
-        // Do not allow MOVE-action drops if a non-leaf node is
-        // selected unless all of its children are also selected.
-        int action = support.getDropAction();
-        if(action == MOVE) {
-            return haveCompleteNode(tree);
-        }
-        // Do not allow a non-leaf node to be copied to a level
-        // which is less than its source level.
-        TreePath dest = dl.getPath();
-        Holon target =
-            (Holon)dest.getLastPathComponent();
-        TreePath path = tree.getPathForRow(selRows[0]);
-        Holon firstNode =
-            (Holon)path.getLastPathComponent();
-        if(firstNode.getChildCount() > 0 &&
-               target.getLevel() < firstNode.getLevel()) {
-            return false;
-        }
-        return true;
-    }
-
-    private boolean haveCompleteNode(JTree tree) {
-        int[] selRows = tree.getSelectionRows();
-        TreePath path = tree.getPathForRow(selRows[0]);
-        Holon first =
-            (Holon)path.getLastPathComponent();
-        int childCount = first.getChildCount();
-        // first has children and no children are selected.
-        if(childCount > 0 && selRows.length == 1)
-            return false;
-        // first may have children.
-        for(int i = 1; i < selRows.length; i++) {
-            path = tree.getPathForRow(selRows[i]);
-            Holon next =
-                (Holon)path.getLastPathComponent();
-            if(first.getChildView().contains(next)) {
-                // Found a child of first.
-                if(childCount > selRows.length-1) {
-                    // Not all children of first are selected.
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    protected Transferable createTransferable(JComponent c) {
-        JTree tree = (JTree)c;
-        TreePath[] paths = tree.getSelectionPaths();
-        if(paths != null) {
-            // Make up a node array of copies for transfer and
-            // another for/of the nodes that will be removed in
-            // exportDone after a successful drop.
-            List<Holon> copies =
-                new ArrayList<Holon>();
-            List<Holon> toRemove =
-                new ArrayList<Holon>();
-            Holon node =
-                (Holon)paths[0].getLastPathComponent();
-            Holon copy = node.cloneWithoutParent();
-            copies.add(copy);
-            toRemove.add(node);
-            for(int i = 1; i < paths.length; i++) {
-                Holon next =
-                    (Holon)paths[i].getLastPathComponent();
-                // Do not allow higher level nodes to be added to list.
-                if(next.getLevel() < node.getLevel()) {
-                    break;
-                } else if(next.getLevel() > node.getLevel()) {  // child node
-                    copy.addChildHolon(next.cloneWithoutParent());
-                    // node already contains child
-                } else {                                        // sibling
-                    copies.add(next.cloneWithoutParent());
-                    toRemove.add(next);
-                }
-            }
-            Holon[] nodes =
-                copies.toArray(new Holon[copies.size()]);
-            nodesToRemove =
-                toRemove.toArray(new Holon[toRemove.size()]);
-            return new NodesTransferable(nodes);
-        }
-        return null;
-    }
-
-    protected void exportDone(JComponent source, Transferable data, int action) {
-        if((action & MOVE) == MOVE) {
-            JTree tree = (JTree)source;
-            HolonTreeModel model = (HolonTreeModel)tree.getModel();
-            // Remove nodes saved in nodesToRemove in createTransferable.
-            for(int i = 0; i < nodesToRemove.length; i++) {
-                model.removeNodeFromParent(nodesToRemove[i]);
-            }
-            tree.updateUI();
-        }
-    }
-
-    public int getSourceActions(JComponent c) {
-        return COPY_OR_MOVE;
-    }
-
-    public boolean importData(TransferHandler.TransferSupport support) {
-        if(!canImport(support)) {
-            return false;
-        }
-        // Extract transfer data.
-        Holon[] nodes = null;
-        try {
-            Transferable t = support.getTransferable();
-            nodes = (Holon[])t.getTransferData(nodesFlavor);
-        } catch(UnsupportedFlavorException ufe) {
-            System.out.println("UnsupportedFlavor: " + ufe.getMessage());
-        } catch(java.io.IOException ioe) {
-            System.out.println("I/O error: " + ioe.getMessage());
-        }
-        // Get drop location info.
-        JTree.DropLocation dl =
-                (JTree.DropLocation)support.getDropLocation();
-        int childIndex = dl.getChildIndex();
-        TreePath dest = dl.getPath();
-        Holon parent =
-            (Holon)dest.getLastPathComponent();
-        JTree tree = (JTree)support.getComponent();
-        HolonTreeModel model = (HolonTreeModel)tree.getModel();
-        // Configure for drop mode.
-        int index = childIndex;    // DropMode.INSERT
-        if(childIndex == -1) {     // DropMode.ON
-            index = parent.getChildCount();
-        }
-        // Add data to model.
-        for(int i = 0; i < nodes.length; i++) {
-            model.insertNodeInto(nodes[i], parent, index++);
-        }
-        return true;
-    }
-
-    public String toString() {
-        return getClass().getName();
-    }
-
-    public class NodesTransferable implements Transferable {
-        Holon[] nodes;
-
-        public NodesTransferable(Holon[] nodes) {
-            this.nodes = nodes;
-         }
-
-        public Object getTransferData(DataFlavor flavor)
-                                 throws UnsupportedFlavorException {
-            if(!isDataFlavorSupported(flavor))
-                throw new UnsupportedFlavorException(flavor);
-            return nodes;
-        }
-
-        public DataFlavor[] getTransferDataFlavors() {
-            return flavors;
-        }
-
-        public boolean isDataFlavorSupported(DataFlavor flavor) {
-            return nodesFlavor.equals(flavor);
-        }
-    }
-}

+ 305 - 6
src/ui/view/outliner/HolonView.java

@@ -1,13 +1,30 @@
 package ui.view.outliner;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
 
 import javax.swing.DropMode;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
 import javax.swing.JPanel;
 import javax.swing.JTree;
+import javax.swing.ToolTipManager;
+import javax.swing.TransferHandler;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreePath;
 import javax.swing.tree.TreeSelectionModel;
 
+import classes.Holon;
+import classes.HolonElement;
 import ui.controller.Control;
+import utility.ImageImport;
 /**
  * An Outliner Tab.
  * A high level view on the Model with respect to the Holon Structure. 
@@ -17,21 +34,303 @@ import ui.controller.Control;
 public class HolonView extends JPanel{
 	private Control control; 
 	private JTree tree;
+	private DefaultMutableTreeNode root;
 	public HolonView(Outliner parent, Control control) {
 		this.control = control;
 		this.setLayout(new BorderLayout());
 		initilizePanel();
-		parent.outlinerUpdate.addListener(() -> tree.updateUI());
+		parent.outlinerUpdate.addListener(() -> updateTreeStructure());
 	}
 
 	private void initilizePanel() {
-		HolonTreeModel model = new HolonTreeModel(control.getModel().getStateHolon()); 
-		tree = new JTree(model);
+		tree = generateTree();
+		tree.setCellRenderer(new HolonJtreeRenderer());
 		tree.setDragEnabled(true);
         tree.setDropMode(DropMode.ON_OR_INSERT);
-        tree.setTransferHandler(new HolonTreeTransferHandler());
+        tree.setTransferHandler(new HolonTransferHandler());
         tree.getSelectionModel().setSelectionMode(
-                TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
-		this.add(TreeUtils.makePanelFromTree(tree, true));
+                TreeSelectionModel.SINGLE_TREE_SELECTION);
+        ToolTipManager.sharedInstance().registerComponent(tree);
+        TreeUtils.expand(tree);
+        tree.setRootVisible(true);
+		this.add(TreeUtils.makePanelFromTree(tree));
 	}
+	
+	
+	private JTree generateTree() {
+		root = generateFromHolon(control.getModel().getStateHolon());
+		return new JTree(root);
+	}
+	
+	private DefaultMutableTreeNode generateFromHolon(Holon holon) {
+		DefaultMutableTreeNode node = new DefaultMutableTreeNode(new HolonInfo(holon));
+		for(Holon child : holon.getChildView()) {
+			node.add(generateFromHolon(child));
+		}
+		for(HolonElement ele : holon.getElementView()) {
+			node.add(new DefaultMutableTreeNode(new ElementInfo(ele)));
+		}
+		return node;
+	}
+	private void updateTreeStructure() {
+		root.removeAllChildren();
+		Holon holon = control.getModel().getStateHolon();
+		for(Holon child : holon.getChildView()) {
+			root.add(generateFromHolon(child));
+		}
+		for(HolonElement ele : holon.getElementView()) {
+			root.add(new DefaultMutableTreeNode(new ElementInfo(ele)));
+		}
+		tree.updateUI();
+		TreeUtils.expand(tree);
+	}
+	
+	interface HolonNode{
+		public Transferable getTransferable(HolonTransferHandler handler);
+		public Icon getIcon(); 
+		public String getToolTip();
+	}
+	static final Icon elementIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/element.png",16,16));
+	static final String elementToolTip = "Element";
+	class ElementInfo implements HolonNode{
+		private HolonElement element;
+		ElementInfo(HolonElement element){
+			this.element = element;
+		}
+		@Override
+		public String toString(){
+			return element.getName();
+		}
+		
+		public HolonElement getElement()
+		{
+			return element;
+		}
+		@Override
+		public Transferable getTransferable(HolonTransferHandler handler) {
+			return handler.new ElementTransferable(element);
+		}
+		@Override
+		public Icon getIcon() {
+			return elementIcon;
+		}
+		@Override
+		public String getToolTip() {
+			return elementToolTip;
+		}
+	}
+	static final Icon holonIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/holon.png",16,16));
+	static final String holonToolTip = "Holon";
+	class HolonInfo implements HolonNode{
+		private Holon holon;
+		HolonInfo(Holon holon){
+			this.holon = holon;
+		}
+		@Override
+		public String toString(){
+			return holon.name;
+		}
+		
+		public Holon getElement()
+		{
+			return holon;
+		}
+		
+		public void AddElement(HolonElement element) {
+			if(element.holon != null) {
+				element.holon.removeElement(element);
+			}
+			holon.addElement(element);
+		}
+		public void AddHolon(Holon holon) {
+			holon.removeFromParent();
+			this.holon.addChild(holon);
+		}
+		@Override
+		public Transferable getTransferable(HolonTransferHandler handler) {
+			return  handler.new HolonTransferable(holon);
+		}
+		@Override
+		public Icon getIcon() {
+			return holonIcon;
+		}
+		@Override
+		public String getToolTip() {
+			return holonToolTip;
+		}
+		
+	}
+	
+	
+	class HolonTransferHandler extends TransferHandler{
+		DataFlavor holonFlavor;		
+		DataFlavor[] holonFlavorArray = new DataFlavor[1]; 
+		DataFlavor elementFlavor;
+		DataFlavor[] elementFlavorArray = new DataFlavor[1]; 
+		HolonTransferHandler(){
+			try {
+				String mimeType = DataFlavor.javaJVMLocalObjectMimeType +
+                        ";class=\"" +
+                        classes.Holon.class.getName() +
+                        "\"";
+				holonFlavor = new DataFlavor(mimeType);
+				holonFlavorArray[0] = holonFlavor; 
+				mimeType = DataFlavor.javaJVMLocalObjectMimeType +
+                        ";class=\"" +
+                        classes.HolonElement.class.getName() +
+                        "\"";
+				elementFlavor = new DataFlavor(mimeType);
+				elementFlavorArray[0] = elementFlavor; 
+			} catch (ClassNotFoundException e) {
+				e.printStackTrace();
+			}
+		}
+		@Override 
+		public boolean canImport(TransferHandler.TransferSupport support) {
+		        if(!support.isDrop()) {
+		            return false;
+		        }
+		        support.setShowDropLocation(true);
+		        //Only accept Element and Holon as Drop
+		        if(!support.isDataFlavorSupported(holonFlavor) &&  !support.isDataFlavorSupported(elementFlavor)) {
+		            return false;
+		        }
+		        JTree.DropLocation location = (JTree.DropLocation)support.getDropLocation();
+		        TreePath pathDrop = location.getPath();
+		        DefaultMutableTreeNode node = (DefaultMutableTreeNode) pathDrop.getLastPathComponent();
+		        //Element cannot be parent of a holon
+		        if(!(node.getUserObject() instanceof HolonInfo)) {
+		        	return false;
+		        }
+		        //Dont allow Cycles
+		        JTree tree = (JTree) support.getComponent();
+		        TreePath pathDrag = tree.getSelectionPath();
+		        if(pathDrag.isDescendant(pathDrop)) {
+		        	return false;
+		        }
+		        return true;
+	    }
+		@Override 
+		public boolean importData(TransferHandler.TransferSupport support) {
+		        if(!canImport(support)) {
+		            return false;
+		        }
+		        JTree.DropLocation location = (JTree.DropLocation)support.getDropLocation();
+		        TreePath path = location.getPath();
+		        DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
+		        if(node.getUserObject() instanceof HolonInfo) {
+		        	
+		        	HolonInfo info = (HolonInfo) node.getUserObject();
+		        	try {
+		        		if(support.isDataFlavorSupported(holonFlavor)) {
+		        			info.AddHolon((Holon) support.getTransferable().getTransferData(holonFlavor));
+		        		}else if (support.isDataFlavorSupported(elementFlavor)){
+		        			info.AddElement((HolonElement) support.getTransferable().getTransferData(elementFlavor));
+		        		}
+		        		
+					} catch (UnsupportedFlavorException | IOException e) {
+						e.printStackTrace();
+					}
+		        }
+				return false;
+		}
+		protected void exportDone(JComponent source,
+                Transferable data,
+                int action) {
+			updateTreeStructure();
+		}
+		
+		@Override
+		public int getSourceActions(JComponent c) {
+		        return MOVE;
+	    }
+		@Override
+		protected Transferable createTransferable(JComponent c) {
+	        JTree tree = (JTree)c;
+	        TreePath path = tree.getSelectionPath();
+	        if(path != null) {
+	        	DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
+	        	Object userObject =	node.getUserObject();
+	        	if(userObject instanceof HolonNode) {
+	        		return ((HolonNode) userObject).getTransferable(this);
+	        		
+	        	}
+	        }
+	        return null;
+	    }
+		
+		public class HolonTransferable implements Transferable{
+			Holon holon;
+			
+			
+			public HolonTransferable(Holon holon) {
+				this.holon = holon;
+			}
+			@Override
+			public DataFlavor[] getTransferDataFlavors() {
+				return holonFlavorArray;
+			}
+
+			@Override
+			public boolean isDataFlavorSupported(DataFlavor flavor) {
+				return holonFlavor.equals(flavor);
+			}
+
+			@Override
+			public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+				 if(!isDataFlavorSupported(flavor))
+		                throw new UnsupportedFlavorException(flavor);
+	            return holon;
+			}
+			
+		}
+		public class ElementTransferable implements Transferable{
+			HolonElement element;
+			
+			
+			public ElementTransferable(HolonElement element) {
+				this.element = element;
+			}
+			@Override
+			public DataFlavor[] getTransferDataFlavors() {
+				return elementFlavorArray;
+			}
+
+			@Override
+			public boolean isDataFlavorSupported(DataFlavor flavor) {
+				return elementFlavor.equals(flavor);
+			}
+
+			@Override
+			public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+				 if(!isDataFlavorSupported(flavor))
+		                throw new UnsupportedFlavorException(flavor);
+	            return element;
+			}
+			
+		}
+	} 
+	
+	
+	class HolonJtreeRenderer extends DefaultTreeCellRenderer {
+
+	    public Component getTreeCellRendererComponent(
+	                        JTree tree,
+	                        Object value,
+	                        boolean isSelected,
+	                        boolean expanded,
+	                        boolean leaf,
+	                        int row,
+	                        boolean hasFocus) {
+	         super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
+	         DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
+	         HolonNode Node = (HolonNode) node.getUserObject();
+	         if(row != 0) {
+	        	 this.setIcon(Node.getIcon());
+	        	 this.setToolTipText(Node.getToolTip());	        	 
+	         }
+	         return this;
+	    }
+	}
+	
 }

+ 2 - 21
src/ui/view/outliner/Outliner.java

@@ -3,17 +3,12 @@ package ui.view.outliner;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.util.ArrayList;
-
-import javax.swing.ImageIcon;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
-import javax.swing.JTree;
 import javax.swing.event.TreeModelEvent;
 import javax.swing.event.TreeModelListener;
 import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
 
 import classes.AbstractCanvasObject;
 import ui.controller.Control;
@@ -80,7 +75,7 @@ public class Outliner extends JFrame {
 		topListPanel.add(switches);
 		topListPanel.add(nodes);
 		topListPanel.add(cables);
-		DefaultMutableTreeNode topStatePanel = new DefaultMutableTreeNode();
+		DefaultMutableTreeNode topStatePanel = new DefaultMutableTreeNode("Networks");
 		
 		for(DecoratedSwitch dSwitch: decoratedState.getDecoratedSwitches()) {
 			switches.add(new DefaultMutableTreeNode(dSwitch.getModel().getName()));
@@ -198,19 +193,5 @@ public class Outliner extends JFrame {
 		
 	}
 	
-	class AbstractCpsObjectInfo {
-		private AbstractCanvasObject aCps;
-		AbstractCpsObjectInfo(AbstractCanvasObject aCps){
-			this.aCps = aCps;
-		}
-		@Override
-		public String toString(){
-			return aCps.getName() + " Id:"+ aCps.getId();
-		}
-		
-		public AbstractCanvasObject getAbstractCpsObject()
-		{
-			return aCps;
-		}
-	}
+
 }

+ 11 - 5
src/ui/view/outliner/TreeUtils.java

@@ -16,8 +16,8 @@ public class TreeUtils {
 		if (ClosedIcon != null && OpenIcon != null && LeafIcon!= null) {
 		    DefaultTreeCellRenderer renderer = 
 		        new DefaultTreeCellRenderer();
-		    renderer.setClosedIcon(ClosedIcon);
-		    renderer.setOpenIcon(OpenIcon);
+		    renderer.setClosedIcon(null);
+		    renderer.setOpenIcon(null);
 		    renderer.setLeafIcon(LeafIcon);
 		    tree.setCellRenderer(renderer);
 		}
@@ -30,12 +30,18 @@ public class TreeUtils {
 	}
 	static JScrollPane makePanelFromNode(DefaultMutableTreeNode node) {
 		JTree stateTree = new JTree(node);
-		return makePanelFromTree(stateTree, true);
+		return makeDefaultPanelFromTree(stateTree);
 	}
-	static JScrollPane makePanelFromTree(JTree stateTree, boolean rootVisible) {
-		stateTree.setRootVisible(rootVisible);
+
+	
+	static JScrollPane makePanelFromTree(JTree stateTree) {
+		return new JScrollPane(stateTree);
+	}
+	static JScrollPane makeDefaultPanelFromTree(JTree stateTree) {
+		stateTree.setRootVisible(false);
 		TreeUtils.signIconsForTree(stateTree);
 		TreeUtils.expand(stateTree);
 		return new JScrollPane(stateTree);
 	}
+	
 }

+ 3 - 3
tests/tests/PraktikumHolonsTestClasses.java

@@ -138,9 +138,9 @@ public class PraktikumHolonsTestClasses {
 		HolonElement ele2 = new HolonElement(null, "Fridge", 1, -50f, IdCounterElem.nextId());
         assertTrue("Array not empty",  ele1.getEnergyAtTimeStep(0) == -40);
         assertTrue("Array not empty", ele1.getEnergyAtTimeStep(2) == -40);
-        assertTrue("Name not correct", ele1.getEleName().equals("TV"));
-        ele1.setEleName(ele2.getEleName());
-		assertTrue("Name not correct", ele1.getEleName().equals("Fridge"));
+        assertTrue("Name not correct", ele1.getName().equals("TV"));
+        ele1.setEleName(ele2.getName());
+		assertTrue("Name not correct", ele1.getName().equals("Fridge"));
 		assertTrue("Amount not correct", ele2.getAmount() == 1);
 		ele2.setAmount(5);
 		assertTrue("Amount not correct", ele2.getAmount() == 5);