Przeglądaj źródła

Removes Connections

Fixes Category & Selection Bugs
TomTroppmann 2 lat temu
rodzic
commit
ae0ca20bf7
45 zmienionych plików z 638 dodań i 1806 usunięć
  1. 1 1
      src/holeg/algorithm/binary/AcoAlgorithm.java
  2. 1 1
      src/holeg/algorithm/binary/BaseLine.java
  3. 2 2
      src/holeg/algorithm/example/DemoAlgo.java
  4. 2 2
      src/holeg/algorithm/example/FlexExample.java
  5. 1 1
      src/holeg/api/AlgorithmFrameworkFlex.java
  6. 15 20
      src/holeg/api/TopologieAlgorithmFramework.java
  7. 1 1
      src/holeg/connect/socket/Server.java
  8. 1 45
      src/holeg/model/AbstractCanvasObject.java
  9. 2 2
      src/holeg/model/Constrain.java
  10. 0 1
      src/holeg/model/GroupNode.java
  11. 1 0
      src/holeg/model/HolonElement.java
  12. 0 1
      src/holeg/model/HolonObject.java
  13. 0 1
      src/holeg/model/HolonSwitch.java
  14. 3 0
      src/holeg/model/Node.java
  15. 5 16
      src/holeg/ui/controller/AutoSaveController.java
  16. 8 71
      src/holeg/ui/controller/CanvasController.java
  17. 50 80
      src/holeg/ui/controller/CategoryController.java
  18. 29 44
      src/holeg/ui/controller/ClipboardController.java
  19. 45 136
      src/holeg/ui/controller/Control.java
  20. 33 40
      src/holeg/ui/controller/LoadController.java
  21. 0 189
      src/holeg/ui/controller/MultiPurposeController.java
  22. 18 46
      src/holeg/ui/controller/NodeController.java
  23. 0 153
      src/holeg/ui/controller/ObjectController.java
  24. 18 26
      src/holeg/ui/controller/SaveController.java
  25. 1 1
      src/holeg/ui/controller/SimulationManager.java
  26. 43 6
      src/holeg/ui/model/GuiSettings.java
  27. 0 2
      src/holeg/ui/model/HolegModel.java
  28. 16 448
      src/holeg/ui/model/Model.java
  29. 6 5
      src/holeg/ui/view/canvas/AbstractCanvas.java
  30. 71 89
      src/holeg/ui/view/canvas/Canvas.java
  31. 24 108
      src/holeg/ui/view/canvas/GroupNodeCanvas.java
  32. 1 1
      src/holeg/ui/view/dialog/AddElementPopUp.java
  33. 12 7
      src/holeg/ui/view/dialog/AddObjectPopUp.java
  34. 7 7
      src/holeg/ui/view/dialog/CanvasResizePopUp.java
  35. 6 11
      src/holeg/ui/view/dialog/CreateNewDialog.java
  36. 16 24
      src/holeg/ui/view/dialog/CreateTemplatePopUp.java
  37. 22 21
      src/holeg/ui/view/dialog/SearchPopUp.java
  38. 9 7
      src/holeg/ui/view/information/HolonInformationPanel.java
  39. 3 4
      src/holeg/ui/view/inspector/Inspector.java
  40. 4 3
      src/holeg/ui/view/inspector/InspectorTable.java
  41. 1 1
      src/holeg/ui/view/inspector/UnitGraph.java
  42. 12 28
      src/holeg/ui/view/main/Category.java
  43. 137 142
      src/holeg/ui/view/main/GUI.java
  44. 5 5
      src/holeg/ui/view/main/TimePanel.java
  45. 6 7
      src/holeg/ui/view/window/FlexWindow.java

+ 1 - 1
src/holeg/algorithm/binary/AcoAlgorithm.java

@@ -81,8 +81,8 @@ public class AcoAlgorithm extends AlgorithmFrameworkFlex{
 		runList.add(best.fitness);
 		console.print("Start with: " + FormatFloat.doubleFixedPlaces(2, best.fitness));
 		if(moreInformation)console.println("");
+		if(best.position.isEmpty()) return best;
 		int problemSize = best.position.size();
-		if(problemSize == 0) return best;
 		List<Double> pheromones = initPheromones(problemSize);
 		List<Individual> population = new ArrayList<Individual>();
 		if(moreInformation)console.println("Size To Test:" + population.size());

+ 1 - 1
src/holeg/algorithm/binary/BaseLine.java

@@ -340,7 +340,7 @@ public class BaseLine implements AddOn {
 		objectList = new ArrayList<HolonObject>();
 		initialState = new ArrayList<Boolean>(); 
 		access= new HashMap<Integer, AccessWrapper>();
-		rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getActualTimeStep());
+		rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getCurrentIteration());
 		return initialState;
 	}
 	/**

+ 2 - 2
src/holeg/algorithm/example/DemoAlgo.java

@@ -286,7 +286,7 @@ public class DemoAlgo implements AddOn {
 		private void executeDemoAlgo() {
 			extractPositionAndAccess();
 			counter = 0;
-			int actualIteration = control.getModel().getActualTimeStep();
+			int actualIteration = control.getModel().getCurrentIteration();
 			deactivateWindrad();
 			setAllSwitchesClosed();
 			updateVisual();
@@ -344,7 +344,7 @@ public class DemoAlgo implements AddOn {
 			objectList = new ArrayList<HolonObject>();
 			initialState = new ArrayList<Boolean>(); 
 			access= new HashMap<Integer, AccessWrapper>();
-			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getActualTimeStep());
+			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getCurrentIteration());
 			return initialState;
 		}
 		/**

+ 2 - 2
src/holeg/algorithm/example/FlexExample.java

@@ -335,7 +335,7 @@ public class FlexExample implements AddOn {
 		 */
 		private void executeDemoAlgo(RunResult result) {
 			extractPositionAndAccess();
-			int actualIteration = control.getModel().getActualTimeStep();
+			int actualIteration = control.getModel().getCurrentIteration();
 			println("TimeStep:" + actualIteration);
 			control.calculateStateOnlyForCurrentTimeStep();
 			List<Priority> priorityListASC = createPriorityListASC();
@@ -467,7 +467,7 @@ public class FlexExample implements AddOn {
 			objectList = new ArrayList<HolonObject>();
 			initialState = new ArrayList<Boolean>();
 			access= new HashMap<Integer, AccessWrapper>();
-			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getActualTimeStep());			
+			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getObjectsOnCanvas().stream(), initialState, model.getCurrentIteration());			
 			resetChain.add(initialState); 
 			return initialState;
 		}

+ 1 - 1
src/holeg/api/AlgorithmFrameworkFlex.java

@@ -804,7 +804,7 @@ public abstract class AlgorithmFrameworkFlex implements AddOn{
 
 	private void rollOutNodes(List<Boolean> positionToInit) {
 		boolean groupNodeSelected = dGroupNode != null;
-		int timeStep = control.getModel().getActualTimeStep();
+		int timeStep = control.getModel().getCurrentIteration();
 		Stream<HolonObject> holonObjects = groupNodeSelected ? dGroupNode.getModel().getAllHolonObjectsRecursive() : control.getModel().getAllHolonObjectsOnCanvas().stream();
 		Stream<HolonSwitch> holonSwitches = groupNodeSelected ? dGroupNode.getModel().getAllSwitchObjectsRecursive(): control.getModel().getAllSwitches().stream();
 		holonObjects.forEach(hObject -> {

+ 15 - 20
src/holeg/api/TopologieAlgorithmFramework.java

@@ -19,6 +19,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -223,7 +224,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 	private void toggleSwitches() {
 		List<HolonSwitch> allSwitchList = control.getModel().getAllSwitches();
 		if(allSwitchList.isEmpty()) return;
-		boolean set = allSwitchList.get(0).getState(control.getModel().getActualTimeStep());
+		boolean set = allSwitchList.get(0).getState(control.getModel().getCurrentIteration());
 		allSwitchList.forEach(hSwitch -> {
 			hSwitch.setManualMode(true);
 			hSwitch.setManualState(!set);
@@ -467,15 +468,9 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 		}
 	}
 	private void createWildcardsCategory() {
-		Category category = control.searchCategory("Wildcards");
-		if(category == null) {
-			try {
-				control.addCategory("Wildcards");
-			} catch (IOException e) {
-				console.println("IO Exception - Creating WIldcards Category failed.");
-				System.out.println("IO Exception - Creating WIldcards Category failed.");
-				e.printStackTrace();
-			}
+		Optional<Category> category = control.findCategoryWithName("Wildcards");
+		if(category.isEmpty()) {
+			control.createCategoryWithName("Wildcards");
 		}
 	}
 	
@@ -720,16 +715,16 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 		Model model = control.getModel();
 		
 		resetAllList();
-		Category category = control.searchCategory("Wildcards");
-		if(category != null) {
-			for(int count = 0; count < category.getObjects().size(); count++ ) {
-				accessIntegerToWildcard.put(count + 1, category.getObjects().get(count));
-			}			
-		}else {
+		Optional<Category> category = control.findCategoryWithName("Wildcards");
+		category.ifPresentOrElse(cat -> {
+			int count = 1;
+			for(AbstractCanvasObject obj : cat.getObjects()) {
+				accessIntegerToWildcard.put(count, obj);
+				count++;
+			}
+		}, () -> {
 			console.println("No 'Wildcards' Category");
-		}
-		
-		
+		});
 		
 		List<Integer> initialState = new ArrayList<Integer>();
 		generateAccess(model.getObjectsOnCanvas().stream(), null);			
@@ -1248,7 +1243,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 	    public final Integer second;
 
 	    public IndexCable(Integer first, Integer second) {
-	    	if(first.compareTo(second) == 0) {
+	    	if(first.equals(second)) {
 	    		throw new IllegalArgumentException("(" + first + "==" + second + ")" 
 	    							+ "Two ends of the cable are at the same Object");
 	    	} else if(first.compareTo(second) < 0) {

+ 1 - 1
src/holeg/connect/socket/Server.java

@@ -288,7 +288,7 @@ public class Server implements Runnable{
 				return true;
 			}
 			if (obj instanceof HolonElementWrapper element) {
-				return this.name.compareTo(element.name) == 0 &&
+				return this.name.equals(element.name) &&
 						this.energy == element.energy &&
 						this.enabled == element.enabled;
 			}			

+ 1 - 45
src/holeg/model/AbstractCanvasObject.java

@@ -6,8 +6,6 @@ import holeg.ui.model.IdCounter;
 import holeg.ui.model.IdCounter.CounterType;
 import holeg.utility.Vector2Int;
 
-import java.util.ArrayList;
-
 /**
  * The abstract class "CpsObject" represents any possible object in the system
  * (except Edges). The representation of any object contains following
@@ -29,8 +27,6 @@ public abstract class AbstractCanvasObject {
 	/* Path of the image for the Obj. */
 	@Expose
 	String image;
-	/* Array of neighbors */
-	private ArrayList<Edge> connections = new ArrayList<>();
 	/* Position with a X and Y value */
 	@Expose
 	Vector2Int position = new Vector2Int(0,0);
@@ -78,9 +74,7 @@ public abstract class AbstractCanvasObject {
 
 	}
 	
-	public void initForReflection() {
-		connections = new ArrayList<>();
-	}
+	public abstract void initForReflection();
 	
 	
 	
@@ -128,44 +122,6 @@ public abstract class AbstractCanvasObject {
 	}
 	
 	
-	/**
-	 * List of all existing connections.
-	 * 
-	 * @return the connections ArrayList
-	 */
-	public ArrayList<Edge> getConnections() {
-		return connections;
-	}
-
-	/**
-	 * Set a new ArrayList of connections (Update).
-	 * 
-	 * @param arrayList
-	 *            the connections to set
-	 */
-	public void setConnections(ArrayList<Edge> arrayList) {
-		this.connections = arrayList;
-	}
-
-	/**
-	 * List of all existing connections.
-	 * 
-	 * @return the connections ArrayList
-	 */
-	public ArrayList<Edge> getConnectedTo() {
-		return connections;
-	}
-
-	/**
-	 * Add a new connection to the selected Object.
-	 * 
-	 * @param toConnect
-	 *            Edge
-	 */
-	public void addConnection(Edge toConnect) {
-		connections.add(toConnect);
-	}
-
 	/**
 	 * Set the position of the Object in the canvas.
 	 *

+ 2 - 2
src/holeg/model/Constrain.java

@@ -42,10 +42,10 @@ public class Constrain {
 	 * @return
 	 */
 	public boolean fixJson() {
-		if(name.compareTo("onConstrain") == 0) {
+		if(name.equals("onConstrain")) {
 			constrainFunction = onConstrain;
 			return false;
-		}else if(name.compareTo("offConstrain") == 0){
+		}else if(name.equals("offConstrain")){
 			constrainFunction = offConstrain;
 			return false;
 		}else {

+ 0 - 1
src/holeg/model/GroupNode.java

@@ -21,7 +21,6 @@ public class GroupNode extends AbstractCanvasObject {
 	@Override
 	public void initForReflection() {
 		log.info("Executed");
-		super.initForReflection();
 		objectList = new ArrayList<>();
 		switchList = new ArrayList<>();
 		nodeList = new ArrayList<>();

+ 1 - 0
src/holeg/model/HolonElement.java

@@ -89,6 +89,7 @@ public class HolonElement implements TimelineDependent{
      * @param energy  float
      * @param model Model
      */
+    //TODO(Tom2021-12-20): constructor should be remade
     public HolonElement(HolonObject parentObject, String eleName, float energy) {
     	
     	this(parentObject, eleName, energy, IdCounter.nextId(CounterType.Element));

+ 0 - 1
src/holeg/model/HolonObject.java

@@ -42,7 +42,6 @@ public class HolonObject extends AbstractCanvasObject {
 
     @Override
     public void initForReflection() {
-    	super.initForReflection();
     	elements = new ArrayList<HolonElement>();
     }
     

+ 0 - 1
src/holeg/model/HolonSwitch.java

@@ -99,7 +99,6 @@ public class HolonSwitch extends AbstractCanvasObject implements TimelineDepende
 
 	@Override
 	public void initForReflection() {
-		super.initForReflection();
 		this.graphPoints = new LinkedList<>();
 		this.reset();
 	}

+ 3 - 0
src/holeg/model/Node.java

@@ -29,4 +29,7 @@ public class Node extends AbstractCanvasObject {
 		return "Node ID:" + getId();
 	}
 
+	@Override
+	public void initForReflection() {}
+
 }

+ 5 - 16
src/holeg/ui/controller/AutoSaveController.java

@@ -1,6 +1,6 @@
 package holeg.ui.controller;
 
-import holeg.ui.model.Model;
+import holeg.ui.model.GuiSettings;
 
 /**
  * Autosave Controller.
@@ -8,28 +8,17 @@ import holeg.ui.model.Model;
  * @author Gruppe14
  */
 public class AutoSaveController {
-	private Model model;
 	private int max = Integer.MAX_VALUE;
 	private int numberOfSaves = 20;
 	private int currentSave;
 	private int count = 0;
 	private boolean isAllowed = false;
 
-	/**
-	 * Constructor.
-	 * 
-	 * @param model
-	 *            the Model
-	 */
-	public AutoSaveController(Model model) {
-		this.model = model;
-	}
-
 	/**
 	 * Increase the Auto save number.
 	 */
 	public void increaseAutoSaveNr() {
-		currentSave = model.getAutoSaveNr() + 1;
+		currentSave = GuiSettings.autoSaveNr + 1;
 		if (count < currentSave) {
 			count = currentSave;
 		}
@@ -40,18 +29,18 @@ public class AutoSaveController {
 			currentSave = 0;
 		}
 
-		model.setAutoSaveNr(currentSave);
+		GuiSettings.autoSaveNr = (currentSave);
 	}
 
 	/**
 	 * Decrease the Autosave Number.
 	 */
 	public void decreaseAutoSaveNr() {
-		currentSave = model.getAutoSaveNr() - 1;
+		currentSave = GuiSettings.autoSaveNr - 1;
 		// if (currentSave < 0) {
 		// currentSave = max;
 		// }
-		model.setAutoSaveNr(currentSave);
+		GuiSettings.autoSaveNr = (currentSave);
 	}
 
 

+ 8 - 71
src/holeg/ui/controller/CanvasController.java

@@ -1,7 +1,6 @@
 package holeg.ui.controller;
 
 import java.awt.Point;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
@@ -28,7 +27,6 @@ import holeg.utility.Vector2Int;
 public class CanvasController {
 
 	private Model model;
-	private MultiPurposeController mpC;
     private GUI gui;
 	/**
 	 * Constructor.
@@ -38,9 +36,8 @@ public class CanvasController {
 	 * @param mp
 	 *            the MultipurposeController
 	 */
-	public CanvasController(Model model, MultiPurposeController mp) {
+	public CanvasController(Model model) {
 		this.model = model;
-		this.mpC = mp;
 	}
 
 	/**
@@ -51,7 +48,6 @@ public class CanvasController {
 	 * @param replace when true objects could be replaced
 	 */
 	public void addObject(AbstractCanvasObject object, boolean replace) {
-		model.getCvsObjIdx().put(object.getId(), model.getObjectsOnCanvas().size());
 		model.getObjectsOnCanvas().add(object);
 		/**
 		 * check if we should drag & drop replace
@@ -119,16 +115,12 @@ public class CanvasController {
 	 */
 	public void deleteObjectOnCanvas(AbstractCanvasObject obj) {
 		removeAllConnectionsFromObject(obj);
-		mpC.decIdx(obj.getId(), model.getCvsObjIdx());
-		model.getCvsObjIdx().remove(obj.getId());
 		model.getObjectsOnCanvas().remove(obj);
 	}
 	
 	public void deleteObjectsOnCanvas(Collection<AbstractCanvasObject> objects) {
 		for(AbstractCanvasObject obj: objects) {
 			removeAllConnectionsFromObject(obj);
-			mpC.decIdx(obj.getId(), model.getCvsObjIdx());
-			model.getCvsObjIdx().remove(obj.getId());
 			model.getObjectsOnCanvas().remove(obj);
 		}
 	}
@@ -151,8 +143,6 @@ public class CanvasController {
 				edge.setB(by);
 			}
 		}
-		/** delete 'toBeReplaced' new empty connections, to prevent Nullpointer*/
-		toBeReplaced.setConnections(new ArrayList<Edge>(1));
 		/**
 		 * set Position of by to exactly toBeReplaced
 		 */
@@ -177,8 +167,6 @@ public class CanvasController {
 	 *            the edge to remove
 	 */
 	public void removeEdgesOnCanvas(Edge edge) {
-		edge.getA().getConnections().remove(edge);
-		edge.getB().getConnections().remove(edge);
 		model.getEdgesOnCanvas().remove(edge);
 	}
 
@@ -189,12 +177,12 @@ public class CanvasController {
 	 *            the mouse Position
 	 */
 	public void pasteObjects(Point p) {
-		model.getSelectedObjects().clear();
+		GuiSettings.getSelectedObjects().clear();
 		AbstractCanvasObject tCps = null;
 		int x = Integer.MAX_VALUE, y = Integer.MAX_VALUE;
 
 		// Location whre to copy the Elements
-		for (AbstractCanvasObject cps : model.getClipboradObjects()) {
+		for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
 			if (cps.getPosition().getX() < x) {
 				x = cps.getPosition().getX();
 			}
@@ -204,7 +192,7 @@ public class CanvasController {
 		}
 
 		// Objects
-		for (AbstractCanvasObject cps : model.getClipboradObjects()) {
+		for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
 			if (cps instanceof HolonObject hO) {
 				tCps = new HolonObject(hO);
 			} else if (cps instanceof HolonSwitch sw) {
@@ -217,36 +205,7 @@ public class CanvasController {
 			addObject(tCps, false);
 		}
 
-		// Edges
-
-		for (AbstractCanvasObject cps : model.getClipboradObjects()) {
-			for (Edge e : cps.getConnectedTo()) {
-				// A and B of e in the copied Elements?
-				if (model.getClipboradObjects().contains(e.getA())
-						&& model.getClipboradObjects().contains(e.getB())) {
-					AbstractCanvasObject a = e.getA();
-					AbstractCanvasObject b = e.getB();
-					boolean newEdge = true;
-					// was this Edge created or not?
-					for (Edge et : cps.getConnectedTo()) {
-						for (Edge etA : et.getA().getConnectedTo()) {
-							if (etA.getA() == a && etA.getB() == b) {
-								newEdge = false;
-							}
-						}
-						for (Edge etB : et.getB().getConnectedTo()) {
-							if (etB.getA() == a && etB.getB() == b) {
-								newEdge = false;
-							}
-						}
-					}
-					if (newEdge) {
-						Edge tempE = new Edge(e);
-						addEdgeOnCanvas(tempE);
-					}
-				}
-			}
-		}
+		
 
 	}
 
@@ -254,12 +213,12 @@ public class CanvasController {
 	 * Cut all Selected Objects.
 	 */
 	public void cutObjects() {
-		model.setClipboradObjects(model.getSelectedObjects().stream().collect(Collectors.toSet()));
-		for (AbstractCanvasObject cps : model.getClipboradObjects()) {
+		GuiSettings.setClipboardObjects(GuiSettings.getSelectedObjects().stream().collect(Collectors.toSet()));
+		for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
 			deleteObjectOnCanvas(cps);
 		}
 
-		model.getSelectedObjects().clear();
+		GuiSettings.getSelectedObjects().clear();
 	}
 
 	
@@ -315,26 +274,4 @@ public class CanvasController {
 		this.gui = gui;
 	}
 	
-	
-	/**
-	 * Set the Background Image;
-	 * 
-	 * @param imagePath
-	 *            Image Path
-	 * @param mode
-	 *            Image Mode
-	 * @param width
-	 *            Image custom width
-	 * @param height
-	 *            Image custom height
-	 */
-	public void setBackgroundImage(String imagePath, int mode, int width, int height) {
-		model.setCanvasImagePath(imagePath);
-		model.setCanvasImageMode(mode);
-		model.setCanvasImageWidth(width);
-		model.setCanvasImageHeight(height);
-	}
-
-	
-	
 }

+ 50 - 80
src/holeg/ui/controller/CategoryController.java

@@ -6,7 +6,7 @@ import holeg.model.AbstractCanvasObject;
 import holeg.model.HolonElement;
 import holeg.model.HolonObject;
 import holeg.model.HolonSwitch;
-import holeg.ui.model.Model;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.view.main.Category;
 import holeg.utility.events.Event;
 
@@ -20,8 +20,6 @@ import java.util.Optional;
  * @author Gruppe14
  */
 public class CategoryController {
-	private Model model;
-	private MultiPurposeController mpC;
 	private final Event OnCategoryChanged;
 
 	/**
@@ -33,9 +31,7 @@ public class CategoryController {
 	 *            the MultiPurposeController
 	 * @param control 
 	 */
-	public CategoryController(Model model, MultiPurposeController mp, Control control) {
-		this.model = model;
-		this.mpC = mp;
+	public CategoryController(Control control) {
 		this.OnCategoryChanged = control.OnCategoryChanged;
 		initCategories();
 	}
@@ -44,45 +40,51 @@ public class CategoryController {
 	 * init default category and objects.
 	 */
 	public void initCategories() {
-
-		addNewCategory("Energy");
-		addNewCategory("Building");
-		addNewCategory("Component");
-		addNewHolonObject(mpC.searchCat("Energy"), "Power Plant", new ArrayList<HolonElement>(),
+		Category energy = createCategoryWithName("Energy");
+		Category building = createCategoryWithName("Building");
+		Category component = createCategoryWithName("Component");
+		HolonObject powerPlant = addNewHolonObject(energy, "Power Plant", new ArrayList<HolonElement>(),
 				"/Images/power-plant.png");
-		addNewHolonObject(mpC.searchCat("Building"), "House", new ArrayList<HolonElement>(), "/Images/home-2.png");
-		addNewHolonSwitch(mpC.searchCat("Component"), "Switch", "/Images/switch-on.png");
+		HolonObject house = addNewHolonObject(building, "House", new ArrayList<HolonElement>(), "/Images/home-2.png");
+		addNewHolonSwitch(component, "Switch", "/Images/switch-on.png");
+		powerPlant.addElement(new HolonElement(null, "Power", 10000));
+		energy.getObjects().add(powerPlant);
+	
+		house.addElement(new HolonElement(null, "TV", -250));
+		house.addElement(new HolonElement(null, "TV", -250));
+		house.addElement(new HolonElement(null, "Fridge", -500));
+		house.addElement(new HolonElement(null, "Radio", -100));
+		house.addElement(new HolonElement(null, "PC", -250));
+		house.addElement(new HolonElement(null, "PC", -250));
+		house.addElement(new HolonElement(null, "PC", -250));
+		house.addElement(new HolonElement(null, "Light", -50));
+		house.addElement(new HolonElement(null, "Light", -50));
+		house.addElement(new HolonElement(null, "Light", -50));
+		house.addElement(new HolonElement(null, "Light", -50));
+		house.addElement(new HolonElement(null, "Light", -50));
+		house.addElement(new HolonElement(null, "Solar Panel", 300));
+		building.getObjects().add(house);
 		OnCategoryChanged.broadcast();
 	}
 
-	/**
-	 * Adds Category into Model if a Category with the same name already exists
-	 * 
-	 * @param category
-	 *            the new Category
-	 */
-	public void addCategory(Category category) {
+	
+	public Category createCategoryWithName(String categoryName) {
 		int i = 0;
-		while (mpC.searchCat(category.getName()) != null) {
-			if (category.getName().contains("_"))
-				category.setName(category.getName().substring(0, category.getName().indexOf('_')));
-			category.setName(category.getName() + "_" + i);
+		while (findCategoryWithName(categoryName).isPresent()) {
+			if (categoryName.contains("_")) {
+				categoryName = (categoryName.substring(0, categoryName.indexOf('_')));				
+			}
+			
+			categoryName += "_" + i;
 			i++;
 		}
-		model.getCgIdx().put(category.getName(), model.getCategories().size());
-		model.getCategories().add(category);
+		
+		Category cat = new Category(categoryName);
+		GuiSettings.getCategories().add(cat);	
 		OnCategoryChanged.broadcast();
+		return cat;
 	}
 
-	/**
-	 * Adds New Category into Model.
-	 * 
-	 * @param name
-	 *            Bezeichnung der neuen Kategorie
-	 */
-	public void addNewCategory(String name) {
-		addCategory(new Category(name));
-	}
 
 	/**
 	 * remove a Category from Model.
@@ -91,33 +93,10 @@ public class CategoryController {
 	 *            Category
 	 */
 	public void removeCategory(Category c) {
-		mpC.decIdx(c.getName(), model.getCgIdx());
-		model.getCgIdx().remove(c.getName());
-		model.getCategories().remove(c);
+		GuiSettings.getCategories().remove(c);
 		OnCategoryChanged.broadcast();
-
-	}
-	
-	/**
-	 * get All Categories
-	 * 
-	 * @return the ArrayList of all Categories
-	 */
-	public ArrayList<Category> getCategories()
-	{
-		return model.getCategories();
 	}
 	
-	
-	/**
-	 * delete a given Category.
-	 * 
-	 * @param category
-	 *            the Category
-	 */
-	public void deleteCategory(String category) {
-		removeCategory(mpC.searchCat(category));
-	}
 
 	/**
 	 * Add Object into a Category.
@@ -132,7 +111,7 @@ public class CategoryController {
 		boolean updateElementSaves = false;
 		String name = "";
 		//TODO(Tom2021-12-1) remove/redo this search
-		while (mpC.searchCatObj(category, object.getName()).isPresent()) {
+		while (category.findObjectWithName(object.getName()).isPresent()) {
 			updateElementSaves = true;
 			if (object.getName().contains("_"))
 				object.setName(object.getName().substring(0, object.getName().indexOf('_')));
@@ -145,7 +124,6 @@ public class CategoryController {
 				e.setSaving(new SimpleEntry<String,String>(e.getSaving().getKey(), name));
 			}
 		}
-		category.getObjIdx().put(object.getName(), category.getObjects().size());
 		category.getObjects().add(object);
 	}
 
@@ -161,14 +139,15 @@ public class CategoryController {
 	 * @param image
 	 *            the image Path
 	 */
-	public void addNewHolonObject(Category category, String object, List<HolonElement> list, String image) {
+	public HolonObject addNewHolonObject(Category category, String object, List<HolonElement> list, String image) {
 		HolonObject obj = new HolonObject(object);
 		obj.setImage(image);
 		obj.setElements(list);
 		obj.setSav(category.getName());
 		addObject(category, obj);
+		return obj;
 	}
-
+	
 
 	/**
 	 * Add new Holon Switch.
@@ -180,12 +159,12 @@ public class CategoryController {
 	 * @param image
 	 *            the Image Path
 	 */
-	public void addNewHolonSwitch(Category cat, String objName, String image) {
+	public HolonSwitch addNewHolonSwitch(Category cat, String objName, String image) {
 		HolonSwitch holonSwitch = new HolonSwitch(objName);
-		
 		holonSwitch.setImage(image);
 		holonSwitch.setSav(cat.getName());
 		addObject(cat, holonSwitch);
+		return holonSwitch;
 	}
 	
 	
@@ -196,25 +175,16 @@ public class CategoryController {
 	 * @param cps the Object
 	 */
 	public void removeObject(Category category, AbstractCanvasObject cps) {
-
-		mpC.decIdx(cps.getName(), category.getObjIdx());
-		category.getObjIdx().remove(cps.getName());
 		category.getObjects().remove(cps);
 		OnCategoryChanged.broadcast();
 	}
 
-	/**
-	 * Delete an Object from a Category.
-	 * 
-	 * @param category
-	 *            the Category
-	 * @param objectName
-	 *            the Object
-	 */
-	public void deleteObject(String category, String objectName) {
-		Category cat = mpC.searchCat(category);
-		Optional<AbstractCanvasObject> object = mpC.searchCatObj(cat, objectName);
-		object.ifPresent(obj -> removeObject(cat, obj));
+	
+	
+	public Optional<Category> findCategoryWithName(String categoryName) {
+		return GuiSettings.getCategories().stream().filter(cat -> cat.getName().equals(categoryName)).findAny();
 	}
+	
+	
 
 }

+ 29 - 44
src/holeg/ui/controller/ClipboardController.java

@@ -35,7 +35,7 @@ public class ClipboardController {
 	private SimulationManager simManager;
 
     ClipboardController(Model model, SaveController store, LoadController load, CanvasController cvs,
-                        ObjectController obj, NodeController uppC, SimulationManager simManager) {
+                        NodeController uppC, SimulationManager simManager) {
         this.model = model;
         this.store = store;
         this.load = load;
@@ -58,10 +58,10 @@ public class ClipboardController {
         store.initNumeration();
 
         file.add("SAV", new JsonPrimitive((upperNode == null ? "CVS" : "" + upperNode.getId())));
-        Vector2Int pos = uppC.calculatePos(model.getSelectedObjects());
-        file.add("CENTER", model.getGson().toJsonTree(pos, Vector2Int.class));
+        Vector2Int pos = uppC.calculatePos(GuiSettings.getSelectedObjects());
+        file.add("CENTER", GuiSettings.gson.toJsonTree(pos, Vector2Int.class));
 
-        for (AbstractCanvasObject abs : model.getSelectedObjects()) {
+        for (AbstractCanvasObject abs : GuiSettings.getSelectedObjects()) {
             queue.add(abs);
         }
         while (!queue.isEmpty()) {
@@ -69,8 +69,8 @@ public class ClipboardController {
             u = queue.pop();
 
             String key = "CVSOBJECT" + store.getNumerator(NUMTYPE.OBJECT);
-            file.add(key, model.getGson().toJsonTree(u, AbstractCanvasObject.class));
-            edgeToJson(EDGETYPE.CONNECTION, file, u.getId(), u.getConnections());
+            file.add(key, GuiSettings.gson.toJsonTree(u, AbstractCanvasObject.class));
+            edgeToJson(EDGETYPE.CONNECTION, file, u.getId(), new ArrayList<>());
 
             if (u instanceof HolonObject)
                 store.elementsToJson(TYPE.CANVAS, file, u);
@@ -88,7 +88,7 @@ public class ClipboardController {
         if (upperNode == null)
             edgeToJson(EDGETYPE.LAYER, file, 0, model.getEdgesOnCanvas());
 
-        StringSelection selection = new StringSelection(model.getGson().toJson(file));
+        StringSelection selection = new StringSelection(GuiSettings.gson.toJson(file));
         clipboard.setContents(selection, selection);
 
     }
@@ -124,20 +124,20 @@ public class ClipboardController {
 
         HashMap<Integer, AbstractCanvasObject> objDispatch = new HashMap<>();
         HashMap<Integer, HolonElement> eleDispatch = new HashMap<>();
-        model.getSelectedObjects().clear();
+        GuiSettings.getSelectedObjects().clear();
 
         objIDMap = new HashMap<>();
         eleIDMap = new HashMap<>();
         sav = json.get("SAV").getAsString();
 
-        Vector2Int old = model.getGson().getAdapter(Vector2Int.class).fromJsonTree(json.get("CENTER"));
+        Vector2Int old = GuiSettings.gson.getAdapter(Vector2Int.class).fromJsonTree(json.get("CENTER"));
         point = new Point(old.getX() - p.x, old.getY() - p.y);
 
         forwardObjects(keys, json, objDispatch, eleDispatch, upperNode);
         // for selecting Cps
         getObjectsInDepth();
         forwardEdges(edges, json, objDispatch, upperNode);
-        this.simManager.calculateStateForTimeStep(model.getActualTimeStep(), true);
+        this.simManager.calculateStateForTimeStep(model.getCurrentIteration(), true);
     }
 
     /**
@@ -145,7 +145,7 @@ public class ClipboardController {
      */
     void cut(GroupNode upperNode) {
         copy(upperNode);
-        for (AbstractCanvasObject abs : model.getSelectedObjects()) {
+        for (AbstractCanvasObject abs : GuiSettings.getSelectedObjects()) {
             if (upperNode == null)
                 cvsC.deleteObjectOnCanvas(abs);
             else
@@ -154,8 +154,8 @@ public class ClipboardController {
             if (abs instanceof GroupNode groupnode)
                 cvsC.bfsNodeCleaner(groupnode);
         }
-        model.getSelectedObjects().clear();
-        this.simManager.calculateStateForTimeStep(model.getActualTimeStep(), true);
+        GuiSettings.getSelectedObjects().clear();
+        this.simManager.calculateStateForTimeStep(model.getCurrentIteration(), true);
 
     }
 
@@ -199,7 +199,7 @@ public class ClipboardController {
 
     private void loadCanvasObject(JsonElement jsonElement, HashMap<Integer, AbstractCanvasObject> objDispatch,
                                   GroupNode upperNode) {
-        AbstractCanvasObject temp = model.getGson().fromJson(jsonElement.getAsJsonObject(), AbstractCanvasObject.class);
+        AbstractCanvasObject temp = GuiSettings.gson.fromJson(jsonElement.getAsJsonObject(), AbstractCanvasObject.class);
         temp.initForReflection();
         objIDMapper(temp);
         updatePosition(temp, upperNode);
@@ -211,7 +211,7 @@ public class ClipboardController {
             else
                 uppC.addObjectInUpperNode(temp, upperNode, false);
             // mark the Pasted Objects
-            model.getSelectedObjects().add(temp);
+            GuiSettings.getSelectedObjects().add(temp);
         } else {
             // else look up the table and put it into the right Uppernode
             GroupNode temp2 = (GroupNode) objDispatch.get(objIDMap.get(Integer.parseInt(temp.getSav())));
@@ -236,7 +236,7 @@ public class ClipboardController {
                                     HashMap<Integer, HolonElement> eleDispatch) {
         JsonObject object = jsonElement.getAsJsonObject();
 
-        HolonElement ele = model.getGson().fromJson(object.get("properties"), HolonElement.class);
+        HolonElement ele = GuiSettings.gson.fromJson(object.get("properties"), HolonElement.class);
         load.initElements(ele);
         eleIDMapper(ele);
         // id which Object it was stored before
@@ -299,7 +299,7 @@ public class ClipboardController {
     private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCanvasObject> objDispatch,
                           GroupNode upperNode) {
         JsonObject object = jsonElement.getAsJsonObject();
-        Edge temp = model.getGson().fromJson(object.get("properties"), Edge.class);
+        Edge temp = GuiSettings.gson.fromJson(object.get("properties"), Edge.class);
         load.initCpsEdge(temp);
         // look for A and B inside the Table
         temp.setA(objDispatch.get(objIDMap.get(object.get("A").getAsInt())));
@@ -311,21 +311,11 @@ public class ClipboardController {
                 model.getEdgesOnCanvas().add(temp);
                 break;
             case CONNECTION:
-                // if no duplicates in connection store them into the given A and B
-                if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getA().getConnections()))
-                    temp.getA().getConnections().add(temp);
-                if (!uppC.lookforDuplicates(temp.getA(), temp.getB(), temp.getB().getConnections()))
-                    temp.getB().getConnections().add(temp);
                 break;
             default:
                 break;
         }
 
-        if (object.get("connection").getAsBoolean() && !type.equals(EDGETYPE.CONNECTION)) {
-            temp.getA().getConnections().add(temp);
-            temp.getB().getConnections().add(temp);
-        }
-
     }
 
     /**
@@ -337,10 +327,10 @@ public class ClipboardController {
         JsonObject temp = new JsonObject();
 
         for (Edge edge : arr) {
-            if (model.getClipboradObjects().contains(edge.getA())
-                    && model.getClipboradObjects().contains(edge.getB())) {
+            if (GuiSettings.getClipboardObjects().contains(edge.getA())
+                    && GuiSettings.getClipboardObjects().contains(edge.getB())) {
                 // add properties and only the ids from a and b
-                temp.add("properties", model.getGson().toJsonTree(edge));
+                temp.add("properties", GuiSettings.gson.toJsonTree(edge));
                 temp.add("A", new JsonPrimitive(edge.getA().getId()));
                 temp.add("B", new JsonPrimitive(edge.getB().getId()));
 
@@ -364,12 +354,8 @@ public class ClipboardController {
                     default:
                         break;
                 }
-                // lookup if the CVS, NODE or OLDEDGE are also connections
-                if (edge.getA().getConnections().contains(edge) && edge.getA().getConnections().contains(edge)
-                        && !type.equals(EDGETYPE.CONNECTION))
-                    b = true;
                 temp.add("connection", new JsonPrimitive(b));
-                file.add(k, model.getGson().toJsonTree(temp));
+                file.add(k, GuiSettings.gson.toJsonTree(temp));
                 temp = new JsonObject();
             }
         }
@@ -379,11 +365,11 @@ public class ClipboardController {
      * Adds all Objects in Depth into Clipboardobjects preemptive when objects are selected
      */
     void getObjectsInDepth() {
-        model.getClipboradObjects().clear();
-        for (AbstractCanvasObject obj : model.getSelectedObjects()) {
-        	model.getClipboradObjects().add(obj);
+        GuiSettings.getClipboardObjects().clear();
+        for (AbstractCanvasObject obj : GuiSettings.getSelectedObjects()) {
+        	GuiSettings.getClipboardObjects().add(obj);
         	if (obj instanceof GroupNode groupnode) {
-        		groupnode.getAllObjectsRecursive().forEach(object -> model.getClipboradObjects().add(object));
+        		groupnode.getAllObjectsRecursive().forEach(object -> GuiSettings.getClipboardObjects().add(object));
             }
         }
     }
@@ -418,13 +404,12 @@ public class ClipboardController {
                 x = GuiSettings.getPictureScaleDiv2() + 1;
         } else if (x < 0)
             x = 0 + GuiSettings.getPictureScaleDiv2() + 1;
-        if (x > model.getCanvasX())
-            x = model.getCanvasX() - GuiSettings.getPictureScaleDiv2() - 1;
-        if (y > model.getCanvasX())
-            y = model.getCanvasY() - GuiSettings.getPictureScaleDiv2() - 1;
+        if (x > GuiSettings.canvasSize.getX())
+            x = GuiSettings.canvasSize.getX() - GuiSettings.getPictureScaleDiv2() - 1;
+        if (y > GuiSettings.canvasSize.getY())
+            y = GuiSettings.canvasSize.getY() - GuiSettings.getPictureScaleDiv2() - 1;
 
         temp.setPosition(new Vector2Int(x, y));
-
     }
 
 }

+ 45 - 136
src/holeg/ui/controller/Control.java

@@ -8,6 +8,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -36,9 +37,7 @@ import holeg.utility.events.Event;
  * @author Gruppe14
  */
 public class Control {
-	private final MultiPurposeController multiPurposeController;
 	private final CategoryController categoryController;
-	private final ObjectController objectController;
 	private final CanvasController canvasController;
 	private final SaveController saveController;
 	private final LoadController loadController;
@@ -64,19 +63,16 @@ public class Control {
 	 */
 	public Control(Model model) {
 		this.model = model;
-
-		this.multiPurposeController = new MultiPurposeController(model);
-		this.categoryController = new CategoryController(model, multiPurposeController, this);
-		this.objectController = new ObjectController(model, multiPurposeController);
-		this.canvasController = new CanvasController(model, multiPurposeController);
+		this.categoryController = new CategoryController(this);
+		this.canvasController = new CanvasController(model);
 		this.saveController = new SaveController(model);
 		this.nodeController = new NodeController(model, canvasController);
-		this.loadController = new LoadController(model, categoryController, canvasController, objectController,
-				nodeController, multiPurposeController);
+		this.loadController = new LoadController(model, categoryController, canvasController,
+				nodeController);
 		this.simulationManager = new SimulationManager(model);
-		this.autoSaveController = new AutoSaveController(model);
+		this.autoSaveController = new AutoSaveController();
 		this.clipboardController = new ClipboardController(model, saveController, loadController, canvasController,
-				objectController, nodeController, this.simulationManager);
+				nodeController, this.simulationManager);
 
 		autosaveDir = System.getProperty("user.home") + "/.config/HolonGUI/Autosave/";
 		categoryDir = System.getProperty("user.home") + "/.config/HolonGUI/Category/";
@@ -124,46 +120,25 @@ public class Control {
 		}
 	}
 
-	/* Operations for searching */
 
-	/**
-	 * Search for Object by ID.
-	 *
-	 * @param id the id of the Object
-	 * @return the CpsObject
-	 */
-	public AbstractCanvasObject searchByID(int id) {
-		return multiPurposeController.searchByID(id);
-	}
 
 
-	public AbstractCanvasObject searchTracked(int id) {
-		return multiPurposeController.searchByID(id);
-	}
 	
-
-
-	/**
-	 * search for category.
-	 *
-	 * @param cat name of the Category
-	 * @return the Category
-	 */
-	public Category searchCategory(String cat) {
-		return multiPurposeController.searchCat(cat);
+	
+	public Optional<Category> findCategoryWithName(String name){
+		return GuiSettings.getCategories().stream().filter(cat -> cat.getName().equals(name)).findAny();
 	}
-
+	
+	
 	/* Operations for Categories and Objects */
 
 	/**
 	 * init default category and objects.
-	 *
-	 * @throws IOException
 	 */
-	public void resetCategorys() throws IOException {
+	public void resetCategories() {
 		categoryController.initCategories();
-		objectController.initHolonElements();
 		saveCategory();
+
 	}
 
 	/**
@@ -172,8 +147,8 @@ public class Control {
 	 * @param cat name of the new Category
 	 * @throws IOException
 	 */
-	public void addCategory(String cat) throws IOException {
-		categoryController.addNewCategory(cat);
+	public void createCategoryWithName(String cat) {
+		categoryController.createCategoryWithName(cat);
 		saveCategory();
 	}
 
@@ -183,8 +158,8 @@ public class Control {
 	 * @return a array of strings from all Categorys
 	 */
 	public String[] getCategoriesStrings() {
-		return ((ArrayList<String>) categoryController.getCategories().stream().map(c -> c.getName())
-				.collect(Collectors.toList())).toArray(new String[categoryController.getCategories().size()]);
+		return GuiSettings.getCategories().stream().map(c -> c.getName()).collect(Collectors.toList())
+				.toArray(new String[GuiSettings.getCategories().size()]);
 	}
 
 	/**
@@ -196,7 +171,7 @@ public class Control {
 	 * @param img  the image Path
 	 * @throws IOException
 	 */
-	public void addObject(Category cat, String obj, List<HolonElement> list, String img) throws IOException {
+	public void addObject(Category cat, String obj, List<HolonElement> list, String img){
 		categoryController.addNewHolonObject(cat, obj, list, img);
 		saveCategory();
 	}
@@ -208,7 +183,7 @@ public class Control {
 	 * @param obj New Object Name
 	 * @throws IOException
 	 */
-	public void addSwitch(Category cat, String obj) throws IOException {
+	public void addSwitch(Category cat, String obj) {
 		categoryController.addNewHolonSwitch(cat, obj, "/Images/switch-on.png");
 		saveCategory();
 	}
@@ -219,20 +194,8 @@ public class Control {
 	 * @param cat the Category
 	 * @throws IOException
 	 */
-	public void deleteCategory(String cat) throws IOException {
-		categoryController.deleteCategory(cat);
-		saveCategory();
-	}
-
-	/**
-	 * Delete an Object from a Category.
-	 *
-	 * @param cat the Category
-	 * @param obj the Object
-	 * @throws IOException
-	 */
-	public void delObjectCategory(String cat, String obj) throws IOException {
-		categoryController.deleteObject(cat, obj);
+	public void deleteCategory(Category category) {
+		categoryController.removeCategory(category);
 		saveCategory();
 	}
 
@@ -242,47 +205,44 @@ public class Control {
 	 * @param obj Cpsobject
 	 */
 	public void removeObjectsFromSelection(Collection<AbstractCanvasObject> objects) {
-		for (AbstractCanvasObject object : objects) {
-			objectController.removeObjectFromSelection(object);
+		for (AbstractCanvasObject obj : objects) {
+			GuiSettings.getSelectedObjects().remove(obj);
 		}
 		OnSelectionChanged.broadcast();
 	}
 
-    
-
 	/**
 	 * removes a selectedObject from selection.
 	 *
 	 * @param obj Cpsobject
 	 */
 	public void removeObjectFromSelection(AbstractCanvasObject obj) {
-		objectController.removeObjectFromSelection(obj);
+		GuiSettings.getSelectedObjects().remove(obj);
 		OnSelectionChanged.broadcast();
 	}
 
-
 	/**
 	 * add an Object to selectedObject.
 	 *
 	 * @param obj AbstractCpsobject
 	 */
 	public void addSelectedObject(AbstractCanvasObject obj) {
-		objectController.addSelectedObject(obj);
+		GuiSettings.getSelectedObjects().add(obj);
 		OnSelectionChanged.broadcast();
 	}
 
 	public void addSelectedObjects(Collection<AbstractCanvasObject> objects) {
-		objectController.addSelectedObjects(objects);
+		GuiSettings.getSelectedObjects().addAll(objects);
 		OnSelectionChanged.broadcast();
 	}
 
 	public void clearSelection() {
-		if(!model.getSelectedObjects().isEmpty()) {
-			model.getSelectedObjects().clear();
+		if (!GuiSettings.getSelectedObjects().isEmpty()) {
+			GuiSettings.getSelectedObjects().clear();
 			OnSelectionChanged.broadcast();
 		}
 	}
-	
+
 	/**
 	 * This method is primarily for the multi-selection. It adds unselected objects
 	 * to the selection and Removes selected objects from the selection. Like the
@@ -292,9 +252,9 @@ public class Control {
 	 */
 	public void toggleSelectedObjects(Collection<AbstractCanvasObject> objects) {
 		Set<AbstractCanvasObject> intersection = new HashSet<>(objects);
-		intersection.retainAll(model.getSelectedObjects());
-		model.getSelectedObjects().addAll(objects);
-		model.getSelectedObjects().removeAll(intersection);
+		intersection.retainAll(GuiSettings.getSelectedObjects());
+		GuiSettings.getSelectedObjects().addAll(objects);
+		GuiSettings.getSelectedObjects().removeAll(intersection);
 		OnSelectionChanged.broadcast();
 	}
 
@@ -307,7 +267,7 @@ public class Control {
 	 */
 	public void addObjectCanvas(AbstractCanvasObject object) {
 		canvasController.addNewObject(object);
-		calculateStateAndVisualForTimeStep(model.getActualTimeStep());
+		calculateStateAndVisualForTimeStep(model.getCurrentIteration());
 		if (!(object instanceof Node)) {
 			tryAutoSave();
 		}
@@ -367,43 +327,6 @@ public class Control {
 		tryAutoSave();
 	}
 
-	/**
-	 * Set the selected Edge.
-	 *
-	 * @param edge that is selected
-	 */
-	public void setSelecteEdge(Edge edge) {
-		model.setSelectedEdge(edge);
-	}
-
-	/* Operations for Objects and Elements */
-
-	/**
-	 * Add a new Element into a Object on the Canvas.
-	 *
-	 * @param objectId  the Object ID
-	 * @param ele       the Name of the Element
-	 * @param energy    the Energy
-	 * @param elementId the Element ID
-	 */
-	public void addElementCanvasObject(int objectId, String ele, float energy, int elementId) {
-		objectController.addNewElementIntoCanvasObject(objectId, ele, energy, elementId);
-		tryAutoSave();
-	}
-
-	/**
-	 * Add a new Element into a Object in Category.
-	 *
-	 * @param catName the Category
-	 * @param objName the Object
-	 * @param eleName the Element Name
-	 * @param amount  the amount
-	 * @param energy  the Energy
-	 */
-	public void addElementCategoryObject(String catName, String objName, String eleName, float energy) {
-		objectController.addNewElementIntoCategoryObject(catName, objName, eleName, energy);
-	}
-
 
 	/**
 	 * Writes the current State of the Modelling into a JSON File which can be
@@ -452,11 +375,11 @@ public class Control {
 	 * Timestep.
 	 */
 	public void calculateStateAndVisualForCurrentTimeStep() {
-		calculateStateAndVisualForTimeStep(model.getActualTimeStep());
+		calculateStateAndVisualForTimeStep(model.getCurrentIteration());
 	}
 
 	public void calculateStateOnlyForCurrentTimeStep() {
-		simulationManager.calculateStateForTimeStep(model.getActualTimeStep(), false);
+		simulationManager.calculateStateForTimeStep(model.getCurrentIteration(), false);
 	}
 
 	/**
@@ -466,7 +389,7 @@ public class Control {
 	 */
 	public void calculateStateAndVisualForTimeStep(int x) {
 		simulationManager.calculateStateForTimeStep(x, true);
-		//TODO(Tom2021-12-2): Convert to Events
+		// TODO(Tom2021-12-2): Convert to Events
 		updateOutliner();
 		updateFlexWindow();
 		this.updateCanvas();
@@ -489,8 +412,7 @@ public class Control {
 		autoSaveController.increaseAutoSaveNr();
 		saveController.writeAutosave(autosaveDir + rand + GuiSettings.autoSaveNr);
 		if (autoSaveController.allowed()) {
-			new File(autosaveDir + rand + (GuiSettings.autoSaveNr - GuiSettings.numberOfSaves))
-					.delete();
+			new File(autosaveDir + rand + (GuiSettings.autoSaveNr - GuiSettings.numberOfSaves)).delete();
 		}
 	}
 
@@ -529,8 +451,13 @@ public class Control {
 		}
 	}
 
-	public void saveCategory() throws IOException {
-		saveController.writeCategory(categoryDir + "Category.json");
+	public void saveCategory() {
+		try {
+			saveController.writeCategory(categoryDir + "Category.json");
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
 
 	public void savePosAndSizeOfWindow(int x, int y, int width, int height) throws IOException, ArchiveException {
@@ -589,7 +516,6 @@ public class Control {
 		return simulationManager;
 	}
 
-
 	// ========================== MANAGING TRACKED OBJECTS END ================
 
 	/**
@@ -631,7 +557,6 @@ public class Control {
 		tryAutoSave();
 	}
 
-
 	/**
 	 * Copy all Selected Objects.
 	 */
@@ -667,20 +592,6 @@ public class Control {
 		clipboardController.getObjectsInDepth();
 	}
 
-
-	/**
-	 * Set the Background Image;
-	 *
-	 * @param imagePath Image Path
-	 * @param mode      Image Mode
-	 * @param width     Image custom width
-	 * @param height    Image custom height
-	 */
-	public void setBackgroundImage(String imagePath, int mode, int width, int height) {
-		canvasController.setBackgroundImage(imagePath, mode, width, height);
-	}
-
-
 	public void updateOutliner() {
 		this.canvasController.updateOutliner(simulationManager);
 	}
@@ -705,6 +616,4 @@ public class Control {
 		canvasController.setGui(gui);
 	}
 
-	
-
 }

+ 33 - 40
src/holeg/ui/controller/LoadController.java

@@ -7,10 +7,10 @@ import com.google.gson.reflect.TypeToken;
 
 import holeg.model.*;
 import holeg.model.HolonElement.Priority;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.model.IdCounter;
 import holeg.ui.model.Model;
 import holeg.ui.model.IdCounter.CounterType;
-import holeg.ui.view.main.Category;
 import holeg.utility.Vector2Float;
 
 import org.apache.commons.compress.archivers.ArchiveEntry;
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 /**
@@ -34,12 +35,11 @@ import java.util.stream.Collectors;
  * @author Gruppe14
  */
 public class LoadController {
+	private static final Logger log = Logger.getLogger(Model.class.getName());
     private Model model;
     private CategoryController cgC;
     private CanvasController cvsC;
-    private ObjectController objC;
     private NodeController uppC;
-    private MultiPurposeController mpC;
     private JsonParser parser;
     private static HashMap<String,String> OldTypeNameReplacement = new HashMap<String, String>();
     
@@ -57,15 +57,13 @@ public class LoadController {
      * @param obj   ObjectController
      * @param mp    MultiPurposeController
      */
-    LoadController(Model model, CategoryController cg, CanvasController cvs, ObjectController obj,
-                   NodeController uppC, MultiPurposeController mp) {
+    LoadController(Model model, CategoryController cg, CanvasController cvs,
+                   NodeController uppC) {
     	
         this.model = model;
         this.cgC = cg;
         this.cvsC = cvs;
-        this.objC = obj;
         this.uppC = uppC;
-        this.mpC = mp;
         this.parser = new JsonParser();
     }
 
@@ -191,28 +189,15 @@ public class LoadController {
 
         switch (MODE.valueOf(json.get("MODE").getAsString())) {
             case COMPLETE:
-                model.setCvsObjIdx(new HashMap<>());
-                model.setObjectsOnCanvas(new ArrayList<>());
-                model.setEdgesOnCanvas(new ArrayList<>());
-                model.setHashcodeMap(new HashMap<>());
-                model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
-                model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
-                IdCounter.setCounter(json.get("IDCOUNTER").getAsInt(), CounterType.Object);
-                IdCounter.setCounter(json.get("IDCOUNTERELEMENT").getAsInt(), CounterType.Element);
-                break;
             case PARTIAL:
-                model.setCvsObjIdx(new HashMap<>());
                 model.setObjectsOnCanvas(new ArrayList<>());
                 model.setEdgesOnCanvas(new ArrayList<>());
-                model.setHashcodeMap(new HashMap<>());
-                model.setCanvasX(json.get("CANVAS_SIZE_X").getAsInt());
-                model.setCanvasX(json.get("CANVAS_SIZE_Y").getAsInt());
+                GuiSettings.canvasSize.setX(json.get("CANVAS_SIZE_X").getAsInt());
+                GuiSettings.canvasSize.setY(json.get("CANVAS_SIZE_Y").getAsInt());
                 IdCounter.setCounter(json.get("IDCOUNTER").getAsInt(), CounterType.Object);
                 IdCounter.setCounter(json.get("IDCOUNTERELEMENT").getAsInt(), CounterType.Element);
                 break;
             case CATEGORY:
-                model.setCgIdx(new HashMap<>());
-                model.setCategories(new ArrayList<>());
 
             default:
                 break;
@@ -224,8 +209,11 @@ public class LoadController {
      * Load a given Category
      */
     private void loadCategory(JsonElement jsonElement) {
-        if (mpC.searchCat(jsonElement.getAsString()) == null)
-            cgC.addCategory(new Category(jsonElement.getAsString()));
+        if (cgC.findCategoryWithName(jsonElement.getAsString()).isEmpty()) {
+        	cgC.createCategoryWithName(jsonElement.getAsString());
+        }
+
+        
     }
 
     /**
@@ -235,18 +223,20 @@ public class LoadController {
     	AbstractCanvasObject temp;
     	replaceOldClassNames(jsonObject);
     	try {
-    		temp = model.getGson().fromJson(jsonObject, AbstractCanvasObject.class);
+    		temp = GuiSettings.gson.fromJson(jsonObject, AbstractCanvasObject.class);
     	}catch (com.google.gson.JsonParseException e){
-    		System.err.println(jsonObject.get("type").getAsString());
+    		log.warning(jsonObject.get("type").getAsString());
     		return;
     	}
         
         temp.setImage(checkOS(temp.getImage()));
         temp.initForReflection();
-        if (mpC.searchCatObj(mpC.searchCat(temp.getSav()), temp.getName()) != null)
-            cgC.deleteObject(temp.getSav(), temp.getName());
-        cgC.addObject(mpC.searchCat(temp.getSav()), temp);
-
+        cgC.findCategoryWithName(temp.getSav()).ifPresent(cat -> {
+        	cat.findObjectWithName(temp.getName()).ifPresent(obj -> {
+        		cgC.removeObject(cat, obj);
+        	});
+        	cgC.addObject(cat, temp);
+        });
     }
 
     /**
@@ -255,10 +245,10 @@ public class LoadController {
      */
     private void loadCategoryElements(JsonElement jsonElement, HashMap<Integer, HolonElement> eleDispatch) {
         JsonObject object = jsonElement.getAsJsonObject();
-        HolonElement ele = model.getGson().fromJson(object.get("properties"), HolonElement.class); 
+        HolonElement ele = GuiSettings.gson.fromJson(object.get("properties"), HolonElement.class); 
         eleDispatch.put(ele.getId(), ele);
         initElements(ele);
-        ele.flexList = model.getGson().fromJson(object.get("FlexList"), new TypeToken<List<Flexibility>>() {}.getType());
+        ele.flexList = GuiSettings.gson.fromJson(object.get("FlexList"), new TypeToken<List<Flexibility>>() {}.getType());
         if(ele.flexList == null) ele.flexList = new ArrayList<Flexibility>();
         ele.flexList.stream().forEach(flex -> {
         	flex.setElement(ele);
@@ -270,7 +260,13 @@ public class LoadController {
         if(amount != null) {
         	ele.setEnergy(amount.getAsInt() * ele.getEnergy());
         }
-        objC.addElementIntoCategoryObject(ele.getSaving().getKey(), ele.getSaving().getValue(), ele);
+        cgC.findCategoryWithName(ele.getSaving().getKey()).ifPresent(cat -> {
+        	cat.findObjectWithName(ele.getSaving().getValue()).ifPresent(obj -> {
+        		HolonObject hObject = (HolonObject) obj;
+        		hObject.addElement(ele);
+        	});
+        });
+        
     }
 
     /**
@@ -280,16 +276,13 @@ public class LoadController {
     	AbstractCanvasObject temp = null;
     	replaceOldClassNames(jsonObject);
     	try {
-    		temp = model.getGson().fromJson(jsonObject, AbstractCanvasObject.class);
+    		temp = GuiSettings.gson.fromJson(jsonObject, AbstractCanvasObject.class);
     	}catch (com.google.gson.JsonParseException e){
     		System.err.println(jsonObject.get("type").getAsString());
     		return;
     	}
         temp.initForReflection();
         temp.setImage(checkOS(temp.getImage()));
-        if (temp instanceof GroupNode groupnode) {
-            model.getHashcodeMap().put(jsonObject.get("hash").getAsInt(), groupnode);
-        }
         // if its stored before on the canvas just put it there
         if (temp.getSav().equals("CVS")) {
             cvsC.addObject(temp, false);
@@ -328,9 +321,9 @@ public class LoadController {
                                     HashMap<Integer, HolonElement> eleDispatch) {
 
         JsonObject object = jsonElement.getAsJsonObject();
-        HolonElement ele = model.getGson().fromJson(object.get("properties"), HolonElement.class);
+        HolonElement ele = GuiSettings.gson.fromJson(object.get("properties"), HolonElement.class);
         initElements(ele);
-        ele.flexList = model.getGson().fromJson(object.get("FlexList"), new TypeToken<List<Flexibility>>() {}.getType());
+        ele.flexList = GuiSettings.gson.fromJson(object.get("FlexList"), new TypeToken<List<Flexibility>>() {}.getType());
         if(ele.flexList == null) ele.flexList = new ArrayList<>();
         ele.flexList.stream().forEach(flex -> {
         	flex.setElement(ele);
@@ -359,7 +352,7 @@ public class LoadController {
      */
     private void loadEdge(EDGETYPE type, JsonElement jsonElement, HashMap<Integer, AbstractCanvasObject> objDispatch) {
         JsonObject object = jsonElement.getAsJsonObject();
-        Edge temp = model.getGson().fromJson(object.get("properties"), Edge.class);
+        Edge temp = GuiSettings.gson.fromJson(object.get("properties"), Edge.class);
         initCpsEdge(temp);
         // look for A and B inside the Table
         temp.setA(objDispatch.get(object.get("A").getAsInt()));

+ 0 - 189
src/holeg/ui/controller/MultiPurposeController.java

@@ -1,189 +0,0 @@
-package holeg.ui.controller;
-
-import java.util.HashMap;
-import java.util.Map.Entry;
-
-import holeg.model.AbstractCanvasObject;
-import holeg.model.Edge;
-import holeg.ui.model.Model;
-import holeg.ui.view.main.Category;
-
-import java.util.Optional;
-
-/**
- * Controller for Multiple Purposes.
- * 
- * @author Gruppe14
- */
-public class MultiPurposeController {
-
-	private Model model;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param model
-	 *            Model
-	 */
-	public MultiPurposeController(Model model) {
-		this.model = model;
-
-	}
-
-	/**
-	 * search for category.
-	 * 
-	 * @param category
-	 *            name of the Category
-	 * @return the Category
-	 */
-	public Category searchCat(String category) {
-
-		Integer idx;
-
-		if ((idx = model.getCgIdx().get(category)) == null || model.getCgIdx().size() < 1)
-			return null;
-		else
-			return model.getCategories().get(idx);
-	}
-
-	/**
-	 * Search for Object in a Category.
-	 * 
-	 * @param category
-	 *            name of the Category
-	 * @param object
-	 *            Name of the Object
-	 * @return The Object
-	 */
-	public Optional<AbstractCanvasObject> searchCatObj(Category category, String objectName) {
-
-		Integer idx;
-		if (category.getObjIdx().isEmpty()) {
-			return Optional.empty();			
-		}
-		else if ((idx = category.getObjIdx().get(objectName)) == null) {
-			return Optional.empty();
-		}
-		return Optional.ofNullable(category.getObjects().get(idx));
-	}
-
-	/**
-	 * Search for Object by ID.
-	 * 
-	 * @param id
-	 *            the ID of the Object
-	 * @return the CpsObject
-	 */
-	public AbstractCanvasObject searchByID(int id) {
-
-		Integer idx;
-
-		if ((idx = model.getCvsObjIdx().get(id)) == null || model.getCvsObjIdx().size() < 1)
-			return null;
-		else
-			return model.getObjectsOnCanvas().get(idx);
-	}
-
-
-
-	/**
-	 * Search Edge between 2 Objects.
-	 * 
-	 * @param a
-	 *            ID of Object a
-	 * @param b
-	 *            ID of Object b
-	 * @return The Edge
-	 */
-	public Edge searchEdge(int a, int b) {
-
-		AbstractCanvasObject objA = searchByID(a);
-		AbstractCanvasObject objB = searchByID(b);
-
-		for (Edge edge : model.getEdgesOnCanvas()) {
-			// if (edge.getA().getObjName().equals(A.getObjName()) &&
-			// (edge.getB().getObjName().equals(B.getObjName()))
-			// || edge.getB().getObjName().equals(A.getObjName())
-			// && (edge.getA().getObjName().equals(B.getObjName())))
-			if ((edge.getA().equals(objA) && edge.getB().equals(objB))
-					|| (edge.getB().equals(objA)) && edge.getA().equals(objB))
-				return edge;
-		}
-		return null;
-	}
-
-	/**
-	 * Decrement the Indices if a Key as been removed.
-	 * 
-	 * @param key
-	 *            the Key
-	 * @param <T>
-	 *            key type
-	 * @param map
-	 *            the Map
-	 */
-	public <T> void decIdx(T key, HashMap<T, Integer> map) {
-		if(!map.containsKey(key)) {
-			return;
-		}
-		for (Entry<T, Integer> i : map.entrySet()) {
-			if (i.getValue() > map.get(key))
-				i.setValue(i.getValue() - 1);
-		}
-	}
-
-	/**
-	 * Adjust Indices before porting them from one map to another
-	 * 
-	 * @param key
-	 *            the Key
-	 * @param <T>
-	 *            key type
-	 * @param map
-	 *            the Map
-	 */
-	public <T> void adjustIdx(int x, HashMap<T, Integer> map) {
-
-		for (Entry<T, Integer> i : map.entrySet()) {
-			i.setValue(i.getValue() + x + 1);
-		}
-	}
-
-	/**
-	 * Returns the highest Id
-	 * 
-	 * @param map
-	 * @return
-	 */
-	public <T> int getHighestIdx(HashMap<T, Integer> map) {
-		int max = 0;
-
-		for (T i : map.keySet()) {
-			if (map.get(i) > max)
-				max = map.get(i);
-		}
-
-		return max;
-	}
-
-	/**
-	 * Copies a HashMap into a new One.
-	 * 
-	 * @param map
-	 *            the HashMap
-	 * @param <T>
-	 *            type
-	 * @return Copy of the HashMap
-	 */
-	public static <T> HashMap<T, Integer> copyHashMap(HashMap<T, Integer> map) {
-
-		HashMap<T, Integer> newMap = new HashMap<>();
-		for (Entry<T, Integer> i : map.entrySet()) {
-			newMap.put(i.getKey(), i.getValue());
-		}
-		return newMap;
-	}
-
-
-}

+ 18 - 46
src/holeg/ui/controller/NodeController.java

@@ -2,7 +2,6 @@ package holeg.ui.controller;
 
 import java.awt.*;
 import java.util.List;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 
@@ -86,13 +85,6 @@ class NodeController {
 	private void unmakeNodesOfNodes(GroupNode node, GroupNode upperNode) {
 		// add all nodes into upperNode
 
-		for (Edge edge : node.getConnections()) {
-			if (edge.getA().equals(node))
-				edge.getB().getConnections().remove(edge);
-			if (edge.getB().equals(node))
-				edge.getA().getConnections().remove(edge);
-		}
-
 		node.getObjectsInThisLayer().forEach(obj -> {
 			updatePosition(obj, upperNode);
 			if (upperNode == null)
@@ -234,20 +226,6 @@ class NodeController {
 	public void replaceObjectInUpperNode(AbstractCanvasObject toBeReplaced,
 			AbstractCanvasObject by, GroupNode upperNode) {
 		/** let all edges of 'toBeReplaced' connect to 'by' */
-		for(Edge e: toBeReplaced.getConnections()){
-			if(e.getA() == toBeReplaced){
-				e.setA(by);
-			}else if(e.getB() == toBeReplaced){
-				e.setB(by);
-			}
-			
-			/** if edge from an object to itself -> remove it */
-			/** else add edge to 'by' */
-			if(e.getA() != e.getB())
-				by.addConnection(e);
-		}
-		/** delete 'toBeReplaced' new empty connections, to prevent Nullpointer*/
-		toBeReplaced.setConnections(new ArrayList<Edge>(1));
 		/**
 		 * set Position of by to exactly toBeReplaced
 		 */
@@ -255,28 +233,22 @@ class NodeController {
 		deleteObjectInUpperNode(toBeReplaced, upperNode);
 	}
 
-	
-	
-	/**
-	 * If Position is out of boundaries adjust it
-	 */
-	private void updatePosition(AbstractCanvasObject temp, GroupNode upperNode) {
-		int x = temp.getPosition().getX() - point.x;
-		int y = temp.getPosition().getY() - point.y;
-
-		if (y < 0)
-			y = 0 + GuiSettings.getPictureScaleDiv2() + 1;
-		if (upperNode != null) {
-			if (x < GuiSettings.getPictureScaleDiv2() + 1)
-				x = GuiSettings.getPictureScaleDiv2() + 1;
-		} else if (x < 0)
-			x = 0 + GuiSettings.getPictureScaleDiv2() + 1;
-		if (x > model.getCanvasX())
-			x = model.getCanvasX() - GuiSettings.getPictureScaleDiv2() - 1;
-		if (y > model.getCanvasX())
-			y = model.getCanvasY() - GuiSettings.getPictureScaleDiv2() - 1;
-
-		temp.setPosition(new Vector2Int(x, y));
-
-	}
+    private void updatePosition(AbstractCanvasObject temp, GroupNode upperNode) {
+        int x = temp.getPosition().getX() - point.x;
+        int y = temp.getPosition().getY() - point.y;
+
+        if (y < 0)
+            y = 0 + GuiSettings.getPictureScaleDiv2() + 1;
+        if (upperNode != null) {
+            if (x < GuiSettings.getPictureScaleDiv2() + 1)
+                x = GuiSettings.getPictureScaleDiv2() + 1;
+        } else if (x < 0)
+            x = 0 + GuiSettings.getPictureScaleDiv2() + 1;
+        if (x > GuiSettings.canvasSize.getX())
+            x = GuiSettings.canvasSize.getX() - GuiSettings.getPictureScaleDiv2() - 1;
+        if (y > GuiSettings.canvasSize.getY())
+            y = GuiSettings.canvasSize.getY() - GuiSettings.getPictureScaleDiv2() - 1;
+
+        temp.setPosition(new Vector2Int(x, y));
+    }
 }

+ 0 - 153
src/holeg/ui/controller/ObjectController.java

@@ -1,153 +0,0 @@
-package holeg.ui.controller;
-
-import java.util.AbstractMap.SimpleEntry;
-
-import holeg.model.AbstractCanvasObject;
-import holeg.model.HolonElement;
-import holeg.model.HolonObject;
-import holeg.ui.model.Model;
-import java.util.Collection;
-import java.util.Optional;
-import java.util.logging.Logger;
-
-/**
- * Controller for Objects.
- *
- * @author Gruppe14
- */
-public class ObjectController {
-	
-	private static final Logger log = Logger.getLogger(ObjectController.class.getName());
-	private Model model;
-	private MultiPurposeController mpC;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param model Model
-	 * @param mp    MultiPurposeController
-	 */
-	public ObjectController(Model model, MultiPurposeController mp) {
-		this.model = model;
-		this.mpC = mp;
-		initHolonElements();
-	}
-
-	/**
-	 * init default Power supply of the Power Plant.
-	 */
-	public void initHolonElements() {
-		addNewElementIntoCategoryObject("Energy", "Power Plant", "Power", 10000);
-		addNewElementIntoCategoryObject("Building", "House", "TV", -250);
-		addNewElementIntoCategoryObject("Building", "House", "TV", -250);
-		addNewElementIntoCategoryObject("Building", "House", "Fridge", -500);
-		addNewElementIntoCategoryObject("Building", "House", "Radio", -100);
-		addNewElementIntoCategoryObject("Building", "House", "PC", -250);
-		addNewElementIntoCategoryObject("Building", "House", "PC", -250);
-		addNewElementIntoCategoryObject("Building", "House", "PC", -250);
-		addNewElementIntoCategoryObject("Building", "House", "Light", -50);
-		addNewElementIntoCategoryObject("Building", "House", "Light", -50);
-		addNewElementIntoCategoryObject("Building", "House", "Light", -50);
-		addNewElementIntoCategoryObject("Building", "House", "Light", -50);
-		addNewElementIntoCategoryObject("Building", "House", "Light", -50);
-		addNewElementIntoCategoryObject("Building", "House", "Solar Panels", 300);
-	}
-
-	/**
-	 * Adds Element into a Object on the Canvas.
-	 *
-	 * @param object  the Object
-	 * @param element the Element
-	 */
-	public void addElementIntoCanvasObject(HolonObject object, HolonElement element) {
-		element.setSaving(null);
-		object.addElement(element);
-	}
-
-	/**
-	 * Add a new Element into a Object on the Canvas.
-	 *
-	 * @param objectId  the Object ID
-	 * @param element   the Name of the Element
-	 * @param amount    the Amount
-	 * @param energy    the Energy
-	 * @param elementId the Element ID
-	 */
-	public void addNewElementIntoCanvasObject(int objectId, String element, float energy, int elementId) {
-		HolonObject hObject = (HolonObject) mpC.searchByID(objectId);
-		if (hObject == null) {
-			hObject = (HolonObject) model.getSelectedObjects().stream().findFirst().get();
-		}
-		HolonElement ele = new HolonElement(hObject, element, energy, elementId);
-		addElementIntoCanvasObject(hObject, ele);
-	}
-
-	/**
-	 * Add Element into a Object in Category.
-	 *
-	 * @param category the Category
-	 * @param object   the Object
-	 * @param element  the Element
-	 */
-	public void addElementIntoCategoryObject(String category, String objectName, HolonElement element) {
-		element.setSaving(new SimpleEntry<>(category, objectName));
-		Optional<AbstractCanvasObject> object = mpC.searchCatObj(mpC.searchCat(category), objectName);
-		object.ifPresent(obj -> ((HolonObject) obj).addElement(element));
-		if(object.isEmpty()) {
-			log.info(String.format("Category %s ObjectName %s element %s", category, objectName, element.getName()));
-			//throw new UnsupportedOperationException();
-		}
-	}
-
-	/**
-	 * Add a new Element into a Object in Category.
-	 *
-	 * @param category   the Category
-	 * @param objectName the Object
-	 * @param element    the Element Name
-	 * @param energy     the Energy
-	 */
-	public void addNewElementIntoCategoryObject(String category, String objectName, String element, float energy) {
-		HolonElement ele = new HolonElement(null, element, energy);
-		addElementIntoCategoryObject(category, objectName, ele);
-	}
-
-	/**
-	 * deletes a Element from a given Object.
-	 *
-	 * @param obj the Oject
-	 * @param ele the Element
-	 */
-	public void deleteElement(HolonObject obj, HolonElement ele) {
-		obj.getElements().remove(ele);
-	}
-
-	/**
-	 * deletes a selectedObject.
-	 *
-	 * @param obj Cpsobject
-	 */
-	public void removeObjectFromSelection(AbstractCanvasObject obj) {
-		model.getSelectedObjects().remove(obj);
-	}
-
-	/**
-	 * add an Object to selectedObject.
-	 *
-	 * @param obj AbstractCpsobject
-	 */
-	public void addSelectedObject(AbstractCanvasObject obj) {
-		model.getSelectedObjects().add(obj);
-	}
-
-	/**
-	 * add an Object to selectedObject.
-	 *
-	 * @param obj AbstractCpsobject
-	 */
-	public void addSelectedObjects(Collection<AbstractCanvasObject> objects) {
-		model.getSelectedObjects().addAll(objects);
-	}
-
-
-}

+ 18 - 26
src/holeg/ui/controller/SaveController.java

@@ -5,6 +5,7 @@ import com.google.gson.JsonPrimitive;
 import com.google.gson.reflect.TypeToken;
 
 import holeg.model.*;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.model.IdCounter;
 import holeg.ui.model.Model;
 import holeg.ui.model.IdCounter.CounterType;
@@ -75,7 +76,7 @@ public class SaveController {
         storeData(stream);
 
         FileWriter writer = new FileWriter(holonFile);
-        writer.write(model.getGson().toJson(file));
+        writer.write(GuiSettings.gson.toJson(file));
         writer.flush();
         writer.close();
 
@@ -97,7 +98,7 @@ public class SaveController {
         storeWindowPosAndSize(file, x, y, width, height);
 
         FileWriter writer = new FileWriter(path);
-        writer.write(model.getGson().toJson(file));
+        writer.write(GuiSettings.gson.toJson(file));
         writer.flush();
         writer.close();
     }
@@ -116,7 +117,7 @@ public class SaveController {
         storeCanvas(file);
 
         FileWriter writer = new FileWriter(path);
-        writer.write(model.getGson().toJson(file));
+        writer.write(GuiSettings.gson.toJson(file));
 
         writer.flush();
         writer.close();
@@ -133,7 +134,7 @@ public class SaveController {
         storeCategory(file);
 
         FileWriter writer = new FileWriter(path);
-        writer.write(model.getGson().toJson(file));
+        writer.write(GuiSettings.gson.toJson(file));
 
         writer.flush();
         writer.close();
@@ -147,18 +148,12 @@ public class SaveController {
     private void initialize(MODE mode, JsonObject file) {
         switch (mode) {
             case COMPLETE:
-                file.add("MODE", new JsonPrimitive(mode.name()));
-                file.add("IDCOUNTER", new JsonPrimitive(IdCounter.actualId(CounterType.Object)));
-                file.add("IDCOUNTERELEMENT", new JsonPrimitive(IdCounter.actualId(CounterType.Element)));
-                file.add("CANVAS_SIZE_X", new JsonPrimitive(model.getCanvasX()));
-                file.add("CANVAS_SIZE_Y", new JsonPrimitive(model.getCanvasY()));
-                break;
             case PARTIAL:
                 file.add("MODE", new JsonPrimitive(mode.name()));
                 file.add("IDCOUNTER", new JsonPrimitive(IdCounter.actualId(CounterType.Object)));
                 file.add("IDCOUNTERELEMENT", new JsonPrimitive(IdCounter.actualId(CounterType.Element)));
-                file.add("CANVAS_SIZE_X", new JsonPrimitive(model.getCanvasX()));
-                file.add("CANVAS_SIZE_Y", new JsonPrimitive(model.getCanvasY()));
+                file.add("CANVAS_SIZE_X", new JsonPrimitive(GuiSettings.canvasSize.getX()));
+                file.add("CANVAS_SIZE_Y", new JsonPrimitive(GuiSettings.canvasSize.getY()));
                 break;
             case CATEGORY:
                 file.add("MODE", new JsonPrimitive(mode.name()));
@@ -176,14 +171,14 @@ public class SaveController {
      */
     private void storeCategory(JsonObject file) {
         // forall categories store them into the jsontree
-        for (Category cat : model.getCategories()) {
+        for (Category cat : GuiSettings.getCategories()) {
             String key = "CATEGORY" + getNumerator(NUMTYPE.CATEGORY);
 
             file.add(key, new JsonPrimitive(cat.getName()));
             // forall object in the category store them into the jsontree
             for (AbstractCanvasObject obj : cat.getObjects()) {
                 file.add("CGOBJECT" + getNumerator(NUMTYPE.OBJECT),
-                        model.getGson().toJsonTree(obj, AbstractCanvasObject.class));
+                        GuiSettings.gson.toJsonTree(obj, AbstractCanvasObject.class));
                 // if its a holonobject add elements too
                 if (obj instanceof HolonObject)
                     elementsToJson(TYPE.CATEGORY, file, obj);
@@ -217,9 +212,9 @@ public class SaveController {
             u = queue.pop();
             // add currentnode into jsontree
             String key = "CVSOBJECT" + getNumerator(NUMTYPE.OBJECT);
-            file.add(key, model.getGson().toJsonTree(u, AbstractCanvasObject.class));
+            file.add(key, GuiSettings.gson.toJsonTree(u, AbstractCanvasObject.class));
             // and its connections too
-            edgeToJson(EDGETYPE.CONNECTION, file, u.getId(), u.getConnections());
+            edgeToJson(EDGETYPE.CONNECTION, file, u.getId(), new ArrayList<>());
             // if holonobject elements too
             if (u instanceof HolonObject)
                 elementsToJson(TYPE.CANVAS, file, u);
@@ -256,9 +251,9 @@ public class SaveController {
         String key = null;
         // forall elements store them into json and include the id of the object
         for (HolonElement ele : ((HolonObject) obj).getElements()) {
-            temp.add("properties", model.getGson().toJsonTree(ele));
+            temp.add("properties", GuiSettings.gson.toJsonTree(ele));
             temp.add("ID", new JsonPrimitive(obj.getId()));
-            temp.add("FlexList", model.getGson().toJsonTree(ele.flexList,  new TypeToken<List<Flexibility>>() {
+            temp.add("FlexList", GuiSettings.gson.toJsonTree(ele.flexList,  new TypeToken<List<Flexibility>>() {
             }.getType()));
             // switch for deciding the key
             switch (type) {
@@ -271,7 +266,7 @@ public class SaveController {
                 default:
                     break;
             }
-            file.add(key, model.getGson().toJsonTree(temp));
+            file.add(key, GuiSettings.gson.toJsonTree(temp));
             // if there are gps add them into
             if (!ele.getGraphPoints().isEmpty())
             	unitgraphTESTToJson(file, ele.getId(), ele.getGraphPoints());
@@ -308,7 +303,7 @@ public class SaveController {
         // add id of element so it can be found again
         temp.add("ID", new JsonPrimitive(id));
 
-        file.add(key, model.getGson().toJsonTree(temp));
+        file.add(key, GuiSettings.gson.toJsonTree(temp));
     }
     /**
      * Put the UnitGraphs of Switches or Elements into Json
@@ -324,7 +319,7 @@ public class SaveController {
         key = "ELETESTUNITGRAPH" + getNumerator(NUMTYPE.UNITGRAPH);
         // add id of element so it can be found again
         temp.add("ID", new JsonPrimitive(id));
-        file.add(key, model.getGson().toJsonTree(temp));
+        file.add(key, GuiSettings.gson.toJsonTree(temp));
     }
 
     /**
@@ -337,7 +332,7 @@ public class SaveController {
 
         for (Edge edge : arr) {
             // add properties and only the ids from a and b
-            temp.add("properties", model.getGson().toJsonTree(edge));
+            temp.add("properties", GuiSettings.gson.toJsonTree(edge));
             temp.add("A", new JsonPrimitive(edge.getA().getId()));
             temp.add("B", new JsonPrimitive(edge.getB().getId()));
 
@@ -361,11 +356,8 @@ public class SaveController {
                     break;
             }
             // lookup if the CVS, NODE or OLDEDGE are also connections
-            if (edge.getA().getConnections().contains(edge) && edge.getA().getConnections().contains(edge)
-                    && !type.equals(EDGETYPE.CONNECTION))
-                b = true;
             temp.add("connection", new JsonPrimitive(b));
-            file.add(k, model.getGson().toJsonTree(temp));
+            file.add(k, GuiSettings.gson.toJsonTree(temp));
             temp = new JsonObject();
         }
 

+ 1 - 1
src/holeg/ui/controller/SimulationManager.java

@@ -54,7 +54,7 @@ public class SimulationManager {
 		long start = System.currentTimeMillis();
 		ArrayList<MinimumNetwork> list = new ArrayList<MinimumNetwork>();
 		MinimumModel minimumModel = new MinimumModel(model.getObjectsOnCanvas(), model.getEdgesOnCanvas(),
-				model.getActualTimeStep());
+				model.getCurrentIteration());
 		ArrayList<Edge> leftOver = new ArrayList<Edge>();
 
 		boolean doAnotherLoop = true;

+ 43 - 6
src/holeg/ui/model/GuiSettings.java

@@ -1,17 +1,21 @@
 package holeg.ui.model;
 
-import java.util.ArrayList;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.logging.Logger;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import holeg.adapter.AbstractCpsObjectAdapter;
+import holeg.adapter.PairAdapter;
+import holeg.adapter.PositionAdapter;
 import holeg.model.AbstractCanvasObject;
 import holeg.model.Edge;
 import holeg.ui.view.main.Category;
 import holeg.utility.Vector2Int;
 
 public class GuiSettings {
-	private static final Logger log = Logger.getLogger(Model.class.getName());
 
     private static int pictureScale = 50; // Picture Scale
     private static int halfPictureScale = pictureScale / 2;
@@ -24,11 +28,11 @@ public class GuiSettings {
     
     
     private static Set<Edge> selectedEdges = new HashSet<>();
-    private static ArrayList<Category> categories = new ArrayList<>();
+    private static Set<Category> categories = new HashSet<>();
     private static Set<AbstractCanvasObject> clipboardObjects = new HashSet<>();
-    private static Set<AbstractCanvasObject> selectedObjects = new HashSet<>();
+	private static Set<AbstractCanvasObject> selectedObjects = new HashSet<>();
     
-    public static int autoSaveNr = -1;
+	public static int autoSaveNr = -1;
     public static int numberOfSaves = 35;
     
     
@@ -44,6 +48,39 @@ public class GuiSettings {
     	pictureScale = value;
     	halfPictureScale = (value + 1) / 2;
     }
+
     
+	public static Set<Edge> getSelectedEdges() {
+		return selectedEdges;
+	}
+	public static Set<Category> getCategories() {
+		return categories;
+	}
+	public static Set<AbstractCanvasObject> getClipboardObjects() {
+		return clipboardObjects;
+	}
+	public static void setClipboardObjects(Set<AbstractCanvasObject> clipboardObjects) {
+		GuiSettings.clipboardObjects = clipboardObjects;
+	}
+	public static Set<AbstractCanvasObject> getSelectedObjects() {
+		return selectedObjects;
+	}
+	public static void setSelectedObjects(Set<AbstractCanvasObject> selectedObjects) {
+		GuiSettings.selectedObjects = selectedObjects;
+	}
     
+	
+	//TODO(Tom2021-12-20) maybe moved somewhere else
+    public static Gson gson = initGson();
+    
+    public static Gson initGson() {
+        GsonBuilder builder = new GsonBuilder();
+        builder.serializeNulls();
+        builder.excludeFieldsWithoutExposeAnnotation();
+        builder.setPrettyPrinting();
+        builder.registerTypeAdapter(AbstractCanvasObject.class, new AbstractCpsObjectAdapter());
+        builder.registerTypeAdapter(Vector2Int.class, new PositionAdapter());
+        builder.registerTypeAdapter(SimpleEntry.class, new PairAdapter());
+        return builder.create();
+    }
 }

+ 0 - 2
src/holeg/ui/model/HolegModel.java

@@ -1,14 +1,12 @@
 package holeg.ui.model;
 
 import java.util.ArrayList;
-import java.util.logging.Logger;
 import java.util.stream.Stream;
 
 import holeg.model.Edge;
 import holeg.model.GroupNode;
 
 public class HolegModel {
-	private static final Logger log = Logger.getLogger(HolegModel.class.getName());
 	
 	public enum FairnessModel{
 		/**

+ 16 - 448
src/holeg/ui/model/Model.java

@@ -1,22 +1,11 @@
 package holeg.ui.model;
 
-import java.util.AbstractMap.SimpleEntry;
-import java.util.logging.Logger;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-
 import java.util.List;
-import java.util.Set;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-import holeg.adapter.AbstractCpsObjectAdapter;
-import holeg.adapter.PairAdapter;
-import holeg.adapter.PositionAdapter;
 import holeg.model.AbstractCanvasObject;
 import holeg.model.Edge;
 import holeg.model.Flexibility;
@@ -24,9 +13,6 @@ import holeg.model.GroupNode;
 import holeg.model.HolonElement;
 import holeg.model.HolonObject;
 import holeg.model.HolonSwitch;
-import holeg.model.Node;
-import holeg.ui.view.main.Category;
-import holeg.utility.Vector2Int;
 
 
 
@@ -39,31 +25,10 @@ import holeg.utility.Vector2Int;
 public class Model {
 
 	private static final Logger log = Logger.getLogger(Model.class.getName());
-    private static final int GRAPH_ITERATIONS = 100;
-    // Canvas Attributes
-    private String imgPath = "";
-    private int backgroundMode = 0;
-    private int backgroundWidth = 0;
-    private int backgroundHeight = 0;
-    private int canvasX = 3000;
-    private int canvasY = 3000;
-    private int curIteration = 0;
-    private Edge selectedEdge;
-    private Set<AbstractCanvasObject> selectedObjects = new HashSet<>();
-    private Set<AbstractCanvasObject> clipboardObjects = new HashSet<>();
-    // Capacity for Edge
-    private float maxCapacity;
-   
-    // Iteration Speed
-    private int timerSpeed = 1000;
-    // number of the current autosave
-    private int autoSaveNr = -1;
-    // number of max simultaneous autosaves
-    private int numberOfSaves = 35;
-    /** whether the supplyBars should be shown or not */
-    private boolean showSupplyBars = true;
+    private int currentIteration = 0;
+    private int maxIterations=100;
+    
     /** the amount of iterations */
-    private int iterations=100;
     
     /**
 	 * All implemented FairnessModels:<br>
@@ -84,36 +49,21 @@ public class Model {
 	}
     /** the Fairness model in use */
     private FairnessModel fairnessModel = FairnessModel.MininumDemandFirst;
-    
-    /*
-     * Array of all categories in the model. It is set by default with the
-     * categories ENERGY, BUILDINGS and COMPONENTS
-     */
-    private ArrayList<Category> categories;
-
+   
+    //TODO(Tom2021-12-20) remove replace with groupnode
     /*
      * Array of all CpsObjects in our canvas. It is set by default as an empty
      * list.
      */
     private ArrayList<AbstractCanvasObject> objectsOnCanvas;
-    private HashMap<String, Integer> cgIdx;
-    private HashMap<Integer, Integer> cvsObjIdx;
     /*
      * Array of all CpsObjects in our canvas. It is set by default as an empty
      * list.
      */
     private ArrayList<Edge> edgesOnCanvas;
     
-    //TODO(Tom2021-12-20) remove replace with groupnode
-    private ArrayList<HolonObject> holonObjectsOnCanvas = new ArrayList<HolonObject>();
-    private ArrayList<Node> nodesOnCanvas= new ArrayList<Node>();
-    private ArrayList<HolonSwitch> switchsOnCanvas= new ArrayList<HolonSwitch>();
-    
-    private HashMap<Integer, GroupNode> hashcodeMap = new HashMap<>();
 
-
-    //TODO(Tom2021-12-20) should be moved in Save/Load Controller
-    private Gson gson;
+  
 
     /**
      * Constructor for the model. It initializes the categories and
@@ -122,31 +72,10 @@ public class Model {
      */
     public Model() {
     	log.fine("Init Model");
-        setCategories(new ArrayList<>());
         setObjectsOnCanvas(new ArrayList<>());
         setEdgesOnCanvas(new ArrayList<>());
-        setCgIdx(new HashMap<>());
-        setCvsObjIdx(new HashMap<>());
-        initGson();
     }
 
-    /**
-     * Returns all Categories.
-     *
-     * @return the categories
-     */
-    public ArrayList<Category> getCategories() {
-        return categories;
-    }
-
-    /**
-     * Sets all Categories.
-     *
-     * @param categories the categories to set
-     */
-    public void setCategories(ArrayList<Category> categories) {
-        this.categories = categories;
-    }
 
 
     /**
@@ -205,33 +134,13 @@ public class Model {
 
 
 
-    /**
-     * Returns all selected Objects on the Canvas.
-     *
-     * @return The selected Objects
-     */
-    public Set<AbstractCanvasObject> getSelectedObjects() {
-        return selectedObjects;
-    }
-
-    /**
-     * Returns all selected Objects on the Canvas.
-     *
-     * @return The selected Objects
-     */
-    public void setSelectedCpsObjects(Set<AbstractCanvasObject> arr) {
-        this.selectedObjects = arr;
-    }
-
-
-
     /**
      * Returns the maximum ITERATIONS.
      *
      * @return ITERATIONS
      */
     public int getMaxIterations() {
-        return iterations;
+        return maxIterations;
     }
 
 
@@ -240,8 +149,8 @@ public class Model {
      *
      * @return current iteration
      */
-    public int getActualTimeStep() {
-        return curIteration;
+    public int getCurrentIteration() {
+        return currentIteration;
     }
 
     /**
@@ -250,185 +159,9 @@ public class Model {
      * @param curIT the current Iteration
      */
     public void setCurrentIteration(int value) {
-        this.curIteration = value;
-    }
-
-    /**
-     * Returns the selected Edge.
-     *
-     * @return selectedEdge
-     */
-    public Edge getSelectedEdge() {
-        return selectedEdge;
-    }
-
-    /**
-     * Set the selected Edge.
-     *
-     * @param edge that is selected
-     */
-    public void setSelectedEdge(Edge edge) {
-        this.selectedEdge = edge;
+        this.currentIteration = value;
     }
 
-    /**
-     * Returns the Categorie Index.
-     *
-     * @return the cgIdx
-     */
-    public HashMap<String, Integer> getCgIdx() {
-        return cgIdx;
-    }
-
-    /**
-     * Sets the Categorie Index.
-     *
-     * @param cgIdx the cgIdx to set
-     */
-    public void setCgIdx(HashMap<String, Integer> cgIdx) {
-        this.cgIdx = cgIdx;
-    }
-
-    /**
-     * Returns the CanvasObject Index.
-     *
-     * @return the cvsObjIdx
-     */
-    public HashMap<Integer, Integer> getCvsObjIdx() {
-        return cvsObjIdx;
-    }
-
-    /**
-     * Sets the CanvasObject Index.
-     *
-     * @param cvsObjIdx the cvsObjIdx to set
-     */
-    public void setCvsObjIdx(HashMap<Integer, Integer> cvsObjIdx) {
-        this.cvsObjIdx = cvsObjIdx;
-    }
-
-    /**
-     * Returns the auto save Number.
-     *
-     * @return the auto save Number
-     */
-    public int getAutoSaveNr() {
-        return autoSaveNr;
-    }
-
-    /**
-     * Sets the auto save Number.
-     *
-     * @param autoSaveNr the auto save number
-     */
-    public void setAutoSaveNr(int autoSaveNr) {
-        this.autoSaveNr = autoSaveNr;
-    }
-
-    /**
-     * Returns the Number of Saves.
-     *
-     * @return the numberOfSaves
-     */
-    public int getNumberOfSaves() {
-        return numberOfSaves;
-    }
-
-    /**
-     * Set the Number of Saves.
-     *
-     * @param numberOfSaves the numberOfSaves to set
-     */
-    public void setNumberOfSaves(int numberOfSaves) {
-        this.numberOfSaves = numberOfSaves;
-    }
-
-    /**
-     * Returns all Objects in the Clipboard.
-     *
-     * @return Objects in the Clipboard
-     */
-    public Set<AbstractCanvasObject> getClipboradObjects() {
-        return clipboardObjects;
-    }
-
-    /**
-     * Sets the ClipboardObjects.
-     *
-     * @param c Array of Objects
-     */
-    public void setClipboradObjects(Set<AbstractCanvasObject> c) {
-        this.clipboardObjects = c;
-    }
-
-
-    /**
-     * @return the maxCapacity
-     */
-    public float getMaxCapacity() {
-        return maxCapacity;
-    }
-
-    /**
-     * @param maxCapacity the maxCapacity to set
-     */
-    public void setMaxCapacity(float maxCapacity) {
-        this.maxCapacity = maxCapacity;
-    }
-
-    /**
-     * get the Interval in ms between each Iteration.
-     *
-     * @return timerSpeed speed for the Iterations
-     */
-    public int getTimerSpeed() {
-        return this.timerSpeed;
-    }
-
-    /**
-     * Sets the Interval in ms between each Iteration.
-     *
-     * @param t speed for the Iterations
-     */
-    public void setTimerSpeed(int t) {
-        this.timerSpeed = t;
-    }
-
-    /**
-     * Get Canvas X Size.
-     *
-     * @return the cANVAS_X
-     */
-    public int getCanvasX() {
-        return canvasX;
-    }
-
-    /**
-     * Set Canvas X Size.
-     *
-     * @param canvasX the cANVAS_X to set
-     */
-    public void setCanvasX(int canvasX) {
-        this.canvasX = canvasX;
-    }
-
-    /**
-     * get Canvas Y size.
-     *
-     * @return the cANVAS_Y
-     */
-    public int getCanvasY() {
-        return canvasY;
-    }
-
-    /**
-     * Set Canvas Y size.
-     *
-     * @param canvasY the cANVAS_Y to set
-     */
-    public void setCanvasY(int canvasY) {
-        this.canvasY = canvasY;
-    }
 
 
     public List<HolonElement> getAllHolonElements() {
@@ -453,10 +186,11 @@ public class Model {
     
     
     public ArrayList<HolonObject> getAllHolonObjectsOnCanvas(){
-		ArrayList<HolonObject> objectToReturn = new ArrayList<HolonObject>();
-		objectToReturn.addAll(this.holonObjectsOnCanvas);
-		//TODO(Tom2021-12-18) create GroupNodeOnCanvas
+		ArrayList<HolonObject> objectToReturn = new ArrayList<>();
 		for(AbstractCanvasObject aCps : objectsOnCanvas) {
+			if (aCps instanceof HolonObject hObject) {
+				objectToReturn.add(hObject);
+			}
     		if(aCps instanceof GroupNode groupnode){
     			objectToReturn.addAll(groupnode.getAllHolonObjectsRecursive().toList());
     		}
@@ -499,101 +233,12 @@ public class Model {
         return switches;
     }
 
-    /**
-     * Returns the Path for the background Image of the Canvas.
-     *
-     * @return imgPath the Path
-     */
-    public String getCanvasImagePath() {
-        return imgPath;
-    }
-
-    /**
-     * Set the Path for the background Image of the Canvas.
-     *
-     * @param path the Path
-     */
-    public void setCanvasImagePath(String path) {
-        imgPath = path;
-    }
-
-    /**
-     * Returns the mode for the background Image of the Canvas.
-     * <p>
-     * 0 take size of the Image 1 stretch the Image 2 Custom Image size
-     *
-     * @return backgroundMode the mode
-     */
-    public int getCanvasImageMode() {
-        return backgroundMode;
-    }
-
-    /**
-     * Set the mode for the background Image of the Canvas.
-     * <p>
-     * 0 take size of the Image, 1 stretch the Image, 2 Custom Image size
-     *
-     * @param mode the backgroundMode
-     */
-    public void setCanvasImageMode(int mode) {
-        backgroundMode = mode;
-    }
-
-    /**
-     * Returns the Custom width of the background Image of the Canvas.
-     *
-     * @return backgroundWidth the Width
-     */
-    public int getCanvasImageWidth() {
-        return backgroundWidth;
-    }
-
-    /**
-     * Set the Custom width of the background Image of the Canvas.
-     *
-     * @param width the Width
-     */
-    public void setCanvasImageWidth(int width) {
-        backgroundWidth = width;
-    }
-
-    /**
-     * Returns the Custom height of the background Image of the Canvas.
-     *
-     * @return backgroundHeight the height
-     */
-    public int getCanvasImageHeight() {
-        return backgroundHeight;
-    }
-
-    /**
-     * Set the Custom height of the background Image of the Canvas.
-     *
-     * @param height the height
-     */
-    public void setCanvasImageHeight(int height) {
-        backgroundHeight = height;
-    }
-
-    /**
-	 * @return true if SupplyBars should be shown
-	 */
-	public boolean getShowSupplyBars() {
-		return showSupplyBars;
-	}
-
-	/**
-	 * @param showSupplyBars true if the SupplyBars should be shown
-	 */
-	public void setShowSupplyBars(boolean showSupplyBars) {
-		this.showSupplyBars = showSupplyBars;
-	}
 	
 	/**
 	 * @param iterations the number of steps for this simulation
 	 */
 	public void setIterations(int iterations){
-		this.iterations=iterations;
+		this.maxIterations=iterations;
 	}
 	
 	/**
@@ -609,82 +254,5 @@ public class Model {
 	public void setFairnessModel(FairnessModel fairnessModel) {
 		this.fairnessModel = fairnessModel;
 	}
-	
-	public int getGraphIterations(){
-		return GRAPH_ITERATIONS;
-	}
-
-	/**
-     * Initialize the Gson with wanted parameters
-     */
-    private void initGson() {
-        GsonBuilder builder = new GsonBuilder();
-        builder.serializeNulls();
-        builder.excludeFieldsWithoutExposeAnnotation();
-        builder.setPrettyPrinting();
-        builder.registerTypeAdapter(AbstractCanvasObject.class, new AbstractCpsObjectAdapter());
-        builder.registerTypeAdapter(Vector2Int.class, new PositionAdapter());
-        builder.registerTypeAdapter(SimpleEntry.class, new PairAdapter());
-        // use the builder and make a instance of the Gson
-        this.setGson(builder.create());
-
-    }
-
-    /**
-     * @return the gson
-     */
-    public Gson getGson() {
-        return gson;
-    }
-
-    /**
-     * @param gson the gson to set
-     */
-    public void setGson(Gson gson) {
-        this.gson = gson;
-    }
-
-    /**
-     * @return the hashcodeMap
-     */
-    public HashMap<Integer, GroupNode> getHashcodeMap() {
-        return hashcodeMap;
-    }
-
-    /**
-     * @param hashcodeMap the hashcodeMap to set
-     */
-    public void setHashcodeMap(HashMap<Integer, GroupNode> hashcodeMap) {
-        this.hashcodeMap = hashcodeMap;
-    }
-
-    
-    
-    
-    
-    
-	public ArrayList<HolonSwitch> getSwitchsOnCanvas() {
-		return switchsOnCanvas;
-	}
-
-	public void setSwitchsOnCanvas(ArrayList<HolonSwitch> switchsOnCanvas) {
-		this.switchsOnCanvas = switchsOnCanvas;
-	}
-
-	public ArrayList<Node> getNodesOnCanvas() {
-		return nodesOnCanvas;
-	}
-
-	public void setNodesOnCanvas(ArrayList<Node> nodesOnCanvas) {
-		this.nodesOnCanvas = nodesOnCanvas;
-	}
-
-	public ArrayList<HolonObject> getHolonObjectsOnCanvas() {
-		return holonObjectsOnCanvas;
-	}
-
-	public void setHolonObjectsOnCanvas(ArrayList<HolonObject> holonObjectsOnCanvas) {
-		this.holonObjectsOnCanvas = holonObjectsOnCanvas;
-	}
 
 }

+ 6 - 5
src/holeg/ui/view/canvas/AbstractCanvas.java

@@ -57,10 +57,11 @@ public abstract class AbstractCanvas extends JPanel {
 	private final int animFPS = 60;
 	final int animDelay = 1000 / animFPS; // animation Delay
 	protected Model model;
-	protected Control controller;
+	protected Control control;
 	protected int x = 0;
 	protected int y = 0;
 	// Selection
+	//TODO(Tom2021-12-20): remove tmpCps or make is optional 
 	public AbstractCanvasObject tempCps = null;
 
 	// Replacement
@@ -176,8 +177,8 @@ public abstract class AbstractCanvas extends JPanel {
 					itemUngroup.setEnabled(true);
 				else
 					itemUngroup.setEnabled(false);
-				if (model.getSelectedObjects().size() == 0) {
-					controller.addSelectedObject(tempCps);
+				if (GuiSettings.getSelectedObjects().isEmpty()) {
+					control.addSelectedObject(tempCps);
 				}
 				if (tempCps instanceof HolonObject) {
 					itemCreateTemplate.setEnabled(true);
@@ -208,8 +209,8 @@ public abstract class AbstractCanvas extends JPanel {
 		if (doMark) {
 			doMark = false;
 			if (!tempSelected.isEmpty()) {
-				controller.toggleSelectedObjects(tempSelected);
-				controller.getObjectsInDepth();
+				control.toggleSelectedObjects(tempSelected);
+				control.getObjectsInDepth();
 				tempSelected.clear();
 			}
 			

+ 71 - 89
src/holeg/ui/view/canvas/Canvas.java

@@ -14,7 +14,6 @@ import java.awt.geom.Line2D;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.Optional;
 
 import javax.swing.ImageIcon;
@@ -38,15 +37,15 @@ import holeg.ui.controller.Control;
 import holeg.ui.model.Consumer;
 import holeg.ui.model.DecoratedGroupNode;
 import holeg.ui.model.DecoratedHolonObject;
+import holeg.ui.model.DecoratedHolonObject.HolonObjectState;
 import holeg.ui.model.DecoratedSwitch;
+import holeg.ui.model.DecoratedSwitch.SwitchState;
 import holeg.ui.model.ExitCable;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.model.Model;
 import holeg.ui.model.Passiv;
 import holeg.ui.model.Supplier;
 import holeg.ui.model.VisualRepresentationalState;
-import holeg.ui.model.DecoratedHolonObject.HolonObjectState;
-import holeg.ui.model.DecoratedSwitch.SwitchState;
 import holeg.ui.view.inspector.UnitGraph;
 import holeg.utility.ImageImport;
 import holeg.utility.Vector2Int;
@@ -77,7 +76,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 	 */
 	public Canvas(Model mod, Control control, UnitGraph unitGraph) {
 		toolTip = false;
-		this.controller = control;
+		this.control = control;
 		this.model = mod;
 
 		scalediv20 = GuiSettings.getPictureScale() / 20;
@@ -107,7 +106,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			// calculate uppernode pos (taken from the controller)
 			unPos = new Vector2Int(0, 0);
 			animCps = new ArrayList<>();
-			for (AbstractCanvasObject cps : model.getSelectedObjects()) {
+			for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 				animCps.add(cps); // add to animation Cps ArrayList
 				unPos = unPos.add(cps.getPosition());
 			}
@@ -137,9 +136,9 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					for (int i = 0; i < animCps.size(); i++) {
 						animCps.get(i).getPosition().set(savePos.get(i));
 					}
-					controller.addUpperNode("GroupNode", groupNode, animCps);
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					controller.clearSelection();
+					control.addUpperNode("GroupNode", groupNode, animCps);
+					control.calculateStateAndVisualForCurrentTimeStep();
+					control.clearSelection();
 					repaint();
 				}
 			});
@@ -154,7 +153,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 
 			savePos = new ArrayList<>();
 			animCps = ((GroupNode) tempCps).getAllObjectsRecursive().toList();
-			controller.ungroupGroupNode((GroupNode) tempCps, groupNode);
+			control.ungroupGroupNode((GroupNode) tempCps, groupNode);
 
 			for (int i = 0; i < animCps.size(); i++) {
 				savePos.add(new Vector2Int(animCps.get(i).getPosition()));
@@ -167,7 +166,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			}
 
 			animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
-				controller.clearSelection();
+				control.clearSelection();
 				if (animDuration - animDelay >= 0) {
 					for (int i = 0; i < animCps.size(); i++) {
 						Vector2Int pos = animCps.get(i).getPosition();
@@ -185,7 +184,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					for (int i = 0; i < animCps.size(); i++) {
 						animCps.get(i).getPosition().set(savePos.get(i));
 					}
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.calculateStateAndVisualForCurrentTimeStep();
 					repaint();
 				}
 			});
@@ -198,50 +197,48 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			// Remove the selected Object objects
 			// Edge Deleting
 			if (tempCps == null && edgeHighlight != null) {
-				controller.removeEdgesOnCanvas(edgeHighlight);
+				control.removeEdgesOnCanvas(edgeHighlight);
 				// Look for a CPSNode with no Connections and delete them
-				if (edgeHighlight.getA() instanceof Node
-						&& edgeHighlight.getA().getConnections().size() == 0) {
-					controller.delCanvasObject(edgeHighlight.getA(), false);
+				if (edgeHighlight.getA() instanceof Node) {
+					control.delCanvasObject(edgeHighlight.getA(), false);
 				}
-				if (edgeHighlight.getB() instanceof Node
-						&& edgeHighlight.getB().getConnections().size() == 0) { // Look on the other end of the cable
-					controller.delCanvasObject(edgeHighlight.getB(), false);
+				if (edgeHighlight.getB() instanceof Node) { // Look on the other end of the cable
+					control.delCanvasObject(edgeHighlight.getB(), false);
 				}
 				edgeHighlight = null;
 			}
-			for (AbstractCanvasObject cps : model.getSelectedObjects()) {
-				controller.delCanvasObject(cps, false);
+			for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
+				control.delCanvasObject(cps, false);
 				toolTip = false;
 			}
-			controller.tryAutoSave();
-			controller.clearSelection();
+			control.tryAutoSave();
+			control.clearSelection();
 			tempCps = null;
 			repaint();
 		});
 
 		itemCut.addActionListener(actionEvent -> {
-			controller.cut(null);
+			control.cut(null);
 			itemPaste.setEnabled(true);
 			repaint();
 		});
 
 		itemCopy.addActionListener(actionEvent -> {
 			if (tempCps instanceof GroupNode)
-				controller.getObjectsInDepth();
-			controller.copy(null);
+				control.getObjectsInDepth();
+			control.copy(null);
 			itemPaste.setEnabled(true);
 			repaint();
 		});
 
 		itemAlign.addActionListener(actionEvent -> {
-			for (AbstractCanvasObject cps : model.getSelectedObjects())
+			for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects())
 				align(cps, GuiSettings.getPictureScaleDiv2());
 			repaint();
 		});
 		itemPaste.addActionListener(actionEvent -> {
 			try {
-				controller.paste(null, mousePosition);
+				control.paste(null, mousePosition);
 
 			} catch (JsonParseException | UnsupportedFlavorException | IOException e1) {
 				JLabel message = new JLabel("The Clipboard information cannot be pastet into Application.");
@@ -254,7 +251,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		 * create Template
 		 */
 		itemCreateTemplate.addActionListener(actionEvent -> {
-			controller.createTemplate((HolonObject) tempCps, (JFrame) SwingUtilities.getRoot(this));
+			control.createTemplate((HolonObject) tempCps, (JFrame) SwingUtilities.getRoot(this));
 		});
 
 		this.addMouseListener(this);
@@ -289,7 +286,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 	protected void paintConsumer(Graphics2D g, Consumer con) {
 		paintCanvasObject(g, con);
 		drawCanvasObjectString(g, con.getModel().getPosition(), -con.getEnergyNeededFromNetwork());
-		if (model.getShowSupplyBars()) {
+		if (GuiSettings.showSupplyBars) {
 			paintSupplyBar(g, con.getSupplyBarPercentage(), ColorPreference.HolonObject.getStateColor(con.getState()),
 					con.getModel().getPosition());
 		}
@@ -479,20 +476,11 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			g2d.drawLine(tempCps.getPosition().getX(), tempCps.getPosition().getY(), x, y);
 		}
 		// <--
-		// SelectedCable
-		HashSet<Edge> selectedEdges = new HashSet<Edge>();
-		for (AbstractCanvasObject aCps : model.getSelectedObjects()) {
-			for (Edge edge : aCps.getConnections()) {
-				selectedEdges.add(edge);
-			}
-		}
-		if (model.getSelectedEdge() != null)
-			selectedEdges.add(model.getSelectedEdge());
 		// timstep:
 		g.setFont(new Font("TimesNewRoman", Font.PLAIN, Math.max((int) (GuiSettings.getPictureScale() / 3.5f), 10)));
 		g2d.setColor(Color.BLACK);
 
-		Optional<VisualRepresentationalState> optVisualState = controller.getSimManager().getActualVisualRepresentationalState();
+		Optional<VisualRepresentationalState> optVisualState = control.getSimManager().getActualVisualRepresentationalState();
 		// VisualState Representation:
 		if (optVisualState.isEmpty()) {
 			return;
@@ -503,7 +491,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			paintExitCable(g2d, cable);
 		}
 		for (Edge cable : visualState.getCableList()) {
-			paintCable(g2d, cable, selectedEdges.contains(cable));
+			paintCable(g2d, cable, GuiSettings.getSelectedEdges().contains(cable));
 		}
 		for (DecoratedGroupNode dGroupNode : visualState.getGroupNodeList()) {
 			paintGroupNode(g2d, dGroupNode);
@@ -535,7 +523,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		g2d.setColor(Color.BLUE);
 		g2d.setStroke(new BasicStroke(1));
 		Color transparentGrey = ColorPreference.Panel.ObjectSelection;
-		for (AbstractCanvasObject aCps : model.getSelectedObjects()) {
+		for (AbstractCanvasObject aCps : GuiSettings.getSelectedObjects()) {
 			if (aCps instanceof Node) {
 				Vector2Int pos = aCps.getPosition();
 				g2d.setColor(transparentGrey);
@@ -587,7 +575,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		if (!disabled) {
 			tempCps = null;
 			edgeHighlight = null;
-			controller.setSelecteEdge(null);
+			GuiSettings.getSelectedEdges().clear();
 			// Object Selection
 			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
 				cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
@@ -599,10 +587,10 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 
 					if (e.isControlDown() && tempCps != null) {
 						System.out.println("Add Remove Selection CANVAS");
-						if (model.getSelectedObjects().contains(tempCps)) {
-							controller.removeObjectFromSelection(tempCps);
+						if (GuiSettings.getSelectedObjects().contains(tempCps)) {
+							control.removeObjectFromSelection(tempCps);
 						} else {
-							controller.addSelectedObject(tempCps);
+							control.addSelectedObject(tempCps);
 						}
 
 					}
@@ -622,9 +610,9 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			// Edge Selection
 			if (tempCps == null) {
 				edgeHighlight = mousePositionOnEdge(x, y);
-				controller.setSelecteEdge(edgeHighlight);
+				GuiSettings.getSelectedEdges().add(edgeHighlight);
 				if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-					controller.clearSelection();
+					control.clearSelection();
 				}
 			}
 
@@ -656,7 +644,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					/**
 					 * Save before further Dragged interactions happen
 					 */
-					controller.autoSave();
+					control.autoSave();
 
 				} catch (IOException ex) {
 					System.err.println("AutoSave error by dragging");
@@ -666,7 +654,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 				/**
 				 * check if a unique tempCps could replace an Object on the canvas
 				 */
-				if (model.getSelectedObjects().size() == 1 && checkForReplacement(model.getObjectsOnCanvas(),
+				if (GuiSettings.getSelectedObjects().size() == 1 && checkForReplacement(model.getObjectsOnCanvas(),
 						tempCps, tempCps.getPosition().getX(), tempCps.getPosition().getY())) {
 					/**
 					 * if UpperNode would be replaced, close its tabs
@@ -676,16 +664,16 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					/**
 					 * replace on canvas (will save)
 					 */
-					controller.replaceCanvasObject(mayBeReplaced, tempCps);
+					control.replaceCanvasObject(mayBeReplaced, tempCps);
 					mayBeReplaced = null;
 				}
 			}
 
 			if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
-				controller.clearSelection();
-				controller.addSelectedObject(tempCps);
+				control.clearSelection();
+				control.addSelectedObject(tempCps);
 				if (tempCps instanceof GroupNode)
-					controller.getObjectsInDepth();
+					control.getObjectsInDepth();
 			}
 
 			dragged = false;
@@ -701,9 +689,9 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 				sw.switchState();
 			}
 			if (doubleclick && tempCps != null && tempCps instanceof GroupNode groupnode) {
-				controller.getGui().openNewUpperNodeTab(groupnode);
+				control.getGui().openNewUpperNodeTab(groupnode);
 			}
-			controller.calculateStateAndVisualForTimeStep(model.getActualTimeStep());
+			control.calculateStateAndVisualForTimeStep(model.getCurrentIteration());
 
 			repaint();
 		}
@@ -716,10 +704,10 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			x = e.getX();
 			y = e.getY();
 
-			if (!model.getSelectedObjects().contains(tempCps) && !doMark) {
-				controller.clearSelection();
+			if (!GuiSettings.getSelectedObjects().contains(tempCps) && !doMark) {
+				control.clearSelection();
 				if (tempCps != null) {
-					controller.addSelectedObject(tempCps);
+					control.addSelectedObject(tempCps);
 				}
 			}
 			if (dragging) {
@@ -753,7 +741,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					toolTipPos.setY(tempCps.getPosition().getY() + scaleDiv2);
 
 					// All Selected Objects
-					for (AbstractCanvasObject cps : model.getSelectedObjects()) {
+					for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 						if (cps != tempCps) {
 							x = (int) (cps.getPosition().getX() + xDist);
 							y = (int) (cps.getPosition().getY() + yDist);
@@ -775,7 +763,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					/**
 					 * check if something might be replaced
 					 */
-					if (model.getSelectedObjects().size() == 1)
+					if (GuiSettings.getSelectedObjects().size() == 1)
 						checkForReplacement(model.getObjectsOnCanvas(), tempCps, x, y);
 
 					repaint();
@@ -853,26 +841,20 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 						&& cps != tempCps) {
 					node = false;
 					onEdge = false;
-					for (Edge p : tempCps.getConnections()) {
-						if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
-							newEdge = false;
-							e = p;
-						}
-					}
 					if (!newEdge) {
-						controller.removeEdgesOnCanvas(e);
+						control.removeEdgesOnCanvas(e);
 						// Node ohne Edge?
-						if (e.getA().getClass() == Node.class && e.getA().getConnections().isEmpty()) {
+						if (e.getA().getClass() == Node.class) {
 							tempCps = e.getA();
 							deleteNode = true;
 						}
-						if (e.getB().getClass() == Node.class && e.getB().getConnections().isEmpty()) {
+						if (e.getB().getClass() == Node.class) {
 							deleteNode = true;
 						}
 					} else {
 						if (!(cps instanceof GroupNode || tempCps instanceof GroupNode)) {
-							e = new Edge(cps, tempCps, model.getMaxCapacity());
-							controller.addEdgeOnCanvas(e);
+							e = new Edge(cps, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
+							control.addEdgeOnCanvas(e);
 						} else if (cps instanceof GroupNode groupnode && !(tempCps instanceof GroupNode)) {
 							GroupNode thisUpperNode = groupnode;
 							Object[] possibilities = thisUpperNode.getObjectsInThisLayer().map(aCps -> new ACpsHandle(aCps))
@@ -883,16 +865,16 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 										new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)),
 										possibilities, "");
 								if (selected != null) {
-									e = new Edge(selected.object, tempCps, model.getMaxCapacity());
-									controller.addEdgeOnCanvas(e);
+									e = new Edge(selected.object, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
+									control.addEdgeOnCanvas(e);
 								}
 							} else {
 								Node n = new Node("Node");
 
 								n.setPosition(x, y);
-								controller.addObjUpperNode(n, thisUpperNode);
-								e = new Edge(n, tempCps, model.getMaxCapacity());
-								controller.addEdgeOnCanvas(e);
+								control.addObjUpperNode(n, thisUpperNode);
+								e = new Edge(n, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
+								control.addEdgeOnCanvas(e);
 							}
 
 						}
@@ -912,22 +894,22 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					Node n = new Node("Node");
 
 					n.setPosition(x, y);
-					controller.addObjectCanvas(n);
+					control.addObjectCanvas(n);
 
 					AbstractCanvasObject r, k;
 					r = p.getA();
 					k = p.getB();
 
-					e = new Edge(n, tempCps, model.getMaxCapacity());
+					e = new Edge(n, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
 
-					e1 = new Edge(n, r, model.getMaxCapacity());
+					e1 = new Edge(n, r, GuiSettings.maxCapacityForNewCreatedEdges);
 
-					e2 = new Edge(n, k, model.getMaxCapacity());
+					e2 = new Edge(n, k, GuiSettings.maxCapacityForNewCreatedEdges);
 
-					controller.removeEdgesOnCanvas(p);
-					controller.addEdgeOnCanvas(e);
-					controller.addEdgeOnCanvas(e1);
-					controller.addEdgeOnCanvas(e2);
+					control.removeEdgesOnCanvas(p);
+					control.addEdgeOnCanvas(e);
+					control.addEdgeOnCanvas(e1);
+					control.addEdgeOnCanvas(e2);
 				}
 			} else {
 				mayBeReplaced = null;
@@ -939,18 +921,18 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 
 				n.setPosition(x, y);
 
-				controller.addObjectCanvas(n);
+				control.addObjectCanvas(n);
 
-				e = new Edge(n, tempCps, model.getMaxCapacity());
+				e = new Edge(n, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
 
-				controller.addEdgeOnCanvas(e);
+				control.addEdgeOnCanvas(e);
 			} else {
 				mayBeReplaced = null;
 			}
 
 			// Wenn ein Node ohne Connections da ist
 			if (deleteNode) {
-				controller.delCanvasObject(tempCps, true);
+				control.delCanvasObject(tempCps, true);
 				tempCps = null;
 			}
 		}
@@ -1023,7 +1005,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		 * AutoSave new Positons
 		 */
 		try {
-			controller.autoSave();
+			control.autoSave();
 		} catch (IOException ex) {
 			System.err.println("AutoSave error by aligning");
 			ex.printStackTrace();

+ 24 - 108
src/holeg/ui/view/canvas/GroupNodeCanvas.java

@@ -8,7 +8,6 @@ import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.MouseEvent;
 import java.io.IOException;
-import java.util.HashSet;
 import java.util.Optional;
 import java.util.logging.Logger;
 
@@ -76,16 +75,9 @@ public class GroupNodeCanvas extends Canvas {
 		}
 		// <--
 		// SelectedCable
-		HashSet<Edge> selectedEdges = new HashSet<Edge>();
-		for (AbstractCanvasObject aCps : model.getSelectedObjects()) {
-			for (Edge edge : aCps.getConnections()) {
-				selectedEdges.add(edge);
-			}
-		}
-		if (model.getSelectedEdge() != null)
-			selectedEdges.add(model.getSelectedEdge());
 
-		Optional<VisualRepresentationalState> visState = controller.getSimManager()
+
+		Optional<VisualRepresentationalState> visState = control.getSimManager()
 				.getActualVisualRepresentationalState();
 		if (visState.isEmpty()) {
 			return;
@@ -96,7 +88,7 @@ public class GroupNodeCanvas extends Canvas {
 			paintExitCable(g2d, cable);
 		}
 		for (Edge cable : actualGroupNode.getInternCableList()) {
-			paintCable(g2d, cable, selectedEdges.contains(cable));
+			paintCable(g2d, cable, GuiSettings.getSelectedEdges().contains(cable));
 		}
 
 		for (DecoratedGroupNode dGroupNode : actualGroupNode.getGroupNodeList()) {
@@ -128,7 +120,7 @@ public class GroupNodeCanvas extends Canvas {
 		// Objects:
 		g2d.setStroke(new BasicStroke(1));
 		Color transparentGrey = ColorPreference.Panel.ObjectSelection;
-		for (AbstractCanvasObject aCps : model.getSelectedObjects()) {
+		for (AbstractCanvasObject aCps : GuiSettings.getSelectedObjects()) {
 			if (aCps instanceof Node) {
 				Vector2Int pos = aCps.getPosition();
 				g2d.setColor(transparentGrey);
@@ -168,7 +160,7 @@ public class GroupNodeCanvas extends Canvas {
 			tempCps = null;
 			dataSelected = null;
 			edgeHighlight = null;
-			controller.setSelecteEdge(null);
+			GuiSettings.getSelectedEdges().clear();
 			// Object Selection
 
 			if (e.getX() > 0) {
@@ -181,12 +173,12 @@ public class GroupNodeCanvas extends Canvas {
 						dragging = true;
 						if (e.isControlDown() && tempCps != null) {
 							log.info("Add Remove Selection GROUPNODECANVAS");
-							if (model.getSelectedObjects().contains(tempCps)) {
-								controller.removeObjectFromSelection(tempCps);
+							if (GuiSettings.getSelectedObjects().contains(tempCps)) {
+								control.removeObjectFromSelection(tempCps);
 							} else {
-								controller.addSelectedObject(tempCps);
+								control.addSelectedObject(tempCps);
 								if (tempCps instanceof GroupNode)
-									controller.getObjectsInDepth();
+									control.getObjectsInDepth();
 							}
 						}
 
@@ -202,41 +194,14 @@ public class GroupNodeCanvas extends Canvas {
 						break;
 					}
 				}
-			} else {
-				// look for objects connected to uppernode
-				int count = 0;
-				for (Edge ed : groupNode.getConnections()) {
-					AbstractCanvasObject cps;
-					if (ed.getA().equals(this.groupNode)) {
-						cps = ed.getB();
-					} else {
-						cps = ed.getA();
-					}
-					if (x - GuiSettings.getPictureScale() <= (GuiSettings.getPictureScaleDiv2())
-							&& y - GuiSettings.getPictureScale() <= (scalediv20 + 5
-									+ (GuiSettings.getPictureScale() + scalediv20 + 10) * count)
-							&& x >= GuiSettings.getPictureScaleDiv2()
-							&& y >= (scalediv20 + 5 + (GuiSettings.getPictureScale() + scalediv20 + 10) * count)) {
-						tempCps = cps;
-						// If drawing an Edge (CTRL down)
-						if (tempCps.getClass() == HolonObject.class) {
-							HolonObject tempObj = ((HolonObject) tempCps);
-							dataSelected = tempObj.getElements();
-						}
-						if (e.isShiftDown()) {
-							drawEdge = true;
-						}
-					}
-					count++;
-				}
 			}
 			// Edge Selection
 			if (e.getButton() == MouseEvent.BUTTON1) {
 				if (tempCps == null) {
 					edgeHighlight = mousePositionOnEdge(x, y);
-					controller.setSelecteEdge(edgeHighlight);
+					GuiSettings.getSelectedEdges().add(edgeHighlight);
 					if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-						controller.clearSelection();
+						control.clearSelection();
 					}
 				}
 
@@ -267,7 +232,7 @@ public class GroupNodeCanvas extends Canvas {
 					/**
 					 * Save State before performing NodePlacement, replacement e.g.
 					 */
-					controller.autoSave();
+					control.autoSave();
 				} catch (IOException ex) {
 					ex.printStackTrace();
 				}
@@ -275,7 +240,7 @@ public class GroupNodeCanvas extends Canvas {
 				/**
 				 * check if tempCps could replace an Object on the UpperNodeanvas
 				 */
-				if (model.getSelectedObjects().size() == 1 && checkForReplacement(groupNode.getObjectsInThisLayer().toList(), tempCps,
+				if (GuiSettings.getSelectedObjects().size() == 1 && checkForReplacement(groupNode.getObjectsInThisLayer().toList(), tempCps,
 						tempCps.getPosition().getX(), tempCps.getPosition().getY())) {
 					/**
 					 * if UpperNode would be replaced, close its tabs
@@ -285,16 +250,16 @@ public class GroupNodeCanvas extends Canvas {
 					/**
 					 * replace on canvas
 					 */
-					controller.replaceObjUpperNode(mayBeReplaced, tempCps, groupNode);
+					control.replaceObjUpperNode(mayBeReplaced, tempCps, groupNode);
 					mayBeReplaced = null;
 				}
 			}
 
 			if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
-				controller.clearSelection();
-				controller.addSelectedObject(tempCps);
+				control.clearSelection();
+				control.addSelectedObject(tempCps);
 				if (tempCps instanceof GroupNode)
-					controller.getObjectsInDepth();
+					control.getObjectsInDepth();
 			}
 
 			dragged = false;
@@ -308,9 +273,9 @@ public class GroupNodeCanvas extends Canvas {
 				sw.switchState();
 			}
 			if (doubleclick && tempCps != null && tempCps instanceof GroupNode groupnode) {
-				controller.getGui().openNewUpperNodeTab(groupnode);
+				control.getGui().openNewUpperNodeTab(groupnode);
 			}
-			controller.calculateStateAndVisualForTimeStep(model.getActualTimeStep());
+			control.calculateStateAndVisualForTimeStep(model.getCurrentIteration());
 			repaint();
 		}
 	}
@@ -321,10 +286,10 @@ public class GroupNodeCanvas extends Canvas {
 			// If Edge is drawn
 			x = e.getX();
 			y = e.getY();
-			if (!model.getSelectedObjects().contains(tempCps) && !doMark) {
-				controller.clearSelection();
+			if (!GuiSettings.getSelectedObjects().contains(tempCps) && !doMark) {
+				control.clearSelection();
 				if (tempCps != null) {
-					controller.addSelectedObject(tempCps);
+					control.addSelectedObject(tempCps);
 				}
 			}
 			if (dragging) {
@@ -361,7 +326,7 @@ public class GroupNodeCanvas extends Canvas {
 						toolTipPos.setY(tempCps.getPosition().getY() - GuiSettings.getPictureScaleDiv2());
 
 						// All Selected Objects
-						for (AbstractCanvasObject cps : model.getSelectedObjects()) {
+						for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 							if (cps != tempCps) {
 								x = (int) (cps.getPosition().getX() + xDist);
 								y = (int) (cps.getPosition().getY() + yDist);
@@ -383,7 +348,7 @@ public class GroupNodeCanvas extends Canvas {
 					/**
 					 * check if something would be replaced
 					 */
-					if (model.getSelectedObjects().size() == 1)
+					if (GuiSettings.getSelectedObjects().size() == 1)
 						checkForReplacement(groupNode.getObjectsInThisLayer().toList(), tempCps, x, y);
 
 					repaint();
@@ -414,33 +379,6 @@ public class GroupNodeCanvas extends Canvas {
 						tempSelected.add(cps);
 					}
 				});
-				int count = 0;
-				for (Edge ed : groupNode.getConnections()) {
-					AbstractCanvasObject cps;
-					if (ed.getA().equals(groupNode)) {
-						cps = ed.getB();
-					} else {
-						cps = ed.getA();
-					}
-
-					int x1 = sx, x2 = x, y1 = sy, y2 = y;
-
-					if (sx >= x) {
-						x1 = x;
-						x2 = sx;
-					}
-					if (sy >= y) {
-						y1 = y;
-						y2 = sy;
-					}
-
-					if (x1 <= 0 && y1 <= (int) (5 + (GuiSettings.getPictureScale() + scalediv20 + 10) * count) + GuiSettings.getPictureScaleDiv2()
-							&& x2 >= 0 && y2 >= (int) (5 + (GuiSettings.getPictureScale() + scalediv20 + 10) * count)) {
-						tempSelected.add(cps);
-
-					}
-					count++;
-				}
 			}
 
 			repaint();
@@ -468,28 +406,6 @@ public class GroupNodeCanvas extends Canvas {
 				toolTipPos.setY(cps.getPosition().getY() + GuiSettings.getPictureScaleDiv2());
 				toolTipText = cps.getName() + ", " + cps.getId();
 			});
-			int count = 0;
-			for (Edge ed : groupNode.getConnections()) {
-
-				AbstractCanvasObject cps;
-				if (ed.getA().equals(this.groupNode)) {
-					cps = ed.getB();
-				} else {
-					cps = ed.getA();
-				}
-
-				cx = 0;
-				cy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count);
-				if (x - 50 <= cx && y - 50 <= cy && x >= cx && y >= cy) {
-
-					on = true;
-					toolTipPos.setX(cx - 25);
-					toolTipPos.setY(cy + 50);
-					toolTipText = cps.getName() + ", " + cps.getId();
-
-				}
-				count++;
-			}
 
 			toolTip = on;
 			repaint();

+ 1 - 1
src/holeg/ui/view/dialog/AddElementPopUp.java

@@ -181,7 +181,7 @@ public class AddElementPopUp extends JDialog {
 				JOptionPane.showMessageDialog(new JFrame(), "Please enter numbers in the Fields amount and Energy");
 			}
 		} else {
-			if (elementName.getText().length() == 0) {
+			if (elementName.getText().isEmpty()) {
 				JLabel errorString = new JLabel("No name");
 				errorString.setBounds(240, 8, 100, 20);
 				contentPanel.add(errorString);

+ 12 - 7
src/holeg/ui/view/dialog/AddObjectPopUp.java

@@ -229,16 +229,21 @@ public class AddObjectPopUp extends JDialog {
 								imageChanged = false;
 								try {
 									if (editState) {
-										controller.delObjectCategory(givenCategory, toEdit.getName());
-										hElements.forEach(ele -> ele
-												.setSaving(new SimpleEntry<>(ele.getSaving().getKey(), objectName.getText())));
-										controller.addObject(controller.searchCategory(givenCategory),
-												objectName.getText(), hElements, imagePath);
+										controller.findCategoryWithName(givenCategory).ifPresent(cat -> {
+											cat.findObjectWithName(toEdit.getName()).ifPresent(object -> {
+												cat.getObjects().remove(object);
+											});
+											hElements.forEach(ele -> ele.setSaving(
+													new SimpleEntry<>(ele.getSaving().getKey(), objectName.getText())));
+											controller.addObject(cat, objectName.getText(), hElements, imagePath);
+										});
 
 									} else {
-										controller.addObject(controller.searchCategory(givenCategory),
-												objectName.getText(), hElements, imagePath);
+										controller.findCategoryWithName(givenCategory).ifPresent(cat -> {
+											controller.addObject(cat, objectName.getText(), hElements, imagePath);
+										});
 									}
+
 								} catch (Exception e2) {
 								}
 

+ 7 - 7
src/holeg/ui/view/dialog/CanvasResizePopUp.java

@@ -42,8 +42,8 @@ public class CanvasResizePopUp extends JDialog {
         setLocationRelativeTo(parentFrame);
 
 		// MainPanel
-		tFieldWidht.setText("" + model.getCanvasX());
-		tFieldHeight.setText("" + model.getCanvasY());
+		tFieldWidht.setText("" + GuiSettings.canvasSize.getX());
+		tFieldHeight.setText("" + GuiSettings.canvasSize.getY());
 		mainPanel.add(lblWidth);
 		mainPanel.add(tFieldWidht);
 		mainPanel.add(lblHeight);
@@ -56,9 +56,9 @@ public class CanvasResizePopUp extends JDialog {
 			public void actionPerformed(ActionEvent e) {
 				GuiSettings.canvasSize.setX(Integer.parseInt(tFieldWidht.getText()));
 				GuiSettings.canvasSize.setY(Integer.parseInt(tFieldHeight.getText()));
-				int width = model.getCanvasX();
-				int height = model.getCanvasY();
-				Dimension preferedSize = new Dimension(width, height);
+				Vector2Int actualCanvasSize = GuiSettings.canvasSize;
+				
+				Dimension preferedSize = new Dimension(actualCanvasSize.getX(), actualCanvasSize.getY());
 				canvas.setPreferredSize(new Dimension(preferedSize));
 				for (int i = 1; i < tabbedPane.getTabCount(); i++) {
 					if (tabbedPane.getComponentAt(i) != null) {
@@ -74,8 +74,8 @@ public class CanvasResizePopUp extends JDialog {
 				
 				controller.getModel().getAllAbstractObjectsOnCanvas().stream().forEach(obj -> {
 					Vector2Int position = obj.getPosition();
-					position.clampX(0, width);
-					position.clampY(0, height);
+					position.clampX(0, actualCanvasSize.getX());
+					position.clampY(0, actualCanvasSize.getY());
 				});
 				controller.updateCanvas();
 				dispose();

+ 6 - 11
src/holeg/ui/view/dialog/CreateNewDialog.java

@@ -5,7 +5,6 @@ import java.awt.CardLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
-import java.io.IOException;
 
 import javax.swing.JButton;
 import javax.swing.JComboBox;
@@ -230,20 +229,16 @@ public class CreateNewDialog extends JDialog{
 		saveButton.addActionListener(actionEvent -> {
 			if(actualOption == Option.Category)
 			{
-				try {
-					actualController.addCategory(inputName.getText());
-				} catch (IOException e) {
-					System.err.println("IOException addCategory");
-				}
+				actualController.createCategoryWithName(inputName.getText());
+
 				dispose();
 			}
 			else if (actualOption == Option.Switch)
 			{
-				try {
-					actualController.addSwitch(actualController.searchCategory(selectedCategorySwitch.getSelectedItem().toString()), inputNameSwitch.getText());
-				} catch (IOException e) {
-					System.err.println("IOException addSwitch");
-				}
+				actualController.findCategoryWithName(selectedCategorySwitch.getSelectedItem().toString()).ifPresent(cat -> {
+					actualController.addSwitch(cat, inputNameSwitch.getText());
+				});
+
 				dispose();
 			}
 		});

+ 16 - 24
src/holeg/ui/view/dialog/CreateTemplatePopUp.java

@@ -3,7 +3,6 @@ package holeg.ui.view.dialog;
 import java.awt.BorderLayout;
 import java.awt.Choice;
 import java.io.File;
-import java.io.IOException;
 import java.util.AbstractMap.SimpleEntry;
 
 import javax.swing.DefaultListModel;
@@ -23,6 +22,7 @@ import javax.swing.filechooser.FileNameExtensionFilter;
 import holeg.model.HolonElement;
 import holeg.model.HolonObject;
 import holeg.ui.controller.Control;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.model.Model;
 import holeg.ui.view.main.Category;
 import holeg.utility.ImageImport;
@@ -139,15 +139,11 @@ public class CreateTemplatePopUp extends JDialog {
 		choice.setBounds(86, 13, 172, 22);
 		contentPanel.add(choice);
 		// add categories
-		if (model.getCategories().size() == 0)// if no categorie exist: create
-												// new Template Category
-			try {
-				this.controller.addCategory("Template");
-			} catch (IOException e1) {
-				e1.printStackTrace();
-			}
+		if (GuiSettings.getCategories().isEmpty()){
+			this.controller.createCategoryWithName("Template");			
+		}
 		// add Categories to the choice
-		for (Category c : model.getCategories())
+		for (Category c : GuiSettings.getCategories())
 			choice.add(c.getName());
 
 		/**
@@ -295,21 +291,17 @@ public class CreateTemplatePopUp extends JDialog {
 	 * create the template and add it to the category
 	 */
 	private void createTemplate() {
-		try {
-			template.setName(textField_name.getText());
-			template.setImage(textField_imagePath.getText());
-			template.getElements().forEach(
-					ele -> ele.setSaving(new SimpleEntry<String, String>(choice
-							.getSelectedItem(), template.getName())));
-			controller.addObject(controller.searchCategory(choice
-					.getItem(choice.getSelectedIndex())), template.getName(),
-					template.getElements(), template.getImage());
-			this.dispose();
-		} catch (IOException e) {
-			System.out
-					.println("Could not create Template: Category not found!");
-			e.printStackTrace();
-		}
+		template.setName(textField_name.getText());
+		template.setImage(textField_imagePath.getText());
+		template.getElements().forEach(
+				ele -> ele.setSaving(new SimpleEntry<String, String>(choice
+						.getSelectedItem(), template.getName())));
+		controller.findCategoryWithName(choice
+				.getItem(choice.getSelectedIndex())).ifPresent(cat -> {
+					controller.addObject(cat, template.getName(),
+							template.getElements(), template.getImage());
+				});
+		this.dispose();
 	}
 
 	/**

+ 22 - 21
src/holeg/ui/view/dialog/SearchPopUp.java

@@ -17,6 +17,7 @@ import javax.swing.border.EmptyBorder;
 
 import holeg.model.AbstractCanvasObject;
 import holeg.ui.controller.Control;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.view.canvas.Canvas;
 
 /**
@@ -30,7 +31,7 @@ public class SearchPopUp extends JDialog {
 	private final JPanel contentPanel = new JPanel();
 	private JTextField replaceTextField;
 	private JTextField findTextField;
-	private Control controller;
+	private Control control;
 	private Canvas canvas;
 	private JRadioButton rdbtnForward;
 	private JRadioButton rdbtnBackward;
@@ -58,7 +59,7 @@ public class SearchPopUp extends JDialog {
 		getContentPane().add(contentPanel, BorderLayout.CENTER);
 		contentPanel.setLayout(null);
 
-		this.controller = contr;
+		this.control = contr;
 		this.canvas = can;
 
 		JLabel lblFind = new JLabel("Find" + ":");
@@ -120,27 +121,27 @@ public class SearchPopUp extends JDialog {
 		btnFind.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				if (rdbtnAll.isSelected()) {
-					for (AbstractCanvasObject cps : controller.getModel().getObjectsOnCanvas()) {
+					for (AbstractCanvasObject cps : control.getModel().getObjectsOnCanvas()) {
 
 						if (cps.getName().equals(findTextField.getText())
-								&& !controller.getModel().getSelectedObjects().contains(cps)) {
-							controller.getModel().getSelectedObjects().add(cps);
+								&& !GuiSettings.getSelectedObjects().contains(cps)) {
+							GuiSettings.getSelectedObjects().add(cps);
 						}
 
 					}
 
 				}
 				if (rdbtnSingle.isSelected()) {
-					controller.getModel().getSelectedObjects().clear();
+					GuiSettings.getSelectedObjects().clear();
 
-					if (!controller.getModel().getObjectsOnCanvas().isEmpty() && !findTextField.getText().isEmpty()) {
+					if (!control.getModel().getObjectsOnCanvas().isEmpty() && !findTextField.getText().isEmpty()) {
 
 						if (rdbtnForward.isSelected()) {
 							if ((idx = getNext(++idx)) != -1)
-								controller.getModel().getSelectedObjects().add(getObj(idx));
+								GuiSettings.getSelectedObjects().add(getObj(idx));
 						} else if (rdbtnBackward.isSelected()) {
 							if ((idx = getPrev(--idx)) != -1)
-								controller.getModel().getSelectedObjects().add(getObj(idx));
+								GuiSettings.getSelectedObjects().add(getObj(idx));
 						}
 					}
 
@@ -171,15 +172,15 @@ public class SearchPopUp extends JDialog {
 		btnReplaceAll.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				canvas.tempCps = null;
-				controller.getModel().getSelectedObjects().clear();
+				GuiSettings.getSelectedObjects().clear();
 
-				for (AbstractCanvasObject cps : controller.getModel().getObjectsOnCanvas()) {
+				for (AbstractCanvasObject cps : control.getModel().getObjectsOnCanvas()) {
 					if (cps.getName().equals(findTextField.getText())
-							&& !controller.getModel().getSelectedObjects().contains(cps))
+							&& !GuiSettings.getSelectedObjects().contains(cps))
 						selectObj(cps);
 				}
 
-				for (AbstractCanvasObject cps : controller.getModel().getSelectedObjects()) {
+				for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 					renameObj(cps, replaceTextField.getText());
 				}
 
@@ -218,7 +219,7 @@ public class SearchPopUp extends JDialog {
 	 *            The Object
 	 */
 	public void selectObj(AbstractCanvasObject obj) {
-		controller.getModel().getSelectedObjects().add(obj);
+		GuiSettings.getSelectedObjects().add(obj);
 	}
 
 	/**
@@ -241,7 +242,7 @@ public class SearchPopUp extends JDialog {
 	 * @return the Object with that ID
 	 */
 	public AbstractCanvasObject getObj(int idx) {
-		return controller.getModel().getObjectsOnCanvas().get(idx);
+		return control.getModel().getObjectsOnCanvas().get(idx);
 	}
 
 	/**
@@ -252,14 +253,14 @@ public class SearchPopUp extends JDialog {
 	 * @return the next Index
 	 */
 	public int getNext(int idx) {
-		for (int i = idx; i < controller.getModel().getObjectsOnCanvas().size(); i++) {
+		for (int i = idx; i < control.getModel().getObjectsOnCanvas().size(); i++) {
 			if (getObj(i).getName().equals(findTextField.getText())
-					&& !controller.getModel().getSelectedObjects().contains(getObj(i)))
+					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
 				return i;
 		}
 		for (int i = 0; i < idx; i++) {
 			if (getObj(i).getName().equals(findTextField.getText())
-					&& !controller.getModel().getSelectedObjects().contains(getObj(i)))
+					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
 				return i;
 		}
 		return -1;
@@ -275,12 +276,12 @@ public class SearchPopUp extends JDialog {
 	public int getPrev(int idx) {
 		for (int i = idx; i >= 0; i--) {
 			if (getObj(i).getName().equals(findTextField.getText())
-					&& !controller.getModel().getSelectedObjects().contains(getObj(i)))
+					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
 				return i;
 		}
-		for (int i = controller.getModel().getObjectsOnCanvas().size() - 1; i > idx; i--) {
+		for (int i = control.getModel().getObjectsOnCanvas().size() - 1; i > idx; i--) {
 			if (getObj(i).getName().equals(findTextField.getText())
-					&& !controller.getModel().getSelectedObjects().contains(getObj(i)))
+					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
 				return i;
 		}
 		return -1;

+ 9 - 7
src/holeg/ui/view/information/HolonInformationPanel.java

@@ -11,6 +11,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Predicate;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -41,9 +42,11 @@ import holeg.ui.model.Passiv;
 import holeg.ui.model.Supplier;
 import holeg.ui.model.VisualRepresentationalState;
 import holeg.ui.model.DecoratedHolonObject.HolonObjectState;
+import holeg.ui.model.GuiSettings;
 import holeg.utility.FormatFloat;
 
 public class HolonInformationPanel extends JPanel {
+	private static final Logger log = Logger.getLogger(JPanel.class.getName());
 	private Predicate<DecoratedHolonObject> stateFilter = (object) -> true;// = (object) -> object.getState() ==
 																			// HolonObjectState.PRODUCER;
 	private Predicate<HolonElement> priorityFilter = (ele) -> true;
@@ -85,7 +88,7 @@ public class HolonInformationPanel extends JPanel {
 	private JLabel differenceEnergyLabelAmount = new JLabel("");
 
 	public void updateCharts() {
-		if (control.getModel().getSelectedObjects().isEmpty()) {
+		if (GuiSettings.getSelectedObjects().isEmpty()) {
 			return;
 		}
 		Optional<FilterableGroupNode> filteredGroupNode = multiSelectionToFilterableGroupNode();
@@ -129,8 +132,7 @@ public class HolonInformationPanel extends JPanel {
 		// UPDATE PRODUCTION
 		float production = decoratedGroupNode.getProduction(stateFilter, priorityFilter);
 		float consumption = decoratedGroupNode.getConsumption(stateFilter, priorityFilter);
-		System.out.println("production" + production);
-		System.out.println("consumption" + consumption);
+		log.info("production" + production + " consumption" + consumption);
 		float difference = Math.abs(production - consumption);
 		energyChart.updatePieSeries("Production", production);
 		energyChart.updatePieSeries("Consumption", consumption);
@@ -191,7 +193,7 @@ public class HolonInformationPanel extends JPanel {
 
 	private Optional<FilterableGroupNode> multiSelectionToFilterableGroupNode() {
 		FilterableGroupNode temp = new FilterableGroupNode(new GroupNode("Temp"),
-				control.getModel().getActualTimeStep());
+				control.getModel().getCurrentIteration());
 
 		Optional<VisualRepresentationalState> visState = control.getSimManager().getActualVisualRepresentationalState();
 		if(visState.isEmpty()) {
@@ -200,16 +202,16 @@ public class HolonInformationPanel extends JPanel {
 		
 		// GroupNodes
 		HashMap<GroupNode, DecoratedGroupNode> accessMapGroupNode = visState.get().getCreatedGroupNodes();
-		List<FilterableGroupNode> groupNodeList = control.getModel().getSelectedObjects().stream()
+		List<FilterableGroupNode> groupNodeList = GuiSettings.getSelectedObjects().stream()
 				.filter(object -> object instanceof GroupNode).map(object -> accessMapGroupNode.get(object))
-				.map(node -> new FilterableGroupNode(node, control.getModel().getActualTimeStep()))
+				.map(node -> new FilterableGroupNode(node, control.getModel().getCurrentIteration()))
 				.collect(Collectors.toList());
 
 		temp.getGroupNodeList().addAll(groupNodeList);
 
 		// HolonObjects
 		HashMap<HolonObject, DecoratedHolonObject> accessMapHolonObject = visState.get().createdHolonObjects;
-		List<DecoratedHolonObject> holonObjectList = control.getModel().getSelectedObjects().stream()
+		List<DecoratedHolonObject> holonObjectList = GuiSettings.getSelectedObjects().stream()
 				.filter(object -> object instanceof HolonObject).map(object -> accessMapHolonObject.get(object))
 				.collect(Collectors.toList());
 

+ 3 - 4
src/holeg/ui/view/inspector/Inspector.java

@@ -24,6 +24,7 @@ import holeg.interfaces.TimelineDependent;
 import holeg.model.HolonElement;
 import holeg.model.HolonSwitch;
 import holeg.ui.controller.Control;
+import holeg.ui.model.GuiSettings;
 import holeg.utility.FormatFloat;
 import holeg.utility.ImageImport;
 import holeg.utility.Maths;
@@ -32,7 +33,6 @@ import holeg.utility.listener.ResizeListener;
 public class Inspector extends JSplitPane {
 	private final UnitGraph unitGraph;
 	private final InspectorTable table;
-	private final Control control;
 	private final JPanel scrollGraph = new JPanel();
 	private final JPanel graphLabel = new JPanel();
 	private final JLabel maxGraph = new JLabel("100%");
@@ -53,7 +53,6 @@ public class Inspector extends JSplitPane {
 	private JButton localPeriodButton = new JButton("", localPeriodButtonImageEnabled);
 
 	public Inspector(Control control) {
-		this.control = control;
 		table = new InspectorTable(control);
 		unitGraph = new UnitGraph(control);
 		table.OnElementSelectionChanged.addListener(this::updateUnitGraph);
@@ -160,7 +159,7 @@ public class Inspector extends JSplitPane {
 		}
 
 		if (elements.isEmpty()) {
-			control.getModel().getSelectedObjects().stream().filter(obj -> obj instanceof HolonSwitch)
+			GuiSettings.getSelectedObjects().stream().filter(obj -> obj instanceof HolonSwitch)
 					.forEach(obj -> unitGraph.addNewSeries((HolonSwitch) obj));
 		}
 
@@ -174,7 +173,7 @@ public class Inspector extends JSplitPane {
 	}
 
 	private void updateGlobalCurve() {
-		Set<HolonElement> elements = InspectorTable.extractElements(control.getModel().getSelectedObjects())
+		Set<HolonElement> elements = InspectorTable.extractElements(GuiSettings.getSelectedObjects())
 				.collect(Collectors.toSet());
 		unitGraph.setGlobalCurve(elements);
 		double maxEnergy = elements.stream().map(ele -> ele.getEnergy()).filter(energy -> energy > 0).reduce(0.0f,

+ 4 - 3
src/holeg/ui/view/inspector/InspectorTable.java

@@ -43,6 +43,7 @@ import holeg.model.HolonObject;
 import holeg.model.HolonElement.Priority;
 import holeg.preferences.ColorPreference;
 import holeg.ui.controller.Control;
+import holeg.ui.model.GuiSettings;
 import holeg.ui.view.component.TrippleCheckBox;
 import holeg.ui.view.component.TrippleCheckBox.State;
 import holeg.utility.ImageImport;
@@ -234,7 +235,7 @@ public class InspectorTable extends JPanel {
 		addButton.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
 		addButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
 		addButton.addActionListener(clicked -> {
-			Optional<HolonObject> last = control.getModel().getSelectedObjects().stream()
+			Optional<HolonObject> last = GuiSettings.getSelectedObjects().stream()
 					.filter(obj -> obj instanceof HolonObject).reduce((prev, next) -> next)
 					.map(obj -> (HolonObject) obj);
 			last.ifPresent(obj -> {
@@ -331,7 +332,7 @@ public class InspectorTable extends JPanel {
 			}
 
 			this.add(buttonPanel, "span");
-			boolean isAtLeastOneHolonObjectSelected = control.getModel().getSelectedObjects().stream()
+			boolean isAtLeastOneHolonObjectSelected = GuiSettings.getSelectedObjects().stream()
 					.anyMatch(object -> object instanceof HolonObject);
 			this.addButton.setEnabled(isAtLeastOneHolonObjectSelected);
 			duplicateButton.setEnabled(false);
@@ -347,7 +348,7 @@ public class InspectorTable extends JPanel {
 
 	private void updateInspectorUi() {
 		// clone for concurrency
-		Set<AbstractCanvasObject> selection = new HashSet<>(control.getModel().getSelectedObjects());
+		Set<AbstractCanvasObject> selection = new HashSet<>(GuiSettings.getSelectedObjects());
 		assignElementsToRowPool(selection);
 		updateTableUi();
 	}

+ 1 - 1
src/holeg/ui/view/inspector/UnitGraph.java

@@ -304,7 +304,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 	 * @param g2D to draw.
 	 */
 	private void drawCurrentIterartionLine(Graphics2D g) {
-		int cur = model.getActualTimeStep();
+		int cur = model.getCurrentIteration();
 		int max = model.getMaxIterations();
 		if (isLocalPeriedDifferentInSeries()) {
 			for (Series series : seriesList) {

+ 12 - 28
src/holeg/ui/view/main/Category.java

@@ -1,7 +1,7 @@
 package holeg.ui.view.main;
-
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
 
 import com.google.gson.annotations.Expose;
 
@@ -18,12 +18,10 @@ import holeg.model.AbstractCanvasObject;
 
 public class Category {
 	// objects: is a ArrayList of all Objects that belongs to the Category
-	private ArrayList<AbstractCanvasObject> objects;
+	private Set<AbstractCanvasObject> objects = new HashSet<AbstractCanvasObject>();
 	// name: is a String chosen by the User
 	@Expose
 	private String name; 
-	// ObjIdx: Index of each Category that corresponds to the order in the tree
-	private HashMap<String, Integer> objIdx;
 
 	/**
 	 * Category Constructor.
@@ -31,10 +29,7 @@ public class Category {
 	 * @param name name of the Category
 	 */
 	public Category(String name) {
-		setObjects(new ArrayList<AbstractCanvasObject>());
 		setName(name);
-		setObjIdx(new HashMap<String, Integer>());
-
 	}
 
 	/**
@@ -42,7 +37,7 @@ public class Category {
 	 * 
 	 * @return the objects
 	 */
-	public ArrayList<AbstractCanvasObject> getObjects() {
+	public Set<AbstractCanvasObject> getObjects() {
 		return objects;
 	}
 
@@ -52,7 +47,7 @@ public class Category {
 	 * @param objects
 	 *            the objects to set
 	 */
-	public void setObjects(ArrayList<AbstractCanvasObject> objects) {
+	public void setObjects(Set<AbstractCanvasObject> objects) {
 		this.objects = objects;
 	}
 
@@ -75,23 +70,12 @@ public class Category {
 		this.name = name;
 	}
 
-	/**
-	 * Getter of the Objects in the Tree with their respective order.
-	 * 
-	 * @return the objIdx
-	 */
-	public HashMap<String, Integer> getObjIdx() {
-		return objIdx;
+	
+	public Optional<AbstractCanvasObject> findObjectWithName(String name){
+		return objects.stream().filter(obj -> obj.getName().equals(name)).findFirst();
 	}
-
-	/**
-	 * Set a new sequence of Objects in the tree.
-	 * 
-	 * @param objIdx
-	 *            the objIdx to set
-	 */
-	public void setObjIdx(HashMap<String, Integer> objIdx) {
-		this.objIdx = objIdx;
+	
+	public boolean removeObjectsWithName(String name){
+		return objects.removeIf(obj -> obj.getName().equals(name));
 	}
-
 }

+ 137 - 142
src/holeg/ui/view/main/GUI.java

@@ -26,8 +26,11 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Optional;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -103,6 +106,7 @@ import holeg.utility.ImageImport;
  * @author Gruppe14
  */
 public class GUI {
+	private static final Logger log = Logger.getLogger(Model.class.getName());
 	/**
 	 * Menu on the Top containing File, Edit View Help etc
 	 */
@@ -182,7 +186,7 @@ public class GUI {
 	// In this section is the graph for the selected HolonElement of the clicked
 
 	private final Model model;
-	private final Control controller;
+	private final Control control;
 
 	// In this section are all the Holonelements that correspond to the clicked
 	// HolonObject with consumption/production, name and amount.
@@ -252,7 +256,7 @@ public class GUI {
 	 * @param control the Controller
 	 */
 	GUI(Control control) {
-		this.controller = control;
+		this.control = control;
 		this.informationPanel = new HolonInformationPanel(control);
 		this.model = control.getModel();
 		inspector = new Inspector(control);
@@ -261,8 +265,8 @@ public class GUI {
 		this.unitGraph = new UnitGraph(control);
 		this.canvas = new Canvas(model, control, unitGraph);
 		initialize();
-		updateCategories(model.getCategories());
-		control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(model.getCategories()));
+		updateCategories(GuiSettings.getCategories());
+		control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(GuiSettings.getCategories()));
 	}
 
 	/**
@@ -272,7 +276,7 @@ public class GUI {
 		holegJFrame = new JFrame();
 		holegJFrame.setTitle("HOLEG Simulator");
 		// try to restore old position/dimensions
-		ArrayList<Integer> savedWindowDim = controller.loadSavedWindowDimensionsIfExistent();
+		ArrayList<Integer> savedWindowDim = control.loadSavedWindowDimensionsIfExistent();
 		if (savedWindowDim.size() == 4) {
 			holegJFrame.setBounds(savedWindowDim.get(0), savedWindowDim.get(1), savedWindowDim.get(2),
 					savedWindowDim.get(3));
@@ -292,14 +296,14 @@ public class GUI {
 			public void windowClosing(java.awt.event.WindowEvent windowEvent) {
 				if (JOptionPane.showConfirmDialog(holegJFrame, "Are you sure you want to exit?", "HOLEG",
 						JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
-					controller
+					control
 							.deleteDirectory(new File(System.getProperty("user.home") + "/.config/HolonGUI/Autosave"));
 
 					// try to save the position and size of the window, such
 					// that (if possible)
 					// it can be opened in the same position the next time
 					try {
-						controller.savePosAndSizeOfWindow(holegJFrame.getX(), holegJFrame.getY(),
+						control.savePosAndSizeOfWindow(holegJFrame.getX(), holegJFrame.getY(),
 								holegJFrame.getWidth(), holegJFrame.getHeight());
 					} catch (Exception e) {
 						e.printStackTrace();
@@ -325,10 +329,10 @@ public class GUI {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				try {
-					controller.loadAutoSave(controller.getUndoSave());
+					control.loadAutoSave(control.getUndoSave());
 					closeInvalidUpperNodeTabs();
 
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.calculateStateAndVisualForCurrentTimeStep();
 					canvas.repaint();
 					updateUpperNodes();
 				} catch (IOException eex) {
@@ -346,11 +350,11 @@ public class GUI {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				try {
-					controller.loadAutoSave(controller.getRedoSave());
+					control.loadAutoSave(control.getRedoSave());
 
 					closeInvalidUpperNodeTabs();
 
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.calculateStateAndVisualForCurrentTimeStep();
 					canvas.repaint();
 					updateUpperNodes();
 				} catch (IOException ex) {
@@ -368,21 +372,22 @@ public class GUI {
 			public void actionPerformed(ActionEvent e) {
 				chooseTabTemp();
 
-				model.getSelectedObjects().clear();
+				GuiSettings.getSelectedObjects().clear();
 
 				// Uppernode Canvas?
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 				Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
 
 				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
-					controller.addSelectedObjects(groupNodeCanvas.getGroupNode().getObjectsInThisLayer().collect(Collectors.toSet()));
+					control.addSelectedObjects(
+							groupNodeCanvas.getGroupNode().getObjectsInThisLayer().collect(Collectors.toSet()));
 					groupNodeCanvas.repaint();
 					// or Canvas?
 				} else if (canvasOrUpperNodeCanvas instanceof Canvas) {
-					controller.addSelectedObjects(model.getObjectsOnCanvas());
+					control.addSelectedObjects(model.getObjectsOnCanvas());
 					canvas.repaint();
 				}
-				controller.getObjectsInDepth();
+				control.getObjectsInDepth();
 			}
 		};
 		actionMap.put(cntrlADown, controlA);
@@ -406,9 +411,9 @@ public class GUI {
 				boolean wasProducerDeleted = true;
 
 				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
-					for (AbstractCanvasObject cps : model.getSelectedObjects()) {
+					for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 						if (groupNodeCanvas.getGroupNode().getObjectsInThisLayer().anyMatch(object -> object == cps)) {
-							controller.delObjUpperNode(cps, groupNodeCanvas.getGroupNode());
+							control.delObjUpperNode(cps, groupNodeCanvas.getGroupNode());
 							unc.setToolTip(false);
 
 							// remove UpperNodeTab if UpperNode deleted
@@ -416,34 +421,35 @@ public class GUI {
 						}
 					}
 					groupNodeCanvas.repaint();
-					controller.clearSelection();
+					control.clearSelection();
 
 					// or Canvas?
 				} else if (canvasOrUpperNodeCanvas instanceof Canvas canvasPanel) {
 					// Edge Deleting
-					Edge edgeHighlight = model.getSelectedEdge();
-					if (edgeHighlight != null) {
-						controller.removeEdgesOnCanvas(edgeHighlight);
+					Optional<Edge> edgeHighlight = GuiSettings.getSelectedEdges().stream().findAny();
+					edgeHighlight.ifPresent(edge -> {
+						control.removeEdgesOnCanvas(edge);
+						// TODO(Tom2021-12-20): Convert to Optional
 						canvasPanel.edgeHighlight = null;
-					}
+					});
 					canvas.setToolTip(false);
-					for (AbstractCanvasObject cps : model.getSelectedObjects()) {
-						controller.delCanvasObject(cps, false);
+					for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
+						control.delCanvasObject(cps, false);
 						// remove UpperNodeTab if UpperNode deleted
 						removeUpperNodeTab(cps);
 					}
-					controller.clearSelection();
-					controller.tryAutoSave();
+					control.clearSelection();
+					control.tryAutoSave();
 					canvas.repaint();
 				}
 
 				// recalculate net if a producer was deleted
 				if (wasProducerDeleted) {
-					controller.resetSimulation();
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.resetSimulation();
+					control.calculateStateAndVisualForCurrentTimeStep();
 				}
 
-				model.getSelectedObjects().clear();
+				GuiSettings.getSelectedObjects().clear();
 			}
 		});
 
@@ -455,7 +461,7 @@ public class GUI {
 
 			@Override
 			public void actionPerformed(ActionEvent e) {
-				SearchPopUp dialog = new SearchPopUp(controller, canvas, holegJFrame);
+				SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
 				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 				dialog.setVisible(true);
 			}
@@ -471,12 +477,12 @@ public class GUI {
 				chooseTabTemp();
 				System.out.println("heiCopy - control C");
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				if (!model.getSelectedObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas groupNodeCanvas)
-						controller.copy(groupNodeCanvas.getGroupNode());
+				if (!GuiSettings.getSelectedObjects().isEmpty()) {
+					if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas)
+						control.copy(groupNodeCanvas.getGroupNode());
 					else
-						controller.copy(null);
-					if (!model.getClipboradObjects().isEmpty()) {
+						control.copy(null);
+					if (!GuiSettings.getClipboardObjects().isEmpty()) {
 						canvas.itemPaste.setEnabled(true);
 					}
 				}
@@ -505,13 +511,12 @@ public class GUI {
 
 					if (tabTemp != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
 
-						controller.paste(groupNodeCanvas.getGroupNode(),
-								canvasOrUpperNodeCanvas.getMousePosition());
-						controller.calculateStateAndVisualForCurrentTimeStep();
+						control.paste(groupNodeCanvas.getGroupNode(), canvasOrUpperNodeCanvas.getMousePosition());
+						control.calculateStateAndVisualForCurrentTimeStep();
 						scrollPane.getViewport().getComponent(0).repaint();
 					} else {
-						controller.paste(null, canvas.getMousePosition());
-						controller.calculateStateAndVisualForCurrentTimeStep();
+						control.paste(null, canvas.getMousePosition());
+						control.calculateStateAndVisualForCurrentTimeStep();
 						canvas.repaint();
 					}
 				} catch (HeadlessException | JsonParseException | UnsupportedFlavorException | IOException e1) {
@@ -532,17 +537,17 @@ public class GUI {
 			public void actionPerformed(ActionEvent e) {
 				chooseTabTemp();
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				if (!model.getSelectedObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas groupNodeCanvas) {
-						controller.cut(groupNodeCanvas.getGroupNode());
-						controller.calculateStateAndVisualForCurrentTimeStep();
+				if (!GuiSettings.getSelectedObjects().isEmpty()) {
+					if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
+						control.cut(groupNodeCanvas.getGroupNode());
+						control.calculateStateAndVisualForCurrentTimeStep();
 						scrollPane.getViewport().getComponent(0).repaint();
 					} else {
-						controller.cut(null);
-						controller.calculateStateAndVisualForCurrentTimeStep();
+						control.cut(null);
+						control.calculateStateAndVisualForCurrentTimeStep();
 						canvas.repaint();
 					}
-					if (!model.getClipboradObjects().isEmpty()) {
+					if (!GuiSettings.getClipboardObjects().isEmpty()) {
 						canvas.itemPaste.setEnabled(true);
 					}
 				}
@@ -569,10 +574,10 @@ public class GUI {
 		mnNewMenuEdit.add(mntmRedo);
 		mntmFindReplace.addActionListener(actionEvent -> {
 			try {
-				SearchPopUp dialog = new SearchPopUp(controller, canvas, holegJFrame);
+				SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
 				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 				dialog.setVisible(true);
-				controller.getObjectsInDepth();
+				control.getObjectsInDepth();
 			} catch (Exception ex) {
 				ex.printStackTrace();
 			}
@@ -583,7 +588,7 @@ public class GUI {
 		mntmEditEdges.addActionListener(actionEvent -> {
 			EditEdgesPopUp edgePopUp = new EditEdgesPopUp(holegJFrame);
 			edgePopUp.setCanvas(canvas);
-			edgePopUp.setController(controller);
+			edgePopUp.setController(control);
 			edgePopUp.setVisible(true);
 		});
 
@@ -605,16 +610,7 @@ public class GUI {
 
 		mnNewMenuOptions.add(mntmResetCategory);
 		mntmResetCategory.addActionListener(actionEvent -> {
-			ArrayList<Category> cat = model.getCategories();
-			try {
-				while (!cat.isEmpty()) {
-					controller.deleteCategory(cat.get(0).getName());
-
-				}
-				controller.resetCategorys();
-			} catch (Exception e2) {
-				System.out.println(e2.getMessage());
-			}
+			control.resetCategories();
 			categoryTree.revalidate();
 			categoryTree.repaint();
 		});
@@ -631,10 +627,10 @@ public class GUI {
 						+ "After that as many HolonObjects as possible will get fully supplied.");
 
 		mntmFairMinFirst.addActionListener(arg0 -> {
-			controller.getModel().setFairnessModel(FairnessModel.MininumDemandFirst);
+			control.getModel().setFairnessModel(FairnessModel.MininumDemandFirst);
 			mntmFairMinFirst.setForeground(Color.BLUE);
 			mntmFairAlleEqual.setForeground(mnFairnessModel.getForeground());
-			controller.calculateStateAndVisualForCurrentTimeStep();
+			control.calculateStateAndVisualForCurrentTimeStep();
 			// Update UpperNodes
 			Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
 			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
@@ -646,10 +642,10 @@ public class GUI {
 		mntmFairAlleEqual.setToolTipText("HolonObjects will all get the same amount of energy.");
 
 		mntmFairAlleEqual.addActionListener(arg0 -> {
-			controller.getModel().setFairnessModel(FairnessModel.AllEqual);
+			control.getModel().setFairnessModel(FairnessModel.AllEqual);
 			mntmFairAlleEqual.setForeground(Color.BLUE);
 			mntmFairMinFirst.setForeground(mnFairnessModel.getForeground());
-			controller.calculateStateAndVisualForCurrentTimeStep();
+			control.calculateStateAndVisualForCurrentTimeStep();
 			// Update UpperNodes
 			Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
 			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
@@ -661,13 +657,13 @@ public class GUI {
 
 		mnNewMenuView.add(mntmCanvasSize);
 		mntmCanvasSize.addActionListener(actionEvent -> {
-			CanvasResizePopUp popUp = new CanvasResizePopUp(model, controller, canvas, this.tabbedPaneInnerOriginal,
+			CanvasResizePopUp popUp = new CanvasResizePopUp(model, control, canvas, this.tabbedPaneInnerOriginal,
 					holegJFrame);
 			popUp.setVisible(true);
 		});
 
 		tabbedPaneInnerOriginal.addChangeListener(change -> {
-			controller.clearSelection();
+			control.clearSelection();
 		});
 		mnNewMenuView.add(mntmCanvasSize);
 
@@ -685,7 +681,8 @@ public class GUI {
 			JScrollPane spane = getScrollPaneFromTabbedPane();
 			if (spane != null) {
 				Component canvasOrUpperNodeCanvas = spane.getViewport().getComponent(0);
-				if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+				if (canvasOrUpperNodeCanvas != null
+						&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
 					groupNodeCanvas.repaint();
 				}
 			}
@@ -703,7 +700,7 @@ public class GUI {
 		mnHelp.add(mntmAboutUs);
 
 		canvas.setBackground(Color.WHITE);
-		canvas.setPreferredSize(new Dimension(model.getCanvasX(), model.getCanvasY()));
+		canvas.setPreferredSize(new Dimension(GuiSettings.canvasSize.getX(), GuiSettings.canvasSize.getY()));
 		/********************
 		 * RIGHT CONTAINER (INFORMATION)
 		 **********************/
@@ -712,11 +709,6 @@ public class GUI {
 		toolBarHolonEl.setFloatable(false);
 		panelHolonEl.add(toolBarHolonEl);
 
-	
-
-
-
-	
 		/***********************
 		 * HolonElement Graph Actions
 		 **********************/
@@ -765,9 +757,9 @@ public class GUI {
 				JLabel label = new JLabel();
 				Image imgR;
 				if (leaf) {
-					for (Category cat : model.getCategories()) {
+					for (Category cat : GuiSettings.getCategories()) {
 						for (AbstractCanvasObject cps : cat.getObjects()) {
-							if (value.toString().compareTo(cps.getName()) == 0) {
+							if (value.toString().equals(cps.getName())) {
 								imgR = ImageImport.loadImage(cps.getImage(), 50, 50);
 								if (imgR != null) {
 									label.setIcon(new ImageIcon(imgR));
@@ -782,9 +774,9 @@ public class GUI {
 					label.setForeground(ColorPreference.Category.Focus);
 					label.setOpaque(true);
 				}
-				if (label.getText().length() == 0) {
+				if (label.getText().isEmpty()) {
 					label.setText(value.toString());
-					if (value.toString().compareTo("Categories") != 0) {
+					if (!value.toString().equals("Categories")) {
 						label.setIcon(new ImageIcon(ImageImport.loadImage("/Images/folder.png")));
 					}
 				}
@@ -894,19 +886,21 @@ public class GUI {
 							/**
 							 * close UpperNodeTabs of replaced UpperNode
 							 */
-							if (groupNodeCanvas.mayBeReplaced != null && groupNodeCanvas.mayBeReplaced instanceof GroupNode) {
+							if (groupNodeCanvas.mayBeReplaced != null
+									&& groupNodeCanvas.mayBeReplaced instanceof GroupNode) {
 								groupNodeCanvas.closeUpperNodeTab(groupNodeCanvas.mayBeReplaced.getId());
 							}
-							controller.addObjUpperNode(h, groupNodeCanvas.getGroupNode());
+							control.addObjUpperNode(h, groupNodeCanvas.getGroupNode());
 
 							/**
 							 * object would be replaced
 							 */
 							groupNodeCanvas.mayBeReplaced = null;
 							groupNodeCanvas.invalidate();
-							controller.calculateStateAndVisualForCurrentTimeStep();
+							control.calculateStateAndVisualForCurrentTimeStep();
 							groupNodeCanvas.repaint();
-							groupNodeCanvas.setXY((int) canvas.getMousePosition().getX(), (int) canvas.getMousePosition().getY());
+							groupNodeCanvas.setXY((int) canvas.getMousePosition().getX(),
+									(int) canvas.getMousePosition().getY());
 						} else {
 							int x = (int) canvas.getMousePosition().getX() + 16;
 							int y = (int) canvas.getMousePosition().getY() + 16;
@@ -927,7 +921,7 @@ public class GUI {
 							if (canvas.mayBeReplaced != null && canvas.mayBeReplaced instanceof GroupNode) {
 								canvas.closeUpperNodeTab(canvas.mayBeReplaced.getId());
 							}
-							controller.addObjectCanvas(h);
+							control.addObjectCanvas(h);
 							/**
 							 * no object should get replaced
 							 */
@@ -937,7 +931,7 @@ public class GUI {
 									(int) canvas.getMousePosition().getY());
 							canvas.repaint();
 						}
-						controller.calculateStateAndVisualForCurrentTimeStep();
+						control.calculateStateAndVisualForCurrentTimeStep();
 						contentPane.updateUI();
 						dragging = false;
 					}
@@ -963,9 +957,9 @@ public class GUI {
 					DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) categoryTree
 							.getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
 					if (SwingUtilities.isRightMouseButton(e)) {
-						for (Category cat : model.getCategories()) {
+						for (Category cat : GuiSettings.getCategories()) {
 							for (AbstractCanvasObject cps : cat.getObjects()) {
-								if (actualObjectClicked.compareTo(cps.getName()) == 0
+								if (actualObjectClicked.equals(cps.getName())
 										&& !(cps instanceof HolonSwitch)) {
 									editItem.setEnabled(true);
 									popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
@@ -975,9 +969,9 @@ public class GUI {
 							}
 						}
 					} else {
-						for (Category cat : model.getCategories()) {
+						for (Category cat : GuiSettings.getCategories()) {
 							for (AbstractCanvasObject cps : cat.getObjects()) {
-								if (actualObjectClicked.compareTo(cps.getName()) == 0) {
+								if (actualObjectClicked.equals(cps.getName())) {
 									File checkPath = new File(cps.getImage());
 									if (checkPath.exists()) {
 										img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(32, 32,
@@ -1005,18 +999,15 @@ public class GUI {
 			System.out.println("Edit");
 			addObjectPopUP = new AddObjectPopUp(true, tempCps, catOfObjToBeEdited, holegJFrame);
 			addObjectPopUP.setCategory(catOfObjToBeEdited);
-			addObjectPopUP.setController(controller);
+			addObjectPopUP.setController(control);
 			addObjectPopUP.setVisible(true);
 		});
 		removeItem.addActionListener(actionEvent -> {
 			// Remove the selected Object object
-			try {
-				System.out.println("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + tempCps);
-				controller.delObjectCategory(catOfObjToBeEdited, tempCps.getName());
-			} catch (IOException e) {
-				System.err.println("IOException");
-				e.printStackTrace();
-			}
+			log.info("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + tempCps);
+			control.findCategoryWithName(catOfObjToBeEdited).ifPresent(cat -> {
+				cat.removeObjectsWithName(tempCps.getName());
+			});
 		});
 		scrollPane1.setViewportView(categoryTree);
 
@@ -1028,20 +1019,20 @@ public class GUI {
 		panel.add(toolBar);
 		btnAddPopUp.add(mItemNew);
 		mItemNew.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller, holegJFrame);
+			new CreateNewDialog(control, holegJFrame);
 		});
 		btnAddPopUp.addSeparator();
 		btnAddPopUp.add(mItemCategory);
 		mItemCategory.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller, Option.Category, holegJFrame);
+			new CreateNewDialog(control, Option.Category, holegJFrame);
 		});
 		btnAddPopUp.add(mItemObject);
 		mItemObject.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller, Option.Object, holegJFrame);
+			new CreateNewDialog(control, Option.Object, holegJFrame);
 		});
 		btnAddPopUp.add(mItemSwitch);
 		mItemSwitch.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller, Option.Switch, holegJFrame);
+			new CreateNewDialog(control, Option.Switch, holegJFrame);
 		});
 		btnAdd.addActionListener(actionEvent -> btnAddPopUp.show(btnAdd, -1, +20));
 		btnAdd.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
@@ -1112,12 +1103,17 @@ public class GUI {
 						int dialogResult = JOptionPane.showConfirmDialog(holegJFrame, eraseCategory + nodeName + "?",
 								warningText, JOptionPane.YES_NO_OPTION);
 						if (dialogResult == JOptionPane.YES_OPTION) {
-							controller.deleteCategory(nodeName);
+							GuiSettings.getCategories().stream().filter(cat -> cat.getName() == nodeName).findAny()
+									.ifPresent(cat -> {
+										control.deleteCategory(cat);
+									});
 						}
 						break;
 					case 2:
 						DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
-						controller.delObjectCategory(parent.getUserObject().toString(), nodeName);
+						control.findCategoryWithName(parent.getUserObject().toString()).ifPresent(cat -> {
+							cat.removeObjectsWithName(nodeName);
+						});
 						break;
 
 					default:
@@ -1150,18 +1146,18 @@ public class GUI {
 			while (tabbedPaneInnerOriginal.getTabCount() > 1) {
 				tabbedPaneInnerOriginal.remove(1);
 			}
-			controller.clearSelection();
+			control.clearSelection();
 			model.getEdgesOnCanvas().clear();
 			model.getObjectsOnCanvas().clear();
-			controller.OnSelectionChanged.broadcast();
-			controller.setSelecteEdge(null);
-			controller.getModel().setCurrentIteration(0);
+			control.OnSelectionChanged.broadcast();
+			GuiSettings.getSelectedEdges().clear();
+			control.getModel().setCurrentIteration(0);
 			elementGraph.setText("None");
 			canvas.tempCps = null;
 			canvas.repaint();
 			IdCounter.resetObjectCounter(CounterType.Object);
 			IdCounter.resetObjectCounter(CounterType.Element);
-			controller.calculateStateAndVisualForCurrentTimeStep();
+			control.calculateStateAndVisualForCurrentTimeStep();
 		});
 
 		mntmOpen.addActionListener(new ActionListener() {
@@ -1183,11 +1179,11 @@ public class GUI {
 						while (tabbedPaneInnerOriginal.getTabCount() > 1) {
 							tabbedPaneInnerOriginal.remove(1);
 						}
-						model.getSelectedObjects().clear();
-						controller.loadFile(file.getAbsolutePath());
+						GuiSettings.getSelectedObjects().clear();
+						control.loadFile(file.getAbsolutePath());
 						canvas.repaint();
 						categoryTree.repaint();
-						controller.calculateStateAndVisualForCurrentTimeStep();
+						control.calculateStateAndVisualForCurrentTimeStep();
 					} catch (IOException | ArchiveException e) {
 						e.printStackTrace();
 						JLabel message = new JLabel("The savefile is corrupt and cannot be opened.");
@@ -1231,7 +1227,7 @@ public class GUI {
 					}
 
 					try {
-						controller.saveFile(new File(fullPath).getAbsolutePath());
+						control.saveFile(new File(fullPath).getAbsolutePath());
 					} catch (IOException | ArchiveException e) {
 						e.printStackTrace();
 					}
@@ -1247,11 +1243,11 @@ public class GUI {
 
 			private void menuUndoActionPerformed() {
 				try {
-					controller.loadAutoSave(controller.getUndoSave());
+					control.loadAutoSave(control.getUndoSave());
 
 					closeInvalidUpperNodeTabs();
 
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.calculateStateAndVisualForCurrentTimeStep();
 					canvas.repaint();
 				} catch (IOException e) {
 					e.printStackTrace();
@@ -1267,11 +1263,11 @@ public class GUI {
 
 			private void menuRedoActionPerformed() {
 				try {
-					controller.loadAutoSave(controller.getRedoSave());
+					control.loadAutoSave(control.getRedoSave());
 
 					closeInvalidUpperNodeTabs();
 
-					controller.calculateStateAndVisualForCurrentTimeStep();
+					control.calculateStateAndVisualForCurrentTimeStep();
 					canvas.repaint();
 				} catch (IOException e) {
 					e.printStackTrace();
@@ -1279,11 +1275,11 @@ public class GUI {
 			}
 		});
 
-		timePanel = new TimePanel(controller);
+		timePanel = new TimePanel(control);
 		timePanel.setBorder(null);
 		timePanel.getTimeSlider().addChangeListener(changeEvent -> {
 			// TimeSliderChanged event
-			controller.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
+			control.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
 			unitGraph.repaint();
 			contentPane.updateUI();
 		});
@@ -1314,9 +1310,7 @@ public class GUI {
 		scrollProperties.setViewportView(this.informationPanel);
 		scrollProperties.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
 		scrollProperties.getVerticalScrollBar().setUnitIncrement(16);
-		
-		
-		
+
 		tabbedPaneOriginal.setBorder(null);
 		scrollProperties.setBorder(null);
 		splitPane.setBorder(null);
@@ -1328,13 +1322,13 @@ public class GUI {
 		holegJFrame.getContentPane().add(timePanel, BorderLayout.SOUTH);
 
 		try {
-			controller.loadAutoSave(System.getProperty("user.home") + "/.config/HolonGUI/Category/Category.json");
+			control.loadAutoSave(System.getProperty("user.home") + "/.config/HolonGUI/Category/Category.json");
 		} catch (IOException e1) {
 		}
 
 		String autoPath = System.getProperty("user.home") + "/.config/HolonGUI/Autosave/";
 		File dest = new File(autoPath);
-		ArrayList<File> oldAutoSaves = controller.filterOldAutoSaveFiles();
+		ArrayList<File> oldAutoSaves = control.filterOldAutoSaveFiles();
 		int nrOfOldSaves = oldAutoSaves.size();
 
 		if (nrOfOldSaves > 0) {
@@ -1343,7 +1337,7 @@ public class GUI {
 					"Old autosave file was found, should it be loaded?", warningText, dialogButton);
 			if (dialogResult == JOptionPane.YES_OPTION) {
 				if (dest.exists()) {
-					model.setAutoSaveNr(nrOfOldSaves - 1);
+					GuiSettings.autoSaveNr = (nrOfOldSaves - 1);
 					mntmRedo.doClick();
 				} else {
 					JOptionPane.showMessageDialog(holegJFrame, "Autosave could not be loaded.");
@@ -1355,14 +1349,15 @@ public class GUI {
 
 			// after all: delete the obsolete/old autosave files from the
 			// directory
-			controller.deleteObsoleteAutoSaveFiles();
+			control.deleteObsoleteAutoSaveFiles();
 		}
 
 		canvasSP.addComponentListener(new ComponentAdapter() {
 			@Override
 			public void componentResized(ComponentEvent e) {
-				GuiSettings.canvasSize.setX(Math.max(model.getCanvasX(), canvasSP.getViewport().getWidth()));
-				GuiSettings.canvasSize.setY(Math.max(model.getCanvasY(), canvasSP.getViewport().getHeight()));
+				GuiSettings.canvasSize.setX(Math.max(GuiSettings.canvasSize.getX(), canvasSP.getViewport().getWidth()));
+				GuiSettings.canvasSize
+						.setY(Math.max(GuiSettings.canvasSize.getY(), canvasSP.getViewport().getHeight()));
 				canvas.repaint();
 			}
 		});
@@ -1374,7 +1369,7 @@ public class GUI {
 		JMenuItem openMenu = new JMenuItem("Open Algorithm Panel", new ImageIcon(ImageImport
 				.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openMenu.addActionListener(actionEvent -> {
-			new AddOnWindow(holegJFrame, controller);
+			new AddOnWindow(holegJFrame, control);
 		});
 		openMenu.setAccelerator(KeyStroke.getKeyStroke('N', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
 		menuWindow.add(openMenu);
@@ -1382,7 +1377,7 @@ public class GUI {
 		JMenuItem openOutliner = new JMenuItem("Open Outliner", new ImageIcon(ImageImport
 				.loadImage("/Button_Images/iconOutliner.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openOutliner.addActionListener(actionEvent -> {
-			outlinerList.add(new Outliner(holegJFrame, model, controller));
+			outlinerList.add(new Outliner(holegJFrame, model, control));
 		});
 		openOutliner
 				.setAccelerator(KeyStroke.getKeyStroke('O', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
@@ -1391,7 +1386,7 @@ public class GUI {
 		JMenuItem openFlexMenuItem = new JMenuItem("Open Flexibility Panel", new ImageIcon(ImageImport
 				.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openFlexMenuItem.addActionListener(actionEvent -> {
-			flexList.add(new FlexWindow(holegJFrame, controller));
+			flexList.add(new FlexWindow(holegJFrame, control));
 		});
 		openFlexMenuItem
 				.setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
@@ -1423,6 +1418,7 @@ public class GUI {
 			out.update();
 		}
 	}
+
 	private boolean isUpperPanelInsideBounds() {
 		int x = holegJFrame.getX();
 		int y = holegJFrame.getY();
@@ -1453,7 +1449,7 @@ public class GUI {
 	private void setUpAutoSave(File dest) {
 		dest.mkdirs();
 		try {
-			controller.autoSave();
+			control.autoSave();
 		} catch (IOException e1) {
 			e1.printStackTrace();
 		}
@@ -1464,7 +1460,7 @@ public class GUI {
 	 *
 	 * @param categories the current categories
 	 */
-	private void updateCategories(final ArrayList<Category> categories) {
+	private void updateCategories(Collection<Category> categories) {
 		DefaultTreeModel treemodel = new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
 
 			private static final long serialVersionUID = 1L;
@@ -1490,7 +1486,7 @@ public class GUI {
 	 *
 	 * @param categories the Categories
 	 */
-	public void updateCategoryUI(ArrayList<Category> categories) {
+	public void updateCategoryUI(Collection<Category> categories) {
 		DefaultTreeModel model = (DefaultTreeModel) categoryTree.getModel();
 		updateCategories(categories);
 		model.reload();
@@ -1507,13 +1503,11 @@ public class GUI {
 		chooseTabTemp();
 
 		JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-		if (scrollPane.getViewport().getComponent(0) instanceof Canvas canvasPanel) {
-			unc = new GroupNodeCanvas(model, controller, unitGraph, node, "",
-					canvasPanel);
+		if (scrollPane.getViewport().getComponent(0)instanceof Canvas canvasPanel) {
+			unc = new GroupNodeCanvas(model, control, unitGraph, node, "", canvasPanel);
 
-		} else if(scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas groupNodeCanvas) {
-			unc = new GroupNodeCanvas(model, controller, unitGraph, node,
-					groupNodeCanvas.getParentPath() + " -> ",
+		} else if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
+			unc = new GroupNodeCanvas(model, control, unitGraph, node, groupNodeCanvas.getParentPath() + " -> ",
 					scrollPane.getViewport().getComponent(0));
 		}
 
@@ -1559,8 +1553,12 @@ public class GUI {
 			}
 			Component pane = ((JScrollPane) c).getViewport().getComponent(0);
 			if (pane instanceof GroupNodeCanvas groupNodeCanvas) {
-				temp = model.getHashcodeMap().get(groupNodeCanvas.hashCode());
-				groupNodeCanvas.setGroupNode((GroupNode) temp);
+				//TODO(Tom2021-12-20) maybe 
+				if(temp instanceof GroupNode node) {
+					groupNodeCanvas.setGroupNode(node);					
+				}else {
+					log.warning("TODO tabbedPane confickt");
+				}
 			}
 		}
 	}
@@ -1621,9 +1619,6 @@ public class GUI {
 		}
 	}
 
-	
-
-
 	private void openWebpage(String URL) {
 		try {
 			java.awt.Desktop.getDesktop().browse(new URI(URL));

+ 5 - 5
src/holeg/ui/view/main/TimePanel.java

@@ -134,14 +134,14 @@ public class TimePanel extends JPanel implements ActionListener {
 		timeSlider.addMouseListener(new MouseAdapter() {
 			@Override
 			public void mousePressed(MouseEvent e) {
-				dragResetIteration = cont.getModel().getActualTimeStep();
+				dragResetIteration = cont.getModel().getCurrentIteration();
 			}
 		});
 
 		timeSlider.addMouseMotionListener(new MouseAdapter() {
 			@Override
 			public void mouseDragged(MouseEvent e) {
-				if (dragResetIteration != cont.getModel().getActualTimeStep()) {
+				if (dragResetIteration != cont.getModel().getCurrentIteration()) {
 					if (running) {
 						play();
 					}
@@ -324,7 +324,7 @@ public class TimePanel extends JPanel implements ActionListener {
 	public void timerAction() {
 		timeSlider.setValue(timeSlider.getValue() + 1);
 		control.getModel().setCurrentIteration(timeSlider.getValue());
-		timer.setDelay(control.getModel().getTimerSpeed());
+		timer.setDelay(GuiSettings.timerSpeed);
 		if (timeSlider.getValue() >= control.getModel().getMaxIterations() - 1) {
 			running = false;
 			playBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/play.png", 30, 30)));
@@ -333,11 +333,11 @@ public class TimePanel extends JPanel implements ActionListener {
 	}
 	
 	public void play() {
-		if (control.getModel().getActualTimeStep() == control.getModel().getMaxIterations() - 1)
+		if (control.getModel().getCurrentIteration() == control.getModel().getMaxIterations() - 1)
 			timeSlider.setValue(timeSlider.getMinimum());
 		running = !running;
 		if (running) {
-			timer.setDelay(control.getModel().getTimerSpeed());
+			timer.setDelay(GuiSettings.timerSpeed);
 			timer.start();
 			playBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/pause.png", 30, 30)));
 		} else {

+ 6 - 7
src/holeg/ui/view/window/FlexWindow.java

@@ -3,20 +3,19 @@ package holeg.ui.view.window;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dialog.ModalityType;
+import java.awt.Dimension;
 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;
@@ -52,11 +51,11 @@ import javax.swing.tree.TreePath;
 import holeg.model.AbstractCanvasObject;
 import holeg.model.Constrain;
 import holeg.model.Flexibility;
+import holeg.model.Flexibility.FlexState;
 import holeg.model.GroupNode;
 import holeg.model.HolonElement;
-import holeg.model.HolonObject;
-import holeg.model.Flexibility.FlexState;
 import holeg.model.HolonElement.Priority;
+import holeg.model.HolonObject;
 import holeg.preferences.ColorPreference;
 import holeg.ui.controller.Control;
 import holeg.ui.model.Model;
@@ -456,7 +455,7 @@ public class FlexWindow extends JFrame {
 		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);
-			control.getSimManager().calculateStateForTimeStep(model.getActualTimeStep(), true);
+			control.getSimManager().calculateStateForTimeStep(model.getCurrentIteration(), true);
 			updateSelectedPanel();
 		}
 	}
@@ -671,7 +670,7 @@ public class FlexWindow extends JFrame {
 			
 			
 			//if(!model.getSelectedCpsObjects().contains(holonObjectSelector.getSelectedItem()))model.getSelectedCpsObjects().add((AbstractCpsObject)holonObjectSelector.getSelectedItem());
-			control.getSimManager().calculateStateForTimeStep(model.getActualTimeStep(), true);
+			control.getSimManager().calculateStateForTimeStep(model.getCurrentIteration(), true);
 			
 			update();
 			addDialog.dispose();