Browse Source

MinimumWorking Flex

Tom 5 years ago
parent
commit
4929475b53

+ 9 - 0
src/classes/HolonElement.java

@@ -4,6 +4,8 @@ import com.google.gson.annotations.Expose;
 
 import interfaces.GraphEditable;
 import interfaces.LocalMode;
+import ui.controller.FlexManager;
+import ui.controller.SingletonControl;
 import ui.model.Model;
 import ui.view.IndexTranslator;
 
@@ -213,6 +215,13 @@ public class HolonElement implements LocalMode, GraphEditable{
         return active;
     }
 
+    public boolean isOn(FlexManager flexManager) {
+    	//return (flexManager.isAFlexInUseOfHolonElement(this))?!active:active; 
+    	//Bool logic XOR
+    	return flexManager.isAFlexInUseOfHolonElement(this) ^ active;
+    }
+    
+    
     /**
      * Set the Status of the Element (see description of variables).
      *

+ 17 - 2
src/classes/HolonObject.java

@@ -2,6 +2,8 @@ package classes;
 
 import com.google.gson.annotations.Expose;
 
+import ui.controller.FlexManager;
+
 import java.util.ArrayList;
 
 
@@ -180,7 +182,9 @@ public class HolonObject extends AbstractCpsObject {
     public float getMinimumConsumingElementEnergy(int timestep){
     	return getElements().stream().filter(element -> element.isActive() && (element.getEnergyAtTimeStep(timestep) < 0) ).map(element -> -element.getEnergyAtTimeStep(timestep)).min((lhs,rhs) ->Float.compare(lhs, rhs)).orElse(0.0f);
     }
-    
+    public float getMinimumConsumingElementEnergyWithFlex(int timestep, FlexManager flexManager){
+    	return getElements().stream().filter(element -> element.isOn(flexManager) && (element.getEnergyAtTimeStep(timestep) < 0) ).map(element -> -element.getEnergyAtTimeStep(timestep)).min((lhs,rhs) ->Float.compare(lhs, rhs)).orElse(0.0f);
+    }
     /**
      * This Method returns the biggest consuming HolonElement'Energy that is ACTIVE.
      * If the HolonObject has no Consumer its return 0. 
@@ -202,6 +206,12 @@ public class HolonObject extends AbstractCpsObject {
     {
     	return getElements().stream().filter(element -> element.isActive()).map(element -> element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
     }
+    
+    public float getEnergyAtTimeStepWithFlex(int timestep, FlexManager flexManager)
+    {
+    	return getElements().stream().filter(element -> element.isOn(flexManager)).map(element -> element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
+    }
+    
     /** 
      * This Method returns the Energy that all HolonElements from the HolonObject produce by itself. Its sums all Energies from the HolonElements of the HolonObject that are ACTIVE and are Producer.
      * If the HolonObject have no HolonElement its return 0;
@@ -211,6 +221,9 @@ public class HolonObject extends AbstractCpsObject {
     public float getEnergySelfProducingFromProducingElements(int timestep) {
     	return getElements().stream().filter(element -> element.isActive() && (element.getEnergyAtTimeStep(timestep) > 0)).map(element -> element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
     }
+    public float getEnergySelfProducingFromProducingElementsWithFlex(int timestep, FlexManager flexManager) {
+    	return getElements().stream().filter(element -> element.isOn(flexManager) && (element.getEnergyAtTimeStep(timestep) > 0)).map(element -> element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
+    }
     /** 
      * This Method returns the Energy of all HolonElements from the HolonObject that are consuming. Its sums all Energies from the HolonElements of the HolonObject that are ACTIVE and are Consumer.
      * If the HolonObject have no HolonElement its return 0;
@@ -220,7 +233,9 @@ public class HolonObject extends AbstractCpsObject {
     public float getEnergyNeededFromConsumingElements(int timestep) {
     	return getElements().stream().filter(element -> element.isActive() && (element.getEnergyAtTimeStep(timestep) < 0)).map(element -> -element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
     }
-    
+    public float getEnergyNeededFromConsumingElementsWithFlex(int timestep, FlexManager flexManager) {
+    	return getElements().stream().filter(element -> element.isOn(flexManager) && (element.getEnergyAtTimeStep(timestep) < 0)).map(element -> -element.getEnergyAtTimeStep(timestep)).reduce(0.0f, (a, b) -> a + b);
+    }
     /**
      * This Method calculate the amount of HolonElements that are consuming Energy and are ACTIVE.
      * @param timestep is the TimeStep to compare the HolonElements.

+ 7 - 0
src/ui/controller/Control.java

@@ -558,6 +558,7 @@ public class Control {
     public void calculateStateAndVisualForTimeStep(int x) {
         simulationManager.calculateStateForTimeStep(x, true);
         updateOutliner();
+        updateFlexWindow();
     }
 
     /**
@@ -1013,6 +1014,12 @@ public class Control {
 	public void updateOutliner() {
 		gui.updateOutliners(simulationManager.getActualDecorState());
 	}
+	
+	public void updateFlexWindow() {
+		gui.updateFlexWindows();
+	}
+	
+	
 	public void updateCanvas() {
 		gui.repaintCanvas();
 	}

+ 23 - 3
src/ui/controller/SimulationManager.java

@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 
 import javax.swing.JPanel;
@@ -40,6 +41,10 @@ public class SimulationManager {
 	private Model model;
 	private HashMap<Integer, DecoratedState> saves = new HashMap<Integer, DecoratedState>();
 	private HashMap<Integer, VisualRepresentationalState> savesVisual = new HashMap<Integer, VisualRepresentationalState>();
+	
+	private HashMap<Integer, FlexManager> savesFlexManger = new HashMap<Integer, FlexManager>();
+	private List<Flexibility> actualOrders = new ArrayList<Flexibility>();
+	
 	private int timeStep;
 	private FlexiblePane flexPane;
 
@@ -60,6 +65,17 @@ public class SimulationManager {
 	 * @param updateVisual TODO
 	 */
 	public void calculateStateForTimeStep(int timestep, boolean updateVisual) {
+		FlexManager newFlexManager = new FlexManager(model, timestep, savesFlexManger.getOrDefault(timestep-1, null));
+		//Actual ordered not delete:
+		FlexManager flexManagerFromActual = savesFlexManger.getOrDefault(timestep, null);
+		if(flexManagerFromActual != null) {
+			newFlexManager.orderFlexFromList(flexManagerFromActual.getAllFlexesOrderedThisTimeStep());
+		}
+		savesFlexManger.put(timestep, newFlexManager);
+		
+		
+		
+		
 		HashMap<CpsEdge, CableState> map = new HashMap<CpsEdge, CableState>();
 		if(timestep > 0 && saves.containsKey(timestep-1)) //if the state before exist
 		{
@@ -89,9 +105,9 @@ public class SimulationManager {
 			doAnotherLoop = false;
 			list = calculateNetworks(minimumModel, timestep, leftOver);
 			for(MinimumNetwork net : list) {
-				float energyOnCables = net.getHolonObjectList().stream().filter(object -> object.getEnergyAtTimeStep(timestep) > 0.0f).map(object -> object.getEnergyAtTimeStep(timestep)).reduce(0.0f, ((a,b) -> a + b));
+				float energyOnCables = net.getHolonObjectList().stream().filter(object -> object.getEnergyAtTimeStepWithFlex(timestep, newFlexManager) > 0.0f).map(object -> object.getEnergyAtTimeStepWithFlex(timestep, newFlexManager)).reduce(0.0f, ((a,b) -> a + b));
 				//find the cable with the energy supplied from his two connected objects are the biggest, from all cables that the network give more energy than the cablecapacity. 
-				IntermediateCableWithState cable = net.getEdgeList().stream().filter(aCable -> energyOnCables > aCable.getModel().getCapacity() && !aCable.getModel().isUnlimitedCapacity()).max((lhs,rhs) -> Float.compare(lhs.getEnergyFromConnetedAtTimestep(timestep), rhs.getEnergyFromConnetedAtTimestep(timestep))).orElse(null);
+				IntermediateCableWithState cable = net.getEdgeList().stream().filter(aCable -> energyOnCables > aCable.getModel().getCapacity() && !aCable.getModel().isUnlimitedCapacity()).max((lhs,rhs) -> Float.compare(lhs.getEnergyFromConnetedAtTimestep(timestep, newFlexManager), rhs.getEnergyFromConnetedAtTimestep(timestep, newFlexManager))).orElse(null);
 				if(cable != null) {
 					cable.setState(CableState.Burned);
 					doAnotherLoop = true;
@@ -101,7 +117,7 @@ public class SimulationManager {
 		ArrayList<DecoratedNetwork> decorNetworks = new ArrayList<DecoratedNetwork>();
 		FairnessModel actualFairnessModel = model.getFairnessModel();
 		for (MinimumNetwork net : list) {
-			decorNetworks.add(new DecoratedNetwork(net, timestep, actualFairnessModel));
+			decorNetworks.add(new DecoratedNetwork(net, timestep, actualFairnessModel, newFlexManager));
 		}
 		ArrayList<DecoratedCable> leftOverDecoratedCables = new ArrayList<DecoratedCable>();
 		
@@ -239,6 +255,10 @@ public class SimulationManager {
 	public VisualRepresentationalState getActualVisualRepresentationalState(){
 		return savesVisual.getOrDefault(timeStep, null);
 	}
+	public FlexManager getActualFlexManager() {
+		return savesFlexManger.getOrDefault(timeStep, null);
+	}
+	
 	
 	public DecoratedState getDecorState(int timestep) {
 		return saves.getOrDefault(timestep, null);

+ 17 - 16
src/ui/model/DecoratedNetwork.java

@@ -3,6 +3,7 @@ package ui.model;
 import java.util.ArrayList;
 
 import classes.HolonObject;
+import ui.controller.FlexManager;
 import ui.model.DecoratedCable.CableState;
 import ui.model.DecoratedHolonObject.HolonObjectState;
 import ui.model.Model.FairnessModel;
@@ -14,14 +15,14 @@ public class DecoratedNetwork {
 	private ArrayList<Passiv> passivNoEnergyList = new ArrayList<Passiv>();
 	private ArrayList<DecoratedCable> decoratedCableList = new ArrayList<DecoratedCable>();
 
-	public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel){	
+	public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel, FlexManager flexManager){	
 		switch(actualFairnessModel) {
 		case AllEqual:
-			calculateAllEqualNetwork(minimumNetwork, Iteration);
+			calculateAllEqualNetwork(minimumNetwork, Iteration, flexManager);
 			break;
 		case MininumDemandFirst:
 		default:
-			calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration);
+			calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration, flexManager);
 			break;		
 		}
 	}
@@ -52,8 +53,8 @@ public class DecoratedNetwork {
 	
 	
 	//Calculations:
-	private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration) {
-		categorize(minimumNetwork, Iteration);
+	private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
+		categorize(minimumNetwork, Iteration, flexManager);
 		//Sort SupplierList according to the EnergyToSupplyNetwork maximum first.
 		//Sort ConsumerList according to the MinimumConsumingElementEnergy minimum first.
 		supplierList.sort((Supplier lhs,Supplier rhs) -> -Float.compare(lhs.getEnergyToSupplyNetwork(), rhs.getEnergyToSupplyNetwork()));
@@ -179,8 +180,8 @@ public class DecoratedNetwork {
 
 
 
-	private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration) {
-		categorize(minimumNetwork, Iteration);
+	private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
+		categorize(minimumNetwork, Iteration, flexManager);
 		float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
 		float energyForEachConsumer = (consumerList.size() != 0) ? energyToSupplyInTheNetwork / consumerList.size() : 0.0f;
 		decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
@@ -221,20 +222,20 @@ public class DecoratedNetwork {
 			setConsumerState(con);
 		}
 	}
-	private void categorize(MinimumNetwork minimumNetwork, int Iteration) {
+	private void categorize(MinimumNetwork minimumNetwork, int Iteration, FlexManager flexManager) {
 		//Categorize
 		for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
-			float energyNeeded = hObject.getEnergyNeededFromConsumingElements(Iteration);
-			float energySelfProducing = hObject.getEnergySelfProducingFromProducingElements(Iteration);
+			float energyNeeded = hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager);
+			float energySelfProducing = hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager);
 			if(energyNeeded < energySelfProducing) {
 				Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded);
 				supplierList.add(sup);
 			} else if (energyNeeded > energySelfProducing) {
 				Consumer con = new Consumer(hObject);
 				con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
-				con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
-				con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
-				con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
+				con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
+				con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
+				con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
 				consumerList.add(con);
 			}else if(energyNeeded == energySelfProducing) {
 				
@@ -244,9 +245,9 @@ public class DecoratedNetwork {
 				} else {
 					Consumer con = new Consumer(hObject);
 					con.setEnergyNeededFromNetwork(0.0f);
-					con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
-					con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
-					con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
+					con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergyWithFlex(Iteration, flexManager));
+					con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElementsWithFlex(Iteration, flexManager));
+					con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElementsWithFlex(Iteration, flexManager));
 					consumerSelfSuppliedList.add(con);
 				}
 				

+ 4 - 3
src/ui/model/IntermediateCableWithState.java

@@ -2,6 +2,7 @@ package ui.model;
 
 import classes.CpsEdge;
 import classes.HolonObject;
+import ui.controller.FlexManager;
 import ui.model.DecoratedCable.CableState;
 
 /**
@@ -27,10 +28,10 @@ public class IntermediateCableWithState {
 		return model;
 	}
 	//ugly
-	public float getEnergyFromConnetedAtTimestep(int iteration) {
+	public float getEnergyFromConnetedAtTimestep(int iteration, FlexManager flexManager) {
 		float energy = 0.0f;
-		if(model.getA() instanceof HolonObject && ((HolonObject) model.getA()).getEnergyAtTimeStep(iteration) > 0) energy += ((HolonObject) model.getA()).getEnergyAtTimeStep(iteration);
-		if(model.getB() instanceof HolonObject && ((HolonObject) model.getB()).getEnergyAtTimeStep(iteration) > 0) energy += ((HolonObject) model.getB()).getEnergyAtTimeStep(iteration);
+		if(model.getA() instanceof HolonObject && ((HolonObject) model.getA()).getEnergyAtTimeStepWithFlex(iteration, flexManager) > 0) energy += ((HolonObject) model.getA()).getEnergyAtTimeStepWithFlex(iteration, flexManager);
+		if(model.getB() instanceof HolonObject && ((HolonObject) model.getB()).getEnergyAtTimeStepWithFlex(iteration, flexManager) > 0) energy += ((HolonObject) model.getB()).getEnergyAtTimeStepWithFlex(iteration, flexManager);
 		return energy;
 	}
 	

+ 143 - 24
src/ui/view/FlexWindow.java

@@ -4,7 +4,11 @@ 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.Dialog.ModalityType;
+import java.awt.Dimension;
 import java.awt.event.ItemEvent;
 import java.awt.image.BufferedImage;
 import java.math.RoundingMode;
@@ -12,6 +16,7 @@ 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;
@@ -43,6 +48,10 @@ import classes.CpsUpperNode;
 import classes.Flexibility;
 import classes.HolonElement;
 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;
 
 
@@ -52,11 +61,12 @@ public class FlexWindow extends JFrame {
 	
 	
 	private JTabbedPane contentPanel = new JTabbedPane();
-	private JPanel usageViewPanel;
+	private JScrollPane usageViewPanel;
 	
+	private Control controller;
 	private Model model;
 	
-	
+	public boolean isClosed = false;
 	
 	//Flexibility Intermediate
 	private Flexibility intermediateFlex = new Flexibility(null);
@@ -68,18 +78,25 @@ public class FlexWindow extends JFrame {
 	private DefaultMutableTreeNode listOfAllSelectedHolonObjects;
 	private JTree stateTree;
 	private DefaultTreeModel treeModel;
+	private FlexManager flexmanager;
 	
 	
 	
 	
-	public FlexWindow(JFrame parentFrame, Model model){
+	public FlexWindow(JFrame parentFrame, ui.controller.Control  controller){
 		this.intermediateFlex.name = "name";
+		this.controller = controller;
+		this.model = controller.getModel();
 		//InitWindow
 		createMenuBar();
 		initWindowPanel(parentFrame);
-		this.model = model;
 		selectedCpsObjectsChanged();
-		System.out.println("Ich wurde erstellt.");
+		this.addWindowListener(new java.awt.event.WindowAdapter() {
+		    @Override
+		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
+		    	isClosed = true;
+		    }
+		});
 		//this.pack();
 	}
 
@@ -91,7 +108,7 @@ public class FlexWindow extends JFrame {
 		this.setTitle("Flexibility");
 		this.setLocationRelativeTo(parentFrame);
 		this.setVisible(true);
-		
+		//this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
 		createNothingSelectedPanel();
 		createSelectedPanel();
 		createUsageViewPanel();
@@ -134,30 +151,128 @@ public class FlexWindow extends JFrame {
 
 	
 	private void createUsageViewPanel() {
-		usageViewPanel = new JPanel();
-		usageViewPanel.setLayout(new BoxLayout(usageViewPanel, BoxLayout.PAGE_AXIS));
-		usageViewPanel.add(new JLabel("Test bla"));
-		addFlexToUsageView(this.intermediateFlex);
-		addFlexToUsageView(this.intermediateFlex);
-		addFlexToUsageView(this.intermediateFlex);
-		addFlexToUsageView(this.intermediateFlex);
-		addFlexToUsageView(this.intermediateFlex);
-	}
+		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 addFlexToUsageView(Flexibility flex) {
-		JPanel newFlexRow = new JPanel(new FlowLayout( FlowLayout.CENTER));
-		newFlexRow.add(new JLabel(flex.name));
-		JButton useFlexButton = new JButton("Use Flex");
-		useFlexButton.addActionListener(clicked ->{
-			System.out.println("Use Flex button pressed");
-		});
-		newFlexRow.add(useFlexButton);
 		
-		usageViewPanel.add(newFlexRow);
+		
+
 	}
+
 	
 
 
+	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();
+			});
+		}
+		//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);
+		
+	}
+
+
+	public void updateFlexOrderMenu() {
+		createUsageViewPanel();
+		contentPanel.setComponentAt(contentPanel.indexOfTab("Order"), usageViewPanel);
+		contentPanel.revalidate();
+	}
+
+	
+	
+	
 	private void createSelectedPanel() {
 		//Liste aller Flexibilities
 		listOfAllSelectedHolonObjects = new DefaultMutableTreeNode("HolonObjects");
@@ -180,6 +295,8 @@ public class FlexWindow extends JFrame {
 	}
 	
 	public void selectedCpsObjectsChanged() {
+		//TODO:Maybe wrong place
+		updateFlexOrderMenu();
 		if(model.getSelectedCpsObjects().isEmpty()) {
 			contentPanel.setComponentAt(contentPanel.indexOfTab("Settings"), nothingSelectedPanel);
 			contentPanel.revalidate();
@@ -263,6 +380,7 @@ public class FlexWindow extends JFrame {
 		if(toDeleteFlex != null) {
 			System.out.println("ToDelete:" + toDeleteFlex);
 			toDeleteFlex.getElement().flexList.remove(toDeleteFlex);
+			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), true);
 			selectedCpsObjectsChanged();
 		}
 	}
@@ -466,6 +584,7 @@ public class FlexWindow extends JFrame {
 			
 			
 			if(!model.getSelectedCpsObjects().contains(holonObjectSelector.getSelectedItem()))model.getSelectedCpsObjects().add((AbstractCpsObject)holonObjectSelector.getSelectedItem());
+			controller.getSimManager().calculateStateForTimeStep(model.getCurIteration(), false);
 			selectedCpsObjectsChanged();
 			addDialog.dispose();
 		});

+ 21 - 2
src/ui/view/GUI.java

@@ -305,6 +305,9 @@ public class GUI implements CategoryListener {
 
 	
 	private List<Outliner> outlinerList = new ArrayList<Outliner>();
+	private List<FlexWindow> flexList = new ArrayList<FlexWindow>();
+
+	
 	/**
 	 * Create the application.
 	 *
@@ -2512,9 +2515,9 @@ public class GUI implements CategoryListener {
 		//FlexWindow
 		JMenuItem openFlexMenuItem =  new JMenuItem("Open Flexibility Panel", new ImageIcon(Util.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openFlexMenuItem.addActionListener(actionEvent -> {
-			new FlexWindow(holegJFrame, model);
+			flexList.add(new FlexWindow(holegJFrame, controller));
 		});
-		openFlexMenuItem.setAccelerator(KeyStroke.getKeyStroke('F', Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()));
+		openFlexMenuItem.setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()));
 		menuWindow.add(openFlexMenuItem);
 	}
 
@@ -2532,6 +2535,22 @@ public class GUI implements CategoryListener {
 			out.repaintWithDecoratedState(state);
 		}
 	}
+	public void updateFlexWindows()
+	{
+		//remove closed Outliner
+		ListIterator<FlexWindow> iter = flexList.listIterator();
+		while(iter.hasNext())
+		{
+			if(iter.next().isClosed) iter.remove();
+		}
+		//update open Flex
+		for(FlexWindow out : flexList) {
+			out.updateFlexOrderMenu();
+		}
+	}
+	
+	
+	
 	private void showScrollGraph() {
 		scrollGraph.setVisible(true);
 		splitGraphHolonEl.setBottomComponent(scrollGraph);