Browse Source

wip

- Remove buggy Search Window
- Remove GroupNodeCanvas
TomTroppmann 2 years ago
parent
commit
dba2a1a18d

+ 3 - 4
src/holeg/addon/RandomSwitch.java

@@ -12,7 +12,6 @@ import javax.swing.JPanel;
 import javax.swing.JSlider;
 
 import holeg.api.AddOn;
-import holeg.model.HolonSwitch;
 import holeg.ui.controller.Control;
 
 public class RandomSwitch implements AddOn {
@@ -61,15 +60,15 @@ public class RandomSwitch implements AddOn {
 		return flipChance;
 	}
 	private void run() {
-		for (HolonSwitch s : control.getModel().getAllSwitches()) {
+		control.getModel().getCanvas().getAllSwitchObjectsRecursive().forEach(s -> {
 			// Set to Manual Mode
 			s.setManualMode(true);
 			// Generate a random number between 0 and 1
 			double randomDouble = Math.random();
 			if (randomDouble < randomChance) {
 				s.setManualState(!s.getManualState());
-			} 
-		}
+			}
+		});
 		control.calculateStateAndVisualForCurrentTimeStep();
 		control.updateCanvas();
 	}

+ 1 - 1
src/holeg/addon/Randomizer.java

@@ -247,7 +247,7 @@ public class Randomizer implements AddOn {
 	public void updateFilterList() {
 		objectMap.clear();
 		if(control != null) {
-			control.getModel().getAllHolonObjectsOnCanvas().forEach(object -> objectMap.put(object, true));
+			control.getModel().getCanvas().getAllHolonObjectsRecursive().forEach(object -> objectMap.put(object, true));
 		}
 		this.fillTablePanel();
 	}

+ 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.getCurrentIteration());
+		rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getCanvas().getObjectsInThisLayer(), initialState, model.getCurrentIteration());
 		return initialState;
 	}
 	/**

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

@@ -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.getCurrentIteration());
+			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getCanvas().getObjectsInThisLayer(), initialState, model.getCurrentIteration());
 			return initialState;
 		}
 		/**
@@ -417,7 +417,7 @@ public class DemoAlgo implements AddOn {
 
 		private void selectHolonObject() {
 			List<HolonObject> holonObjectList = new ArrayList<HolonObject>();
-			addObjectToList(control.getModel().getObjectsOnCanvas(),holonObjectList);
+			addObjectToList(control.getModel().getCanvas().getObjectsInThisLayer().toList(),holonObjectList);
 			Object[] possibilities = holonObjectList.stream().map(aCps -> new Handle<HolonObject>(aCps)).toArray();
 			@SuppressWarnings("unchecked")
 			Handle<HolonObject> selected = (Handle<HolonObject>) JOptionPane.showInputDialog(content, "Select HolonObject:", "HolonObject?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");

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

@@ -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.getCurrentIteration());			
+			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getObjectsInThisLayer() :model.getCanvas().getObjectsInThisLayer(), initialState, model.getCurrentIteration());			
 			resetChain.add(initialState); 
 			return initialState;
 		}

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

@@ -805,8 +805,8 @@ public abstract class AlgorithmFrameworkFlex implements AddOn{
 	private void rollOutNodes(List<Boolean> positionToInit) {
 		boolean groupNodeSelected = dGroupNode != null;
 		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();
+		Stream<HolonObject> holonObjects = groupNodeSelected ? dGroupNode.getModel().getAllHolonObjectsRecursive() : control.getModel().getCanvas().getAllHolonObjectsRecursive();
+		Stream<HolonSwitch> holonSwitches = groupNodeSelected ? dGroupNode.getModel().getAllSwitchObjectsRecursive(): control.getModel().getCanvas().getAllSwitchObjectsRecursive();
 		holonObjects.forEach(hObject -> {
 			AccessWrapper killSwitchAccess = new AccessWrapper(hObject);
 			if(this.algoUseKillSwitch) {

+ 4 - 4
src/holeg/api/TopologieAlgorithmFramework.java

@@ -222,7 +222,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 	//ParameterImports
 	
 	private void toggleSwitches() {
-		List<HolonSwitch> allSwitchList = control.getModel().getAllSwitches();
+		List<HolonSwitch> allSwitchList = control.getModel().getCanvas().getAllSwitchObjectsRecursive().toList();
 		if(allSwitchList.isEmpty()) return;
 		boolean set = allSwitchList.get(0).getState(control.getModel().getCurrentIteration());
 		allSwitchList.forEach(hSwitch -> {
@@ -727,7 +727,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 		});
 		
 		List<Integer> initialState = new ArrayList<Integer>();
-		generateAccess(model.getObjectsOnCanvas().stream(), null);			
+		generateAccess(model.getCanvas().getObjectsInThisLayer(), null);			
 		addCables(model.getEdgesOnCanvas());
 		model.getEdgesOnCanvas().clear();
 		//New Cables
@@ -882,7 +882,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 				groupnode.add(newSwitch);
 				accessSwitchGroupNode.put(newSwitch, groupnode);
 			}else {
-				control.getModel().getObjectsOnCanvas().add(newSwitch);		
+				control.getModel().getCanvas().add(newSwitch);		
 			}
 			//else if toObject is in Group
 			this.switchList.add(newSwitch);
@@ -913,7 +913,7 @@ public abstract class TopologieAlgorithmFramework implements AddOn{
 				accessSwitchGroupNode.get(hSwitch).remove(hSwitch);
 			}
 			else {
-				control.getModel().getObjectsOnCanvas().remove(hSwitch);
+				control.getModel().getCanvas().remove(hSwitch);
 			}
 		}
 		accessSwitchGroupNode.clear();

+ 0 - 218
src/holeg/connect/ConnectHandheld.java

@@ -1,218 +0,0 @@
-package holeg.connect;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.net.BindException;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JFormattedTextField;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
-import javax.swing.text.NumberFormatter;
-
-import holeg.api.AddOn;
-import holeg.connect.socket.Server;
-import holeg.model.AbstractCanvasObject;
-import holeg.model.GroupNode;
-import holeg.model.HolonObject;
-import holeg.ui.controller.Control;
-import holeg.ui.view.component.Console;
-
-public class ConnectHandheld implements AddOn{
-	
-	//Holeg
-	Control control;
-	private HolonObject observed;
-	
-	//Gui
-	private JPanel content = new JPanel();
-	private JTextArea textArea;
-	
-
-	//TCP
-	int port = 4242;
-	Server server;
-	
-	private Console console;
-	private boolean holonObjectConnected;
-	private JLabel houseLabel;
-	
-
-
-
-
-	public static void main(String[] args)
-	{
-	      JFrame newFrame = new JFrame("exampleWindow");
-	      ConnectHandheld instance = new ConnectHandheld();
-	      newFrame.setContentPane(instance.getPanel());
-	      newFrame.pack();
-	      newFrame.setVisible(true);
-	      newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	}
-
-	
-	
-	
-	
-	public ConnectHandheld() {
-		content.setLayout(new BorderLayout());
-		
-		textArea = new JTextArea();
-		textArea.setEditable(false);
-		console = new Console();
-		JScrollPane scrollPane = new JScrollPane(console);
-		JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
-				createSettingsPanel() , scrollPane);
-		splitPane.setResizeWeight(0.0);
-		content.add(splitPane, BorderLayout.CENTER);
-		content.setPreferredSize(new Dimension(400,600));	
-	}
-
-
-	
-	private JPanel createSettingsPanel() {
-		JPanel settingsPanel = new JPanel(null);
-		settingsPanel.setPreferredSize(new Dimension(400, 400));
-		settingsPanel.setMinimumSize(new Dimension(400, 225));
-		
-		NumberFormat format = NumberFormat.getIntegerInstance();
-		format.setGroupingUsed(false);
-		format.setParseIntegerOnly(true);
-		NumberFormatter integerFormatter = new NumberFormatter(format);
-		integerFormatter.setMinimum(0);
-		integerFormatter.setMaximum(65535);
-		integerFormatter.setCommitsOnValidEdit(true);
-		
-		
-		
-		JLabel portLabel = new JLabel("Port:");
-		portLabel.setBounds(10, 20, 35, 30);
-		settingsPanel.add(portLabel);
-		JFormattedTextField portTF = new JFormattedTextField(integerFormatter);
-		portTF.setText(""+port);
-		portTF.setBounds(55 ,20, 80, 30);
-		portTF.addPropertyChangeListener(propertyChange ->{
-			String text = portTF.getValue().toString();
-			text = text.replaceAll("\\s", "");
-			port = Integer.parseInt((text));
-		});
-		settingsPanel.add(portTF);
-		
-		
-		houseLabel = new JLabel("House Status: " + (holonObjectConnected?"Connected":"Not selected"));
-		houseLabel.setBounds(10, 90, 220, 30);
-		settingsPanel.add(houseLabel);
-		
-		JButton selectRoom1Button = new JButton("Select");
-		selectRoom1Button.setBounds(230,95, 90, 20);
-		selectRoom1Button.addActionListener(actionEvent -> this.selectHolonObject());
-		settingsPanel.add(selectRoom1Button);
-		
-		
-		JButton connectButton = new JButton("Start Server");
-		connectButton.setBounds(100 ,175, 200, 50);
-		connectButton.addActionListener(actionEvent -> connect());
-		settingsPanel.add(connectButton);
-
-		return settingsPanel;
-	}
-
-
-
-
-
-
-
-
-
-
-
-	private void connect() {
-		if(!holonObjectConnected) {
-			console.println("Select a HolonObject");
-			return;
-		}
-		try {
-			if(server != null) {
-				server.stopServer();
-			}
-			console.println("Start Server on Port:" + port);
-			server = new Server(port, console, observed, control);
-		}catch(BindException e){
-			console.println(e.getMessage());
-		}
-		catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-
-	@Override
-	public JPanel getPanel() {
-		return content;
-	}
-
-	@Override
-	public void setController(Control control) {
-		this.control = control;
-	}
-
-	
-		private void selectHolonObject() {
-			List<HolonObject> holonObjectList = new ArrayList<HolonObject>();
-			addObjectToList(control.getModel().getObjectsOnCanvas(),holonObjectList);
-			Object[] possibilities = holonObjectList.stream().map(aCps -> new Handle<HolonObject>(aCps)).toArray();
-			@SuppressWarnings("unchecked")
-			Handle<HolonObject> selected = (Handle<HolonObject>) JOptionPane.showInputDialog(content, "Select HolonObject:", "HolonObject?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
-			if(selected != null) {
-				console.println("Selected: " + selected);
-				observed = selected.object;
-				holonObjectConnected = true;
-				if(server != null) {
-					server.setObserved(selected.object);
-				}
-				updateSelectionLabel();
-			}
-		}
-		
-		private void updateSelectionLabel() {
-			houseLabel.setText("House Status: " + (holonObjectConnected?"Connected":"Not selected"));
-		}
-
-
-
-
-
-		private void addObjectToList(List<AbstractCanvasObject> listToSearch, List<HolonObject> listToAdd){
-			for (AbstractCanvasObject aCps : listToSearch) {
-				if (aCps instanceof HolonObject hO) listToAdd.add(hO);
-				else if(aCps instanceof GroupNode groupNode) {
-					listToAdd.addAll(groupNode.getAllHolonObjectsRecursive().toList());
-				}
-			}
-		}
-		
-		
-		private   class  Handle<T>{
-			public T object;
-			Handle(T object){
-				this.object = object;
-			}
-			public String toString() {
-				return object.toString();
-			}
-		}
-	
-}

+ 0 - 517
src/holeg/connect/ConnectPhysical.java

@@ -1,517 +0,0 @@
-package holeg.connect;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JFormattedTextField;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.text.NumberFormatter;
-
-import holeg.api.AddOn;
-import holeg.model.AbstractCanvasObject;
-import holeg.model.GroupNode;
-import holeg.model.HolonElement;
-import holeg.model.HolonObject;
-import holeg.ui.controller.Control;
-import holeg.ui.view.component.Console;
-/**
- * Easy Connection via Http Request. Repeat Request with a delay.
- * 
- * @author tom
- *
- */
-public class ConnectPhysical implements AddOn{
-	//Holeg
-	private Control  control;
-	
-	
-	
-	
-	//Gui
-	private JPanel content = new JPanel();
-	private Console console;
-
-	private JLabel rotorLabel;
-	private JLabel houseLabel;
-	private boolean onlyOnChange = false;
-	//
-	Future<?> future;
-	private boolean lessInformation = false;
-	private int delay = 1000;
-	JLabel warningLabel;
-	
-	public enum HolonObjectStatus{
-		Connected , NotSelected, ObjectDeleted 
-	}
-	
-	public class PhysicalLinkWrapper{
-		public HolonObject hObject;
-		public HolonObjectStatus status;
-		public String postAddress;
-		
-		PhysicalLinkWrapper(HolonObject hObject, HolonObjectStatus status, String postAddress){
-			this.hObject = hObject;
-			this.status = status;
-			this.postAddress = postAddress;
-		}
-	}
-	
-	
-	//Object to look at
-	PhysicalLinkWrapper rotor = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "/rotor/");
-	
-	//Because House is special
-	PhysicalLinkWrapper house = new PhysicalLinkWrapper(null, HolonObjectStatus.NotSelected, "notUsed");
-	String room1Address = "/room1/";
-	String room2Address = "/room2/";
-	//the keywords are for the sepreation in 2 rooms
-	String room1Keyword = "room1";
-	String room2Keyword = "room2";
-
-
-	//OnChange
-	int oldValueRotor = -1;
-	int oldValueRoom1 = -1;
-	int oldValueRoom2 = -1;
-
-
-
-
-	
-
-
-
-
-
-
-
-	public static void main(String[] args)
-	{
-	      JFrame newFrame = new JFrame("exampleWindow");
-	      ConnectPhysical instance = new ConnectPhysical();
-	      newFrame.setContentPane(instance.getPanel());
-	      newFrame.pack();
-	      newFrame.setVisible(true);
-	      newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	}
-
-	
-	
-	
-	
-	public ConnectPhysical() {
-		content.setLayout(new BorderLayout());
-		console = new Console();
-		JScrollPane scrollPane = new JScrollPane(console);
-		JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
-				createOptionPanel() , scrollPane);
-		splitPane.setResizeWeight(0.0);
-		content.add(splitPane, BorderLayout.CENTER);
-		content.setPreferredSize(new Dimension(800,800));	
-	}
-
-	private Component createOptionPanel() {
-		JPanel optionPanel = new JPanel(new BorderLayout());
-		JScrollPane scrollPane = new JScrollPane(createParameterPanel());
-		scrollPane.setBorder(BorderFactory.createTitledBorder("Settings"));
-		optionPanel.add(scrollPane,  BorderLayout.CENTER);
-		optionPanel.add(createButtonPanel(), BorderLayout.PAGE_END);
-		return optionPanel;
-	}
-
-	private Component createParameterPanel() {
-		JPanel parameterPanel = new JPanel(null);
-		parameterPanel.setPreferredSize(new Dimension(510,300));
-		
-		
-		JLabel lessInformationLabel = new JLabel("Less information in Console:");
-		lessInformationLabel.setBounds(200, 180, 200, 20);
-		parameterPanel.add(lessInformationLabel);	
-		
-		JCheckBox lessInformationCheckBox = new JCheckBox();
-		lessInformationCheckBox.setSelected(false);
-		lessInformationCheckBox.setBounds(400, 180, 25, 20);
-		lessInformationCheckBox.addActionListener(actionEvent -> {
-			lessInformation = lessInformationCheckBox.isSelected();
-		});
-		parameterPanel.add(lessInformationCheckBox);
-		
-		JLabel onlyOnChangeLabel = new JLabel("OnlyOnChange:");
-		onlyOnChangeLabel.setBounds(200, 240, 200, 20);
-		parameterPanel.add(onlyOnChangeLabel);	
-		
-		
-		JCheckBox onlyOnChangeCheckBox = new JCheckBox();
-		onlyOnChangeCheckBox.setSelected(false);
-		onlyOnChangeCheckBox.setBounds(400, 240, 25, 20);
-		onlyOnChangeCheckBox.addActionListener(actionEvent -> {
-			onlyOnChange = onlyOnChangeCheckBox.isSelected();
-		});
-		parameterPanel.add(onlyOnChangeCheckBox);
-		
-		
-		
-		
-		JLabel delayLabel = new JLabel("Delay:");
-		delayLabel.setBounds(200, 210, 50, 20);
-		parameterPanel.add(delayLabel);	
-		
-		JLabel delayUnitLabel = new JLabel("[ms]");
-		delayUnitLabel.setBounds(300, 210, 50, 20);
-		parameterPanel.add(delayUnitLabel);	
-		
-		warningLabel = new JLabel(stringToHtml(stringWithColor("You need to Stop and Run again to affect delay change.", "red")));
-		warningLabel.setBounds(200, 280, 400, 20);
-		warningLabel.setVisible(false);
-		parameterPanel.add(warningLabel);	
-		
-		//Integer formatter
-		NumberFormat format = NumberFormat.getIntegerInstance();
-		format.setGroupingUsed(false);
-		format.setParseIntegerOnly(true);
-		NumberFormatter integerFormatter = new NumberFormatter(format);
-		integerFormatter.setMinimum(0);
-		integerFormatter.setCommitsOnValidEdit(true);
-		
-		
-		JFormattedTextField delayTextField = new  JFormattedTextField(integerFormatter);
-		delayTextField.setValue(delay);
-		delayTextField.setToolTipText("Only positive Integer.");
-		delayTextField.addPropertyChangeListener(actionEvent -> {
-			delay = Integer.parseInt(delayTextField.getValue().toString());
-			if(future != null && !future.isCancelled()) {
-				console.println("You need to Stop and Run again to affect this change.");
-				warningLabel.setVisible(true);
-			}
-		});
-		delayTextField.setBounds(250, 210, 50, 20);
-		parameterPanel.add(delayTextField);
-
-		
-		
-		rotorLabel = new JLabel(stringToHtml("Rotor Status: " + statusToString(rotor.status)));
-		rotorLabel.setBounds(200, 60, 220, 30);
-		parameterPanel.add(rotorLabel);	
-		
-		houseLabel = new JLabel(stringToHtml("House Status: " + statusToString(house.status)));
-		houseLabel.setBounds(200, 90, 220, 30);
-		parameterPanel.add(houseLabel);
-		
-		JLabel keywordsLabel = new JLabel("Room Seperation Keywords: " + room1Keyword + " " + room2Keyword);
-		keywordsLabel.setBounds(200, 120, 320, 30);
-		parameterPanel.add(keywordsLabel);
-		
-		JLabel keywordsHintLabel = new JLabel("HolonElements with a name that contains the Keyword count.");
-		keywordsHintLabel.setBounds(200, 135, 450, 30);
-		parameterPanel.add(keywordsHintLabel);
-		
-		
-		JButton selectRotorButton = new JButton("Select");
-		selectRotorButton.setBounds(420,65, 90, 20);
-		selectRotorButton.addActionListener(actionEvent -> this.selectGroupNode(rotor));
-		parameterPanel.add(selectRotorButton);
-		
-		JButton selectRoom1Button = new JButton("Select");
-		selectRoom1Button.setBounds(420,95, 90, 20);
-		selectRoom1Button.addActionListener(actionEvent -> this.selectGroupNode(house));
-		parameterPanel.add(selectRoom1Button);
-		
-		
-		
-		return parameterPanel;
-	}
-
-
-
-	private String stringToHtml(String string) {
-		return "<html>" + string + "</html>";
-	}
-
-	private String statusToString(HolonObjectStatus status) {
-		switch(status) {
-		case Connected:
-			return stringWithColor("Connected", "green");
-		case NotSelected:
-			return stringWithColor("Not selected", "red");
-		case ObjectDeleted:
-			return stringWithColor("Object deleted", "red");
-		default:
-			return "";
-		
-		}
-	}
-	private String stringWithColor(String string, String color) {
-		return "<font color='"+color + "'>" + string + "</font>";
-	}
-
-	private void  updateStatusLabels() {
-		rotorLabel.setText(stringToHtml("Rotor Status: " + statusToString(rotor.status)));
-		houseLabel.setText(stringToHtml("House Status: " + statusToString(house.status)));
-	}
-	
-	
-	
-	private Component createButtonPanel() {
-		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-		JButton clearButton =  new JButton("Clear Console");
-		clearButton.addActionListener(actionEvent -> console.clear());
-		buttonPanel.add(clearButton);
-		JButton stopButton =  new JButton("Stop");
-		stopButton.addActionListener(actionEvent -> stop());
-		buttonPanel.add(stopButton);
-		JButton runButton =  new JButton("Run");
-		runButton.addActionListener(actionEvent -> initSchedule());
-		buttonPanel.add(runButton);
-		return buttonPanel;
-	}
-
-	
-	private void stop() {
-		if(future!= null) {
-			if(future.isCancelled()) {
-				console.println("Is cancelled.");
-			}
-			else {
-				future.cancel(true);
-				console.println("Stopped sending Requests on localhost:2019 ...");
-			}
-		}
-		else {
-			console.println("Not started jet.");
-		}
-	}
-
-	private void initSchedule() {
-		if(future != null && !future.isCancelled()) {
-			console.println("Is running.");
-			return;
-		}
-		warningLabel.setVisible(false);
-		console.println("Starting sending Requests on localhost:2019");
-		final ScheduledExecutorService 	executorService = Executors.newSingleThreadScheduledExecutor();
-		final Runnable beeper = new Runnable() {
-				
-				//RepeatedMethod
-		       	public void run() {
-		       		if(lessInformation)console.print(".");
-		       		checkWrapper(rotor);
-		       		checkWrapperHouseSpecial(house);
-		       	}
-
-
-				private void checkWrapper(PhysicalLinkWrapper wrapper) {
-					if(wrapper.status == HolonObjectStatus.Connected) checkConnected(wrapper);
-		       		else if(!lessInformation)console.println(wrapper.postAddress +" is not connected.");
-				}
-
-				private void checkConnected(PhysicalLinkWrapper wrapper) {
-					if(wrapper.hObject == null) {
-						wrapper.status =  HolonObjectStatus.ObjectDeleted;
-						updateStatusLabels();
-						return;
-					}
-					if(wrapper.hObject.getNumberOfElements() > 0) {
-						//OnlyForRotor
-						
-						int value = Math.round(((float)wrapper.hObject.getNumberOfActiveElements()/(float) wrapper.hObject.getNumberOfElements())*(float) 100);					
-						if(onlyOnChange) {
-							if(oldValueRotor != value) {
-								sendRequest(wrapper.postAddress, value);
-								oldValueRotor = value; 
-							}
-						}else {
-							sendRequest(wrapper.postAddress, value);
-						}
-						
-						
-					}else {
-						if(onlyOnChange) {
-							if(oldValueRotor != 0) {
-								sendRequest(wrapper.postAddress, 0);
-								oldValueRotor = 0; 
-							}
-						}else {
-							sendRequest(wrapper.postAddress, 0);
-						}
-					}
-						
-					
-						
-				}
-
-				private void sendRequest(String postAddress, int value) {
-					if(!lessInformation)console.println("Send " + "http://localhost:2019" + postAddress + value);
-					doHttpUrlConnectionAction("http://localhost:2019" + postAddress + value);
-				
-				}
-
-				  /**
-				   * Send A Request to a URL.
-				   * 
-				   * @param desiredUrl
-				   * @return
-				   */
-				  private void doHttpUrlConnectionAction(String desiredUrl)
-				  {
-				    URL url = null;
-
-				      // create the HttpURLConnection
-				      try {
-						url = new URL(desiredUrl);
-					
-				      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-				      
-				      // just want to do an HTTP GET here
-				      connection.setRequestMethod("GET");
-
-				      connection.getResponseCode();
-				     
-				      // give it 15 seconds to respond
-				      connection.setReadTimeout(1000);
-				      connection.connect();
-				      } catch (MalformedURLException e) {
-				    	  console.println("MalformedURLException");
-				    	  e.printStackTrace();
-					} catch (IOException e) {
-						console.println("IOException: Connection refused");
-						e.printStackTrace();
-					}
-				  }
-				  private void checkWrapperHouseSpecial(PhysicalLinkWrapper house) {
-					if(!(house.status == HolonObjectStatus.Connected)) {
-						if(!lessInformation)console.println("House" + " is not connected.");
-						return;
-					}
-			       	//House is Connected
-					if(house.hObject == null) {
-						house.status =  HolonObjectStatus.ObjectDeleted;
-						updateStatusLabels();
-						return;
-					}
-					//House exist
-					List<HolonElement> elementsOfRoom1 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room1Keyword)).collect(Collectors.toList());
-					List<HolonElement> elementsOfRoom2 = house.hObject.getElements().stream().filter(ele -> ele.getName().contains(room2Keyword)).collect(Collectors.toList());
-					
-					if(elementsOfRoom1.isEmpty()){
-						if(onlyOnChange) {
-							if(oldValueRoom1 != 0) {
-								sendRequest(room1Address, 0);
-								oldValueRoom1 = 0; 
-							}
-						}else {
-							sendRequest(room1Address, 0);
-						}
-					}
-					else{
-						int value = Math.round(((float)elementsOfRoom1.stream().filter(ele -> ele.active).count()/(float) elementsOfRoom1.size())*(float) 100);					
-						if(onlyOnChange) {
-							if(oldValueRoom1 != value) {
-								sendRequest(room1Address, value);
-								oldValueRoom1 = value; 
-							}
-						}else {
-							sendRequest(room1Address, value);
-						}
-					}
-					if(elementsOfRoom2.isEmpty()){
-						if(onlyOnChange) {
-							if(oldValueRoom2 != 0) {
-								sendRequest(room2Address, 0);
-								oldValueRoom2 = 0; 
-							}
-						}else {
-							sendRequest(room2Address, 0);
-						}
-					}
-					else{
-						int value = Math.round(((float)elementsOfRoom2.stream().filter(ele -> ele.active).count()/(float) elementsOfRoom2.size())*(float) 100);					
-						if(onlyOnChange) {
-							if(oldValueRoom2 != value) {
-								sendRequest(room2Address, value);
-								oldValueRoom2 = value; 
-							}
-						}else {
-							sendRequest(room2Address, value);
-						}
-					}
-					
-					
-				  }
-		     };
-		future = executorService.scheduleAtFixedRate(beeper, 0, delay, TimeUnit.MILLISECONDS);
-	}
-	
-
-	
-	private void addObjectToList(List<AbstractCanvasObject> listToSearch, List<HolonObject> listToAdd){
-		for (AbstractCanvasObject aCps : listToSearch) {
-			if (aCps instanceof HolonObject hO) listToAdd.add(hO);
-			else if(aCps instanceof GroupNode groupNode) {
-				listToAdd.addAll(groupNode.getAllHolonObjectsRecursive().toList());
-			}
-		}
-	}
-	
-	//SelectGroupNode
-	private void selectGroupNode(PhysicalLinkWrapper wrapper) {
-		List<HolonObject> holonObjectList = new ArrayList<HolonObject>();
-		addObjectToList(control.getModel().getObjectsOnCanvas(),holonObjectList);
-		Object[] possibilities = holonObjectList.stream().map(aCps -> new Handle<HolonObject>(aCps)).toArray();
-		@SuppressWarnings("unchecked")
-		Handle<HolonObject> selected = (Handle<HolonObject>) JOptionPane.showInputDialog(content, "Select HolonObject:", "HolonObject?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
-		if(selected != null) {
-			console.println("Selected: " + selected);
-			wrapper.hObject = selected.object;
-			wrapper.status = HolonObjectStatus.Connected;
-			updateStatusLabels();
-		}
-	}
-	private   class  Handle<T>{
-		public T object;
-		Handle(T object){
-			this.object = object;
-		}
-		public String toString() {
-			return object.toString();
-		}
-	}
-	
-	
-	@Override
-	public JPanel getPanel() {
-		return content;
-	}
-
-	@Override
-	public void setController(Control control) {
-		this.control = control;
-	}
-	
-
-	
-	
-
-}

+ 0 - 303
src/holeg/connect/socket/Server.java

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

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

@@ -1,6 +1,7 @@
 package holeg.model;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.logging.Logger;
 import java.util.stream.Stream;
 
@@ -27,6 +28,12 @@ public class GroupNode extends AbstractCanvasObject {
 		groupNodeList = new ArrayList<>();
 	}
 
+	public void addAll(Stream<AbstractCanvasObject> stream) {
+		stream.forEach(obj -> add(obj));
+	}
+	public void addAll(Collection<AbstractCanvasObject> collection) {
+		collection.forEach(obj -> add(obj));
+	}
 	
 	public void add(AbstractCanvasObject object) {
 		if (object instanceof HolonObject hObject) {
@@ -100,4 +107,10 @@ public class GroupNode extends AbstractCanvasObject {
 		return groupNodeList.stream();
 	}
 	
+	public void clear() {
+		objectList.clear();
+		switchList.clear();
+		nodeList.clear();
+		groupNodeList.clear();
+	}
 }

+ 4 - 4
src/holeg/ui/controller/CanvasController.java

@@ -46,7 +46,7 @@ public class CanvasController {
 	 * @param replace when true objects could be replaced
 	 */
 	public void addObject(AbstractCanvasObject object, boolean replace) {
-		model.getObjectsOnCanvas().add(object);
+		model.getCanvas().add(object);
 		/**
 		 * check if we should drag & drop replace
 		 */
@@ -67,7 +67,7 @@ public class CanvasController {
 			AbstractCanvasObject toBeReplaced = null;
 			
 			/** for each cps on Canvas */
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()){
+			for (AbstractCanvasObject cps : model.getCanvas().getObjectsInThisLayer().toList()){
 				
 				/** same object -> ignore */
 				if(cps == object)continue;
@@ -113,13 +113,13 @@ public class CanvasController {
 	 */
 	public void deleteObjectOnCanvas(AbstractCanvasObject obj) {
 		removeAllConnectionsFromObject(obj);
-		model.getObjectsOnCanvas().remove(obj);
+		model.getCanvas().remove(obj);
 	}
 	
 	public void deleteObjectsOnCanvas(Collection<AbstractCanvasObject> objects) {
 		for(AbstractCanvasObject obj: objects) {
 			removeAllConnectionsFromObject(obj);
-			model.getObjectsOnCanvas().remove(obj);
+			model.getCanvas().remove(obj);
 		}
 	}
 

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

@@ -319,7 +319,7 @@ public class ClipboardController {
     /**
      * Modified Method from LoadController. Slightly different
      */
-    private void edgeToJson(EDGETYPE type, JsonObject file, int id, ArrayList<Edge> arr) {
+    private void edgeToJson(EDGETYPE type, JsonObject file, int id, List<Edge> arr) {
         String k = null;
         boolean b = false;
         JsonObject temp = new JsonObject();

+ 0 - 1
src/holeg/ui/controller/LoadController.java

@@ -188,7 +188,6 @@ public class LoadController {
         switch (MODE.valueOf(json.get("MODE").getAsString())) {
             case COMPLETE:
             case PARTIAL:
-                model.setObjectsOnCanvas(new ArrayList<>());
                 model.setEdgesOnCanvas(new ArrayList<>());
                 GuiSettings.canvasSize.setX(json.get("CANVAS_SIZE_X").getAsInt());
                 GuiSettings.canvasSize.setY(json.get("CANVAS_SIZE_Y").getAsInt());

+ 2 - 2
src/holeg/ui/controller/NodeController.java

@@ -95,7 +95,7 @@ class NodeController {
 				obj.setSav("" + upperNode.getId());
 		});
 		if (upperNode == null) {
-			model.getObjectsOnCanvas().addAll(node.getObjectsInThisLayer().toList());
+			model.getCanvas().addAll(node.getObjectsInThisLayer());
 		} else {
 			node.getObjectsInThisLayer().forEach(obj -> upperNode.add(obj));
 		}
@@ -126,7 +126,7 @@ class NodeController {
 	 * Removes the Given Obj from current Layer and adjusts the idx
 	 */
 	private void removeForNodeOfNode(AbstractCanvasObject obj) {
-		model.getObjectsOnCanvas().remove(obj);
+		model.getCanvas().remove(obj);
 	}
 
 

+ 3 - 7
src/holeg/ui/controller/SaveController.java

@@ -200,16 +200,12 @@ public class SaveController {
     private void storeCanvas(JsonObject file) {
     	//TODO(Tom2021-12-20): remove QUEUE
         ArrayDeque<AbstractCanvasObject> queue = new ArrayDeque<>();
-        AbstractCanvasObject u = null;
-        // put all objects into queue since there is not starting object
-        for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-            queue.add(cps);
-        }
+        queue.addAll(model.getCanvas().getObjectsInThisLayer().toList());
         // while quene not empty
         while (!queue.isEmpty()) {
 
             // u = current node
-            u = queue.pop();
+        	AbstractCanvasObject u = queue.pop();
             // add currentnode into jsontree
             String key = "CVSOBJECT" + getNumerator(NUMTYPE.OBJECT);
             file.add(key, GuiSettings.gson.toJsonTree(u, AbstractCanvasObject.class));
@@ -325,7 +321,7 @@ public class SaveController {
     /**
      * Canvas-Edge, Connections, Node-Edge and Old-Edges to json
      */
-    private void edgeToJson(EDGETYPE type, JsonObject file, int id, ArrayList<Edge> arr) {
+    private void edgeToJson(EDGETYPE type, JsonObject file, int id, List<Edge> arr) {
         String k = null;
         boolean b = false;
         JsonObject temp = new JsonObject();

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

@@ -53,7 +53,7 @@ public class SimulationManager {
 		timeStep = timestep;
 		long start = System.currentTimeMillis();
 		ArrayList<MinimumNetwork> list = new ArrayList<MinimumNetwork>();
-		MinimumModel minimumModel = new MinimumModel(model.getObjectsOnCanvas(), model.getEdgesOnCanvas(),
+		MinimumModel minimumModel = new MinimumModel(model.getCanvas(), model.getEdgesOnCanvas(),
 				model.getCurrentIteration());
 		ArrayList<Edge> leftOver = new ArrayList<Edge>();
 

+ 16 - 12
src/holeg/ui/model/MinimumModel.java

@@ -2,6 +2,7 @@ package holeg.ui.model;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 
 import holeg.model.AbstractCanvasObject;
 import holeg.model.Edge;
@@ -37,18 +38,19 @@ public class MinimumModel {
 		return inGroupEdges;
 	}
 
-	public MinimumModel(ArrayList<AbstractCanvasObject> abstractObjectList, ArrayList<Edge> edgeList, int timestep) {// Constructor because of old Model
-		for (AbstractCanvasObject aCps : abstractObjectList) {
-			if (aCps instanceof HolonObject hObject) {
-				holonObjectList.add(hObject);
-			}
-			else if (aCps instanceof Node node) nodeList.add(node);
-			else if (aCps instanceof HolonSwitch sw) switchList.add(sw);
-			else if(aCps instanceof GroupNode groupnode) {
-				addGroupNodeObjects(groupnode, timestep);
-				groupNodeList.add(groupnode);
-			}
-		}
+	public MinimumModel(GroupNode canvas, List<Edge> edgeList, int timestep) {// Constructor because of old Model
+		 canvas.getObjectsInThisLayer().forEach(aCps -> {
+			 if (aCps instanceof HolonObject hObject) {
+				 holonObjectList.add(hObject);
+			 }
+			 else if (aCps instanceof Node node) nodeList.add(node);
+			 else if (aCps instanceof HolonSwitch sw) switchList.add(sw);
+			 else if(aCps instanceof GroupNode groupnode) {
+				 addGroupNodeObjects(groupnode, timestep);
+				 groupNodeList.add(groupnode);
+			 }
+		 });
+		 
 		for (Edge edge : edgeList) {
 			this.edgeList.add(edge);
 			AbstractCanvasObject objectA = edge.getA();
@@ -66,6 +68,8 @@ public class MinimumModel {
 		holonObjectList.forEach(obj -> obj.calculateEnergy(timestep));
 	}
 
+
+
 	private void addGroupNodeObjects(GroupNode groupNode, int timestep) {
 		holonObjectList.addAll(groupNode.getAllHolonObjectsRecursive().toList());
 		nodeList.addAll(groupNode.getAllNodeObjectsRecursive().toList());

+ 18 - 100
src/holeg/ui/model/Model.java

@@ -4,15 +4,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import holeg.model.AbstractCanvasObject;
 import holeg.model.Edge;
 import holeg.model.Flexibility;
 import holeg.model.GroupNode;
 import holeg.model.HolonElement;
-import holeg.model.HolonObject;
-import holeg.model.HolonSwitch;
 
 
 
@@ -50,58 +45,28 @@ public class Model {
     /** the Fairness model in use */
     private FairnessModel fairnessModel = FairnessModel.MininumDemandFirst;
    
-    //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 GroupNode canvas = new GroupNode("Canvas");
     /*
      * Array of all CpsObjects in our canvas. It is set by default as an empty
      * list.
      */
-    private ArrayList<Edge> edgesOnCanvas;
-    
-
-  
-
-    /**
-     * Constructor for the model. It initializes the categories and
-     * objectsOnCanvas by default values. Listeners are also initialized by
-     * default values.
-     */
+    private List<Edge> edgesOnCanvas = new ArrayList<>();
+   
     public Model() {
     	log.fine("Init Model");
-        setObjectsOnCanvas(new ArrayList<>());
-        setEdgesOnCanvas(new ArrayList<>());
     }
-
-
-
-    /**
-     * Returns all Objects on the Canvas.
-     *
-     * @return the objectsOnCanvas
-     */
-    public ArrayList<AbstractCanvasObject> getObjectsOnCanvas() {
-        return objectsOnCanvas;
-    }
-
-    /**
-     * Sets all Objects on the Canvas.
-     *
-     * @param objectsOnCanvas the objectsOnCanvas to set
-     */
-    public void setObjectsOnCanvas(ArrayList<AbstractCanvasObject> objectsOnCanvas) {
-        this.objectsOnCanvas = objectsOnCanvas;
+    
+    public GroupNode getCanvas() {
+    	return canvas;
     }
+    
 
     /**
      * Get all Edges on the Canvas.
      *
      * @return the edgesOnCanvas
      */
-    public ArrayList<Edge> getEdgesOnCanvas() {
+    public List<Edge> getEdgesOnCanvas() {
         return edgesOnCanvas;
     }
 
@@ -132,12 +97,10 @@ public class Model {
         this.edgesOnCanvas.remove(edge);
     }
 
-
-
     /**
-     * Returns the maximum ITERATIONS.
+     * Returns the maximum iterations.
      *
-     * @return ITERATIONS
+     * @return iterations
      */
     public int getMaxIterations() {
         return maxIterations;
@@ -165,11 +128,11 @@ public class Model {
 
 
     public List<HolonElement> getAllHolonElements() {
-    	return getAllHolonObjectsOnCanvas().stream().flatMap(hO -> hO.getElements().stream()).collect(Collectors.toList());
+    	return canvas.getAllHolonObjectsRecursive().flatMap(hO -> hO.getElements().stream()).collect(Collectors.toList());
     }
     
     public List<Flexibility> getAllFlexibilities() {
-    	return getAllHolonObjectsOnCanvas().stream().flatMap(hO -> hO.getElements().stream().flatMap(ele -> ele.flexList.stream())).collect(Collectors.toList());
+    	return canvas.getAllHolonObjectsRecursive().flatMap(hO -> hO.getElements().stream().flatMap(ele -> ele.flexList.stream())).collect(Collectors.toList());
     }
     
     public void reset() {
@@ -183,56 +146,7 @@ public class Model {
     private void resetEdges() {
     	this.getEdgesOnCanvas().forEach(edge -> edge.reset());
     }
-    
-    
-    public ArrayList<HolonObject> getAllHolonObjectsOnCanvas(){
-		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());
-    		}
-    	}
-    	return objectToReturn;
-    }
-    
-
-    
-    public ArrayList<AbstractCanvasObject> getAllAbstractObjectsOnCanvas(){
-		ArrayList<AbstractCanvasObject> objectToReturn = new ArrayList<AbstractCanvasObject>();
-		getAllAsbtractObjectsRecursive(objectToReturn, getObjectsOnCanvas().stream());
-    	return objectToReturn;
-    }
-    private void getAllAsbtractObjectsRecursive(ArrayList<AbstractCanvasObject> addObjectsToThisList, Stream<AbstractCanvasObject> listOfObjectsToSearch){
-    	listOfObjectsToSearch.forEach(aCps -> {
-    		if(aCps instanceof GroupNode groupnode){
-    			getAllAsbtractObjectsRecursive(addObjectsToThisList, groupnode.getObjectsInThisLayer());
-    		}
-    		else{
-    			addObjectsToThisList.add(aCps);
-    		}
-    	});
-    }
-    
-    
-    
-    /**
-     * get all Switches
-     */
-    public ArrayList<HolonSwitch> getAllSwitches() {
-        ArrayList<HolonSwitch> switches = new ArrayList<>();
-        for (AbstractCanvasObject obj : getObjectsOnCanvas()) {
-            if (obj instanceof HolonSwitch sw) {
-                switches.add(sw);
-            } else if (obj instanceof GroupNode groupnode) {
-            	switches.addAll(groupnode.getAllSwitchObjectsRecursive().toList());
-            }
-        }
-        return switches;
-    }
-
+   
 	
 	/**
 	 * @param iterations the number of steps for this simulation
@@ -254,5 +168,9 @@ public class Model {
 	public void setFairnessModel(FairnessModel fairnessModel) {
 		this.fairnessModel = fairnessModel;
 	}
-
+	
+	public void clear() {
+		this.edgesOnCanvas.clear();
+		canvas.clear();
+	}
 }

+ 1 - 0
src/holeg/ui/model/VisualRepresentationalState.java

@@ -251,6 +251,7 @@ public class VisualRepresentationalState {
 
 	private LinkedList<TreeNode<TreeGroupNodeData>> createList(GroupNode insideUpperNode,
 			HashMap<GroupNode, TreeNode<TreeGroupNodeData>> fastaccess) {
+		System.out.println(insideUpperNode);
 		TreeNode<TreeGroupNodeData> actualNode = fastaccess.get(insideUpperNode);
 		LinkedList<TreeNode<TreeGroupNodeData>> list = new LinkedList<TreeNode<TreeGroupNodeData>>();
 		list.add(actualNode);

+ 4 - 3
src/holeg/ui/view/canvas/AbstractCanvas.java

@@ -12,6 +12,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.TimerTask;
+import java.util.stream.Stream;
 
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
@@ -98,7 +99,7 @@ public abstract class AbstractCanvas extends JPanel {
 	// Graphics
 	Image img = null; // Contains the image to draw on the Canvas
 	Graphics2D g2; // For Painting
-	float scalediv20;
+	float scalediv20 = GuiSettings.getPictureScale() / 20;
 	// Mouse
 	private boolean click = false;
 
@@ -275,7 +276,7 @@ public abstract class AbstractCanvas extends JPanel {
 	 * @param y          Position of the objects that might replace
 	 * @return true if exactly one Object could be replaced
 	 */
-	protected boolean checkForReplacement(List<AbstractCanvasObject> objects, AbstractCanvasObject draggedCps,
+	protected boolean checkForReplacement(Stream<AbstractCanvasObject> objects, AbstractCanvasObject draggedCps,
 			int x, int y) {
 
 		/** distance treshold for replacement */
@@ -292,7 +293,7 @@ public abstract class AbstractCanvas extends JPanel {
 
 		/** for each cps on Canvas */
 		if (draggedCps == null || !(draggedCps instanceof Node) && !(draggedCps instanceof Node)) {
-			for (AbstractCanvasObject cps : objects) {
+			for (AbstractCanvasObject cps : objects.toList()) {
 				/** same object -> ignore */
 				if (cps == draggedCps)
 					continue;

+ 29 - 16
src/holeg/ui/view/canvas/Canvas.java

@@ -15,6 +15,8 @@ import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Optional;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
 import javax.swing.ImageIcon;
 import javax.swing.JFrame;
@@ -56,7 +58,7 @@ import holeg.utility.Vector2Int;
  * @author Gruppe14
  */
 public class Canvas extends AbstractCanvas implements MouseListener, MouseMotionListener {
-
+	private static final Logger log = Logger.getLogger(Canvas.class.getName());
 	private static final long serialVersionUID = 1L;
 	public boolean disabled = false;
 
@@ -74,12 +76,12 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 	 * @param control   the Controller
 	 * @param unitGraph
 	 */
-	public Canvas(Model mod, Control control, UnitGraph unitGraph) {
+	public Canvas(Control control, UnitGraph unitGraph, GroupNode groupNode) {
 		toolTip = false;
 		this.control = control;
-		this.model = mod;
-
-		scalediv20 = GuiSettings.getPictureScale() / 20;
+		this.model = control.getModel();
+		this.groupNode = groupNode;
+		
 
 		showConnectionInformation = true;
 		popmenu.add(itemCut);
@@ -479,7 +481,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		// timstep:
 		g.setFont(new Font("TimesNewRoman", Font.PLAIN, Math.max((int) (GuiSettings.getPictureScale() / 3.5f), 10)));
 		g2d.setColor(Color.BLACK);
-
+		
 		Optional<VisualRepresentationalState> optVisualState = control.getSimManager().getActualVisualRepresentationalState();
 		// VisualState Representation:
 		if (optVisualState.isEmpty()) {
@@ -496,9 +498,11 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		for (DecoratedGroupNode dGroupNode : visualState.getGroupNodeList()) {
 			paintGroupNode(g2d, dGroupNode);
 		}
+		log.info(visualState.getConsumerList().stream().map(Object::toString).collect(Collectors.joining(", ")));
 		for (Consumer con : visualState.getConsumerList()) {
 			paintConsumer(g2d, con);
 		}
+		log.info(visualState.getSupplierList().stream().map(Object::toString).collect(Collectors.joining(", ")));
 		for (Supplier sup : visualState.getSupplierList()) {
 			paintSupplier(g2d, sup);
 		}
@@ -577,7 +581,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			edgeHighlight = null;
 			GuiSettings.getSelectedEdges().clear();
 			// Object Selection
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
+			for (AbstractCanvasObject cps : groupNode.getObjectsInThisLayer().toList()) {
 				cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
 				cy = cps.getPosition().getY() - GuiSettings.getPictureScaleDiv2();
 				if (x - GuiSettings.getPictureScale() <= cx && y - GuiSettings.getPictureScale() <= cy && x >= cx && y >= cy) {
@@ -645,7 +649,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 				/**
 				 * check if a unique tempCps could replace an Object on the canvas
 				 */
-				if (GuiSettings.getSelectedObjects().size() == 1 && checkForReplacement(model.getObjectsOnCanvas(),
+				if (GuiSettings.getSelectedObjects().size() == 1 && checkForReplacement(groupNode.getObjectsInThisLayer(),
 						tempCps, tempCps.getPosition().getX(), tempCps.getPosition().getY())) {
 					/**
 					 * if UpperNode would be replaced, close its tabs
@@ -755,7 +759,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					 * check if something might be replaced
 					 */
 					if (GuiSettings.getSelectedObjects().size() == 1)
-						checkForReplacement(model.getObjectsOnCanvas(), tempCps, x, y);
+						checkForReplacement(groupNode.getObjectsInThisLayer(), tempCps, x, y);
 
 					repaint();
 				} catch (Exception eex) {
@@ -765,7 +769,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			// Mark Objects
 			if (doMark) {
 				tempSelected.clear();
-				for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
+				for (AbstractCanvasObject cps : groupNode.getObjectsInThisLayer().toList()) {
 					int x1 = sx, x2 = x, y1 = sy, y2 = y;
 
 					if (sx >= x) {
@@ -797,7 +801,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 
 			// Everything for the tooltip :)
 			boolean on = false;
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
+			for (AbstractCanvasObject cps : groupNode.getObjectsInThisLayer().toList()) {
 				cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
 				cy = cps.getPosition().getY() - GuiSettings.getPictureScaleDiv2();
 
@@ -825,7 +829,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			boolean deleteNode = false;
 			Edge e = null;
 
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
+			for (AbstractCanvasObject cps : groupNode.getObjectsInThisLayer().toList()) {
 				cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
 				cy = cps.getPosition().getY() - GuiSettings.getPictureScaleDiv2();
 				if (x - GuiSettings.getPictureScale() <= cx && y - GuiSettings.getPictureScale() <= cy && x >= cx && y >= cy
@@ -981,7 +985,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 	@Override
 	public boolean checkForReplacement(int x, int y) {
 
-		return checkForReplacement(model.getObjectsOnCanvas(), null, x, y);
+		return checkForReplacement(model.getCanvas().getObjectsInThisLayer(), null, x, y);
 	}
 
 	@Override
@@ -989,8 +993,9 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		/**
 		 * Align all Objects
 		 */
-		for (AbstractCanvasObject cps : model.getObjectsOnCanvas())
-			align(cps, 3 * GuiSettings.getPictureScaleDiv2());
+		model.getCanvas().getAllObjectsRecursive().forEach(cps -> {
+			align(cps, 3 * GuiSettings.getPictureScaleDiv2());			
+		});
 
 		/**
 		 * AutoSave new Positons
@@ -1002,7 +1007,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 	public void closeUpperNodeTab(int upperNodeId) {
 		JTabbedPane tabbedPaneInner = (JTabbedPane) getParent().getParent().getParent().getParent();
 		for (int i = 1; i < tabbedPaneInner.getTabCount(); i++) {
-			if (((GroupNodeCanvas) ((JScrollPane) tabbedPaneInner.getComponentAt(i)).getViewport().getComponent(0))
+			if (((Canvas) ((JScrollPane) tabbedPaneInner.getComponentAt(i)).getViewport().getComponent(0))
 					.getGroupNode().getId() == upperNodeId) {
 				tabbedPaneInner.remove(i);
 				break;
@@ -1010,4 +1015,12 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		}
 	}
 
+	public GroupNode getGroupNode() {
+		return this.groupNode;
+	}
+
+	public void setGroupNode(GroupNode groupNode) {
+		this.groupNode = groupNode;
+	}
+
 }

+ 0 - 406
src/holeg/ui/view/canvas/GroupNodeCanvas.java

@@ -1,406 +0,0 @@
-package holeg.ui.view.canvas;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.event.MouseEvent;
-import java.util.Optional;
-import java.util.logging.Logger;
-
-import holeg.model.AbstractCanvasObject;
-import holeg.model.Edge;
-import holeg.model.GroupNode;
-import holeg.model.HolonObject;
-import holeg.model.HolonSwitch;
-import holeg.model.Node;
-import holeg.preferences.ColorPreference;
-import holeg.ui.controller.Control;
-import holeg.ui.model.Consumer;
-import holeg.ui.model.DecoratedGroupNode;
-import holeg.ui.model.DecoratedSwitch;
-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.view.inspector.UnitGraph;
-import holeg.utility.ImageImport;
-import holeg.utility.Vector2Int;
-
-//TODO(Tom2021-12-1) delete GroupNodeCanvas completely and only have canvas Class
-public class GroupNodeCanvas extends Canvas {
-	private static final Logger log = Logger.getLogger(GroupNodeCanvas.class.getName());
-	private String parentPath;
-	private Component parentComponent;
-
-	public GroupNodeCanvas(Model mod, Control control, UnitGraph unitGraph, GroupNode groupNode, String parentPath,
-			Component parentComponent) {
-		super(mod, control, unitGraph);
-		this.groupNode = groupNode;
-		this.parentPath = parentPath;
-		this.parentComponent = parentComponent;
-	}
-
-	public void setGroupNode(GroupNode upperNode) {
-		this.groupNode = upperNode;
-	}
-
-	public GroupNode getGroupNode() {
-		return groupNode;
-	}
-
-	public String getParentPath() {
-		return parentPath;
-	}
-
-	public Component getParentComponent() {
-		return parentComponent;
-	}
-
-	public void paintComponent(Graphics g) {
-		// super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;
-		g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
-		g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
-		// -->Old code
-		if (drawEdge) {
-			g2d.setColor(Color.BLACK);
-			g2d.setStroke(new BasicStroke(1));
-			g2d.drawLine(tempCps.getPosition().getX(), tempCps.getPosition().getY(), x, y);
-		}
-		// <--
-		// SelectedCable
-
-
-		Optional<VisualRepresentationalState> visState = control.getSimManager()
-				.getActualVisualRepresentationalState();
-		if (visState.isEmpty()) {
-			return;
-		}
-		DecoratedGroupNode actualGroupNode = visState.get().getCreatedGroupNodes().get(groupNode);
-		// VisualState Representation:
-		for (ExitCable cable : actualGroupNode.getExitCableList()) {
-			paintExitCable(g2d, cable);
-		}
-		for (Edge cable : actualGroupNode.getInternCableList()) {
-			paintCable(g2d, cable, GuiSettings.getSelectedEdges().contains(cable));
-		}
-
-		for (DecoratedGroupNode dGroupNode : actualGroupNode.getGroupNodeList()) {
-			paintGroupNode(g2d, dGroupNode);
-		}
-		for (Consumer con : actualGroupNode.getConsumerList()) {
-			paintConsumer(g2d, con);
-		}
-		for (Supplier sup : actualGroupNode.getSupplierList()) {
-			paintSupplier(g2d, sup);
-		}
-		for (Passiv pas : actualGroupNode.getPassivList()) {
-			paintCanvasObject(g2d, pas);
-		}
-		for (DecoratedSwitch dSwitch : actualGroupNode.getSwitchList()) {
-			paintSwitch(g2d, dSwitch);
-		}
-		for (Node node : actualGroupNode.getNodeList()) {
-			drawCanvasObject(g2d, "/Images/node.png", node.getPosition());
-		}
-
-		// -->oldCode
-		if (doMark) {
-			g2d.setColor(Color.BLACK);
-			g2d.setStroke(new BasicStroke(0));
-			drawMarker(g2d);
-		}
-		// Test Selection
-		// Objects:
-		g2d.setStroke(new BasicStroke(1));
-		Color transparentGrey = ColorPreference.Panel.ObjectSelection;
-		for (AbstractCanvasObject aCps : GuiSettings.getSelectedObjects()) {
-			if (aCps instanceof Node) {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillOval(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2()),
-						pos.getY() - (int) (GuiSettings.getPictureScaleDiv2()), GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
-				g2d.setColor(ColorPreference.Panel.ObjectSelectionBorder);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawOval(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2()),
-						pos.getY() - (int) (GuiSettings.getPictureScaleDiv2()), GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
-			} else {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillRect(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f),
-						pos.getY() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f), (int) (GuiSettings.getPictureScale() * 1.5f),
-						(int) (GuiSettings.getPictureScale() * 1.5f));
-				g2d.setColor(ColorPreference.Panel.ObjectSelectionBorder);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawRect(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f),
-						pos.getY() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f), (int) (GuiSettings.getPictureScale() * 1.5f),
-						(int) (GuiSettings.getPictureScale() * 1.5f));
-			}
-
-		}
-		// maybeReplace:
-		if (mayBeReplaced != null) {
-			Vector2Int pos = mayBeReplaced.getPosition();
-			g.drawImage(ImageImport.loadImage("/Images/replace.png"), pos.getX() + GuiSettings.getPictureScaleDiv2(),
-					pos.getY() - GuiSettings.getPictureScale(), GuiSettings.getPictureScaleDiv2(), GuiSettings.getPictureScaleDiv2(), null);
-		}
-		// <-- OldCode
-	}
-
-	@Override
-	public void mousePressed(MouseEvent e) {
-		this.grabFocus();
-		if (!disabled) {
-			tempCps = null;
-			dataSelected = null;
-			edgeHighlight = null;
-			GuiSettings.getSelectedEdges().clear();
-			// Object Selection
-
-			if (e.getX() > 0) {
-				for (AbstractCanvasObject cps : groupNode.getObjectsInThisLayer().toList()) {
-					cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
-					cy = cps.getPosition().getY() - GuiSettings.getPictureScaleDiv2();
-					if (x - GuiSettings.getPictureScale() <= cx && y - GuiSettings.getPictureScale() <= cy && x >= cx && y >= cy) {
-						tempCps = cps;
-
-						dragging = true;
-						if (e.isControlDown() && tempCps != null) {
-							log.info("Add Remove Selection GROUPNODECANVAS");
-							if (GuiSettings.getSelectedObjects().contains(tempCps)) {
-								control.removeObjectFromSelection(tempCps);
-							} else {
-								control.addSelectedObject(tempCps);
-								if (tempCps instanceof GroupNode)
-									control.getObjectsInDepth();
-							}
-						}
-
-						// If drawing an Edge (CTRL down)
-						if (tempCps.getClass() == HolonObject.class) {
-							HolonObject tempObj = ((HolonObject) tempCps);
-							dataSelected = tempObj.getElements();
-						}
-						if (e.isShiftDown()) {
-							drawEdge = true;
-							dragging = false;
-						}
-						break;
-					}
-				}
-			}
-			// Edge Selection
-			if (e.getButton() == MouseEvent.BUTTON1) {
-				if (tempCps == null) {
-					edgeHighlight = mousePositionOnEdge(x, y);
-					GuiSettings.getSelectedEdges().add(edgeHighlight);
-					if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-						control.clearSelection();
-					}
-				}
-
-				if (edgeHighlight == null && tempCps == null) {
-					sx = e.getX();
-					sy = e.getY();
-					doMark = true;
-				}
-				repaint();
-			}
-		}
-	}
-
-	@Override
-	public void mouseReleased(MouseEvent e) {
-		if (!disabled) {
-			x = e.getX();
-			y = e.getY();
-			dragging = false;
-
-			if (drawEdge) {
-				drawEdge = false;
-				drawDeleteEdge();
-			}
-
-			if (dragged) {
-				control.tryAutoSave();
-
-				/**
-				 * check if tempCps could replace an Object on the UpperNodeanvas
-				 */
-				if (GuiSettings.getSelectedObjects().size() == 1 && checkForReplacement(groupNode.getObjectsInThisLayer().toList(), tempCps,
-						tempCps.getPosition().getX(), tempCps.getPosition().getY())) {
-					/**
-					 * if UpperNode would be replaced, close its tabs
-					 */
-					if (mayBeReplaced instanceof GroupNode)
-						closeUpperNodeTab(mayBeReplaced.getId());
-					/**
-					 * replace on canvas
-					 */
-					control.replaceObjectInGroupNode(mayBeReplaced, tempCps, groupNode);
-					mayBeReplaced = null;
-				}
-			}
-
-			if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
-				control.clearSelection();
-				control.addSelectedObject(tempCps);
-				if (tempCps instanceof GroupNode)
-					control.getObjectsInDepth();
-			}
-
-			dragged = false;
-
-			// Rightclick List
-			setRightClickMenu(e);
-
-			markObjects();
-			boolean doubleclick = doubleClick();
-			if (doubleclick && tempCps != null && tempCps instanceof HolonSwitch sw) {
-				sw.switchState();
-			}
-			if (doubleclick && tempCps != null && tempCps instanceof GroupNode groupnode) {
-				control.getGui().openNewUpperNodeTab(groupnode);
-			}
-			control.calculateStateAndVisualForTimeStep(model.getCurrentIteration());
-			repaint();
-		}
-	}
-
-	@Override
-	public void mouseDragged(MouseEvent e) {
-		if (!disabled) {
-			// If Edge is drawn
-			x = e.getX();
-			y = e.getY();
-			if (!GuiSettings.getSelectedObjects().contains(tempCps) && !doMark) {
-				control.clearSelection();
-				if (tempCps != null) {
-					control.addSelectedObject(tempCps);
-				}
-			}
-			if (dragging) {
-				try {
-					// tempCps in the upperNode? else its a connected Object from
-					// outside
-					if (groupNode.getObjectsInThisLayer().anyMatch(obj -> obj.equals(tempCps))) {
-						dragged = true;
-						float xDist, yDist; // Distance
-
-						x = e.getX();
-						y = e.getY();
-
-						// Make sure its in bounds
-						if (e.getX() < GuiSettings.getPictureScaleDiv2() + +5)
-							x = GuiSettings.getPictureScaleDiv2() + +5;
-						else if (e.getX() > this.getWidth() - GuiSettings.getPictureScaleDiv2())
-							x = this.getWidth() - GuiSettings.getPictureScaleDiv2();
-						if (e.getY() < GuiSettings.getPictureScaleDiv2())
-							y = GuiSettings.getPictureScaleDiv2();
-						else if (e.getY() > this.getHeight() - GuiSettings.getPictureScaleDiv2())
-							y = this.getHeight() - GuiSettings.getPictureScaleDiv2();
-
-						// Distance
-						xDist = x - tempCps.getPosition().getX();
-						yDist = y - tempCps.getPosition().getY();
-
-						tempCps.setPosition(x, y); // Drag Position
-
-						// TipText Position and name
-						toolTip = true;
-						toolTipText = tempCps.getName() + ", " + tempCps.getId();
-						toolTipPos.setX(tempCps.getPosition().getX() - GuiSettings.getPictureScaleDiv2());
-						toolTipPos.setY(tempCps.getPosition().getY() - GuiSettings.getPictureScaleDiv2());
-
-						// All Selected Objects
-						for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
-							if (cps != tempCps) {
-								x = (int) (cps.getPosition().getX() + xDist);
-								y = (int) (cps.getPosition().getY() + yDist);
-
-								// Make sure its in bounds
-								if (x < +5 + GuiSettings.getPictureScaleDiv2())
-									x = GuiSettings.getPictureScaleDiv2() + +5;
-								else if (x > this.getWidth() - GuiSettings.getPictureScaleDiv2())
-									x = this.getWidth() - GuiSettings.getPictureScaleDiv2();
-								if (y <= GuiSettings.getPictureScaleDiv2())
-									y = GuiSettings.getPictureScaleDiv2();
-								else if (y > this.getHeight() - GuiSettings.getPictureScaleDiv2())
-									y = this.getHeight() - GuiSettings.getPictureScaleDiv2();
-
-								cps.setPosition(x, y);
-							}
-						}
-					}
-					/**
-					 * check if something would be replaced
-					 */
-					if (GuiSettings.getSelectedObjects().size() == 1)
-						checkForReplacement(groupNode.getObjectsInThisLayer().toList(), tempCps, x, y);
-
-					repaint();
-				} catch (Exception eex) {
-
-				}
-
-			}
-
-			// Mark Objects
-			if (doMark) {
-				tempSelected.clear();
-				groupNode.getObjectsInThisLayer().forEach(cps -> 
-				{
-					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 <= cps.getPosition().getX() + GuiSettings.getPictureScaleDiv2()
-							&& y1 <= cps.getPosition().getY() + GuiSettings.getPictureScaleDiv2() && x2 >= cps.getPosition().getX()
-							&& y2 >= cps.getPosition().getY()) {
-						tempSelected.add(cps);
-					}
-				});
-			}
-
-			repaint();
-		}
-	}
-
-	@Override
-	public void mouseMoved(MouseEvent e) {
-		{
-			x = e.getX();
-			y = e.getY();
-			// Everything for the tooltip :)
-			boolean on = false;
-			Optional<AbstractCanvasObject> objectUnderCursor = groupNode.getObjectsInThisLayer().filter(cps -> {
-
-				cx = cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2();
-				cy = cps.getPosition().getY() - GuiSettings.getPictureScaleDiv2();
-				boolean mouseOverObject = x - GuiSettings.getPictureScale() <= cx && y - GuiSettings.getPictureScale() <= cy && x >= cx
-						&& y >= cy;
-				return mouseOverObject;
-			}).findAny();
-			on |= objectUnderCursor.isPresent();
-			objectUnderCursor.ifPresent(cps -> {
-				toolTipPos.setX(cps.getPosition().getX() - GuiSettings.getPictureScaleDiv2());
-				toolTipPos.setY(cps.getPosition().getY() + GuiSettings.getPictureScaleDiv2());
-				toolTipText = cps.getName() + ", " + cps.getId();
-			});
-
-			toolTip = on;
-			repaint();
-		}
-	}
-}

+ 2 - 3
src/holeg/ui/view/dialog/CanvasResizePopUp.java

@@ -6,7 +6,6 @@ import holeg.ui.controller.Control;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.model.Model;
 import holeg.ui.view.canvas.Canvas;
-import holeg.ui.view.canvas.GroupNodeCanvas;
 import holeg.utility.ImageImport;
 import holeg.utility.Vector2Int;
 
@@ -63,7 +62,7 @@ public class CanvasResizePopUp extends JDialog {
 				for (int i = 1; i < tabbedPane.getTabCount(); i++) {
 					if (tabbedPane.getComponentAt(i) != null) {
 						JScrollPane scollPane = (JScrollPane) tabbedPane.getComponentAt(i);
-						GroupNodeCanvas groupNodeCanvas = ((GroupNodeCanvas) (scollPane)
+						Canvas groupNodeCanvas = ((Canvas) (scollPane)
 								.getViewport().getComponent(0));
 						groupNodeCanvas.setPreferredSize(new Dimension(preferedSize));
 						groupNodeCanvas.repaint();
@@ -72,7 +71,7 @@ public class CanvasResizePopUp extends JDialog {
 				canvas.revalidate();
 				canvas.repaint();
 				
-				controller.getModel().getAllAbstractObjectsOnCanvas().stream().forEach(obj -> {
+				controller.getModel().getCanvas().getAllObjectsRecursive().forEach(obj -> {
 					Vector2Int position = obj.getPosition();
 					position.clampX(0, actualCanvasSize.getX());
 					position.clampY(0, actualCanvasSize.getY());

+ 0 - 289
src/holeg/ui/view/dialog/SearchPopUp.java

@@ -1,289 +0,0 @@
-package holeg.ui.view.dialog;
-
-import java.awt.BorderLayout;
-import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JTextField;
-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;
-
-/**
- * This Class represents a popup to seatch for Objects on the Canvas.
- * 
- * @author Gruppe14
- */
-public class SearchPopUp extends JDialog {
-
-	private static final long serialVersionUID = 1L;
-	private final JPanel contentPanel = new JPanel();
-	private JTextField replaceTextField;
-	private JTextField findTextField;
-	private Control control;
-	private Canvas canvas;
-	private JRadioButton rdbtnForward;
-	private JRadioButton rdbtnBackward;
-	private JRadioButton rdbtnAll;
-	private JRadioButton rdbtnSingle;
-	private int idx;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param contr
-	 *            Controller
-	 * @param can
-	 *            Canvas
-	 */
-    public SearchPopUp(Control contr, Canvas can, JFrame parentFrame) {
-        super((java.awt.Frame) null, true);
-		idx = -1;
-		setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
-		this.setTitle("Search for Objects");
-		setBounds(100, 100, 250, 360);
-        setLocationRelativeTo(parentFrame);
-        getContentPane().setLayout(new BorderLayout());
-		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
-		getContentPane().add(contentPanel, BorderLayout.CENTER);
-		contentPanel.setLayout(null);
-
-		this.control = contr;
-		this.canvas = can;
-
-		JLabel lblFind = new JLabel("Find" + ":");
-		lblFind.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		lblFind.setBounds(10, 11, 46, 19);
-		contentPanel.add(lblFind);
-
-		JLabel lblReplace = new JLabel("Replace" + ":");
-		lblReplace.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		lblReplace.setBounds(10, 41, 80, 14);
-		contentPanel.add(lblReplace);
-
-		// ReplaceTest
-		replaceTextField = new JTextField();
-		replaceTextField.setBounds(90, 39, 101, 20);
-		contentPanel.add(replaceTextField);
-		replaceTextField.setColumns(10);
-
-		// FindText
-		findTextField = new JTextField();
-		findTextField.setBounds(90, 11, 101, 20);
-		contentPanel.add(findTextField);
-		findTextField.setColumns(10);
-
-		JLabel lblNewLabel = new JLabel("Direction");
-		lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 13));
-		lblNewLabel.setBounds(10, 90, 82, 14);
-		contentPanel.add(lblNewLabel);
-
-		rdbtnForward = new JRadioButton("Forward");
-		rdbtnForward.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		rdbtnForward.setBounds(10, 111, 109, 23);
-		contentPanel.add(rdbtnForward);
-		rdbtnForward.setSelected(true);
-
-		rdbtnBackward = new JRadioButton("Backward");
-		rdbtnBackward.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		rdbtnBackward.setBounds(10, 137, 109, 23);
-		contentPanel.add(rdbtnBackward);
-
-		JLabel lblScope = new JLabel("Scope");
-		lblScope.setFont(new Font("Tahoma", Font.BOLD, 13));
-		lblScope.setBounds(122, 90, 60, 14);
-		contentPanel.add(lblScope);
-
-		rdbtnAll = new JRadioButton("All");
-		rdbtnAll.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		rdbtnAll.setBounds(121, 112, 109, 23);
-		contentPanel.add(rdbtnAll);
-		rdbtnAll.setSelected(true);
-
-		rdbtnSingle = new JRadioButton("Single");
-		rdbtnSingle.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		rdbtnSingle.setBounds(121, 138, 109, 23);
-		contentPanel.add(rdbtnSingle);
-
-		// FindButton
-		JButton btnFind = new JButton("Find");
-		btnFind.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				if (rdbtnAll.isSelected()) {
-					for (AbstractCanvasObject cps : control.getModel().getObjectsOnCanvas()) {
-
-						if (cps.getName().equals(findTextField.getText())
-								&& !GuiSettings.getSelectedObjects().contains(cps)) {
-							GuiSettings.getSelectedObjects().add(cps);
-						}
-
-					}
-
-				}
-				if (rdbtnSingle.isSelected()) {
-					GuiSettings.getSelectedObjects().clear();
-
-					if (!control.getModel().getObjectsOnCanvas().isEmpty() && !findTextField.getText().isEmpty()) {
-
-						if (rdbtnForward.isSelected()) {
-							if ((idx = getNext(++idx)) != -1)
-								GuiSettings.getSelectedObjects().add(getObj(idx));
-						} else if (rdbtnBackward.isSelected()) {
-							if ((idx = getPrev(--idx)) != -1)
-								GuiSettings.getSelectedObjects().add(getObj(idx));
-						}
-					}
-
-				}
-
-				canvas.repaint();
-			}
-		});
-		btnFind.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		btnFind.setBounds(10, 186, 110, 23);
-		contentPanel.add(btnFind);
-
-		// ReplaceButton
-		JButton btnReplace = new JButton("Replace");
-		btnReplace.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				//TODO(Tom2021-12-1) fix or remove SearchPopUp
-				System.out.println("REPLACE");
-				canvas.repaint();
-			}
-		});
-		btnReplace.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		btnReplace.setBounds(110, 187, 110, 23);
-		contentPanel.add(btnReplace);
-
-		// ReplaceAllButton
-		JButton btnReplaceAll = new JButton("Replace All");
-		btnReplaceAll.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				canvas.tempCps = null;
-				GuiSettings.getSelectedObjects().clear();
-
-				for (AbstractCanvasObject cps : control.getModel().getObjectsOnCanvas()) {
-					if (cps.getName().equals(findTextField.getText())
-							&& !GuiSettings.getSelectedObjects().contains(cps))
-						selectObj(cps);
-				}
-
-				for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
-					renameObj(cps, replaceTextField.getText());
-				}
-
-				canvas.repaint();
-			}
-		});
-		btnReplaceAll.setFont(new Font("Tahoma", Font.PLAIN, 11));
-		btnReplaceAll.setBounds(110, 218, 110, 23);
-		contentPanel.add(btnReplaceAll);
-
-		// CloseButton
-		JButton btnClose = new JButton("Close");
-		btnClose.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent arg0) {
-				dispose();
-			}
-		});
-		btnClose.setFont(new Font("Tahoma", Font.PLAIN, 13));
-		btnClose.setBounds(110, 287, 110, 23);
-		contentPanel.add(btnClose);
-
-		ButtonGroup directionbtns = new ButtonGroup();
-		ButtonGroup scopebtns = new ButtonGroup();
-
-		directionbtns.add(rdbtnBackward);
-		directionbtns.add(rdbtnForward);
-		scopebtns.add(rdbtnSingle);
-		scopebtns.add(rdbtnAll);
-
-	}
-
-	/**
-	 * add the searched Objects to the Selected Objects.
-	 * 
-	 * @param obj
-	 *            The Object
-	 */
-	public void selectObj(AbstractCanvasObject obj) {
-		GuiSettings.getSelectedObjects().add(obj);
-	}
-
-	/**
-	 * Rename an Object.
-	 * 
-	 * @param obj
-	 *            the Object
-	 * @param name
-	 *            the new name
-	 */
-	public void renameObj(AbstractCanvasObject obj, String name) {
-		obj.setName(name);
-	}
-
-	/**
-	 * get the Object with the specific ID.
-	 * 
-	 * @param idx
-	 *            the ID
-	 * @return the Object with that ID
-	 */
-	public AbstractCanvasObject getObj(int idx) {
-		return control.getModel().getObjectsOnCanvas().get(idx);
-	}
-
-	/**
-	 * Get the next Object ID.
-	 * 
-	 * @param idx
-	 *            the Index
-	 * @return the next Index
-	 */
-	public int getNext(int idx) {
-		for (int i = idx; i < control.getModel().getObjectsOnCanvas().size(); i++) {
-			if (getObj(i).getName().equals(findTextField.getText())
-					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
-				return i;
-		}
-		for (int i = 0; i < idx; i++) {
-			if (getObj(i).getName().equals(findTextField.getText())
-					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
-				return i;
-		}
-		return -1;
-	}
-
-	/**
-	 * Get the previous Index.
-	 * 
-	 * @param idx
-	 *            the Index
-	 * @return the previousIndex
-	 */
-	public int getPrev(int idx) {
-		for (int i = idx; i >= 0; i--) {
-			if (getObj(i).getName().equals(findTextField.getText())
-					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
-				return i;
-		}
-		for (int i = control.getModel().getObjectsOnCanvas().size() - 1; i > idx; i--) {
-			if (getObj(i).getName().equals(findTextField.getText())
-					&& !GuiSettings.getSelectedObjects().contains(getObj(i)))
-				return i;
-		}
-		return -1;
-	}
-}

+ 24 - 82
src/holeg/ui/view/main/GUI.java

@@ -27,7 +27,6 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Optional;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
@@ -39,7 +38,6 @@ import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
@@ -67,7 +65,6 @@ import org.apache.commons.compress.archivers.ArchiveException;
 import com.google.gson.JsonParseException;
 
 import holeg.model.AbstractCanvasObject;
-import holeg.model.Edge;
 import holeg.model.GroupNode;
 import holeg.model.HolonObject;
 import holeg.model.HolonSwitch;
@@ -75,20 +72,18 @@ import holeg.preferences.ColorPreference;
 import holeg.ui.controller.Control;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.model.IdCounter;
-import holeg.ui.model.Model;
 import holeg.ui.model.IdCounter.CounterType;
+import holeg.ui.model.Model;
 import holeg.ui.model.Model.FairnessModel;
 import holeg.ui.view.canvas.AbstractCanvas;
 import holeg.ui.view.canvas.Canvas;
-import holeg.ui.view.canvas.GroupNodeCanvas;
 import holeg.ui.view.component.ButtonTabComponent;
 import holeg.ui.view.dialog.AboutUsPopUp;
 import holeg.ui.view.dialog.AddObjectPopUp;
 import holeg.ui.view.dialog.CanvasResizePopUp;
 import holeg.ui.view.dialog.CreateNewDialog;
-import holeg.ui.view.dialog.EditEdgesPopUp;
-import holeg.ui.view.dialog.SearchPopUp;
 import holeg.ui.view.dialog.CreateNewDialog.Option;
+import holeg.ui.view.dialog.EditEdgesPopUp;
 import holeg.ui.view.information.HolonInformationPanel;
 import holeg.ui.view.inspector.Inspector;
 import holeg.ui.view.inspector.UnitGraph;
@@ -210,7 +205,6 @@ public class GUI {
 	private final JMenuItem mntmUndo = new JMenuItem("Undo");
 	private final JMenuItem mntmRedo = new JMenuItem("Redo");
 	private final JMenuItem mntmEditEdges = new JMenuItem("Edge Properties");
-	private final JMenuItem mntmFindReplace = new JMenuItem("Find/ Replace");
 	private final JMenuItem mntmAlignAll = new JMenuItem("Align All");
 	private final JMenuItem mntmResetCategory = new JMenuItem("Reset Categories");
 	// TODO(Tom2021-12-1) make GUI a JFRAME and remove holegJFrame
@@ -219,7 +213,7 @@ public class GUI {
 	// tabbedPaneOriginal or tabbedPaneSplit
 	private JTabbedPane tabTemp;
 	private String catOfObjToBeEdited;
-	private GroupNodeCanvas unc;
+	private Canvas unc;
 	private JPanel contentPane;
 	// Pop up Windows
 	private AddObjectPopUp addObjectPopUP;
@@ -257,10 +251,11 @@ public class GUI {
 		control.setGui(this);
 		control.calculateStateAndVisualForCurrentTimeStep();
 		this.unitGraph = new UnitGraph(control);
-		this.canvas = new Canvas(model, control, unitGraph);
+		this.canvas = new Canvas(control, unitGraph, model.getCanvas());
 		initialize();
 		updateCategories(GuiSettings.getCategories());
 		control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(GuiSettings.getCategories()));
+		this.unc = this.canvas;
 	}
 
 	/**
@@ -372,14 +367,11 @@ public class GUI {
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 				Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
 
-				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+				if (canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 					control.addSelectedObjects(
 							groupNodeCanvas.getGroupNode().getObjectsInThisLayer().collect(Collectors.toSet()));
 					groupNodeCanvas.repaint();
 					// or Canvas?
-				} else if (canvasOrUpperNodeCanvas instanceof Canvas) {
-					control.addSelectedObjects(model.getObjectsOnCanvas());
-					canvas.repaint();
 				}
 				control.getObjectsInDepth();
 			}
@@ -404,7 +396,7 @@ public class GUI {
 				// complete re-evaluation of the net)
 				boolean wasProducerDeleted = true;
 
-				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+				if (canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 					for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 						if (groupNodeCanvas.getGroupNode().getObjectsInThisLayer().anyMatch(object -> object == cps)) {
 							control.deleteObjectInGroupNode(cps, groupNodeCanvas.getGroupNode());
@@ -416,25 +408,6 @@ public class GUI {
 					}
 					groupNodeCanvas.repaint();
 					control.clearSelection();
-
-					// or Canvas?
-				} else if (canvasOrUpperNodeCanvas instanceof Canvas canvasPanel) {
-					// Edge Deleting
-					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 : GuiSettings.getSelectedObjects()) {
-						control.delCanvasObject(cps, false);
-						// remove UpperNodeTab if UpperNode deleted
-						removeUpperNodeTab(cps);
-					}
-					control.clearSelection();
-					control.tryAutoSave();
-					canvas.repaint();
 				}
 
 				// recalculate net if a producer was deleted
@@ -446,21 +419,6 @@ public class GUI {
 				GuiSettings.getSelectedObjects().clear();
 			}
 		});
-
-		String cntrlFDown = "controlF";
-		inputMap.put(KeyStroke.getKeyStroke("control F"), cntrlFDown);
-		actionMap.put(cntrlFDown, new AbstractAction() {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
-				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-				dialog.setVisible(true);
-			}
-		});
-
 		String cntrlCDown = "controlC";
 		inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
 		AbstractAction controlC = new AbstractAction() {
@@ -472,7 +430,7 @@ public class GUI {
 				System.out.println("heiCopy - control C");
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 				if (!GuiSettings.getSelectedObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas)
+					if (scrollPane.getViewport().getComponent(0)instanceof Canvas groupNodeCanvas)
 						control.copy(groupNodeCanvas.getGroupNode());
 					else
 						control.copy(null);
@@ -503,7 +461,7 @@ public class GUI {
 					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 					Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
 
-					if (tabTemp != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+					if (tabTemp != null && canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 
 						control.paste(groupNodeCanvas.getGroupNode(), canvasOrUpperNodeCanvas.getMousePosition());
 						control.calculateStateAndVisualForCurrentTimeStep();
@@ -532,7 +490,7 @@ public class GUI {
 				chooseTabTemp();
 				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 				if (!GuiSettings.getSelectedObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
+					if (scrollPane.getViewport().getComponent(0)instanceof Canvas groupNodeCanvas) {
 						control.cut(groupNodeCanvas.getGroupNode());
 						control.calculateStateAndVisualForCurrentTimeStep();
 						scrollPane.getViewport().getComponent(0).repaint();
@@ -566,18 +524,6 @@ public class GUI {
 		mnNewMenuEdit.add(mntmUndo);
 
 		mnNewMenuEdit.add(mntmRedo);
-		mntmFindReplace.addActionListener(actionEvent -> {
-			try {
-				SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
-				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-				dialog.setVisible(true);
-				control.getObjectsInDepth();
-			} catch (Exception ex) {
-				ex.printStackTrace();
-			}
-		});
-
-		mnNewMenuEdit.add(mntmFindReplace);
 		mnNewMenuEdit.add(mntmEditEdges);
 		mntmEditEdges.addActionListener(actionEvent -> {
 			EditEdgesPopUp edgePopUp = new EditEdgesPopUp(holegJFrame);
@@ -627,7 +573,7 @@ public class GUI {
 			control.calculateStateAndVisualForCurrentTimeStep();
 			// Update UpperNodes
 			Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
-			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 				groupNodeCanvas.repaint();
 			}
 		});
@@ -642,7 +588,7 @@ public class GUI {
 			control.calculateStateAndVisualForCurrentTimeStep();
 			// Update UpperNodes
 			Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
-			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+			if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 				groupNodeCanvas.repaint();
 			}
 		});
@@ -676,7 +622,7 @@ public class GUI {
 			if (spane != null) {
 				Component canvasOrUpperNodeCanvas = spane.getViewport().getComponent(0);
 				if (canvasOrUpperNodeCanvas != null
-						&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+						&& canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 					groupNodeCanvas.repaint();
 				}
 			}
@@ -814,7 +760,7 @@ public class GUI {
 					/**
 					 * check for replacements on the canvas
 					 */
-					if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+					if (canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 						if (unc.getMousePosition() == null)
 							return;
 						int x = (int) unc.getMousePosition().getX() + 16;
@@ -864,7 +810,7 @@ public class GUI {
 						JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 						Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
 
-						if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
+						if (canvasOrUpperNodeCanvas instanceof Canvas groupNodeCanvas) {
 							int x = (int) groupNodeCanvas.getMousePosition().getX() + 16;
 							int y = (int) groupNodeCanvas.getMousePosition().getY() + 16;
 
@@ -1128,7 +1074,7 @@ public class GUI {
 		holegJFrame.getContentPane().add(splitPane);
 
 		mntmNew.addActionListener(actionEvent -> {
-			if (model.getObjectsOnCanvas().size() != 0) {
+			if (model.getCanvas().getObjectsInThisLayer().findAny().isPresent()) {
 				int newWarning = JOptionPane.YES_NO_OPTION;
 				int dialogForNewWarning = JOptionPane.showConfirmDialog(holegJFrame, saveBeforeNew, warningText,
 						newWarning);
@@ -1141,8 +1087,7 @@ public class GUI {
 				tabbedPaneInnerOriginal.remove(1);
 			}
 			control.clearSelection();
-			model.getEdgesOnCanvas().clear();
-			model.getObjectsOnCanvas().clear();
+			model.clear();
 			control.OnSelectionChanged.broadcast();
 			GuiSettings.getSelectedEdges().clear();
 			control.getModel().setCurrentIteration(0);
@@ -1468,11 +1413,8 @@ public class GUI {
 
 		JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 		if (scrollPane.getViewport().getComponent(0)instanceof Canvas canvasPanel) {
-			unc = new GroupNodeCanvas(model, control, unitGraph, node, "", canvasPanel);
+			unc = new Canvas(control, unitGraph, node);
 
-		} else if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
-			unc = new GroupNodeCanvas(model, control, unitGraph, node, groupNodeCanvas.getParentPath() + " -> ",
-					scrollPane.getViewport().getComponent(0));
 		}
 
 		// check if tab already open for clicked NodeOfNode
@@ -1480,7 +1422,7 @@ public class GUI {
 
 		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
 			JScrollPane paneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
-			if (paneOriginal != null && ((GroupNodeCanvas) paneOriginal.getViewport().getComponent(0)).getGroupNode()
+			if (paneOriginal != null && ((Canvas) paneOriginal.getViewport().getComponent(0)).getGroupNode()
 					.getId() == node.getId()) {
 				dupl = true;
 				// set selected component to view
@@ -1516,7 +1458,7 @@ public class GUI {
 				continue;
 			}
 			Component pane = ((JScrollPane) c).getViewport().getComponent(0);
-			if (pane instanceof GroupNodeCanvas groupNodeCanvas) {
+			if (pane instanceof Canvas groupNodeCanvas) {
 				//TODO(Tom2021-12-20) maybe 
 				if(temp instanceof GroupNode node) {
 					groupNodeCanvas.setGroupNode(node);					
@@ -1538,7 +1480,7 @@ public class GUI {
 				JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
 
 				if (scrollPaneOriginal == null) {
-				} else if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode()
+				} else if (((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode()
 						.getId() == cps.getId()) {
 					((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
 					break;
@@ -1601,7 +1543,7 @@ public class GUI {
 		 */
 		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
 			JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
-			if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() == null) {
+			if (((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() == null) {
 				((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
 				break;
 			}
@@ -1626,8 +1568,8 @@ public class GUI {
 		canvas.disabled = state;
 		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
 			JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
-			if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() != null) {
-				((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).disabled = state;
+			if (((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() != null) {
+				((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).disabled = state;
 			}
 		}
 	}

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

@@ -48,7 +48,6 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreePath;
 
-import holeg.model.AbstractCanvasObject;
 import holeg.model.Constrain;
 import holeg.model.Flexibility;
 import holeg.model.Flexibility.FlexState;
@@ -377,12 +376,12 @@ public class FlexWindow extends JFrame {
 		
 		listOfAllSelectedHolonObjects.removeAllChildren();
 		//Init with HolonObjects
-		for(AbstractCanvasObject aCps: model.getObjectsOnCanvas()) {
+		model.getCanvas().getObjectsInThisLayer().forEach(aCps -> {
 			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
 			if(aCps instanceof HolonObject hO) expandTreeHolonObject(hO, newObjectChild);
 			if(aCps instanceof GroupNode groupnode)expandTreeUpperNode(groupnode, newObjectChild);
-			listOfAllSelectedHolonObjects.add(newObjectChild);
-		}
+			listOfAllSelectedHolonObjects.add(newObjectChild);			
+		});
 		treeModel.nodeStructureChanged(listOfAllSelectedHolonObjects);
 	
 		stateTree.revalidate();
@@ -437,11 +436,7 @@ public class FlexWindow extends JFrame {
 	
 	
 	private void createDeleteDialog() {
-		
-		List<HolonObject> list= model.getAllHolonObjectsOnCanvas();
-		
-		//String test = list.stream().map(Object::toString).collect(Collectors.joining(","));
-		Object[] allFlexes = list.stream().flatMap(hObject -> hObject.getElements().stream()).flatMap(hElement -> hElement.flexList.stream()).toArray(size -> new Flexibility[size]);
+		Object[] allFlexes = model.getCanvas().getAllHolonObjectsRecursive().flatMap(hObject -> hObject.getElements().stream()).flatMap(hElement -> hElement.flexList.stream()).toArray(size -> new Flexibility[size]);
 		if(allFlexes.length == 0) {
 			JOptionPane.showMessageDialog(this,
 					"No Flexibility exist.",
@@ -465,7 +460,7 @@ public class FlexWindow extends JFrame {
 
 	//Add Element
 	private void createAddDialog(HolonElement element){
-		if(model.getObjectsOnCanvas().isEmpty()) {
+		if(model.getCanvas().getAllHolonObjectsRecursive().findAny().isEmpty()) {
 			JOptionPane.showMessageDialog(this,
 					"No HolonObject exist.",
 					"Warning",
@@ -491,7 +486,7 @@ public class FlexWindow extends JFrame {
 		
 
 		//Erstelle HolonObject AuswahlBox
-		HolonObject[] holonObjects = model.getAllHolonObjectsOnCanvas().stream().toArray(HolonObject[]::new);
+		HolonObject[] holonObjects = model.getCanvas().getAllHolonObjectsRecursive().toArray(HolonObject[]::new);
 
 		DefaultComboBoxModel<HolonObject> comboBoxModel = new DefaultComboBoxModel<HolonObject>( holonObjects );
 

+ 0 - 1
src/holeg/utility/FormatFloat.java

@@ -28,7 +28,6 @@ public class FormatFloat {
 		return twoFormatter.format(value);
 	}
 	
-	
 	public static String doubleAllPlaces(double value) {
 		return formatter.format(value);
 	}

+ 1 - 0
src/holeg/utility/Maths.java

@@ -6,6 +6,7 @@ public class Maths {
 	public static double linearInterpolate(double first, double second, double alpha) {
 		return first * (1.0 - alpha) + second * alpha;
 	}
+	
 	public static double inverseLinearInterpolation(double min, double max, double value) {
 		if (Math.abs(max - min) < EPSILON) return max;
 		else return (value - min) / (max - min);