TomTroppmann 2 years ago
parent
commit
9ff09a7b9c

+ 0 - 430
src/ui/view/AbstractCanvas.java.orig

@@ -1,430 +0,0 @@
-package ui.view;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.Point;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.TimerTask;
-
-import javax.swing.CellEditor;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JTable;
-import javax.swing.Timer;
-
-import classes.AbstractCanvasObject;
-import classes.Edge;
-import classes.GroupNode;
-import classes.HolonElement;
-import classes.HolonObject;
-import classes.Node;
-import ui.controller.Control;
-import ui.controller.UpdateController;
-import ui.model.Model;
-import utility.Vector2Int;
-
-/**
- * Collection of methods and values needed in both <code>MyCanvas</code> and
- * <code>UpperNodeCanvas</code>
- * <p>
- * Although Java works on references we chose to add explicit return values for
- * clearer code understanding in most cases
- *
- * @author: I. Dix
- */
-public abstract class AbstractCanvas extends JPanel {
-	/**
-	 * Version
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	final JMenuItem itemCut = new JMenuItem("Cut");
-	final JMenuItem itemCopy = new JMenuItem("Copy");
-	final JMenuItem itemPaste = new JMenuItem("Paste");
-	final JMenuItem itemDelete = new JMenuItem("Delete");
-	final JMenuItem itemGroup = new JMenuItem("Group");
-	final JMenuItem itemUngroup = new JMenuItem("Ungroup");
-	final JMenuItem itemAlign = new JMenuItem("Align selected");
-	final JMenuItem itemCreateTemplate = new JMenuItem("Create Template");
-	
-	final int ANIMTIME = 500; // animation Time
-	private final int animFPS = 60;
-	final int animDelay = 1000 / animFPS; // animation Delay
-	protected Model model;
-	protected Control controller;
-	protected int x = 0;
-	protected int y = 0;
-	// Selection
-	AbstractCanvasObject tempCps = null;
-	UpdateController updCon;
-	
-	//Replacement
-	/**
-	 * the CpsObject that might be replaced by drag&drop
-	 */
-	protected AbstractCanvasObject mayBeReplaced = null;
-	
-	// PopUpMenu
-	JPopupMenu popmenu = new JPopupMenu();
-	// Tooltip
-	boolean toolTip; // Tooltip on or off
-	Vector2Int toolTipPos = new Vector2Int(); // Tooltip Position
-	String toolTipText = "";
-	List<HolonElement> dataSelected = new ArrayList<>();
-	ArrayList<AbstractCanvasObject> tempSelected = new ArrayList<>();
-	boolean[] showedInformation = new boolean[5];
-	boolean showConnectionInformation;
-	boolean dragging = false; // for dragging
-	boolean dragged = false; // if an object/objects was/were dragged
-	boolean drawEdge = false; // for drawing edges
-	boolean doMark = false; // for double click
-	Edge edgeHighlight = null;
-	Point mousePosition = new Point(); // Mouse Position when
-	ArrayList<Vector2Int> savePos;
-	// edge Object Start Point
-	int cx, cy;
-	int sx, sy; // Mark Coords
-	Vector2Int unPos;
-	// Animation
-	Timer animT; // animation Timer
-	int animDuration = ANIMTIME; // animation Duration
-	int animSteps = animDuration / animDelay; // animation Steps;
-	ArrayList<AbstractCanvasObject> animCps = null;
-	// Graphics
-	Image img = null; // Contains the image to draw on the Canvas
-	Graphics2D g2; // For Painting
-	float scalediv20;
-	// Mouse
-	private boolean click = false;
-
-	// ------------------------------------------ METHODS
-	// ------------------------------------------
-	
-
-	
-	
-
-	class ACpsHandle{
-		public AbstractCanvasObject object;
-		ACpsHandle(AbstractCanvasObject object){
-			this.object = object;
-		}
-		public String toString() {
-			return object.toString();
-		}
-	}
-
-	void drawMarker() {
-		if (sx > x && sy > y) {
-			g2.drawRect(x, y, sx - x, sy - y);
-		} else if (sx < x && sy < y) {
-			g2.drawRect(sx, sy, x - sx, y - sy);
-		} else if (sx >= x) {
-			g2.drawRect(x, sy, sx - x, y - sy);
-		} else if (sy >= y) {
-			g2.drawRect(sx, y, x - sx, sy - y);
-		}
-	}
-	/**
-	 * @deprecated
-	 * @param g
-	 */
-	void showTooltip(Graphics g) {
-		if (toolTip) {
-			g2.setColor(new Color(255, 225, 150));
-			g2.setStroke(new BasicStroke(1));
-			int textWidth = g.getFontMetrics().stringWidth(toolTipText) + 2; // Text
-			// width
-
-			// fixed x and y Position to the screen
-			int fixXPos = toolTipPos.getX() - (textWidth >> 1) + model.getScaleDiv2();
-			int fixYPos = toolTipPos.getY();
-
-			if (fixXPos < 0) {
-				fixXPos = 0;
-			} else if (fixXPos + textWidth + 1 > this.getWidth()) {
-				fixXPos -= (fixXPos + textWidth + 1) - this.getWidth();
-			}
-			if (fixYPos + 16 > this.getHeight()) {
-				fixYPos -= (fixYPos + 16) - this.getHeight();
-			}
-			g2.fillRect(fixXPos, fixYPos, textWidth, 15);
-			g2.setColor(Color.BLACK);
-			g2.drawRect(fixXPos, fixYPos, textWidth, 15);
-			g2.drawString(toolTipText, fixXPos + 2, fixYPos + 12);
-		}
-	}
-
-
-
-	void setRightClickMenu(MouseEvent e) {
-		if (e.getButton() == MouseEvent.BUTTON3) {
-			itemPaste.setEnabled(true);
-			if (tempCps != null) {
-				itemPaste.setEnabled(true);
-				itemDelete.setEnabled(true);
-				itemCut.setEnabled(true);
-				itemCopy.setEnabled(true);
-				itemAlign.setEnabled(true);
-				// tracking
-				if (tempCps != null) {
-					itemGroup.setEnabled(true);
-				}
-				// ungrouping
-				if (tempCps instanceof GroupNode)
-					itemUngroup.setEnabled(true);
-				else
-					itemUngroup.setEnabled(false);
-				if (model.getSelectedCpsObjects().size() == 0) {
-					controller.addSelectedObject(tempCps);
-				}
-				if (tempCps instanceof HolonObject) {
-					itemCreateTemplate.setEnabled(true);
-				} else {
-					itemCreateTemplate.setEnabled(false);
-				}
-			} else {
-				itemAlign.setEnabled(false);
-				itemCut.setEnabled(false);
-				itemCopy.setEnabled(false);
-				itemGroup.setEnabled(false);
-				itemUngroup.setEnabled(false);
-				itemCreateTemplate.setEnabled(false);
-				if (edgeHighlight != null) {
-					itemDelete.setEnabled(true);
-					itemPaste.setEnabled(false);
-				} else {
-					itemDelete.setEnabled(false);
-					itemPaste.setEnabled(true);
-				}
-			}
-			mousePosition = this.getMousePosition();
-			popmenu.show(e.getComponent(), e.getX(), e.getY());
-		}
-	}
-
-	void markObjects() {
-		if (doMark) {
-			doMark = false;
-			for (AbstractCanvasObject cps : tempSelected) {
-				if (!model.getSelectedCpsObjects().contains(cps)) {
-					controller.addSelectedObject(cps);
-				}
-			}
-			controller.getObjectsInDepth();
-			tempSelected.clear();
-		}
-	}
-
-
-	int[] determineMousePositionOnEdge(Edge p) {
-		int lx, ly, hx, hy;
-
-		if (p.getA().getPosition().getX() > p.getB().getPosition().getX()) {
-			hx = p.getA().getPosition().getX() + model.getScaleDiv2() + 7;
-			lx = p.getB().getPosition().getX() + model.getScaleDiv2() - 7;
-		} else {
-			lx = p.getA().getPosition().getX() + model.getScaleDiv2() - 7;
-			hx = p.getB().getPosition().getX() + model.getScaleDiv2() + 7;
-		}
-		if (p.getA().getPosition().getY() > p.getB().getPosition().getY()) {
-			hy = p.getA().getPosition().getY() + model.getScaleDiv2() + 7;
-			ly = p.getB().getPosition().getY() + model.getScaleDiv2() - 7;
-		} else {
-			ly = p.getA().getPosition().getY() + model.getScaleDiv2() - 7;
-			hy = p.getB().getPosition().getY() + model.getScaleDiv2() + 7;
-		}
-
-		return new int[] { lx, ly, hx, hy };
-	}
-
-	/**
-	 * Checks if a double click was made.
-	 *
-	 * @return true if doublecklick, false if not
-	 */
-	boolean doubleClick() {
-		if (click) {
-			click = false;
-			return true;
-		} else {
-			click = true;
-			java.util.Timer t = new java.util.Timer("doubleclickTimer", false);
-			t.schedule(new TimerTask() {
-				@Override
-				public void run() {
-					click = false;
-				}
-			}, 500);
-		}
-		return false;
-	}
-
-	boolean setToolTipInfoAndPosition(boolean on, AbstractCanvasObject cps) {
-		if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
-			on = true;
-			toolTipPos.setX(cps.getPosition().getX() - controller.getScaleDiv2());
-			toolTipPos.setY(cps.getPosition().getY() + controller.getScaleDiv2());
-			toolTipText = cps.getName() + ", " + cps.getId();
-		}
-
-		return on;
-	}
-
-	abstract void drawDeleteEdge();
-
-	void triggerUpdateController() {
-		updCon.paintProperties(tempCps);
-		updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
-		updCon.refreshTableProperties(model.getPropertyTable());
-	}
-	
-	
-	/**
-	 * Checks if {@code draggedCps} or a new cpsObject at Position (x,y) could replace exactly one object
-	 * in {@code objects}.
-	 * Saves the object that would be replaced in {@link AbstractCanvas}.{@code MayBeReplaced}
-	 * @param objects list of objects that could be replaced
-	 * @param draggedCps Object that might replace
-	 * @param x Position of the objects that might replace
-	 * @param y Position of the objects that might replace
-	 * @return true if exactly one Object could be replaced 
-	 */
-	protected boolean checkForReplacement(ArrayList<AbstractCanvasObject> objects, AbstractCanvasObject draggedCps, int x, int y){
-		
-		/** distance treshold for replacement */
-		int treshhold = controller.getScale()/2;
-						
-		/** number of Objects that might be replaced (should be 1) */
-		int replaceCounter = 0;
-		
-		/** last object that could be replaced */
-		AbstractCanvasObject toBeReplaced = null;
-		
-		/** Position of object that might be replaced */
-		Vector2Int p;
-		
-		/** for each cps on Canvas */
-		if(draggedCps == null || !(draggedCps instanceof Node) && !(draggedCps instanceof Node)){
-			for (AbstractCanvasObject cps : objects){
-				/** same object -> ignore */
-				if(cps == draggedCps)continue;
-						
-				/** set Position of object that might be replaced */
-				p = cps.getPosition();
-				
-				/** if near enough */
-				if(Math.abs(x-p.getX())<treshhold && Math.abs(y-p.getY())<treshhold){
-					replaceCounter++;
-					toBeReplaced = cps;
-					
-					/**
-					 * if too many Objects could be replaced:
-					 * stop searching, because it would not be clear which one should
-					 * be replaced
-					 */
-					if(replaceCounter>1)break;
-				}
-			}
-		}
-		/**
-		 * return true if exactly one obect would be replaced
-		 */
-		if( replaceCounter == 1 && toBeReplaced != null){
-			mayBeReplaced = toBeReplaced;
-			return true;
-		}else{
-			mayBeReplaced = null;
-			return false;
-		}
-	}
-	
-	/**
-	 * Checks if an inserted new Object could replace exactly one object on the canvas.
-	 * Saves the object that would be replaced in {@link AbstractCanvas}.{@code MayBeReplaced}
-	 * @param x Position of the objects that might replace
-	 * @param y Position of the objects that might replace
-	 * @return true if exactly one Object could be replaced 
-	 */
-	public abstract boolean checkForReplacement(int x, int y);
-	
-		
-	/**
-	 * highlights the object that mayBeReplaced
-	 * @param g2
-	 */
-	protected void highlightMayBeReplaced(Graphics2D g2) {
-		if(mayBeReplaced != null){
-			g2.setColor(Color.RED);
-			g2.fillRect(
-					(int) (mayBeReplaced.getPosition().getX()
-							- controller.getScaleDiv2() - (scalediv20 + 3)),
-					(int) (mayBeReplaced.getPosition().getY()
-							- controller.getScaleDiv2() - (scalediv20 + 3)),
-					(int) (controller.getScale() + ((scalediv20 + 3) * 2)),
-					(int) (controller.getScale() + ((scalediv20 + 3) * 2)));
-		}
-	}
-	
-	/**
-	 * Align alle Objects on the Canvas to a Grid with objects every 10 pixels
-	 */
-	public abstract void tryToAlignObjects();
-
-	/**
-	 * Aligns the Object the a grid
-	 * @param cps Object that should be aligned
-	 * @param distance distance between the AlignmentGrid Lines. (objects every 'distance' pixels
-	 */
-	protected void align(AbstractCanvasObject cps, int distance) {
-		/** Position of the AbstractCpsObject which should be aligned */
-		Vector2Int p = cps.getPosition();
-		
-		//calculate how many pixels the cps should be decreased to align
-		/** x offset relative to a grid with lines every distance pixels */
-		int x_off = cps.getPosition().getX() % distance;
-		
-		/** y offset relative to a grid with lines every distance pixels */
-		int y_off = cps.getPosition().getY() % distance;
-		
-		//align to the other Line, if it is nearer
-		if(x_off > distance/2)
-			x_off -= distance;
-		if(y_off > distance/2)
-			y_off -= distance;
-		
-		/** set new Position */
-		cps.setPosition(p.getX()-x_off, p.getY()-y_off);
-	}
-	
-	/**
-	 * Stops Editing in HolonElementTable and PropertyTable
-	 */
-	protected void stopEditing() {
-		/**
-		 * Stop Editing, if mouse exits the Table
-		 */
-		JTable holElem = model.getTableHolonElement();
-		CellEditor cellEditor = holElem.getCellEditor();
-		if (cellEditor != null) {
-		    if (cellEditor.getCellEditorValue() != null) {
-		    	/** TODO: Maybe try to save current Data */
-		        cellEditor.stopCellEditing();
-		    } else {
-		        cellEditor.cancelCellEditing();
-		    }
-		}
-	}
-
-	/**
-	 * Closes a tab of the UpperNode with ID upperNodeID
-	 * @param upperNodeId
-	 */
-	public abstract void closeUpperNodeTab(int upperNodeId);
-}

+ 0 - 2686
src/ui/view/GUI.java.orig

@@ -1,2686 +0,0 @@
-package ui.view;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.GraphicsDevice;
-import java.awt.GraphicsEnvironment;
-import java.awt.HeadlessException;
-import java.awt.Image;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionAdapter;
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import javax.swing.AbstractAction;
-import javax.swing.ActionMap;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.CellEditor;
-import javax.swing.GrayFilter;
-import javax.swing.ImageIcon;
-import javax.swing.InputMap;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.JToolBar;
-import javax.swing.JTree;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.DefaultTableModel;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeCellRenderer;
-
-import org.apache.commons.compress.archivers.ArchiveException;
-import com.google.gson.JsonParseException;
-
-import classes.AbstractCanvasObject;
-import classes.Category;
-import classes.Edge;
-import classes.GroupNode;
-import classes.HolonElement;
-import classes.HolonObject;
-import classes.HolonSwitch;
-import classes.IdCounter;
-import classes.IdCounter.CounterType;
-import interfaces.GraphEditable;
-import ui.controller.Control;
-import ui.controller.UpdateController;
-import ui.model.DecoratedState;
-import ui.model.Model;
-import ui.model.Model.FairnessModel;
-import ui.view.CreateNewDialog.Option;
-import utility.Event;
-import utility.ImageImport;
-
-/**
- * Graphical User Interface.
- *
- * @author Gruppe14
- */
-public class GUI{
-	
-	static final Color PALE_RED=new Color(255, 192, 192);
-	
-	
-	
-	
-	
-	/**
-	 * Menu on the Top containing File, Edit View Help etc
-	 */
-	private final JMenuBar menuBar = new JMenuBar();
-	private final JMenu mnNewMenu = new JMenu("File");
-	private final JMenu mnNewMenuEdit = new JMenu("Edit");
-	private final JMenu mnNewMenuOptions = new JMenu("Options");
-	private final JMenu mnNewMenuView = new JMenu("View");
-	private final JMenu menuWindow = new JMenu("Window");
-	
-	
-	private final HolonInformationPanel informationPanel;
-	
-	/** Help Menu containing helpful Informations and the AboutUs Popup */
-	private final JMenu mnHelp = new JMenu("Help");
-	
-	/** 
-	 * Help -> Introduction
-	 * A small Introduction of the Application, SmartGrids and Holons 
-	 */
-	private final JMenuItem mntmIntroduction = new JMenuItem("Introduction");
-
-	/** 
-	 * Help -> UserManual
-	 */
-	private final JMenuItem mntmUserManual = new JMenuItem("User Manual");
-	
-	/** Help -> Algorithm Help Menu */
-	private final JMenuItem mntmAlgorithmHelp = new JMenuItem("Algorithm Introduction");
-	
-	/** Help -> CodeDocumentation */
-	private final JMenuItem mntmCodeDoc = new JMenuItem("Code Documentation");
-	
-	/** Help -> AboutUs */
-	private final JMenuItem mntmAboutUs = new JMenuItem("About Us");
-	/** checked if supplyBars should be shown */
-	private final JCheckBoxMenuItem showSupplyBarsCheckBox = new JCheckBoxMenuItem(
-			"Show supply bars.");
-	/** menu for the different fairness Models */
-	private final JMenu mnFairnessModel = new JMenu("Fairness Model");
-	/** press to supply minimum demand first */
-	private final JMenuItem mntmFairMinFirst = new JMenuItem(
-			"Minimum demand first");
-	/** press to give everyone the same energy */
-	private final JMenuItem mntmFairAlleEqual = new JMenuItem(
-			"Equal supply for everyone");
-	private final JMenuItem mntmOpen = new JMenuItem("Open");
-	private final JMenuItem mntmNew = new JMenuItem("New");
-	private final JMenuItem mntmSave = new JMenuItem("Save");
-	private final JMenuItem mntmCanvasSize = new JMenuItem("Set View Size");
-	private final JMenuItem mntmBackground = new JMenuItem("Set Background Image");
-	private final JSplitPane splitPane = new JSplitPane();
-	private final JSplitPane splitPane1 = new JSplitPane();
-	// the tabbed canvas containing the different sub-net tabs of the grid (Main
-	// Grid + Nodes of Nodes)
-
-	private final JPanel myPanel = new JPanel(new BorderLayout());
-	private final JTabbedPane tabbedPaneInnerOriginal = new JTabbedPane(
-			JTabbedPane.TOP);
-	// the main canvas where we can see the grid currently displayed
-	private final JScrollPane canvasSP = new JScrollPane();
-	private final JScrollPane scrollPane1 = new JScrollPane();
-	// private final JScrollPane holonSP = new JScrollPane();
-	// the original tabbed Pane (containing tabs for view, statistics, holon,
-	// flexibility)
-	private final JTabbedPane tabbedPaneOriginal = new JTabbedPane(
-			JTabbedPane.TOP);
-	// the same tabbed Pane that appears once the view is split
-	private final JTabbedPane tabbedPaneSplit = new JTabbedPane(JTabbedPane.TOP);
-	private final JPopupMenu popmenuEdit = new JPopupMenu();
-	private final JMenuItem editItem = new JMenuItem("Edit Object");
-	private final JLabel maxGraph = new JLabel("100%");
-	private final JLabel medGraph = new JLabel("50%");
-	private final JLabel minGraph = new JLabel("0%");
-	private final JLabel elementGraph = new JLabel("None ");
-	private final ArrayList<HolonElement> selectedElements = new ArrayList<>();
-	private final JTree categoryTree = new JTree();
-	/******************************************
-	 ************* Right Container*************
-	 ******************************************
-	 * Right Container: here comes the information about the HolonObject, such
-	 * as HolonElements Information, Properties and Consumption/Production
-	 * graph.
-	 **/
-	private final JSplitPane splitHolonElPro = new JSplitPane(
-			JSplitPane.VERTICAL_SPLIT);
-	private final JSplitPane splitGraphHolonEl = new JSplitPane(
-			JSplitPane.VERTICAL_SPLIT);
-	private final int distanceBetweenElementsAndGraph = 350;
-	// Model for single or multi selection
-	private final JPanel scrollElements = new JPanel();
-	private final JScrollPane tableHolonElementScrollPane = new JScrollPane();
-
-	//Prechoosed local Periods
-	private String[] comboContext = {
-	         "", "5", "10", "20" ,"100", "1000"
-	};
-	private JComboBox<String> localPeriodInput = new JComboBox<String>(comboContext);
-	JButton resetButton = new JButton("", new ImageIcon(ImageImport.loadImage("/Images/resetIcon3.png")));
-	ImageIcon localPeriodButtonImage = new ImageIcon(GrayFilter.createDisabledImage(ImageImport.loadImage("/Images/Graph.png")));
-	private JButton localPeriodButton = new JButton("", localPeriodButtonImage);
-	private final JPanel graphLabel = new JPanel();
-	private final JScrollPane scrollProperties = new JScrollPane();
-	// In this section is the graph for the selected HolonElement of the clicked
-	// HolonObject
-	private final DefaultTableModel tableModelGraph = new DefaultTableModel();
-	private final JScrollPane scrollGraph = new JScrollPane();
-	private final Model model;
-	private final Control controller;
-
-	// In this section are all the Holonelements that correspond to the clicked
-	// HolonObject with consumption/production, name and amount.
-	private final JPanel panel = new JPanel();
-	private final JPanel panelHolonEl = new JPanel();
-	// Buttons
-
-	private final JButton btnAdd = new JButton();
-	private final JPopupMenu btnAddPopUp = new JPopupMenu("Newacac");
-	private final JMenuItem mItemNew = new JMenuItem("New..");
-	private final JMenuItem mItemCategory = new JMenuItem("Category");
-	private final JMenuItem mItemObject = new JMenuItem("Object");
-	private final JMenuItem mItemSwitch = new JMenuItem("Switch");
-	private final JButton btnDel = new JButton();
-	private final JButton btnAddHolEL = new JButton();
-	private final JButton btnDelHolEL = new JButton();
-
-	private final JToolBar toolBar = new JToolBar();
-	private final JToolBar toolBarHolonEl = new JToolBar();
-	private final JToolBar toolBarGraph = new JToolBar();
-	// Languages
-	private final MyCanvas canvas;
-	private final UnitGraph unitGraph;
-	/** Textfield to show the period of an element */
-	private final JTextField unitGraphLocalPeriod = new JTextField(6);
-	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");
-	private final String[] columnNamesMulti = { "Object", "Nr.", "Device",
-			"Energy", "Flexibility active", "Quantity", "Activated" };
-	private final String[] columnNamesSingle = { "Nr.", "Device", "Energy",
-			"Flexibility active", "Quantity", "Activated" };
-	private final ArrayList<PropertyTable> tables = new ArrayList<>();
-	private final UpdateController updCon;
-	// for doubleclick
-	private boolean click = false;
-	private JFrame holegJFrame;
-	private JTabbedPane tabTemp; // tabbedPaneOriginal or tabbedPaneSplit
-	private boolean initSplit = true;
-	private String catOfObjToBeEdited;
-	private GroupNodeCanvas unc;
-	private JPanel contentPane;
-	private String holonEleNamesDisplayed = "None ";
-	// Pop up Windows
-	private AddObjectPopUp addObjectPopUP;
-	private AboutUsPopUp aboutUsPopUp;
-	private AddElementPopUp addElementPopUp;
-	// variables
-	private boolean dragging = false;
-	private String actualObjectClicked;
-	private Image img = null;
-	private AbstractCanvasObject tempCps = null;
-	private int yValueElements = 0;
-	// Time Stuff
-	private TimePanel timePanel;
-	public TimePanel getTimePanel() {
-		return timePanel;
-	}
-
-	// Coord for all Cells with text
-	private int yThis;
-	private int xThis;
-	// Coord for all Cells with boolean values (checkbox)
-	private int yBTis;
-	private int xBThis;
-	// Coord for the Edit-Modus in the PropertieTable
-	private AbstractCanvasObject temp = null;
-	private String warningText = "Warning";
-	private String saveBeforeNew = "Do you want to save your current data?";
-	private String eraseCategory = "Do you really want to delete the Category ";
-	private String selectObjBeforeErase = "Please select a Category or an Object in the left library in order to delete something.";
-
-	
-	private List<Outliner> outlinerList = new ArrayList<Outliner>();
-	private List<FlexWindow> flexList = new ArrayList<FlexWindow>();
-
-	private JMenuItem removeItem = new JMenuItem("Remove");
-
-	
-	/**
-	 * Create the application.
-	 *
-	 * @param control
-	 *            the Controller
-	 */
-	GUI(Control control) {
-		this.controller = control;
-		this.informationPanel = new HolonInformationPanel(control);
-		this.model = control.getModel();
-		control.setGui(this);
-		this.unitGraph = new UnitGraph(model, control);
-		this.canvas = new MyCanvas(model, control, unitGraph);
-		initialize();
-		updateCategories(model.getCategories());
-		updCon = new UpdateController(model, controller);
-		control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(model.getCategories()));
-	}
-
-
-	/**
-	 * Initialize the contents of the frame.
-	 */
-	private void initialize() {
-		holegJFrame = new JFrame();
-		holegJFrame.setTitle("HOLEG Simulator");
-		// try to restore old position/dimensions
-		ArrayList<Integer> savedWindowDim = controller
-				.loadSavedWindowDimensionsIfExistent();
-		if (savedWindowDim.size() == 4) {
-			holegJFrame.setBounds(savedWindowDim.get(0),
-					savedWindowDim.get(1), savedWindowDim.get(2),
-					savedWindowDim.get(3));
-		}
-
-		// if the upper part of the window is showing, the windows can still be
-		// moved,
-		// but if it is not, we need to move it to somewhere else
-		if (savedWindowDim.size() != 4 || !isUpperPanelInsideBounds()) {
-			holegJFrame.setBounds(100, 100, 1000, 800);
-			holegJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
-		}
-		holegJFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
-
-		holegJFrame.addWindowListener(new java.awt.event.WindowAdapter() {
-			@Override
-			public void windowClosing(java.awt.event.WindowEvent windowEvent) {
-				if (JOptionPane.showConfirmDialog(holegJFrame,
-						"Are you sure you want to exit?",
-						"HOLEG",
-						JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
-					controller.deleteDirectory(new File(System
-							.getProperty("user.home")
-							+ "/.config/HolonGUI/Autosave"));
-
-					// try to save the position and size of the window, such
-					// that (if possible)
-					// it can be opened in the same position the next time
-					try {
-						controller.savePosAndSizeOfWindow(
-								holegJFrame.getX(),
-								holegJFrame.getY(),
-								holegJFrame.getWidth(),
-								holegJFrame.getHeight());
-					} catch (Exception e) {
-						e.printStackTrace();
-					}
-					System.exit(1);
-				}
-				System.exit(0);
-			}
-		});
-
-		contentPane = (JPanel) holegJFrame.getContentPane();
-
-		int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
-		InputMap inputMap = contentPane.getInputMap(condition);
-		ActionMap actionMap = contentPane.getActionMap();
-
-		String cntrlZDown = "controlZ";
-		inputMap.put(KeyStroke.getKeyStroke("control Z"), cntrlZDown);
-		actionMap.put(cntrlZDown, new AbstractAction() {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				try {
-					controller.loadAutoSave(controller.getUndoSave());
-					closeInvalidUpperNodeTabs();
-					
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					canvas.repaint();
-					updateUpperNodes();
-				} catch (IOException eex) {
-					eex.printStackTrace();
-				}
-			}
-		});
-
-		String cntrlYDown = "controlY";
-		inputMap.put(KeyStroke.getKeyStroke("control Y"), cntrlYDown);
-		actionMap.put(cntrlYDown, new AbstractAction() {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				try {
-					controller.loadAutoSave(controller.getRedoSave());
-
-					closeInvalidUpperNodeTabs();
-					
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					canvas.repaint();
-					updateUpperNodes();
-				} catch (IOException ex) {
-					ex.printStackTrace();
-				}
-			}
-		});
-
-		String cntrlADown = "controlA";
-		inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
-		AbstractAction controlA = new AbstractAction() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				chooseTabTemp();
-
-				controller.clearSelection();
-
-				// Uppernode Canvas?
-				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				Component canvasOrUpperNodeCanvas = scrollPane.getViewport()
-						.getComponent(0);
-
-				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-					GroupNodeCanvas uNC = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
-					for (AbstractCanvasObject cps : uNC.upperNode.getNodes()) {
-						controller.addSelectedObject(cps);
-					}
-					uNC.repaint();
-					// or Canvas?
-				} else if (canvasOrUpperNodeCanvas instanceof MyCanvas) {
-					for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-						controller.addSelectedObject(cps);
-					}
-					canvas.repaint();
-				}
-				controller.getObjectsInDepth();
-
-			}
-		};
-		actionMap.put(cntrlADown, controlA);
-
-		String delDown = "delete";
-		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false),
-				delDown);
-		actionMap.put(delDown, new AbstractAction() {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				chooseTabTemp();
-
-				// Uppernode Canvas?
-				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				Component canvasOrUpperNodeCanvas = scrollPane.getViewport()
-						.getComponent(0);
-
-				// check whether a producer was deleted (this triggers a
-				// complete re-evaluation of the net)
-				boolean wasProducerDeleted = true;
-
-				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-					GroupNodeCanvas uNC = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
-					for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-						if (uNC.upperNode.getNodes().contains(cps)) {
-							controller.delObjUpperNode(cps, uNC.upperNode);
-							unc.setToolTip(false);
-
-							// remove UpperNodeTab if UpperNode deleted
-							removeUpperNodeTab(cps);
-						}
-					}
-					uNC.repaint();
-
-					// or Canvas?
-				} else if (canvasOrUpperNodeCanvas instanceof MyCanvas) {
-					boolean save = false;
-					// Edge Deleting
-					Edge edgeHighlight = model.getSelectedEdge();
-					if (edgeHighlight != null) {
-						controller.removeEdgesOnCanvas(edgeHighlight);
-						((MyCanvas) canvasOrUpperNodeCanvas).edgeHighlight = null;
-					}
-					for (int j = 0; j < model.getSelectedCpsObjects().size(); j++) {
-						AbstractCanvasObject cps = model.getSelectedCpsObjects()
-								.get(j);
-						if (j < model.getSelectedCpsObjects().size() - 1)
-							save = true;
-						controller.delCanvasObject(cps, save);
-						canvas.setToolTip(false);
-
-						// remove UpperNodeTab if UpperNode deleted
-						removeUpperNodeTab(cps);
-					}
-					canvas.repaint();
-				}
-
-				// recalculate net if a producer was deleted
-				if (wasProducerDeleted) {
-					controller.resetSimulation();
-					controller.calculateStateAndVisualForCurrentTimeStep();
-				}
-
-				controller.clearSelection();
-				hideScrollGraph();
-			}
-		});
-
-		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(controller, 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() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				chooseTabTemp();
-
-				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				if (!model.getSelectedCpsObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas)
-						controller.copy(((GroupNodeCanvas) scrollPane
-								.getViewport().getComponent(0)).upperNode);
-					else
-						controller.copy(null);
-					if (!model.getClipboradObjects().isEmpty()) {
-						canvas.itemPaste.setEnabled(true);
-					}
-				}
-			}
-		};
-		actionMap.put(cntrlCDown, controlC);
-
-		String cntrlVDown = "controlV";
-		inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
-		AbstractAction controlV = new AbstractAction() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				try {
-					tabTemp = null;
-					if (tabbedPaneOriginal.getMousePosition() != null) {
-						tabTemp = tabbedPaneOriginal;
-					} else {
-						if (!initSplit) {
-							tabTemp = tabbedPaneSplit;
-						}
-					}
-
-					if(tabTemp == null)return;
-					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-					Component canvasOrUpperNodeCanvas = scrollPane
-							.getViewport().getComponent(0);
-
-					if (tabTemp != null
-							&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-
-						controller
-								.paste(((GroupNodeCanvas) canvasOrUpperNodeCanvas).upperNode,
-										canvasOrUpperNodeCanvas
-												.getMousePosition());
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						scrollPane.getViewport().getComponent(0).repaint();
-					} else {
-						controller.paste(null, canvas.getMousePosition());
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						canvas.repaint();
-					}
-				} catch (HeadlessException | JsonParseException
-						| UnsupportedFlavorException | IOException e1) {
-					JLabel message = new JLabel(
-							"The Clipboard information cannot be pasted into Application.");
-					JOptionPane.showMessageDialog(holegJFrame, message,
-							"", JOptionPane.ERROR_MESSAGE);
-				}
-
-			}
-		};
-		actionMap.put(cntrlVDown, controlV);
-
-		String cntrlXDown = "controlX";
-		inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
-		AbstractAction controlX = new AbstractAction() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				chooseTabTemp();
-
-				JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-				if (!model.getSelectedCpsObjects().isEmpty()) {
-					if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas) {
-						controller.cut(((GroupNodeCanvas) scrollPane
-								.getViewport().getComponent(0)).upperNode);
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						scrollPane.getViewport().getComponent(0).repaint();
-					} else {
-						controller.cut(null);
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						canvas.repaint();
-					}
-					if (!model.getClipboradObjects().isEmpty()) {
-						canvas.itemPaste.setEnabled(true);
-					}
-				}
-			}
-		};
-		actionMap.put(cntrlXDown, controlX);
-
-		holegJFrame.setJMenuBar(menuBar);
-
-		holegJFrame.setIconImage(ImageImport.loadImage(
-				"/Images/Holeg.png", 30, 30));
-
-		menuBar.add(mnNewMenu);
-
-		mnNewMenu.add(mntmNew);
-
-		mnNewMenu.add(mntmOpen);
-
-		mnNewMenu.add(mntmSave);
-
-		menuBar.add(mnNewMenuEdit);
-
-		mnNewMenuEdit.add(mntmUndo);
-
-		mnNewMenuEdit.add(mntmRedo);
-		mntmFindReplace.addActionListener(actionEvent -> {
-			try {
-				SearchPopUp dialog = new SearchPopUp(controller, canvas,
-						holegJFrame);
-				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-				dialog.setVisible(true);
-				controller.getObjectsInDepth();
-			} catch (Exception ex) {
-				ex.printStackTrace();
-			}
-		});
-
-		mnNewMenuEdit.add(mntmFindReplace);
-		mnNewMenuEdit.add(mntmEditEdges);
-		mntmEditEdges.addActionListener(actionEvent -> {
-			EditEdgesPopUp edgePopUp = new EditEdgesPopUp(holegJFrame);
-			edgePopUp.setCanvas(canvas);
-			edgePopUp.setController(controller);
-			edgePopUp.setVisible(true);
-		});
-		
-		
-		//Edit -> Align All
-		
-		mnNewMenuEdit.add(mntmAlignAll);
-		mntmAlignAll.addActionListener(actionEvent -> {
-			// getScrollPaneFromTabbedPane().getViewport().getComponent(0) is always the active canvas
-			AbstractCanvas activeCanvas = ((AbstractCanvas) getScrollPaneFromTabbedPane().getViewport().getComponent(0));
-			if (activeCanvas != null) {
-				activeCanvas.tryToAlignObjects();
-				activeCanvas.repaint();
-			}
-		});
-		
-		
-		menuBar.add(mnNewMenuOptions);
-
-		mnNewMenuOptions.add(mntmResetCategory);
-		mntmResetCategory.addActionListener(actionEvent -> {
-			ArrayList<Category> cat = model.getCategories();
-			try {
-				while (!cat.isEmpty()) {
-					controller.deleteCategory(cat.get(0).getName());
-
-				}
-				controller.resetCategorys();
-			} catch (Exception e2) {
-				System.out.println(e2.getMessage());
-			}
-			categoryTree.revalidate();
-			categoryTree.repaint();
-		});
-
-
-		/**
-		 * Add Fairness Model Option to the option Menu
-		 */
-		mnNewMenuOptions.add(mnFairnessModel);
-
-		mnFairnessModel.add(mntmFairMinFirst);
-		mntmFairMinFirst.setForeground(Color.BLUE);
-		mntmFairMinFirst
-				.setToolTipText("HolonObjects with the smallest mininum Demand will be partially supplied first.\n"
-						+ "After that as many HolonObjects as possible will get fully supplied.");
-
-		mntmFairMinFirst
-				.addActionListener(arg0 -> {
-					controller.setFairnessModel(FairnessModel.MininumDemandFirst);
-					mntmFairMinFirst.setForeground(Color.BLUE);
-					mntmFairAlleEqual.setForeground(mnFairnessModel
-							.getForeground());
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					// Update UpperNodes
-					Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane()
-							.getViewport().getComponent(0);
-					if (canvasOrUpperNodeCanvas != null
-							&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-						((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
-					}
-				});
-
-		mnFairnessModel.add(mntmFairAlleEqual);
-		mntmFairAlleEqual
-				.setToolTipText("HolonObjects will all get the same amount of energy.");
-
-		mntmFairAlleEqual.addActionListener(arg0 -> {
-			controller.setFairnessModel(FairnessModel.AllEqual);
-			mntmFairAlleEqual.setForeground(Color.BLUE);
-			mntmFairMinFirst.setForeground(mnFairnessModel.getForeground());
-			controller.calculateStateAndVisualForCurrentTimeStep();
-			// Update UpperNodes
-				Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane()
-						.getViewport().getComponent(0);
-				if (canvasOrUpperNodeCanvas != null
-						&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-					((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
-				}
-			});
-
-		menuBar.add(mnNewMenuView);
-
-		mnNewMenuView.add(mntmCanvasSize);
-		mntmCanvasSize.addActionListener(actionEvent -> {
-			CanvasResizePopUp popUp = new CanvasResizePopUp(model, controller,
-					canvas, tabbedPaneOriginal, tabbedPaneSplit,
-					holegJFrame);
-			popUp.setVisible(true);
-		});
-		
-		mnNewMenuView.add(mntmCanvasSize);
-
-		/*
-		 * Adds Checkbox to turn supply bars on/off
-		 */
-		mnNewMenuView.add(showSupplyBarsCheckBox);
-		showSupplyBarsCheckBox.setSelected(true);
-		showSupplyBarsCheckBox.addActionListener(arg0 -> {
-			controller.setShowSupplyBars(showSupplyBarsCheckBox.isSelected());
-
-			canvas.repaint();
-
-			// Update UpperNodes
-				JScrollPane spane = getScrollPaneFromTabbedPane();
-				if(spane != null){
-					Component canvasOrUpperNodeCanvas = spane.getViewport().getComponent(0);
-					if (canvasOrUpperNodeCanvas != null
-							&& canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-						((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
-					}
-				}
-			});
-		initWindowMenu();
-		
-		
-		
-		
-		mnNewMenuView.add(mntmBackground);
-
-		mntmBackground
-				.addActionListener(actionEvent -> {
-					tabTemp = tabbedPaneOriginal;
-					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-
-					if (scrollPane.getViewport().getComponent(0) instanceof MyCanvas) {
-						BackgroundPopUp backgroundDialog = new BackgroundPopUp(
-								model, controller, canvas, null,
-								holegJFrame);
-						backgroundDialog
-								.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-						backgroundDialog.setVisible(true);
-					} else if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas) {
-						GroupNodeCanvas uNodeCanvas = (GroupNodeCanvas) (scrollPane
-								.getViewport().getComponent(0));
-						BackgroundPopUp backgroundDialog = new BackgroundPopUp(
-								model, controller, null, uNodeCanvas.upperNode,
-								holegJFrame);
-						backgroundDialog
-								.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-						backgroundDialog.setVisible(true);
-						uNodeCanvas.repaint();
-					}
-				});
-
-
-
-
-
-		/**
-		 * add Help Menu and its items
-		 */
-		menuBar.add(mnHelp);
-		mnHelp.add(mntmIntroduction); 
-		mnHelp.add(mntmUserManual); 
-		mnHelp.add(mntmAlgorithmHelp); 
-		mnHelp.add(mntmCodeDoc);
-		mnHelp.add(mntmAboutUs);
-
-		tabbedPaneOriginal.addChangeListener(changeEvent -> {
-			if (tabbedPaneOriginal.getSelectedComponent() == null) {
-				Component tempC = tabbedPaneSplit.getSelectedComponent();
-				tabbedPaneSplit.setComponentAt(
-						tabbedPaneOriginal.getSelectedIndex(), null);
-				tabbedPaneOriginal.setComponentAt(
-						tabbedPaneOriginal.getSelectedIndex(), tempC);
-				tempC = tabbedPaneOriginal.getComponentAt((tabbedPaneOriginal
-						.getSelectedIndex() + 1)
-						% (tabbedPaneOriginal.getTabCount()));
-				tabbedPaneOriginal.setComponentAt(
-						(tabbedPaneOriginal.getSelectedIndex() + 1)
-								% (tabbedPaneOriginal.getTabCount()), null);
-				tabbedPaneSplit.setComponentAt(
-						(tabbedPaneOriginal.getSelectedIndex() + 1)
-								% (tabbedPaneOriginal.getTabCount()), tempC);
-				tabbedPaneSplit.setSelectedIndex((tabbedPaneOriginal
-						.getSelectedIndex() + 1)
-						% (tabbedPaneOriginal.getTabCount()));
-				contentPane.updateUI();
-			}
-		});
-
-		tabbedPaneSplit.addChangeListener(changeEvent -> {
-			if (tabbedPaneSplit.getSelectedComponent() == null && !initSplit) {
-				Component tempC = tabbedPaneOriginal
-						.getComponentAt(tabbedPaneSplit.getSelectedIndex());
-				tabbedPaneOriginal.setComponentAt(
-						tabbedPaneSplit.getSelectedIndex(), null);
-				tabbedPaneSplit.setComponentAt(
-						tabbedPaneSplit.getSelectedIndex(), tempC);
-
-				for (int i = 0; i < tabbedPaneOriginal.getTabCount(); i++) {
-					if (tabbedPaneSplit.getComponentAt(i) != null
-							&& tabbedPaneSplit.getComponentAt(i) != tempC) {
-						tempC = tabbedPaneSplit.getComponentAt(i);
-						tabbedPaneSplit.setComponentAt(i, null);
-						tabbedPaneOriginal.setComponentAt(i, tempC);
-						break;
-					}
-				}
-				if (tabbedPaneOriginal.getSelectedIndex() == tabbedPaneSplit
-						.getSelectedIndex()) {
-					tabbedPaneOriginal.setSelectedIndex((tabbedPaneSplit
-							.getSelectedIndex() + 1)
-							% tabbedPaneOriginal.getTabCount());
-				}
-				contentPane.updateUI();
-			}
-		});
-		canvas.setBackground(Color.WHITE);
-		canvas.setPreferredSize(new Dimension(model.getCanvasX(), model
-				.getCanvasY()));
-		/********************
-		 * RIGHT CONTAINER (INFORMATION)
-		 **********************/
-		// Set up of the HolonElements section
-		// Two different Models: Multi for multi-selection mode and Single for
-		// single-selection mode (CPS-Object)
-		model.getMultiTable().setColumnIdentifiers(columnNamesMulti);
-		model.getSingleTable().setColumnIdentifiers(columnNamesSingle);
-		model.getTableHolonElement().setBorder(null);
-		model.getTableHolonElement().setFillsViewportHeight(true);
-		model.getTableHolonElement().setCellSelectionEnabled(true);
-		model.getTableHolonElement().setColumnSelectionAllowed(true);
-		/*
-		 * Register Clicks on ColumNames for sorting:
-		 */
-		model.getTableHolonElement().getTableHeader()
-				.addMouseListener(new MouseAdapter() {
-					public void mouseClicked(MouseEvent e) {
-						//TODO: sort
-						//clicked column
-						int col = model.getTableHolonElement().columnAtPoint(
-								e.getPoint());
-						//insert column into UpdateController
-						updCon.setSortBy(col);
-						//refresh HolonElementTable
-						updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
-					}
-					
-
-					@Override
-					public void mouseExited(MouseEvent e) {
-						/**
-						 * Stop Editing, if mouse exits the Table
-						 */
-						JTable holElem = model.getTableHolonElement();
-						JTableHeader holElemHead = holElem.getTableHeader();
-						if(e.getX()<=0 || e.getX()>=holElemHead.getWidth() 
-								|| e.getY() <= 0){
-							CellEditor cellEditor = holElem.getCellEditor();
-							if (cellEditor != null) {
-							    if (cellEditor.getCellEditorValue() != null) {
-							    	/** TODO: Maybe try to save current Data */
-							        cellEditor.stopCellEditing();
-							    } else {
-							        cellEditor.cancelCellEditing();
-							    }
-							}
-						}
-						
-					}
-				});
-		model.getTableHolonElement().getTableHeader().setReorderingAllowed(false);
-
-		tableHolonElementScrollPane.setViewportView(model
-				.getTableHolonElement());
-		scrollElements.setLayout(new BorderLayout(0, 0));
-		scrollElements.add(panelHolonEl, BorderLayout.NORTH);
-		scrollElements.add(tableHolonElementScrollPane);
-		panelHolonEl.setLayout(new BoxLayout(panelHolonEl, BoxLayout.X_AXIS));
-		toolBarHolonEl.add(btnAddHolEL);
-		toolBarHolonEl.add(btnDelHolEL);
-		toolBarHolonEl.setFloatable(false);
-		panelHolonEl.add(toolBarHolonEl);
-
-		// Set up of the Properties section
-		scrollProperties.setViewportView(this.informationPanel);
-		scrollProperties.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-		scrollProperties.getVerticalScrollBar().setUnitIncrement(16);
-		
-		// Set up of the Graph section
-		scrollGraph.setViewportView(unitGraph);
-		graphLabel.setLayout(new BorderLayout(0, 10));
-		graphLabel.add(maxGraph, BorderLayout.NORTH);
-		graphLabel.add(medGraph, BorderLayout.CENTER);
-		graphLabel.add(minGraph, BorderLayout.SOUTH);
-
-		
-		
-		
-		
-		toolBarGraph.setFloatable(false);
-		toolBarGraph.setAlignmentY(Component.RIGHT_ALIGNMENT);	
-		
-		
-		localPeriodButton.setToolTipText("Toggle Local/Global Mode");
-		toolBarGraph.add(localPeriodButton);
-		//ComboBox
-		localPeriodInput.setEditable(true);
-		localPeriodInput.setVisible(false);
-		localPeriodInput.setMaximumSize(new Dimension(20,23));
-		localPeriodInput.addItemListener(aListener->{
-			if(aListener.getStateChange() == ItemEvent.DESELECTED) {
-				validateInput(localPeriodInput.getEditor().getItem().toString(), true);
-			}
-			
-		});
-		
-		toolBarGraph.add(localPeriodInput);
-				
-		//localPeriodButtonFunction
-		localPeriodButton.addActionListener(actionEvent->{
-			boolean newState= !localPeriodInput.isVisible();
-			changeLocalPeriodButtonAppeareance(newState);
-			unitGraph.setUseLocalPeriod(newState);
-		});
-		
-		
-		toolBarGraph.add(Box.createHorizontalGlue());
-		resetButton.setToolTipText("Reset");
-		resetButton.addActionListener(actionEvent ->  unitGraph.reset());
-		toolBarGraph.add(resetButton);
-		
-		
-		
-		
-		
-		scrollGraph.setRowHeaderView(graphLabel);
-		scrollGraph.setColumnHeaderView(toolBarGraph);
-
-		tables.add(model.getSingleTable());
-		tables.add(model.getMultiTable());
-		/***********************
-		 * HolonElement Table Actions
-		 **********************/
-		/*
-		 * Add HolonElement to given HolonObject
-		 */
-		btnAddHolEL.addActionListener(actionEvent -> {
-			if (model.getSelectedCpsObjects().size() == 1) {
-				AbstractCanvasObject tempCpsObject = updCon.getActualCps();
-				if (tempCpsObject != null
-						&& tempCpsObject.getClass() == HolonObject.class
-						&& tempCpsObject.getId() != 0) {
-					addElementPopUp = new AddElementPopUp(holegJFrame);
-					addElementPopUp.setActualHolonObject((HolonObject)updCon.getActualCps());
-					addElementPopUp.setVisible(true);
-					HolonElement ele = addElementPopUp.getElement();
-					if (ele != null) {
-						controller.addElementCanvasObject(
-								tempCpsObject.getId(), ele.getEleName(),
-								ele.getAmount(), ele.getEnergyPerElement(),
-								ele.getId());
-					}
-					controller.calculateStateAndVisualForTimeStep(model
-							.getCurIteration());
-					triggerUpdateController(null);
-					contentPane.updateUI();
-				}
-			}else
-			{
-				JOptionPane.showMessageDialog(contentPane, "No object selected.\nPlease select a object first." , "Message" , JOptionPane.INFORMATION_MESSAGE);
-			}
-		});
-		btnAddHolEL.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
-		btnAddHolEL.setToolTipText("<html><b>Add Element</b><br>Add a new HolonElement to the HolonObject.</html>");
-		
-		
-		/*
-		 * Delete the chosen HolonElement of the selected HolonObject,
-		 * Multi-Selection for CpsObjects as well as for HolonElements possible
-		 */
-		btnDelHolEL.addActionListener(actionEvent -> {
-			// For Single Selection of CpsObject
-				if (model.getSelectedCpsObjects().size() == 1) {
-					if (updCon.getActualCps().getClass() == HolonObject.class) {
-						HolonObject obj = (HolonObject) updCon.getActualCps();
-						if(selectedElements.isEmpty())
-						{
-							JOptionPane.showMessageDialog(contentPane, "No element selectet.\nPlease select a element in the list first." , "Message" , JOptionPane.INFORMATION_MESSAGE);
-						}
-						for (HolonElement e : selectedElements) {
-							controller.deleteElementCanvas(obj.getId(),
-									e.getId());
-							controller.calculateStateAndVisualForTimeStep(model
-									.getCurIteration());
-							triggerUpdateController(null);
-							contentPane.updateUI();
-							// Names displayed in graph are not updated
-			}
-			model.getEleToDelete().clear();
-			selectedElements.clear();
-		}
-		// For MultiSelection of CpsObject
-	} else if (model.getSelectedCpsObjects().size() > 1) {
-		for (Integer i : model.getEleToDelete().keySet()) {
-			for (HolonElement e : model.getEleToDelete().get(i)) {
-				controller.deleteElementCanvas(i, e.getId());
-			}
-		}
-		triggerUpdateController(null);
-		model.getEleToDelete().clear();
-		selectedElements.clear();
-	}else
-			{
-				JOptionPane.showMessageDialog(contentPane, "No object selectet.\nPlease select a object first." , "No object selectet" , JOptionPane.INFORMATION_MESSAGE);
-			}
-	triggerUpdateController(null);
-	elementGraph.setText("None");
-	holonEleNamesDisplayed = "None";
-})		;
-		btnDelHolEL.setIcon(new ImageIcon(ImageImport.loadImage("Images/minus.png", 16, 16)));
-		btnDelHolEL.setToolTipText("<html><b>Remove Element</b><br>Removes the selected HolonElement from the HolonObject.</html>");
-		/*
-		 * Communication between HolonElement Table and displayed Graph and
-		 * Properties, as well as selection of different HolonElements
-		 */
-		model.getTableHolonElement().addMouseListener(new MouseAdapter() {
-			public void mousePressed(MouseEvent e) {
-				HolonObject obj = null;
-				if (model.getSelectedCpsObjects().size() == 1
-						&& model.getSelectedCpsObjects().get(0) instanceof HolonObject) {
-					obj = (HolonObject) updCon.getActualCps();
-				}
-				yValueElements = e.getY();
-				HolonElement ele;
-				// Search for current clicked HolonElement
-				if (model.getSelectedCpsObjects().size() == 1) {
-					ele = updCon.getActualHolonElement(obj, yValueElements, 0,
-							tables);
-				} else {
-					ele = updCon.getActualHolonElement(null, yValueElements, 0,
-							tables);
-				}
-				// Multi-Selection of HolonElements through control button +
-				// mouse click
-				if (ele != null) {
-					// make energy-consumption graph visible
-					showScrollGraph();
-
-					if (e.isControlDown()) {
-						if (!selectedElements.contains(ele)) {
-							selectedElements.add(ele);
-							if (!holonEleNamesDisplayed.equals("None")) {
-								holonEleNamesDisplayed = holonEleNamesDisplayed
-										+ "; " + ele.getEleName() + " ";
-							} else {
-								holonEleNamesDisplayed = ele.getEleName() + " ";
-							}
-							updateUnitGraph((GraphEditable)selectedElements.get(selectedElements.size()-1));
-						}
-						updCon.getActualHolonElement(null, yValueElements, 2,
-								tables);
-					}
-					// if no control-button pressed but a HolonElement chosen
-					else {
-						selectedElements.clear();
-						selectedElements.add(ele);
-						updCon.getActualHolonElement(null, yValueElements, 1,
-								tables);
-						holonEleNamesDisplayed = ele.getEleName() + " ";
-						updateUnitGraph((GraphEditable)selectedElements.get(selectedElements.size()-1));
-					}
-				} else {
-					elementGraph.setText("None");
-					hideScrollGraph();
-				}
-				// if any HolonElement is double-clicked --> Edit-Mode started
-				// for selected HolonElement
-				if (e.getClickCount() == 2) {
-					yThis = e.getY();
-					xThis = e.getX();
-				}
-				// for single click and empty slot
-				if (e.getClickCount() == 1 && ele == null) {
-					selectedElements.clear();
-					holonEleNamesDisplayed = "None";
-				}
-				elementGraph.setText(holonEleNamesDisplayed);
-				yBTis = e.getY();
-				xBThis = e.getX();
-
-			}
-			
-			@Override
-			public void mouseExited(MouseEvent e) {
-				/**
-				 * Stop Editing, if mouse exits the Table
-				 */
-				JTable holElem = model.getTableHolonElement();
-				if(e.getX()<=0 || e.getX()>=holElem.getWidth() 
-						/*|| e.getY() <= 0*/|| e.getY()>= holElem.getHeight()){
-					CellEditor cellEditor = holElem.getCellEditor();
-					if (cellEditor != null) {
-					    if (cellEditor.getCellEditorValue() != null) {
-					    	/** TODO: Maybe try to save current Data */
-					        cellEditor.stopCellEditing();
-					    } else {
-					        cellEditor.cancelCellEditing();
-					    }
-					}
-				}
-				
-			}
-			
-		});
-		
-		/*
-		 * Triggered every time a change is made
-		 */
-		model.getTableHolonElement()
-				.addPropertyChangeListener(propertyChangeEvent -> {
-					try {
-						int yMouse = yThis;
-						int yBMouse = yBTis;
-						int selectedValueY = (int) Math.floor(yMouse / 16);
-						int selectedValueBY = (int) Math.floor(yBMouse / 16);
-						// ------------------ multi-selection mode
-						// ------------------
-						if (model.getSelectedCpsObjects().size() > 1) {
-							int selectedValueX = (int) Math
-									.floor(xThis
-											/ (model.getTableHolonElement()
-													.getWidth() / 8));
-							int selectedValueBX = (int) Math
-									.floor(xBThis
-											/ (model.getTableHolonElement()
-													.getWidth() / 8));
-							if (updCon.getHolonObj(yMouse,
-									model.getMultiTable()) != null) {
-								// For active column (boolean with a checkbox)
-								if (selectedValueBX == 6) {
-									System.out.println("selectedValueBX == 6");
-									HolonElement eleBTemp = updCon
-											.getActualHolonElement(null,
-													yBMouse, 0, tables);
-									String newBStuff = model
-											.getMultiTable()
-											.getValueAt(selectedValueBY,
-													selectedValueBX).toString();
-									Boolean bTemp = Boolean
-											.parseBoolean(newBStuff);
-									eleBTemp.setActive(bTemp);
-								}
-								// For activeFlex column (boolean with a
-								// checkbox)
-								else if (selectedValueBX == 7) {
-									HolonElement eleBTemp = updCon
-											.getActualHolonElement(null,
-													yBMouse, 0, tables);
-									String newBStuff = model
-											.getMultiTable()
-											.getValueAt(selectedValueBY,
-													selectedValueBX).toString();
-									Boolean bTemp = Boolean
-											.parseBoolean(newBStuff);
-									eleBTemp.setActive(bTemp);
-								} else {
-									//TODO: check all possible fields.
-									// Update of HolonElement
-									HolonElement eleTemp = updCon
-											.getActualHolonElement(null,
-													yMouse, 0, tables);
-									String newStuff = model
-											.getMultiTable()
-											.getValueAt(selectedValueY,
-													selectedValueX).toString();
-									
-									// Name update
-									if (selectedValueX == 2) {
-										eleTemp.setEleName(newStuff);
-									}
-									// Energy Update
-									else if (selectedValueX == 3) {
-										Float ftemp = Float
-												.parseFloat(newStuff);
-										eleTemp.setEnergyPerElement(ftemp);
-									}
-									// Flexibility
-									else if (selectedValueX == 4) {
-										
-										
-										
-									}
-									// Amount of Elements update
-									else if (selectedValueX == 5) {
-										Integer iTemp = Integer
-												.parseInt(newStuff);
-										eleTemp.setAmount(iTemp);
-									}
-									else if (selectedValueX == 6) {
-									}
-								}
-							}
-						} // ------------------ single-selection mode
-							// ------------------
-						else if (model.getSelectedCpsObjects().size() == 1) {
-							int selectedValueX = (int) Math
-									.floor(xThis
-											/ (model.getTableHolonElement()
-													.getWidth() / 7));
-							int selectedValueBX = (int) Math
-									.floor(xBThis
-											/ (model.getTableHolonElement()
-													.getWidth() / 7));
-							if (updCon.getActualCps() != null
-									&& updCon.getActualCps().getClass() == HolonObject.class) {
-								HolonElement eleTemp;
-
-								// For active column (boolean with a checkbox)
-								if (selectedValueBX == 5) {
-									eleTemp = updCon.getActualHolonElement(
-											(HolonObject) updCon.getActualCps(),
-											yBMouse, 0, tables);
-									String newBStuff = model
-											.getSingleTable()
-											.getValueAt(selectedValueBY,
-													selectedValueBX).toString();
-									Boolean bTemp = Boolean
-											.parseBoolean(newBStuff);
-									eleTemp.setActive(bTemp);
-
-								} // For activeFlex column (boolean with a
-									// checkbox)
-								else if (selectedValueBX == 6) {
-									eleTemp = updCon.getActualHolonElement(
-											(HolonObject) updCon.getActualCps(),
-											yBMouse, 0, tables);
-									String newBStuff = model
-											.getSingleTable()
-											.getValueAt(selectedValueBY,
-													selectedValueBX -1).toString();
-									eleTemp.setActive(Boolean
-											.parseBoolean(newBStuff));
-
-								} else {
-									//TODO check all possible assignements.
-									// Update of HolonElement
-									eleTemp = updCon.getActualHolonElement(
-											(HolonObject) updCon.getActualCps(),
-											yMouse, 0, tables);
-									String newStuff = model
-											.getSingleTable()
-											.getValueAt(selectedValueY,
-													selectedValueX).toString();
-									// Name update
-									if (selectedValueX == 1) {
-										eleTemp.setEleName(newStuff);
-									} // Energy Update
-									else if (selectedValueX == 2) {
-										Float ftemp = Float
-												.parseFloat(newStuff);
-										eleTemp.setEnergyPerElement(ftemp);
-									} // Flexibility
-									else if (selectedValueX == 3) {
-									}
-									// Amount of Elements update
-									else if (selectedValueX == 4) {
-										Integer iTemp = Integer
-												.parseInt(newStuff);
-										eleTemp.setAmount(iTemp);
-									}
-								}
-
-								// set all cells anew, if anything was changed
-								updateElementTableAfterChange(eleTemp,
-										selectedValueBY);
-							}
-						}
-						controller.calculateStateAndVisualForTimeStep(model
-								.getCurIteration());
-						model.getSingleTable().fireTableDataChanged();
-						triggerUpdateController(null);
-						contentPane.updateUI();
-						unitGraph.repaint();
-
-						// trigger update of table after UnitGraph was painted
-						SwingUtilities.invokeLater(() -> {
-							triggerUpdateController(null);
-						});
-					} catch (Exception e) {
-					}
-				});
-	
-		/***********************
-		 * HolonElement Graph Actions
-		 **********************/
-		
-		/*
-		 * Update Local Period of an Element Graph
-		 */
-		unitGraphLocalPeriod.addKeyListener(new KeyAdapter() {
-			@Override
-			 public void keyReleased(KeyEvent e) {
-				try{
-					int localLength = Integer.parseInt(unitGraphLocalPeriod.getText());
-					unitGraphLocalPeriod.setBackground(Color.WHITE);
-					/**
-					 * set local graph Period
-					 */
-					if(e.getKeyCode() == KeyEvent.VK_ENTER)
-						unitGraph.setLocalPeriod(localLength);						
-				}catch(NumberFormatException ex){
-					unitGraphLocalPeriod.setBackground(PALE_RED);
-				}
-				
-			}
-		});
-		
-		/*****************************
-		 * RIGHT CONTAINER DONE
-		 *****************************/
-
-		holegJFrame.getContentPane().setLayout(new BorderLayout(0, 0));
-		/****************
-		 * Tree Stuff
-		 ****************/
-
-		// Override Key Actions
-		inputMap = categoryTree.getInputMap();
-		inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
-		inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
-		inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
-		inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
-
-		TreeCellRenderer customRenderer = new TreeCellRenderer() {
-			@Override
-			public Component getTreeCellRendererComponent(JTree tree,
-					Object value, boolean selected, boolean expanded,
-					boolean leaf, int row, boolean hasFocus) {
-				JLabel label = new JLabel();
-				Image imgR;
-				if (leaf) {
-					for (Category cat : model.getCategories()) {
-						for (AbstractCanvasObject cps : cat.getObjects()) {
-							if (value.toString().compareTo(cps.getObjName()) == 0) {
-								imgR = ImageImport.loadImage(cps.getImage(), 50,
-										50);
-								if (imgR != null) {
-									label.setIcon(new ImageIcon(imgR));
-								}
-								label.setText(cps.getName());
-							}
-						}
-					}
-				}
-				tree.setRowHeight(50);
-				if (hasFocus) {
-					label.setForeground(new Color(0, 0, 255));
-					label.setOpaque(true);
-				}
-				if (label.getText().length() == 0) {
-					label.setText(value.toString());
-					if (value.toString().compareTo("Categories") != 0) {
-						label.setIcon(new ImageIcon(ImageImport.loadImage(
-								"/Images/folder.png")));
-					}
-				}
-
-				return label;
-
-			}
-		};
-		
-		categoryTree.setCellRenderer(customRenderer);
-
-		categoryTree.addMouseMotionListener(new MouseMotionAdapter() {
-
-			public void mouseDragged(MouseEvent e){
-				checkForDragAndDrop(e);
-			}
-			
-			/**
-			 * checks if an object of the current Panel
-			 * could be replaced by the dragged object
-			 * @param e
-			 */
-			private void checkForDragAndDrop(MouseEvent e){
-				try {
-					/**
-					 * if no object gets dragged -> finished
-					 */
-					if(!dragging)return;
-					
-					/**
-					 * select the current Panel
-					 */
-					chooseTabTemp();				
-					JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-					if(scrollPane == null)return;
-					Component canvasOrUpperNodeCanvas = scrollPane
-							.getViewport().getComponent(0);
-					
-					/**
-					 * check for replacements on the canvas
-					 */
-					if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-						GroupNodeCanvas unc = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
-						if(unc.getMousePosition()==null)return;
-						int x = (int) unc.getMousePosition().getX()+16;
-						int y = (int) unc.getMousePosition().getY()+16;
-						
-						/**
-						 * if in upperNode
-						 */
-						if (x <= unc.upperNode.getLeftBorder()) return;
-						
-						/**
-						 * check for replacement
-						 */
-						unc.checkForReplacement(x, y);
-						
-						/**
-						 * repaint 
-						 */
-						unc.invalidate();
-						unc.repaint();
-					} else {
-						if(canvas.getMousePosition()==null)return;
-						int x = (int) canvas.getMousePosition().getX()+16;
-						int y = (int) canvas.getMousePosition().getY()+16;
-						
-						/**
-						 * check for replacement
-						 */
-						canvas.checkForReplacement(x, y);
-						
-						/**
-						 * repaint
-						 */
-						canvas.invalidate();
-						canvas.repaint();
-					}
-					contentPane.updateUI();
-					
-				} catch (Exception eex) {
-					eex.printStackTrace();
-				}
-			}});
-
-		
-		categoryTree.addMouseListener(new MouseAdapter() {
-			
-			public void mouseReleased(MouseEvent e) {
-				try {
-					if (dragging) {
-						chooseTabTemp();
-						JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-						Component canvasOrUpperNodeCanvas = scrollPane
-								.getViewport().getComponent(0);
-
-						if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
-							GroupNodeCanvas unc = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
-							int x = (int) unc.getMousePosition().getX() + 16;
-							int y = (int) unc.getMousePosition().getY() + 16;
-
-							if (x > unc.upperNode.getLeftBorder()) {
-
-								AbstractCanvasObject h = null;
-								if (tempCps instanceof HolonObject) {
-									h = new HolonObject((HolonObject)tempCps);
-								}
-								if (tempCps instanceof HolonSwitch) {
-									h = new HolonSwitch(tempCps);
-								}
-								h.setPosition(x, y);
-
-								/**
-								 * close UpperNodeTabs of replaced UpperNode
-								 */
-								if(unc.mayBeReplaced!=null &&unc.mayBeReplaced instanceof GroupNode){
-									unc.closeUpperNodeTab(unc.mayBeReplaced.getId());
-								}
-								controller.addObjUpperNode(h, unc.upperNode);
-								
-								/**
-								 * object would be replaced
-								 */
-								unc.mayBeReplaced = null; 
-								unc.invalidate();
-								controller.calculateStateAndVisualForCurrentTimeStep();
-								unc.repaint();
-								unc.setXY((int) canvas.getMousePosition()
-										.getX(), (int) canvas
-										.getMousePosition().getY());
-							}
-						} else {
-							int x = (int) canvas.getMousePosition().getX() + 16;
-							int y = (int) canvas.getMousePosition().getY() + 16;
-
-							AbstractCanvasObject h = null;
-							if (tempCps instanceof HolonObject) {
-								h = new HolonObject((HolonObject)tempCps);
-							}
-							if (tempCps instanceof HolonSwitch) {
-								h = new HolonSwitch(tempCps);
-							}
-							
-							h.setPosition(x, y);
-							
-							/**
-							 * close UpperNodeTabs of replaced UpperNode
-							 */
-							if(canvas.mayBeReplaced!=null &&canvas.mayBeReplaced instanceof GroupNode){
-								canvas.closeUpperNodeTab(canvas.mayBeReplaced.getId());
-							}
-							controller.addObjectCanvas(h);
-							/**
-							 * no object should get replaced
-							 */
-							canvas.mayBeReplaced = null;
-							canvas.invalidate();
-							canvas.setXY(
-									(int) canvas.getMousePosition().getX(),
-									(int) canvas.getMousePosition().getY());
-							canvas.repaint();
-						}
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						contentPane.updateUI();
-						dragging = false;
-					}
-				} catch (Exception eex) {
-				}
-				holegJFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-			}
-		});
-		
-
-		popmenuEdit.add(editItem);
-		popmenuEdit.add(removeItem);
-		editItem.setEnabled(false);
-		editItem.addActionListener(actionEvent -> {
-		});
-		categoryTree.addMouseListener(new MouseAdapter() {
-		
-			public void mousePressed(MouseEvent e) {
-				try {
-					actualObjectClicked = categoryTree
-							.getPathForLocation(e.getX(), e.getY())
-							.getLastPathComponent().toString();
-					// if an Object was selected, the porperties are shown in
-					// the table
-					DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) categoryTree
-							.getPathForLocation(e.getX(), e.getY())
-							.getLastPathComponent();
-					if (selectedNode.getLevel() == 2) {
-						controller.searchCategoryObject(selectedNode
-								.getParent().toString(), selectedNode
-								.toString());
-						updCon.deleteRows(model.getSingleTable());
-						updCon.deleteRows(model.getMultiTable());
-						// if (selected instanceof HolonObject && selected !=
-						// null) {
-						// selected = (HolonObject) selected;
-						// fillElementTable(((HolonObject)
-						// selected).getElements());
-						// }
-					}
-					if (SwingUtilities.isRightMouseButton(e)) {
-						for (Category cat : model.getCategories()) {
-							for (AbstractCanvasObject cps : cat.getObjects()) {
-								if (actualObjectClicked.compareTo(cps
-										.getObjName()) == 0
-										&& !(cps instanceof HolonSwitch)) {
-									editItem.setEnabled(true);
-									popmenuEdit.show(e.getComponent(),
-											e.getX(), e.getY());
-									catOfObjToBeEdited = selectedNode
-											.getParent().toString();
-									tempCps = cps;
-								}
-							}
-						}
-					} else {
-						for (Category cat : model.getCategories()) {
-							for (AbstractCanvasObject cps : cat.getObjects()) {
-								if (actualObjectClicked.compareTo(cps
-										.getObjName()) == 0) {
-									File checkPath = new File(cps.getImage());
-									if (checkPath.exists()) {
-										img = new ImageIcon(cps.getImage())
-												.getImage()
-												.getScaledInstance(
-														32,
-														32,
-														java.awt.Image.SCALE_SMOOTH);
-									} else {
-										img = ImageImport.loadImage(
-												cps.getImage(), 32, 32);
-									}
-									tempCps = cps;
-									dragging = true;
-									Cursor cursor = Toolkit.getDefaultToolkit()
-											.createCustomCursor(img,
-													new Point(0, 0), "Image");
-									holegJFrame.setCursor(cursor);
-								}
-							}
-						}
-					}
-				} catch (Exception eex) {
-				}
-			}
-		});
-		editItem.addActionListener(actionEvent -> {
-			// Remove the selected Object object
-			//AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame parentFrame)
-			System.out.println("Edit");
-			addObjectPopUP = new AddObjectPopUp(true, tempCps,
-					catOfObjToBeEdited, holegJFrame);
-			addObjectPopUP.setCategory(catOfObjToBeEdited);
-			addObjectPopUP.setController(controller);
-			addObjectPopUP.setVisible(true);
-		});
-		removeItem.addActionListener(actionEvent -> {
-			// Remove the selected Object object
-			try {
-				System.out.println("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + tempCps);
-				controller.delObjectCategory(catOfObjToBeEdited, tempCps.getName());				
-			}catch(IOException e) {
-				System.err.println("IOException");
-				e.printStackTrace();
-			}
-		});
-		scrollPane1.setViewportView(categoryTree);
-
-		scrollPane1.setColumnHeaderView(panel);
-		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-		toolBar.setAlignmentX(Component.LEFT_ALIGNMENT);
-		toolBar.setFloatable(false);
-
-		panel.add(toolBar);
-		btnAddPopUp.add(mItemNew);
-		mItemNew.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller, holegJFrame);
-		});
-		btnAddPopUp.addSeparator();
-		btnAddPopUp.add(mItemCategory);
-		mItemCategory.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller,Option.Category, holegJFrame);
-		});
-		btnAddPopUp.add(mItemObject);
-		mItemObject.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller,Option.Object, holegJFrame);
-		});
-		btnAddPopUp.add(mItemSwitch);
-		mItemSwitch.addActionListener(actionEvent -> {
-			new CreateNewDialog(controller,Option.Switch, holegJFrame);
-		});
-		btnAdd.addActionListener(actionEvent -> btnAddPopUp.show(btnAdd, -1, +20));
-		btnAdd.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
-		btnAdd.setToolTipText("<html><b>New</b><br>Add a new Category or Item to the library.</html>");
-		toolBar.add(btnAdd);
-		/**
-		 * Help Menu Action Listeners
-		 */
-		
-		/**
-		 * URL of the telecommunication git Wiki
-		 */
-		String tkWikiWebpage = "https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons/wiki/";
-		
-		/** open Introduction Web Page */
-		mntmIntroduction.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e){
-				openWebpage(tkWikiWebpage + "Introduction+V2.1");
-			}
-		});
-		
-		/** open UserManual WebPage */
-		mntmUserManual.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e){
-				openWebpage(tkWikiWebpage + "User+Manual+V2.1");
-			}
-		});
-		
-		/** open Algorithm Help Web Page*/
-		mntmAlgorithmHelp.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e){
-				openWebpage(tkWikiWebpage + "Algorithms+V2.1");
-			}
-		});
-		
-		/** open Code Documentation Web Page */
-		mntmCodeDoc.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e){
-				openWebpage(tkWikiWebpage + "Code+documentation+V2.1");
-			}
-		});
-		
-		/**
-		 * Pop up - About Us with some important information about the
-		 * developers, source and programming stuff
-		 */
-		mntmAboutUs.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e) {
-				aboutUsPopUp = new AboutUsPopUp(holegJFrame);
-				aboutUsPopUp.setVisible(true);
-			}
-		});
-
-		/**
-		 * Update of every interaction between the user and the canvas (only on
-		 * the canvas). Basically the update of all the information concerning
-		 * the clicked HolonObject. For multi-selection, the propertyTable would
-		 * be disabled
-		 */
-		canvas.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mousePressed(MouseEvent e) {
-
-			}
-
-			@Override
-			public void mouseReleased(MouseEvent e) {
-				holonEleNamesDisplayed = "None";
-				// If any empty space is clicked
-				if (temp == null || temp.getId() != model.getSelectedObjectID()) {
-					hideScrollGraph();
-					elementGraph.setText("None");
-				}
-				temp = updCon.getActualCps();
-				// Erase old data in the PropertyTable
-				if (model.getPropertyTable().getRowCount() > 0) {
-					for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
-						model.getPropertyTable().removeRow(i);
-					}
-				}
-				if (e.isControlDown() && temp != null) {
-					if (model.getSelectedCpsObjects().contains(temp)) {
-						controller.removeSelectedObjectFromSelection(temp);
-					} else {
-						controller.addSelectedObject(temp);
-					}
-				}
-				if (temp instanceof HolonSwitch) {
-					showScrollGraph();
-					updateUnitGraph((GraphEditable)temp);
-				}
-				// Write new data in the PropertyTable
-				triggerUpdateController(temp);
-
-				// New Tab with NodeOfNode
-				if (doubleClick() && MouseEvent.BUTTON3 != e.getButton()
-						&& temp instanceof GroupNode) {
-					openNewUpperNodeTab();
-					try {
-						controller.autoSave();
-					} catch (IOException e1) {
-						e1.printStackTrace();
-					}
-				}
-				if (model.getSelectedCpsObjects().size() > 1) {
-					model.getTableHolonElement()
-							.setModel(model.getMultiTable());
-				} else if (model.getSelectedCpsObjects().size() == 1) {
-					model.getTableHolonElement().setModel(
-							model.getSingleTable());
-				}
-
-			}
-
-		});
-
-
-		
-
-		// Del Button
-		btnDel.addActionListener(actionEvent -> {
-			Object nodeInfo = categoryTree.getLastSelectedPathComponent();
-			if (nodeInfo != null) {
-				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
-				String nodeName = selectedNode.getUserObject().toString();
-				int depthOfNode = selectedNode.getLevel();
-				try {
-					switch (depthOfNode) {
-					case 1:
-						int dialogResult = JOptionPane.showConfirmDialog(
-								holegJFrame, eraseCategory + nodeName
-										+ "?", warningText,
-								JOptionPane.YES_NO_OPTION);
-						if (dialogResult == JOptionPane.YES_OPTION) {
-							controller.deleteCategory(nodeName);
-						}
-						break;
-					case 2:
-						DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode
-								.getParent();
-						controller.delObjectCategory(parent.getUserObject()
-								.toString(), nodeName);
-						break;
-
-					default:
-						JOptionPane.showMessageDialog(holegJFrame,
-								selectObjBeforeErase);
-					}
-				} catch (Exception e2) {
-				}
-
-			} else {
-				JOptionPane.showMessageDialog(holegJFrame,
-						selectObjBeforeErase);
-			}
-			categoryTree.repaint();
-		});
-		btnDel.setIcon(new ImageIcon(ImageImport.loadImage("Images/minus.png", 16, 16)));
-		btnDel.setToolTipText("<html><b>Delete</b><br>Removes a Category or a Category Item.</html>");
-		toolBar.add(btnDel);
-		
-
-		holegJFrame.getContentPane().add(splitPane);
-
-		mntmNew.addActionListener(actionEvent -> {
-			if (model.getObjectsOnCanvas().size() != 0) {
-				int newWarning = JOptionPane.YES_NO_OPTION;
-				int dialogForNewWarning = JOptionPane.showConfirmDialog(
-						holegJFrame, saveBeforeNew, warningText,
-						newWarning);
-				if (dialogForNewWarning == JOptionPane.YES_OPTION) {
-					mntmSave.doClick();
-				}
-			}
-
-			model.getEdgesOnCanvas().removeAll(model.getEdgesOnCanvas());
-			model.getObjectsOnCanvas().removeAll(model.getObjectsOnCanvas());
-			controller.setSelectedObjectID(0);
-			controller.setSelecteEdge(null);
-			controller.setCurIteration(0);
-			hideScrollGraph();
-			elementGraph.setText("None");
-			canvas.tempCps = null;
-			canvas.repaint();
-			IdCounter.resetObjectCounter(CounterType.Object);
-			IdCounter.resetObjectCounter(CounterType.Element);
-			controller.calculateStateAndVisualForCurrentTimeStep();
-		});
-
-		mntmOpen.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent evt) {
-				menuFileExitActionPerformed();
-			}
-
-			private void menuFileExitActionPerformed() {
-				JFileChooser fileChooser = new JFileChooser();
-				fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir")+"/exampleNetworks/"));
-				FileNameExtensionFilter holonFilter = new FileNameExtensionFilter(
-						"Holon Save File(*.holon)", "holon");
-				fileChooser.setFileFilter(holonFilter);
-
-				if (fileChooser.showOpenDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
-					File file = fileChooser.getSelectedFile();
-
-					try {
-						controller.loadFile(file.getAbsolutePath());
-						canvas.repaint();
-						categoryTree.repaint();
-						controller.calculateStateAndVisualForCurrentTimeStep();
-					} catch (IOException | ArchiveException e) {
-						e.printStackTrace();
-						JLabel message = new JLabel(
-								"The savefile is corrupt and cannot be opened.");
-						JOptionPane.showMessageDialog(holegJFrame,
-								message, "", JOptionPane.ERROR_MESSAGE);
-					}
-				}
-			}
-		});
-
-		mntmSave.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent evt) {
-				menuSaveActionPerformed();
-			}
-
-			private void menuSaveActionPerformed() {
-				JFileChooser fileChooser = new JFileChooser();
-				FileNameExtensionFilter holonFilter = new FileNameExtensionFilter(
-						"Holon Save File(*.holon)", "holon");
-				fileChooser.setFileFilter(holonFilter);
-
-				if (fileChooser.showSaveDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
-					File selectedFile = fileChooser.getSelectedFile();
-					String fileName = selectedFile.getName();
-					String fullPath = fileChooser.getSelectedFile().getPath();
-					if (fileChooser.getFileFilter().equals(holonFilter)) {
-						if (!fileName.contains("."))
-							fullPath += ".holon";
-					}
-					if (!fullPath.endsWith(".holon")) {
-						String suffix = fullPath.substring(fullPath.lastIndexOf("."),
-								fullPath.length());
-						String[] options = new String[] { "keep .holon",
-								"use " + suffix };
-
-						JLabel message = new JLabel(
-								"Are you sure to use the extension \"" + suffix
-										+ "\" instead of \".holon\"?");
-
-						int response = JOptionPane.showOptionDialog(
-								holegJFrame, message, "",
-								JOptionPane.DEFAULT_OPTION,
-								JOptionPane.QUESTION_MESSAGE, null, options,
-								options[1]);
-
-						if (response == 0)
-							fullPath = fullPath.replace(suffix, ".holon");
-					}
-
-					try {
-						controller.saveFile(new File(fullPath).getAbsolutePath());
-					} catch (IOException | ArchiveException e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		});
-
-
-		mntmUndo.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent evt) {
-				menuUndoActionPerformed();
-			}
-
-			private void menuUndoActionPerformed() {
-				try {
-					controller.loadAutoSave(controller.getUndoSave());
-					
-					closeInvalidUpperNodeTabs();
-					
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					canvas.repaint();
-					hideScrollGraph();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		});
-
-		mntmRedo.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent evt) {
-				menuRedoActionPerformed();
-			}
-
-			private void menuRedoActionPerformed() {
-				try {
-					controller.loadAutoSave(controller.getRedoSave());
-					
-					closeInvalidUpperNodeTabs();
-					
-					controller.calculateStateAndVisualForCurrentTimeStep();
-					canvas.repaint();
-					hideScrollGraph();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		});
-
-		timePanel = new TimePanel(controller);
-		timePanel.setBorder(null);
-		timePanel.getTimeSlider()
-				.addChangeListener(changeEvent -> {
-					//TimeSliderChanged event
-					controller.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
-					unitGraph.repaint();
-					contentPane.updateUI();
-				});
-		splitPane1.setMinimumSize(new Dimension(0, 25));
-		splitPane.setRightComponent(splitPane1);
-		splitPane.setDividerLocation(200);
-		splitPane1.setDividerLocation(500);
-
-		splitPane.setLeftComponent(scrollPane1);
-		tabbedPaneOriginal.addTab("View", tabbedPaneInnerOriginal);
-		
-		
-		myPanel.add(canvasSP, BorderLayout.CENTER);
-		
-		
-		tabbedPaneInnerOriginal.addTab("Main Grid", myPanel);
-		splitPane1.setLeftComponent(tabbedPaneOriginal);
-		splitPane1.setRightComponent(splitHolonElPro);
-
-		splitPane1.setResizeWeight(0.9);
-
-		splitHolonElPro.setDividerLocation(700);
-		// containing the graph and the elements-list
-		splitHolonElPro.setTopComponent(splitGraphHolonEl);
-		// containing the object's properties
-		splitHolonElPro.setBottomComponent(scrollProperties);
-
-		splitGraphHolonEl.setDividerLocation(distanceBetweenElementsAndGraph);
-		splitGraphHolonEl.setTopComponent(scrollElements);
-		splitGraphHolonEl.setBottomComponent(scrollGraph);
-		canvasSP.setViewportView(canvas);
-
-		tabbedPaneOriginal.setBorder(null);
-		scrollProperties.setBorder(null);
-		scrollGraph.setBorder(null);
-		scrollElements.setBorder(null);
-		splitPane.setBorder(null);
-		splitPane1.setBorder(null);
-		splitHolonElPro.setBorder(null);
-		splitGraphHolonEl.setBorder(null);
-		panelHolonEl.setBorder(null);
-		canvasSP.setBorder(null);
-		hideScrollGraph();
-		tableHolonElementScrollPane.setBorder(null);
-
-		holegJFrame.getContentPane().add(timePanel, BorderLayout.SOUTH);
-
-
-
-		try {
-			controller.loadAutoSave(System.getProperty("user.home")
-					+ "/.config/HolonGUI/Category/Category.json");
-		} catch (IOException e1) {
-		}
-
-		String autoPath = System.getProperty("user.home")
-				+ "/.config/HolonGUI/Autosave/";
-		File dest = new File(autoPath);
-		ArrayList<File> oldAutoSaves = controller.filterOldAutoSaveFiles();
-		int nrOfOldSaves = oldAutoSaves.size();
-
-		if (nrOfOldSaves > 0) {
-			int dialogButton = JOptionPane.YES_NO_OPTION;
-			int dialogResult = JOptionPane.showConfirmDialog(holegJFrame,
-					"Old autosave file was found, should it be loaded?",
-					warningText, dialogButton);
-			if (dialogResult == JOptionPane.YES_OPTION) {
-				if (dest.exists()) {
-					model.setAutoSaveNr(nrOfOldSaves - 1);
-					mntmRedo.doClick();
-				} else {
-					JOptionPane.showMessageDialog(holegJFrame,
-							"Autosave could not be loaded.");
-					setUpAutoSave(dest);
-				}
-			} else {
-				setUpAutoSave(dest);
-			}
-
-			// after all: delete the obsolete/old autosave files from the
-			// directory
-			controller.deleteObsoleteAutoSaveFiles();
-		}
-
-		canvasSP.addComponentListener(new ComponentAdapter() {
-			@Override
-			public void componentResized(ComponentEvent e) {
-				controller.setCanvasX(Math.max(model.getCanvasX(), canvasSP
-						.getViewport().getWidth()));
-				controller.setCanvasY(Math.max(model.getCanvasY(), canvasSP
-						.getViewport().getHeight()));
-				canvas.repaint();
-			}
-		});
-	}
-
-	private void initWindowMenu() {
-		menuBar.add(menuWindow);
-		//Algo
-		JMenuItem openMenu =  new JMenuItem("Open Algorithm Panel", new ImageIcon(ImageImport.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
-		openMenu.addActionListener(actionEvent -> {
-			new AddOnWindow(holegJFrame, controller);
-		});
-		openMenu.setAccelerator(KeyStroke.getKeyStroke('N', Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()));
-		menuWindow.add(openMenu);
-		//Outliner
-		JMenuItem openOutliner =  new JMenuItem("Open Outliner", new ImageIcon(ImageImport.loadImage("/Button_Images/iconOutliner.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
-		openOutliner.addActionListener(actionEvent -> {
-			outlinerList.add(new Outliner(holegJFrame, model, controller));
-		});
-		openOutliner.setAccelerator(KeyStroke.getKeyStroke('O', Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()));
-		menuWindow.add(openOutliner);
-		//FlexWindow
-		JMenuItem openFlexMenuItem =  new JMenuItem("Open Flexibility Panel", new ImageIcon(ImageImport.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
-		openFlexMenuItem.addActionListener(actionEvent -> {
-			flexList.add(new FlexWindow(holegJFrame, controller));
-		});
-		openFlexMenuItem.setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx()));
-		menuWindow.add(openFlexMenuItem);
-	}
-
-
-	public void updateOutliners(DecoratedState state)
-	{
-		//remove closed Outliner
-		ListIterator<Outliner> iter = outlinerList.listIterator();
-		while(iter.hasNext())
-		{
-			if(iter.next().isClosed) iter.remove();
-		}
-		//update open Outliner
-		for(Outliner out : outlinerList) {
-			out.repaintWithDecoratedState(state);
-		}
-	}
-	public void updateFlexWindows()
-	{
-		//remove closed Outliner
-		ListIterator<FlexWindow> iter = flexList.listIterator();
-		while(iter.hasNext())
-		{
-			if(iter.next().isClosed) iter.remove();
-		}
-		//update open Flex
-		for(FlexWindow out : flexList) {
-			out.update();
-		}
-	}
-	
-	
-	
-	private void showScrollGraph() {
-		scrollGraph.setVisible(true);
-		splitGraphHolonEl.setBottomComponent(scrollGraph);
-		splitGraphHolonEl.setDividerLocation(distanceBetweenElementsAndGraph);
-	}
-
-	private void hideScrollGraph() {
-		scrollGraph.setVisible(false);
-		splitGraphHolonEl.remove(scrollGraph);
-		splitGraphHolonEl.setDividerLocation(0);
-	}
-
-	private boolean isUpperPanelInsideBounds() {
-		int x = holegJFrame.getX();
-		int y = holegJFrame.getY();
-		int width = holegJFrame.getWidth();
-
-		// get all connected screen devices
-		GraphicsDevice[] screenDevices = GraphicsEnvironment
-				.getLocalGraphicsEnvironment().getScreenDevices();
-		boolean isUpperPanelVisible = false;
-
-		// and check whether they contain the upper left or upper right point of
-		// the frame
-		for (GraphicsDevice device : screenDevices) {
-			Rectangle bounds = device.getDefaultConfiguration().getBounds();
-			if (bounds.contains(x, y) || bounds.contains(x + width, y)) {
-				isUpperPanelVisible = true;
-				break;
-			}
-		}
-
-		return isUpperPanelVisible;
-	}
-
-	/**
-	 * Sets up autosave if no old one is loaded at the beginning
-	 *
-	 * @param dest
-	 *            path to save-folder
-	 */
-	private void setUpAutoSave(File dest) {
-		dest.mkdirs();
-		try {
-			controller.autoSave();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
-	}
-
-	/**
-	 * reloads the Categories from Model.
-	 *
-	 * @param categories
-	 *            the current categories
-	 */
-	private void updateCategories(final ArrayList<Category> categories) {
-		DefaultTreeModel treemodel = new DefaultTreeModel(new DefaultMutableTreeNode(
-				"Categories") {
-
-			private static final long serialVersionUID = 1L;
-
-			{
-				DefaultMutableTreeNode node1;
-				for (Category c : categories) {
-					node1 = new DefaultMutableTreeNode(c.getName());
-					
-					for (AbstractCanvasObject obj : c.getObjects()) {
-						node1.add(new DefaultMutableTreeNode(obj.getObjName()));
-					}
-					add(node1);
-				}
-
-			}
-		});
-		categoryTree.setModel(treemodel);
-	}
-
-	/**
-	 * When changes are made to the Categories.
-	 *
-	 * @param categories
-	 *            the Categories
-	 */
-	public void updateCategoryUI(ArrayList<Category> categories) {
-		DefaultTreeModel model = (DefaultTreeModel) categoryTree.getModel();
-		updateCategories(categories);
-		model.reload();
-	}
-
-	/**
-	 * Get the Frame.
-	 *
-	 * @return the Frame
-	 */
-	JFrame getFrmCyberPhysical() {
-		return holegJFrame;
-	}
-
-
-	/**
-	 * Checks if a double click was made.
-	 *
-	 * @return true if doublecklick, false if not
-	 */
-	private boolean doubleClick() {
-		if (click) {
-			click = false;
-			return true;
-		} else {
-			click = true;
-			Timer t = new Timer("doubleclickTimer", false);
-			t.schedule(new TimerTask() {
-				@Override
-				public void run() {
-					click = false;
-				}
-			}, 350);
-		}
-		return false;
-	}
-
-	/*
-	 * Open a new Tab with an UpperNodeCanvas
-	 */
-	private void openNewUpperNodeTab() {
-		chooseTabTemp();
-
-		JScrollPane scrollPane = getScrollPaneFromTabbedPane();
-		if (scrollPane.getViewport().getComponent(0) instanceof MyCanvas) {
-			unc = new GroupNodeCanvas(model, controller, unitGraph,
-					(GroupNode) temp, "", scrollPane.getViewport().getComponent(0));
-
-		} else {
-			unc = new GroupNodeCanvas(model, controller, unitGraph,
-					(GroupNode) temp, ((GroupNodeCanvas) scrollPane
-							.getViewport().getComponent(0)).path + " -> ", scrollPane.getViewport().getComponent(0));
-		}
-		unc.setShowedInformation(canvas.getShowedInformation());
-
-		// check if tab already open for clicked NodeOfNode
-		boolean dupl = false;
-
-		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
-			JScrollPane paneOriginal = (JScrollPane) tabbedPaneInnerOriginal
-					.getComponentAt(i);
-			if (paneOriginal != null
-					&& ((GroupNodeCanvas) paneOriginal.getViewport()
-							.getComponent(0)).upperNode.getId() == temp.getId()) {
-				dupl = true;
-				// set selected component to view
-				tabbedPaneOriginal
-						.setSelectedComponent(tabbedPaneInnerOriginal);
-				// set selected tab in view to found upper-node-canvas
-				tabbedPaneInnerOriginal
-						.setSelectedComponent(tabbedPaneInnerOriginal
-								.getComponentAt(i));
-			}
-
-			if (tabbedPaneSplit.getTabCount() > 0) {
-				JTabbedPane tabbedPaneInnerSplit = (JTabbedPane) tabbedPaneSplit
-						.getComponentAt(0);
-				if (tabbedPaneInnerSplit != null) {
-					JScrollPane paneSplit = (JScrollPane) tabbedPaneInnerSplit
-							.getComponentAt(i);
-					if (!initSplit
-							&& paneSplit != null
-							&& ((GroupNodeCanvas) paneSplit.getViewport()
-									.getComponent(0)).upperNode.getId() == temp
-									.getId()) {
-						dupl = true;
-						// set selected component to view
-						tabbedPaneSplit
-								.setSelectedComponent(tabbedPaneInnerSplit);
-						// set selected tab in view to found upper-node-canvas
-						tabbedPaneInnerSplit
-								.setSelectedComponent(tabbedPaneInnerSplit
-										.getComponentAt(i));
-					}
-				}
-			}
-
-			// if we found a duplicate, break
-			if (dupl) {
-				break;
-			}
-		}
-		if (!dupl) {
-			unc.setBorder(null);
-			unc.setBackground(Color.WHITE);
-			unc.setPreferredSize(new Dimension(model.getCanvasX(), model
-					.getCanvasY()));
-
-			unc.addMouseListener(new MouseAdapter() {
-				@Override
-				public void mousePressed(MouseEvent e) {
-					hideScrollGraph();
-					holonEleNamesDisplayed = "None";
-					elementGraph.setText(holonEleNamesDisplayed);
-
-					chooseTabTemp();
-
-					JScrollPane scrollPane1 = getScrollPaneFromTabbedPane();
-					temp = ((GroupNodeCanvas) scrollPane1.getViewport()
-							.getComponent(0)).tempCps;
-					if (doubleClick() && MouseEvent.BUTTON3 != e.getButton()
-							&& temp instanceof GroupNode) {
-						openNewUpperNodeTab();
-					}
-					if (temp instanceof HolonSwitch) {
-						updateUnitGraph((GraphEditable)temp);
-					}
-				}
-
-			});
-
-			JScrollPane sp = new JScrollPane(unc);
-			sp.setBorder(null);
-
-			// Selected tabbed Pane = tabbedPaneOriginal or tabbedPaneSplit
-			if (tabTemp == tabbedPaneOriginal) {
-				this.tabbedPaneInnerOriginal.add(temp.getName(), sp);
-				this.tabbedPaneInnerOriginal.setSelectedComponent(sp);
-				this.tabbedPaneInnerOriginal.setTabComponentAt(
-						this.tabbedPaneInnerOriginal.getTabCount() - 1,
-						new ButtonTabComponent(this.tabbedPaneInnerOriginal,
-								tabbedPaneSplit));
-
-			} else {
-				JTabbedPane tabbedPaneInnerSplit = (JTabbedPane) tabbedPaneSplit
-						.getComponentAt(0);
-				tabbedPaneInnerSplit.add(temp.getName(), sp);
-				Component tempC = tabbedPaneInnerSplit.getSelectedComponent();
-				tabbedPaneInnerSplit.setComponentAt(
-						tabbedPaneInnerSplit.getSelectedIndex(), null);
-				tabbedPaneOriginal.setComponentAt(
-						tabbedPaneInnerSplit.getSelectedIndex(), tempC);
-				tabbedPaneInnerSplit.setSelectedComponent(sp);
-
-				tabbedPaneInnerOriginal.add(temp.getName(), null);
-				tabbedPaneInnerOriginal.setTabComponentAt(
-						tabbedPaneInnerOriginal.getTabCount() - 1,
-						new ButtonTabComponent(tabbedPaneInnerOriginal,
-								tabbedPaneInnerSplit));
-			}
-
-			temp = null;
-		}
-	}
-
-	private void updateUpperNodes() {
-		for (Component c : tabbedPaneInnerOriginal.getComponents()) {
-			if (!(c instanceof JScrollPane)) {
-				continue;
-			}
-			Component pane = ((JScrollPane) c).getViewport().getComponent(0);
-			if (pane instanceof GroupNodeCanvas) {
-				temp = model.getHashcodeMap()
-						.get(((GroupNodeCanvas) pane).code);
-				((GroupNodeCanvas) pane).upperNode = (GroupNode) temp;
-			}
-		}
-	}
-
-	/**
-	 * Removes UpperNodeTab if UpperNode was deleted
-	 *
-	 * @param cps
-	 *            the CPS object that is currently selected
-	 */
-	private void removeUpperNodeTab(AbstractCanvasObject cps) {
-		if (cps instanceof GroupNode) {
-			boolean splitView = false;
-			for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
-				JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal
-						.getComponentAt(i);
-
-				if (scrollPaneOriginal == null) {
-					splitView = true;
-				} else if (((GroupNodeCanvas) scrollPaneOriginal.getViewport()
-						.getComponent(0)).upperNode.getId() == cps.getId()) {
-					((ButtonTabComponent) tabbedPaneInnerOriginal
-							.getTabComponentAt(i)).removeTabs();
-					break;
-				}
-			}
-			// If SplitView is on and the view on
-			// tabbedPaneSplit is the deleted upperNode
-			if (splitView && tabbedPaneSplit.getComponentCount() > 0) {
-				JTabbedPane tabbedPaneInnerSplit = (JTabbedPane) tabbedPaneSplit
-						.getComponentAt(0);
-
-				if (((GroupNodeCanvas) ((JScrollPane) tabbedPaneInnerSplit
-						.getSelectedComponent()).getViewport().getComponent(0)).upperNode
-						.getId() == cps.getId()) {
-					((ButtonTabComponent) tabbedPaneInnerOriginal
-							.getTabComponentAt(tabbedPaneInnerSplit
-									.getSelectedIndex())).removeTabs();
-				}
-			}
-		}
-	}
-
-
-	/**
-	 * chooses whether to set the tabTemp to tabbedPaneOriginal or
-	 * tabbedPaneSplit
-	 */
-	private void chooseTabTemp() {
-		// is the uppernode on tabbedPaneOriginal or tabbedPaneSplit
-		/* TODO: Fix or Remove SplitView */
-		if (tabbedPaneOriginal.getMousePosition() != null || initSplit) {
-			tabTemp = tabbedPaneOriginal;
-		} else {
-			tabTemp = tabbedPaneSplit;
-		}
-	}
-
-	private JScrollPane getScrollPaneFromTabbedPane() {
-		return getScrollPaneFromTabbedPane(-1);
-	}
-
-	private JScrollPane getScrollPaneFromTabbedPane(int index) {
-		Component upperLevelSelectedComponent;
-		if(tabTemp == null)
-		{
-			return null;
-		}
-		if (index == -1) {
-			upperLevelSelectedComponent = tabTemp.getSelectedComponent();
-		} else {
-			upperLevelSelectedComponent = tabTemp.getComponentAt(index);
-		}
-		if (upperLevelSelectedComponent instanceof JTabbedPane) {
-			Component nextLevel = ((JTabbedPane) upperLevelSelectedComponent).getSelectedComponent();
-			if(nextLevel instanceof JPanel)
-				return (JScrollPane) ((JPanel)nextLevel).getComponent(0);
-			else
-				return (JScrollPane) nextLevel;
-			
-		} else if (upperLevelSelectedComponent instanceof JScrollPane) {
-			return (JScrollPane) upperLevelSelectedComponent;
-		} else {
-			return null;
-		}
-	}
-
-
-	/**
-	 * if flexibility was turned on, then active needs to be turned off, the
-	 * energy currently produced/consumed
-	 *
-	 * @param eleBTemp
-	 *            element that needs to be updated
-	 * @param selectedValueBY
-	 *            the y value in the table
-	 */
-	private void updateElementTableAfterChange(HolonElement eleBTemp,
-			int selectedValueBY) {
-//		model.getSingleTable().setValueAt(false,
-//				selectedValueBY, 6);
-		model.getSingleTable().setValueAt(eleBTemp.isActive(), selectedValueBY,
-				5);
-		model.getSingleTable().setValueAt(eleBTemp.getAmount(),
-				selectedValueBY, 4);
-		model.getSingleTable().setValueAt(
-				controller.getSimManager().getActualFlexManager().isAFlexInUseOfHolonElement(eleBTemp),
-				selectedValueBY, 3);
-		model.getSingleTable().setValueAt(eleBTemp.getEnergyPerElement(),
-				selectedValueBY, 2);
-	}
-
-	public void triggerUpdateController(AbstractCanvasObject temp) {
-		if(model != null) { return;}
-		if (temp != null) {
-			updCon.paintProperties(temp);
-		}
-		updCon.refreshTableHolonElement(model.getMultiTable(),
-				model.getSingleTable());
-		updCon.refreshTableProperties(model.getPropertyTable());
-	}
-
-	/**
-	 * This Method updates the UnitGraph, saves the old LocalModeState and load the new LocalModeState.
-	 * @param element The new Element to load the UnitGraph
-	 */
-	private void updateUnitGraph(GraphEditable element){
-		//SaveOld LocalMode State.
-		if(localPeriodInput.isVisible())
-		{
-			//Save Old State
-			validateInput(localPeriodInput.getEditor().getItem().toString(), false);
-		}
-		//Update UnitGraph
-		unitGraph.initNewElement(element);
-		//Load LocalMode State.
-		changeLocalPeriodButtonAppeareance(unitGraph.isUsingLocalPeriod());
-		localPeriodInput.getEditor().setItem(unitGraph.getLocalPeriod());
-	}
-	
-	/**
-	 * Displayed the actual LocalModeState.
-	 * @param enabled
-	 */
-	private void changeLocalPeriodButtonAppeareance(boolean enabled) {
-		localPeriodInput.setVisible(enabled);
-		if(enabled)
-		{
-			localPeriodButtonImage.setImage(ImageImport.loadImage("/Images/Graph.png"));
-		}else {
-			localPeriodButtonImage.setImage(GrayFilter.createDisabledImage(ImageImport.loadImage("/Images/Graph.png")));
-		}
-	}
-	/**
-	 * Validate the LocalMode Input and when its valid save on the Element.
-	 * @param text the inputText to validate. 
-	 * @param bShowMessage when true, open a MessageDialog when text invalid.
-	 */
-	private void validateInput(String text, boolean bShowMessage) {
-		int localPeriodInputValue;
-		try {
-		      localPeriodInputValue = Integer.parseInt(text);
-		} catch (NumberFormatException e) {
-			if(bShowMessage)
-				JOptionPane.showMessageDialog(contentPane, '"' +text + '"'+ " is not a valid Input. \n Use whole numbers.");
-			return;
-		}
-		unitGraph.setLocalPeriod(localPeriodInputValue);
-	}
-
-	
-	private void openWebpage(String URL){
-		try {
-			java.awt.Desktop.getDesktop().browse(new URI(URL));
-		} catch (IOException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		} catch (URISyntaxException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-	}
-	
-	/**
-	 * closes all UpperNodeTabs, that don't have a
-	 * valid UpperNode (e.g. if it was ungrouped/deleted/replaced and so on)
-	 */
-	private void closeInvalidUpperNodeTabs() {
-		/**
-		 * close bugged Tabs
-		 */
-		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
-			JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal
-					.getComponentAt(i);
-			if (((GroupNodeCanvas) scrollPaneOriginal.getViewport()
-					.getComponent(0)).upperNode == null) {
-				((ButtonTabComponent) tabbedPaneInnerOriginal
-						.getTabComponentAt(i)).removeTabs();
-				break;
-			}
-		}
-	}
-	
-	public void repaintCanvas() {
-		tabbedPaneInnerOriginal.repaint();
-	}
-	
-	/**
-	 * Class should be reworked as soon as possible!
-	 * @param state
-	 */
-	public void guiDisable(boolean state) {
-		canvas.disabled = state;
-		for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
-			JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal
-					.getComponentAt(i);
-			if (((GroupNodeCanvas) scrollPaneOriginal.getViewport()
-					.getComponent(0)).upperNode != null) {
-				((GroupNodeCanvas) scrollPaneOriginal.getViewport()
-						.getComponent(0)).disable = state;
-			}
-		}
-	}
-}

+ 0 - 1272
src/ui/view/GroupNodeCanvas.java.orig

@@ -1,1272 +0,0 @@
-package ui.view;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.awt.geom.Line2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import javax.swing.ImageIcon;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingUtilities;
-
-import com.google.gson.JsonParseException;
-
-import classes.AbstractCanvasObject;
-import classes.Edge;
-import classes.GroupNode;
-import classes.HolonObject;
-import classes.HolonSwitch;
-import classes.Node;
-import ui.controller.Control;
-import ui.controller.UpdateController;
-import ui.model.Consumer;
-import ui.model.DecoratedCable;
-import ui.model.DecoratedGroupNode;
-import ui.model.DecoratedHolonObject;
-import ui.model.DecoratedHolonObject.HolonObjectState;
-import ui.model.DecoratedSwitch;
-import ui.model.ExitCable;
-import ui.model.DecoratedSwitch.SwitchState;
-import ui.model.Model;
-import ui.model.Passiv;
-import ui.model.Supplier;
-import utility.ImageImport;
-import utility.Vector2Float;
-import utility.Vector2Int;
-
-/**
- * This Class is the Canvas. All Objects will be visualized here
- *
- * @author Gruppe14
- */
-public class GroupNodeCanvas extends AbstractCanvas implements MouseListener, MouseMotionListener {
-
-    private static final long serialVersionUID = 1L;
-    // The UpperNode
-    public GroupNode upperNode;
-    // Path
-    protected String path;
-    int code;
-    public boolean disable = false;
-    /**
-     * Constructor.
-     *
-     * @param mod       the Model
-     * @param control   the Controller
-     * @param unitGraph
-     */
-    GroupNodeCanvas(Model mod, Control control, UnitGraph unitGraph, GroupNode UpperNode, String parentPath, Component parentComponent) {
-        toolTip = false;
-
-        this.controller = control;
-        this.model = mod;
-        this.upperNode = UpperNode;
-        this.code = UpperNode.hashCode();
-        this.path = parentPath + upperNode.getName();
-        scalediv20 = model.getScale() / 20;
-
-        // Cps objecte aus dem border links schieben
-        upperNode.setLeftBorder(/*(int) (50 + scalediv20 + scalediv20 + 10)*/ 0);
-        for (AbstractCanvasObject cps : upperNode.getNodes()) {
-            if (cps.getPosition().getX() < model.getScaleDiv2() + upperNode.getLeftBorder() + 5) {
-                cps.setPosition(
-                        new Vector2Int(upperNode.getLeftBorder() + 5 + model.getScaleDiv2(), cps.getPosition().getY()));
-            }
-        }
-
-        showedInformation[0] = true;
-        showedInformation[1] = true;
-        showedInformation[4] = true;
-
-        popmenu.add(itemCut);
-        popmenu.add(itemCopy);
-        popmenu.add(itemPaste);
-        popmenu.add(itemDelete);
-        popmenu.add(itemAlign);
-        popmenu.addSeparator();
-        popmenu.add(itemGroup);
-        popmenu.add(itemUngroup);
-        popmenu.add(itemCreateTemplate);
-        
-        itemAlign.setEnabled(true);
-        itemDelete.setEnabled(false);
-        itemCut.setEnabled(false);
-        itemCopy.setEnabled(false);
-        itemPaste.setEnabled(true);
-        itemGroup.setEnabled(false);
-        itemUngroup.setEnabled(false);
-        
-        updCon = new UpdateController(model, controller);
-        
-        itemAlign.addActionListener(actionEvent -> {
-        	for(AbstractCanvasObject cps: model.getSelectedCpsObjects())
-        		align(cps, model.getScaleDiv2());
-        	repaint();
-        });
-        
-        itemGroup.addActionListener(actionEvent -> {
-            // calculate uppernode pos (taken from the controller)
-            unPos = new Vector2Int(0, 0);
-            animCps = new ArrayList<>();
-            for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-                animCps.add(cps); // add to animation Cps ArrayList
-                unPos = unPos.add(cps.getPosition());
-            }
-            unPos = unPos.divide(animCps.size());
-
-            // save old Position
-            savePos = new ArrayList<>();
-            for (int i = 0; i < animCps.size(); i++) {
-                savePos.add(animCps.get(i).getPosition().clone());
-            }
-
-            animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
-                if (animDuration - animDelay > 0 && animCps.size() > 1) {
-                    for (AbstractCanvasObject currentAnimCps : animCps) {
-                    	Vector2Int pos = currentAnimCps.getPosition();
-                    	Vector2Int difference = pos.subtract(unPos);
-                    	Vector2Int result = pos.subtract(difference.divide(animSteps));
-                    	pos.set(result);
-                    }
-                    repaint();
-                    animDuration -= animDelay;
-                    animSteps--;
-                } else {
-                    animDuration = ANIMTIME;
-                    animSteps = animDuration / animDelay;
-                    animT.stop();
-                    for (int i = 0; i < animCps.size(); i++) {
-                        animCps.get(i).getPosition().set(savePos.get(i));
-                    }
-                    controller.addUpperNode("GroupNode", upperNode, model.getSelectedCpsObjects());
-                    controller.calculateStateAndVisualForCurrentTimeStep();
-                    repaint();
-                }
-            });
-            animT.start();
-        });
-
-        itemUngroup.addActionListener(actionEvent -> {
-            // save old Position
-        	closeUpperNodeTab(tempCps.getId());
-
-            savePos = new ArrayList<>();
-            animCps = ((GroupNode) tempCps).getNodes();
-            controller.ungroupGroupNode((GroupNode) tempCps, upperNode);
-
-            for (int i = 0; i < animCps.size(); i++) {
-                savePos.add(animCps.get(i).getPosition().clone());
-            }
-            for (AbstractCanvasObject cps : animCps) {
-                cps.setPosition(tempCps.getPosition().clone());
-            }
-
-            animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
-                if (animDuration - animDelay >= 0) {
-                    for (int i = 0; i < animCps.size(); i++) {
-                        Vector2Int pos = animCps.get(i).getPosition();
-                    	Vector2Int difference = pos.subtract(savePos.get(i));
-                    	Vector2Int result = pos.subtract(difference.divide(animSteps));
-                    	pos.set(result);
-                    }
-                    repaint();
-                    animDuration -= animDelay;
-                    animSteps--;
-                } else {
-                    animDuration = ANIMTIME;
-                    animSteps = animDuration / animDelay;
-                    animT.stop();
-                    for (int i = 0; i < animCps.size(); i++) {
-                        animCps.get(i).getPosition().set(savePos.get(i));
-                    }
-
-                    controller.calculateStateAndVisualForCurrentTimeStep();
-                    repaint();
-                }
-            });
-            animT.start();
-        });
-
-        
-
-        itemDelete.addActionListener(actionEvent -> {
-            // Remove the selected Object objects
-            for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-                if (upperNode.getNodes().contains(cps)) {
-                    controller.delObjUpperNode(cps, upperNode);
-                    // Remove UpperNodeTab if UpperNode deleted
-                    if (cps instanceof GroupNode) {
-                        JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent().getParent();
-                        // Look if the uppernode is open in a Tab
-                        for (int i = 4; i < tabbedPane.getTabCount(); i++) {
-
-                            if (tabbedPane.getComponentAt(i) != null &&
-                                    ((GroupNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
-                                            .getComponent(0)).upperNode.getId() == cps.getId()) {
-                                ((ButtonTabComponent) tabbedPane.getTabComponentAt(i)).removeTabs();
-                                break;
-                            }
-                        }
-                      
-                    }
-                }
-            }
-            toolTip = false;
-            controller.clearSelection();
-            tempCps = null;
-            repaint();
-        });
-
-        itemCut.addActionListener(actionEvent -> {
-            controller.cut(upperNode);
-            itemPaste.setEnabled(true);
-            repaint();
-        });
-
-        itemCopy.addActionListener(actionEvent -> {
-        	if(tempCps instanceof GroupNode)
-				controller.getObjectsInDepth();
-            controller.copy(upperNode);
-            itemPaste.setEnabled(true);
-            repaint();
-        });
-
-        itemPaste.addActionListener(actionEvent -> {
-            try {
-                controller.paste(upperNode, mousePosition);
-            } catch (JsonParseException | UnsupportedFlavorException | IOException e1) {
-                JLabel message = new JLabel("The Clipboard information cannot be pastet into Application.");
-                JOptionPane.showMessageDialog(null, message, "", JOptionPane.ERROR_MESSAGE);
-            }
-            repaint();
-        });
-        
-        /*
-		 * create Template
-		 */
-		itemCreateTemplate.addActionListener(actionEvent -> {
-			controller.createTemplate((HolonObject)tempCps, (JFrame)SwingUtilities.getRoot(this));
-		});
-
-        this.addMouseListener(this);
-        this.addMouseMotionListener(this);
-    }
-
-	/**
-	 * Paints all Components on the Canvas.
-	 *
-	 * @param g
-	 *            Graphics
-	 */
-	
-	private Color getStateColor(HolonObjectState state) {
-		switch(state) {
-		case NOT_SUPPLIED:
-			return new Color(230, 120, 100);
-		case NO_ENERGY:
-			return Color.white;
-		case OVER_SUPPLIED:
-			return new Color(166, 78, 229);
-		case PARTIALLY_SUPPLIED:
-			return Color.yellow;
-		case PRODUCER:
-			return Color.lightGray;
-		case SUPPLIED:
-			return new Color(13, 175, 28);
-		default:
-			return Color.BLACK;
-		}
-	}
-	private void paintCanvasObject(Graphics2D g, DecoratedHolonObject decoratedHolonObject){
-		Vector2Int pos = decoratedHolonObject.getModel().getPosition();
-		Color statecolor = getStateColor(decoratedHolonObject.getState());
-		g.setColor(statecolor);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
-		drawCanvasObject(g, decoratedHolonObject.getModel().getImage(), pos);
-	}
-	private void drawCanvasObjectString(Graphics2D g, Vector2Int posOfCanvasObject, float energy) {
-		g.setColor(Color.BLACK);
-		g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (controller.getScale() / 4f) )); 
-		g.drawString((energy > 0)? "+" + Float.toString(energy): Float.toString(energy), posOfCanvasObject.getX() - controller.getScaleDiv2(), posOfCanvasObject.getY() - controller.getScaleDiv2() - 1);
-	}
-	private void paintConsumer(Graphics2D g, Consumer con){
-		paintCanvasObject(g, con);
-		paintSupplyBar(g,con.getSupplyBarPercentage(), getStateColor(con.getState()), con.getModel().getPosition());
-		drawCanvasObjectString(g, con.getModel().getPosition(), -con.getEnergyNeededFromNetwork());
-	}
-	private void paintSupplier(Graphics2D g, Supplier sup){
-		paintCanvasObject(g, sup);
-		drawCanvasObjectString(g, sup.getModel().getPosition(), sup.getEnergyToSupplyNetwork());
-	}
-	
-	private void drawCanvasObject(Graphics2D g, String Image, Vector2Int pos) {
-		g.drawImage(ImageImport.loadImage(Image, controller.getScale(), controller.getScale()) , 
-				pos.getX() - controller.getScaleDiv2(),
-				pos.getY() - controller.getScaleDiv2(),
-				controller.getScale(), controller.getScale() , null);
-	}
-	
-	private void paintCable(Graphics2D g, DecoratedCable cable, boolean isSelected)
-	{
-		Vector2Int start = cable.getModel().getA().getPosition();
-		Vector2Int end =  cable.getModel().getB().getPosition();
-		float currentEnergy = cable.getFlowEnergy();
-		float capacity = cable.getModel().getCapacity();
-		boolean unlimited = cable.getModel().isUnlimitedCapacity();
-		switch(cable.getState()) {
-		case Burned:
-			g.setColor(Color.RED);
-			g.setStroke(new BasicStroke(2));
-			break;
-		case Working:
-			g.setColor(new Color(13, 175, 28));
-			g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
-			break;
-		}
-		if(isSelected){
-			g.setColor(Color.lightGray);
-		}
-		g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
-		Vector2Int middle = new Vector2Int((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
-		g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-		g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
-	}
-	private void paintSwitch(Graphics2D g, DecoratedSwitch dSwitch)
-	{
-		drawCanvasObject(g, dSwitch.getState() == SwitchState.Open ? HolonSwitch.getSwitchOpenImage(): HolonSwitch.getSwitchClosedImage() , dSwitch.getModel().getPosition());
-	}
-	private void paintGroupNode(Graphics2D g, DecoratedGroupNode dGroupNode) {
-		Vector2Int pos = dGroupNode.getModel().getPosition();
-		g.setColor(Color.lightGray);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
-		drawCanvasObject(g, "/Images/upper_node.png" , pos);
-		paintGroupNodeBar(g, dGroupNode, pos);
-	}
-	private void paintGroupNodeBar(Graphics2D g, DecoratedGroupNode dGroupNode , Vector2Int pos) {
-		// +1, -2, -1 little Adjustment for pixel perfect alignment
-		int barWidth = (int) (controller.getScale());
-		int barHeight = (int) (controller.getScale() / 5);
-		g.setColor(Color.WHITE);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
-		float[] percentages = getGroupNodeBarPercentages(dGroupNode);
-		Color[] colors = new Color[6];
-		colors[0] = getStateColor(HolonObjectState.PRODUCER);
-		colors[1] = getStateColor(HolonObjectState.NOT_SUPPLIED);
-		colors[2] = getStateColor(HolonObjectState.PARTIALLY_SUPPLIED);
-		colors[3] = getStateColor(HolonObjectState.SUPPLIED);
-		colors[4] = getStateColor(HolonObjectState.OVER_SUPPLIED);
-		colors[5] = getStateColor(HolonObjectState.NO_ENERGY);
-				
-		for(int i = 5; i>=0; i--) {
-			g.setColor(colors[i]);
-			g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * percentages[i] - 1), barHeight);		
-		}
-//		g.setColor(color);
-//		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
-		g.setColor(Color.BLACK);
-		g.setStroke(new BasicStroke(1));
-		g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
-	}
-	/**
-	 * HardCoded Stuff dont try at Home ;)
-	 * @param dGroupNode
-	 * @return
-	 */
-	public float[] getGroupNodeBarPercentages(DecoratedGroupNode dGroupNode) {
-		int[] amountOfObjects = new int[6];
-		amountOfObjects[0] = dGroupNode.getAmountOfSupplier();
-		amountOfObjects[1] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.NOT_SUPPLIED);
-		amountOfObjects[2] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.PARTIALLY_SUPPLIED);
-		amountOfObjects[3] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.SUPPLIED);
-		amountOfObjects[4] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.OVER_SUPPLIED);
-		amountOfObjects[5] = dGroupNode.getAmountOfPassiv();
-		int countHolonObjects = amountOfObjects[0] + 	amountOfObjects[1] + amountOfObjects[2] + amountOfObjects[3] + amountOfObjects[4] + amountOfObjects[5];
-		float[] percentages = new float[6];
-		int count = 0;
-		for(int i = 0; i < 6; i++) {
-			count += amountOfObjects[i];
-			percentages[i] = (float)count / (float)countHolonObjects;
-		}
-		return percentages;
-	}
-	private void paintExitCable(Graphics2D g, ExitCable eCable) {
-		if(eCable.getStart() == null || eCable.getFinish() == null) {
-			System.out.println("Null wrong exitcable");
-			System.out.println(" wrongCable: " + " start:"  +eCable.getStart() + " end:"  +eCable.getFinish() + " state:" + eCable.getState());
-			return;
-		}
-		Vector2Int start = eCable.getStart().getPosition();
-		Vector2Int end = eCable.getFinish().getPosition();
-		float currentEnergy = eCable.getCable().getFlowEnergy();
-		float capacity = eCable.getCable().getModel().getCapacity();
-		boolean unlimited = eCable.getCable().getModel().isUnlimitedCapacity();
-		switch(eCable.getCable().getState()) {
-		case Burned:
-			g.setColor(Color.RED);
-			g.setStroke(new BasicStroke(2));
-			break;
-		case Working:
-			g.setColor(new Color(13, 175, 28));
-			g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
-			break;
-		}
-		switch(eCable.getState()) {
-		case DOWN:
-		case DOWNDOWN:
-			g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
-			Vector2Int middle = new Vector2Int((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
-			g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-			g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
-			break;
-		case DOWNUP:
-		case UP:
-			Vector2Float vStart = new Vector2Float(start.getX(), start.getY());
-			Vector2Float vEnd = new Vector2Float(end.getX(), end.getY());
-			float stretchFactor = 4 * model.getScale();
-			stretchFactor =  (stretchFactor > vStart.getDistance(vEnd))? vStart.getDistance(vEnd) : stretchFactor;
-			Vector2Float vPosition = vStart.add((vEnd.subtract(vStart)).normalize().multiply(stretchFactor));
-			Vector2Int result = new Vector2Int(Math.round(vPosition.getX()),Math.round(vPosition.getY()));
-			g.drawLine(start.getX(), start.getY(), result.getX(), result.getY());
-			Vector2Int middle1 = new Vector2Int((start.getX() +result.getX()) / 2, (start.getY() + +result.getY()) / 2);
-			g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-			g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle1.getX(), middle1.getY());
-			drawCanvasObject(g, "/Images/arrowUp.png" , result);
-			break;
-		default:
-			System.out.println("Error");
-			break;
-		}
-	}
-	private void paintSupplyBar(Graphics2D g, float percentage, Color color, Vector2Int pos) {
-		// +1, -2, -1 little Adjustment for pixel perfect alignment
-		int barWidth = (int) (controller.getScale());
-		int barHeight = (int) (controller.getScale() / 5);
-		g.setColor(Color.WHITE);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
-		g.setColor(color);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
-		g.setColor(Color.BLACK);
-		g.setStroke(new BasicStroke(1));
-		g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
-		g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (barHeight * 1.5) - 2)); 
-		String percentageString = (Math.round((percentage * 100))) + "%";
-		int stringWidth = (int) g.getFontMetrics().getStringBounds(percentageString, g).getWidth();
-		if(percentage > 1.0f) g.setColor(Color.WHITE); //Just to see better on purple
-		g.drawString(percentageString, pos.getX() + 1 - stringWidth / 2, pos.getY() + controller.getScaleDiv2() - 1+ barHeight);
-		
-	}
-	
-	//old code
-	void drawMarker(Graphics2D g) {
-		Color transparentGrey = new Color(128, 174, 247, 40);
-		if (sx > x && sy > y) {
-			g.drawRect(x, y, sx - x, sy - y);
-			g.setColor(transparentGrey);
-			g.fillRect(x, y, sx - x, sy - y);
-		} else if (sx < x && sy < y) {
-			g.drawRect(sx, sy, x - sx, y - sy);
-			g.setColor(transparentGrey);
-			g.fillRect(sx, sy, x - sx, y - sy);
-		} else if (sx >= x) {
-			g.drawRect(x, sy, sx - x, y - sy);
-			g.setColor(transparentGrey);
-			g.fillRect(x, sy, sx - x, y - sy);
-		} else if (sy >= y) {
-			g.drawRect(sx, y, x - sx, sy - y);
-			g.setColor(transparentGrey);
-			g.fillRect(sx, y, x - sx, sy - y);
-		}
-	}
-	public void paintComponent(Graphics g) {		
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;
-		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
-		HashSet<Edge> selectedEdges = new HashSet<Edge>();
-		for(AbstractCanvasObject aCps:  model.getSelectedCpsObjects()) {
-			for(Edge edge: aCps.getConnections()) {
-				selectedEdges.add(edge);
-			}
-		}
-		if(model.getSelectedEdge() != null) selectedEdges.add(model.getSelectedEdge());
-
-		
-		DecoratedGroupNode  actualGroupNode = controller.getSimManager().getActualVisualRepresentationalState().getCreatedGroupNodes().get(upperNode);
-		//VisualState Representation:
-		for(ExitCable cable : actualGroupNode.getExitCableList()) {
-			paintExitCable(g2d, cable);
-		}
-		for(DecoratedCable cable : actualGroupNode.getInternCableList()) {
-			paintCable(g2d, cable, selectedEdges.contains(cable.getModel()));
-		}
-	
-		
-		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.setColor(Color.BLUE);
-		g2d.setStroke(new BasicStroke(1));
-		Color transparentGrey = new Color(128, 174, 247, 40);
-		for(AbstractCanvasObject aCps:  model.getSelectedCpsObjects()) {
-			if(aCps instanceof Node) {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()),  controller.getScale(),  controller.getScale());
-				g2d.setColor(Color.LIGHT_GRAY);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()),  controller.getScale(),  controller.getScale());
-			}
-			else {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));
-				g2d.setColor(Color.LIGHT_GRAY);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));				
-			}
-
-		}
-		//maybeReplace:
-		if(mayBeReplaced != null){
-			g2d.setColor(Color.RED);
-			Vector2Int pos = mayBeReplaced.getPosition();
-			g.drawImage(ImageImport.loadImage("/Images/replace.png") , 
-					pos.getX() + controller.getScaleDiv2(),
-					pos.getY() - controller.getScale(),
-					controller.getScaleDiv2(), controller.getScaleDiv2(), null);
-		}
-		//<-- OldCode
-	}
-   
-
-    @Override
-    public void mouseClicked(MouseEvent e) {
-    	if(!disable){
-        triggerUpdateController();
-        stopEditing();
-    	}
-    }
-
-    @Override
-    public void mouseEntered(MouseEvent e) {
-    }
-
-    @Override
-    public void mouseExited(MouseEvent e) {
-    }
-
-    @Override
-    public void mousePressed(MouseEvent e) {
-    	if(!disable){
-    	stopEditing();
-        tempCps = null;
-        dataSelected = null;
-        edgeHighlight = null;
-        controller.setSelecteEdge(null);
-        controller.setSelectedObjectID(-1);
-        // Object Selection
-
-        // Erase old data in the PropertyTable
-        if (model.getPropertyTable().getRowCount() > 0) {
-            for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
-                model.getPropertyTable().removeRow(i);
-            }
-        }
-
-        if (e.getX() > upperNode.getLeftBorder()) {
-            for (AbstractCanvasObject cps : upperNode.getNodes()) {
-                cx = cps.getPosition().getX() - model.getScaleDiv2();
-                cy = cps.getPosition().getY() - model.getScaleDiv2();
-                if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
-                    tempCps = cps;
-
-
-                    dragging = true;
-                    if (e.isControlDown() && tempCps != null) {
-                        if (model.getSelectedCpsObjects().contains(tempCps)) {
-                            controller.removeSelectedObjectFromSelection(tempCps);
-                        } else {
-                            controller.addSelectedObject(tempCps);
-                            if(tempCps instanceof GroupNode)
-    							controller.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;
-                }
-            }
-        } else {
-            // look for objects connected to uppernode
-            int count = 0;
-            for (Edge ed : upperNode.getConnections()) {
-                AbstractCanvasObject cps;
-                if (ed.getA().equals(this.upperNode)) {
-                    cps = ed.getB();
-                } else {
-                    cps = ed.getA();
-                }
-                if (x - controller.getScale() <= ((upperNode.getLeftBorder() >> 1) - model.getScaleDiv2())
-                        && y - controller.getScale() <= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)
-                        && x >= (upperNode.getLeftBorder() >> 1) - model.getScaleDiv2()
-                        && y >= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)) {
-                    tempCps = cps;
-                    // If drawing an Edge (CTRL down)
-                    if (tempCps.getClass() == HolonObject.class) {
-                        HolonObject tempObj = ((HolonObject) tempCps);
-                        dataSelected = tempObj.getElements();
-                    }
-                    if (e.isShiftDown()) {
-                        drawEdge = true;
-                    }
-                }
-                count++;
-            }
-        }
-
-        // Selection of CpsObject
-        // model.setSelectedCpsObject(tempCps);
-
-        // Edge Selection
-        if (e.getButton() == MouseEvent.BUTTON1) {
-            if (tempCps == null) {
-                edgeHighlight = mousePositionOnEdge(x, y);
-                controller.setSelecteEdge(edgeHighlight);
-                controller.setSelectedObjectID(0);
-                if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-                    controller.clearSelection();
-                }
-                updCon.deleteRows(model.getMultiTable());
-                updCon.deleteRows(model.getSingleTable());
-            }
-
-            if (edgeHighlight == null && tempCps == null) {
-                sx = e.getX();
-                sy = e.getY();
-                doMark = true;
-            }
-            // System.out.println("Selected Objects");
-            // for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
-            // System.out.println(temp.getName() + " " + temp.getID());
-            // }
-            repaint();
-        }
-    	}
-    }
-
-    @Override
-    public void mouseReleased(MouseEvent e) {
-    	if(!disable){
-        x = e.getX();
-        y = e.getY();
-        dragging = false;
-        if (model.getSelectedCpsObjects().size() > 1) {
-            model.getTableHolonElement().setModel(model.getMultiTable());
-        } else if (model.getSelectedCpsObjects().size() == 1) {
-            model.getTableHolonElement().setModel(model.getSingleTable());
-        }
-
-        if (drawEdge) {
-            drawEdge = false;
-            drawDeleteEdge();
-        }
-
-        if (dragged) {
-            try { 
-            	/**
-            	 * Save State before performing NodePlacement, replacement e.g.
-            	 */
-                controller.autoSave();
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-            
-            /**
-             * check if tempCps could replace an Object on the UpperNodeanvas
-             */
-            if(model.getSelectedCpsObjects().size() == 1 && checkForReplacement(upperNode.getNodes(), 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
-            	 */
-            	controller.replaceObjUpperNode(mayBeReplaced, tempCps, upperNode);
-            	mayBeReplaced=null;
-            }
-        }
-
-        if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
-            controller.clearSelection();
-            controller.addSelectedObject(tempCps);
-            if(tempCps instanceof GroupNode)
-				controller.getObjectsInDepth();
-        }
-
-        dragged = false;
-
-        // Rightclick List
-        setRightClickMenu(e);
-
-        markObjects();
-
-        if (doubleClick() && tempCps != null && tempCps instanceof HolonSwitch) {
-            ((HolonSwitch) tempCps).switchState();
-        }
-
-        controller.calculateStateAndVisualForTimeStep(model.getCurIteration());
-        triggerUpdateController();
-        repaint();
-    	}
-    }
-
-    @Override
-    public void mouseDragged(MouseEvent e) {
-    	if(!disable){
-        // If Edge is drawn
-        x = e.getX();
-        y = e.getY();
-        if (!model.getSelectedCpsObjects().contains(tempCps) && !doMark) {
-            controller.clearSelection();
-            if (tempCps != null) {
-                controller.addSelectedObject(tempCps);
-            }
-        }
-        if (dragging) {
-            try {            	
-                // tempCps in the upperNode? else its a connected Object from
-                // outside
-                if (upperNode.getNodes().contains(tempCps)) {
-                    dragged = true;
-                    float xDist, yDist; // Distance
-
-                    x = e.getX();
-                    y = e.getY();
-
-                    // Make sure its in bounds
-                    if (e.getX() < controller.getScaleDiv2() + upperNode.getLeftBorder() + 5)
-                        x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
-                    else if (e.getX() > this.getWidth() - controller.getScaleDiv2())
-                        x = this.getWidth() - controller.getScaleDiv2();
-                    if (e.getY() < controller.getScaleDiv2())
-                        y = controller.getScaleDiv2();
-                    else if (e.getY() > this.getHeight() - controller.getScaleDiv2())
-                        y = this.getHeight() - controller.getScaleDiv2();
-
-                    // 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() - model.getScaleDiv2());
-                    toolTipPos.setY(tempCps.getPosition().getY() - model.getScaleDiv2());
-
-                    // All Selected Objects
-                    for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-                        if (cps != tempCps) {
-                            x = (int) (cps.getPosition().getX() + xDist);
-                            y = (int) (cps.getPosition().getY() + yDist);
-
-                            // Make sure its in bounds
-                            if (x < upperNode.getLeftBorder() + 5 + controller.getScaleDiv2())
-                                x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
-                            else if (x > this.getWidth() - controller.getScaleDiv2())
-                                x = this.getWidth() - controller.getScaleDiv2();
-                            if (y <= controller.getScaleDiv2())
-                                y = controller.getScaleDiv2();
-                            else if (y > this.getHeight() - controller.getScaleDiv2())
-                                y = this.getHeight() - controller.getScaleDiv2();
-
-                            cps.setPosition(x, y);
-                        }
-                    }
-                }
-                /**
-            	 * check if something would be replaced
-            	 */
-                if(model.getSelectedCpsObjects().size()==1)
-                	checkForReplacement(upperNode.getNodes(), tempCps, x, y);
-
-               repaint();
-            } catch (Exception eex) {
-
-            }
-        	
-        }
-
-        // Mark Objects
-        if (doMark) {
-            tempSelected.clear();
-            for (AbstractCanvasObject cps : upperNode.getNodes()) {
-                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() + model.getScaleDiv2() && y1 <= cps.getPosition().getY() + model.getScaleDiv2()
-                        && x2 >= cps.getPosition().getX() && y2 >= cps.getPosition().getY()) {
-                    tempSelected.add(cps);
-
-                }
-            }
-            int count = 0;
-            for (Edge ed : upperNode.getConnections()) {
-                AbstractCanvasObject cps;
-                if (ed.getA().equals(upperNode)) {
-                    cps = ed.getB();
-                } else {
-                    cps = ed.getA();
-                }
-
-                int x1 = sx, x2 = x, y1 = sy, y2 = y;
-
-                if (sx >= x) {
-                    x1 = x;
-                    x2 = sx;
-                }
-                if (sy >= y) {
-                    y1 = y;
-                    y2 = sy;
-                }
-
-                if (x1 <= upperNode.getLeftBorder() >> 1
-                        && y1 <= (int) (5 + (model.getScale() + scalediv20 + 10) * count) + model.getScaleDiv2()
-                        && x2 >= upperNode.getLeftBorder() >> 1
-                        && y2 >= (int) (5 + (model.getScale() + scalediv20 + 10) * count)) {
-                    tempSelected.add(cps);
-
-                }
-                count++;
-            }
-        }
-
-        repaint();
-    	}
-    }
-
-    @Override
-    public void mouseMoved(MouseEvent e) {
-    	{
-        x = e.getX();
-        y = e.getY();
-        // Everything for the tooltip :)
-        boolean on = false;
-        for (AbstractCanvasObject cps : upperNode.getNodes()) {
-
-            cx = cps.getPosition().getX() - controller.getScaleDiv2();
-            cy = cps.getPosition().getY() - controller.getScaleDiv2();
-
-            on = setToolTipInfoAndPosition(on, cps);
-        }
-        int count = 0;
-        for (Edge ed : upperNode.getConnections()) {
-
-            AbstractCanvasObject cps;
-            if (ed.getA().equals(this.upperNode)) {
-                cps = ed.getB();
-            } else {
-                cps = ed.getA();
-            }
-
-            cx = upperNode.getLeftBorder() >> 1;
-            cy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count);
-            if (x - 50 <= cx && y - 50 <= cy && x >= cx && y >= cy) {
-
-                on = true;
-                toolTipPos.setX(cx - 25);
-                toolTipPos.setY(cy + 50);
-                toolTipText = cps.getName() + ", " + cps.getId();
-
-            }
-            count++;
-        }
-
-        toolTip = on;
-        repaint();
-    	}
-    }
-
-    /**
-     * Draws or Deletes an Edge.
-     */
-    void drawDeleteEdge() {
-        boolean node = true; // new node?
-        boolean newEdge = true;
-        boolean onEdge = true;
-        boolean deleteNode = false;
-        boolean outsideCon = !upperNode.getNodes().contains(tempCps); // Connection to the outside
-        boolean found = false; // dont search for outside connetion if inside
-        // connection is found
-        Edge e = null;
-        for (AbstractCanvasObject cps : upperNode.getNodes()) {
-
-            cx = cps.getPosition().getX() - controller.getScaleDiv2();
-            cy = cps.getPosition().getY() - controller.getScaleDiv2();
-
-            if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
-                    && cps != tempCps) {
-                found = true;
-                node = false;
-                onEdge = false;
-                for (Edge p : tempCps.getConnections()) {
-                    if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
-                        newEdge = false;
-                        e = p;
-                    }
-                }
-                if (!newEdge) {
-                    if (outsideCon) {
-                    } else {
-                        controller.removeEdgesOnCanvas(e);
-                    }
-                    // Node ohne Edge?
-                    if (e.getA().getClass() == Node.class && e.getA().getConnections().isEmpty()) {
-                        tempCps = e.getA();
-                        deleteNode = true;
-                    }
-                    if (e.getB().getClass() == Node.class && e.getB().getConnections().isEmpty()) {
-                        deleteNode = true;
-                    }
-                } else {
-                	if(!(cps instanceof GroupNode || tempCps instanceof GroupNode)) {
-						e = new Edge(cps, tempCps, model.getMaxCapacity());
-						controller.addEdgeOnCanvas(e);
-					}else if (cps instanceof GroupNode && !(tempCps instanceof GroupNode)){
-						GroupNode thisUpperNode = (GroupNode)cps;
-						Object[] possibilities = thisUpperNode.getNodes().stream().map(aCps -> new ACpsHandle(aCps)).filter(aCpsHandle -> !(aCpsHandle.object instanceof GroupNode)).toArray();
-						if(possibilities.length != 0) {
-							ACpsHandle selected = (ACpsHandle) JOptionPane.showInputDialog(this, "Select a inside Object:", "Connection To?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
-							if(selected != null) {
-								e = new Edge(selected.object, tempCps, model.getMaxCapacity());
-								controller.addEdgeOnCanvas(e);
-							}
-						}else {
-							Node n = new Node("Node");
-
-							n.setPosition(x, y);
-							controller.addObjUpperNode(n, thisUpperNode);
-							e = new Edge(n, tempCps, model.getMaxCapacity());
-							controller.addEdgeOnCanvas(e);
-						}
-						
-					}
-                }
-            }
-        }
-        if (!found && !outsideCon) {
-            int count = 0;
-            for (Edge ed : upperNode.getConnections()) {
-                AbstractCanvasObject cps;
-                if (ed.getA().equals(upperNode)) {
-                    cps = ed.getB();
-                } else {
-                    cps = ed.getA();
-                }
-
-                cx = upperNode.getLeftBorder() >> 1;
-                cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
-
-                if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
-                        && cps != tempCps) {
-                    outsideCon = true;
-                    node = false;
-                    onEdge = false;
-                    for (Edge p : tempCps.getConnections()) {
-                        if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
-                            newEdge = false;
-                            e = p;
-                        }
-                    }
-                    if (!newEdge) {
-
-                        // Node ohne Edge?
-                        if (e.getA().getClass() == Node.class && e.getA().getConnections().isEmpty()) {
-                            tempCps = e.getA();
-                            deleteNode = true;
-                        }
-                        if (e.getB().getClass() == Node.class && e.getB().getConnections().isEmpty()) {
-                            deleteNode = true;
-                        }
-                    } else {
-                        Edge edge = new Edge(cps, tempCps, model.getMaxCapacity());
-                        if (outsideCon) {
-                        } else {
-                            controller.addEdgeOnCanvas(edge);
-                        }
-                    }
-                }
-                count++;
-            }
-        }
-
-        // Edge auf eine Edge gezogen?
-        if (onEdge && !checkForReplacement(x, y)) {
-            Edge p = mousePositionOnEdge(x, y);
-            if (p != null) {
-                Edge e1;
-                Edge e2;
-
-                node = false;
-
-                Node n = new Node("Node");
-
-                n.setPosition(x, y);
-                controller.addObjUpperNode(n, upperNode);
-
-                AbstractCanvasObject r, k;
-                r = p.getA();
-                k = p.getB();
-
-                e = new Edge(n, tempCps, model.getMaxCapacity());
-
-                e1 = new Edge(n, r, model.getMaxCapacity());
-
-                e2 = new Edge(n, k, model.getMaxCapacity());
-
-                controller.addEdgeOnCanvas(e1);
-                controller.addEdgeOnCanvas(e2);
-            }
-        }else{
-        	mayBeReplaced = null;
-        }
-
-        // ins leere Gedragged
-        if (node && x > upperNode.getLeftBorder() && !checkForReplacement(x, y)) {
-            Node n = new Node("Node");
-
-            n.setPosition(x, y);
-            controller.addObjUpperNode(n, upperNode);
-
-            e = new Edge(n, tempCps, model.getMaxCapacity());
-
-        }else{
-        	mayBeReplaced = null;
-        }
-
-        // Wenn ein Node ohne Connections da ist
-        if (deleteNode) {
-            controller.delCanvasObject(tempCps, true);
-            tempCps = null;
-        }
-    }
-
-    /**
-     * Checks if the mouse is on an Edge.
-     *
-     * @param x Position of the Mouse
-     * @param y Position of the Mouse
-     * @return CpsEdge the Mouse is on, null if the mouse is not on an Edge
-     */
-    private Edge mousePositionOnEdge(int x, int y) {
-        x += controller.getScaleDiv2();
-        y += controller.getScaleDiv2();
-        int lx, ly, hx, hy;
-
-//TODO: is this right
-//        for (CpsEdge p : upperNode.getNodeEdges()) {
-//            Line2D l = new Line2D.Float(p.getA().getPosition().getX(), p.getA().getPosition().getY(), p.getB().getPosition().getX(),
-//                    p.getB().getPosition().getY());
-//
-//            int[] positions = determineMousePositionOnEdge(p);
-//            lx = positions[0];
-//            ly = positions[1];
-//            hx = positions[2];
-//            hy = positions[3];
-//
-//            // distance from a point to a line and between both Objects
-//            if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx && y > ly
-//                    && y < hy) {
-//                return p;
-//            }
-//        }
-
-        // edge to outside connection
-
-        int count = 0;
-        for (Edge e : upperNode.getConnections()) {
-            AbstractCanvasObject cps;
-            if (e.getA().equals(this.upperNode)) {
-                cps = e.getB();
-            } else {
-                cps = e.getA();
-            }
-            for (Edge p : cps.getConnections()) {
-                AbstractCanvasObject obj = null;
-                boolean doTest = false;
-                if (upperNode.getNodes().contains(p.getA())) {
-                    obj = p.getA();
-                    doTest = true;
-                } else if (upperNode.getNodes().contains(p.getB())) {
-                    obj = p.getB();
-                    doTest = true;
-                }
-                // g2.drawImage(img, (borderPos >> 1) - 25, (int) (scalediv20 +
-                // 5 + (50 + scalediv20 + 10) * count), 50, 50, null);
-                if (doTest) {
-                    Line2D l = new Line2D.Float((upperNode.getLeftBorder() >> 1) - 25,
-                            (int) (scalediv20 + 5 + 25 + (50 + scalediv20 + 10) * count), obj.getPosition().getX(),
-                            obj.getPosition().getY());
-                    if ((upperNode.getLeftBorder() >> 1) > obj.getPosition().getX()) {
-                        hx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() + 7;
-                        lx = obj.getPosition().getX() + model.getScaleDiv2() - 7;
-                    } else {
-                        lx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() - 7;
-                        hx = obj.getPosition().getX() + model.getScaleDiv2() + 7;
-                    }
-                    if ((int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) > obj.getPosition().getY()) {
-                        hy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() + 7;
-                        ly = obj.getPosition().getY() + model.getScaleDiv2() - 7;
-                    } else {
-                        ly = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() - 7;
-                        hy = obj.getPosition().getY() + model.getScaleDiv2() + 7;
-                    }
-
-                    // distance from a point to a line and between both Objects
-                    if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx
-                            && y > ly && y < hy) {
-                        return p;
-                    }
-                }
-            }
-            count++;
-        }
-        return null;
-    }
-
-
-
-    /**
-     * copies a set of given informations
-     *
-     * @param informations
-     */
-    protected void setShowedInformation(boolean[] informations) {
-        showedInformation = informations;
-    }
-
-
-    /**
-     * set tooltIp
-     *
-     * @param bool
-     */
-    void setToolTip(boolean bool) {
-        this.toolTip = bool;
-    }
-
-    /**
-     * Set the Mouse Position on the UpperNodeCanvas;
-     *
-     * @param x
-     * @param y
-     */
-    void setXY(int x, int y) {
-        this.x = x;
-        this.y = y;
-    }
-    
-    @Override
-	public boolean checkForReplacement(int x, int y) {
-		return checkForReplacement(upperNode.getNodes(), null, x, y);
-	}
-    
-
-	@Override
-	public void tryToAlignObjects(){
-		/**
-		 * Align all Objects
-		 */
-		for(AbstractCanvasObject cps: upperNode.getNodes())
-			align(cps,3*model.getScaleDiv2());
-		
-		/**
-		 * AutoSave new Positons
-		 */
-		try{	
-			controller.autoSave();
-		} catch (IOException ex) {
-			System.err.println("AutoSave error by aligning");
-			ex.printStackTrace();
-		}
-	}
-
-	@Override
-	public void closeUpperNodeTab(int upperNodeId) {
-        JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
-        for (int i = 4; i < tabbedPane.getTabCount(); i++) {
-            if (((GroupNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
-                    .getComponent(0)).upperNode.getId() == upperNodeId) {
-                tabbedPane.remove(i);
-                break;
-            }
-        }
-	}
-
-}

+ 0 - 1126
src/ui/view/MyCanvas.java.orig

@@ -1,1126 +0,0 @@
-package ui.view;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.awt.geom.Line2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import javax.swing.ImageIcon;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingUtilities;
-
-import com.google.gson.JsonParseException;
-
-import classes.AbstractCanvasObject;
-import classes.Edge;
-import classes.GroupNode;
-import classes.HolonObject;
-import classes.HolonSwitch;
-import classes.Node;
-import preferences.ColorPreference;
-import ui.controller.Control;
-import ui.controller.UpdateController;
-import ui.model.Consumer;
-import ui.model.DecoratedCable;
-import ui.model.DecoratedGroupNode;
-import ui.model.DecoratedHolonObject;
-import ui.model.DecoratedHolonObject.HolonObjectState;
-import ui.model.DecoratedSwitch;
-import ui.model.ExitCable;
-import ui.model.DecoratedSwitch.SwitchState;
-import ui.model.Model;
-import ui.model.Passiv;
-import ui.model.Supplier;
-import ui.model.VisualRepresentationalState;
-import utility.ImageImport;
-import utility.Vector2Int;
-
-/**
- * This Class is the Canvas. All Objects will be visualized here
- *
- * @author Gruppe14
- */
-public class MyCanvas extends AbstractCanvas implements MouseListener,
-		MouseMotionListener {
-
-	private static final long serialVersionUID = 1L;
-	public boolean disabled = false;
-	/**
-	 * Constructor.
-	 *
-	 * @param mod
-	 *            the Model
-	 * @param control
-	 *            the Controller
-	 * @param unitGraph
-	 */
-	public MyCanvas(Model mod, Control control, UnitGraph unitGraph) {
-		toolTip = false;
-		this.controller = control;
-		this.model = mod;
-		
-		scalediv20 = model.getScale() / 20;
-		
-		showConnectionInformation = true;
-		showedInformation[1] = true;
-		showedInformation[3] = false;
-		showedInformation[4] = true;
-		control.setMaxCapacity(10000);
-		popmenu.add(itemCut);
-		popmenu.add(itemCopy);
-		popmenu.add(itemPaste);
-		popmenu.add(itemDelete);
-		popmenu.add(itemAlign);
-		popmenu.addSeparator();
-		popmenu.add(itemGroup);
-		popmenu.add(itemUngroup);
-		popmenu.add(itemCreateTemplate);
-
-		updCon = new UpdateController(mod, control);
-
-		itemDelete.setEnabled(false);
-		itemCut.setEnabled(false);
-		itemCopy.setEnabled(false);
-		itemPaste.setEnabled(true);
-		itemAlign.setEnabled(false);
-		itemGroup.setEnabled(false);
-		itemUngroup.setEnabled(false);
-
-		itemCut.setText("Cut");
-		
-		itemGroup.addActionListener(actionEvent -> {
-			// calculate uppernode pos (taken from the controller)
-				unPos = new Vector2Int(0, 0);
-				animCps = new ArrayList<>();
-				for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-					animCps.add(cps); // add to animation Cps ArrayList
-					unPos = unPos.add(cps.getPosition());
-				}
-				unPos = unPos.divide(animCps.size());
-
-				// save old Position
-				savePos = new ArrayList<>();
-				for (int i = 0; i < animCps.size(); i++) {
-					savePos.add(animCps.get(i).getPosition().clone());
-				}
-
-				animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
-					if (animDuration - animDelay > 0 && animCps.size() > 1) {
-						for (AbstractCanvasObject animCpObject : animCps) {
-							Vector2Int pos = animCpObject.getPosition();
-	                    	Vector2Int difference = pos.subtract(unPos);
-	                    	Vector2Int result = pos.subtract(difference.divide(animSteps));
-	                    	pos.set(result);
-						}
-						repaint();
-						animDuration -= animDelay;
-						animSteps--;
-					} else {
-						animDuration = ANIMTIME;
-						animSteps = animDuration / animDelay;
-						animT.stop();
-						for (int i = 0; i < animCps.size(); i++) {
-							animCps.get(i).getPosition().set(savePos.get(i));
-						}
-						controller.addUpperNode("GroupNode", null, animCps);
-						controller.calculateStateAndVisualForCurrentTimeStep();
-						triggerUpdateController();
-						controller.clearSelection();
-						repaint();
-					}
-				});
-				animT.start();
-			});
-
-		itemUngroup
-				.addActionListener(actionEvent -> {
-					// save old Position
-					int upperNodeId = tempCps.getId();
-					
-					closeUpperNodeTab(upperNodeId);
-
-					savePos = new ArrayList<>();
-					animCps = ((GroupNode) tempCps).getNodes();
-					controller.ungroupGroupNode((GroupNode) tempCps, null);
-
-					for (int i = 0; i < animCps.size(); i++) {
-						savePos.add(animCps.get(i).getPosition().clone());
-					}
-					for (AbstractCanvasObject cps : animCps) {
-						int x = tempCps.getPosition().getX();
-						int y = tempCps.getPosition().getY();
-
-						cps.setPosition(new Vector2Int(x, y));
-					}
-
-					animT = new javax.swing.Timer(
-							animDelay,
-							actionEvent1 -> {
-								controller.clearSelection();
-								if (animDuration - animDelay >= 0) {
-									for (int i = 0; i < animCps.size(); i++) {
-										Vector2Int pos =  animCps.get(i).getPosition();
-				                    	Vector2Int difference = pos.subtract(savePos.get(i));
-				                    	Vector2Int result = pos.subtract(difference.divide(animSteps));
-				                    	pos.set(result);
-									}
-									repaint();
-									animDuration -= animDelay;
-									animSteps--;
-								} else {
-									animDuration = ANIMTIME;
-									animSteps = animDuration / animDelay;
-									animT.stop();
-									for (int i = 0; i < animCps.size(); i++) {
-										animCps.get(i).getPosition().set(savePos
-												.get(i));
-									}
-									controller.calculateStateAndVisualForCurrentTimeStep();
-									triggerUpdateController();
-									repaint();
-								}
-							});
-					animT.start();
-				});
-
-		// adds the selected object(s) to the statistic panel
-
-		itemDelete.addActionListener(actionEvent -> {
-			// Remove the selected Object objects
-				//Edge Deleting
-				if (tempCps == null && edgeHighlight != null) {
-					controller.removeEdgesOnCanvas(edgeHighlight);
-					//Look for a CPSNode with no Connections and delete them
-					if(edgeHighlight.getA().getClass() == Node.class && edgeHighlight.getA().getConnections().size() == 0){ 
-						controller.delCanvasObject(edgeHighlight.getA(), false);	
-					}
-					if(edgeHighlight.getB().getClass() == Node.class && edgeHighlight.getB().getConnections().size() == 0){ //Look on the other end of the cable
-						controller.delCanvasObject(edgeHighlight.getB(), false);
-					}
-					edgeHighlight = null;
-				}
-				boolean save = false;
-				for (int j = 0; j < model.getSelectedCpsObjects().size(); j++) {
-					AbstractCanvasObject cps = model.getSelectedCpsObjects()
-							.get(j);
-					if (j == model.getSelectedCpsObjects().size() - 1)
-						save = true;
-					controller.delCanvasObject(cps, save);
-					// Remove UpperNodeTab if UpperNode deleted
-				if (cps instanceof GroupNode) {
-					JTabbedPane tabbedPane = (JTabbedPane)getParent().getParent()
-							.getParent().getParent();
-					// Look if the uppernode is open in a Tab
-					for (int i = 4; i < tabbedPane.getTabCount(); i++) {
-						if (tabbedPane.getComponentAt(i) != null
-								&& ((GroupNodeCanvas) ((JScrollPane) tabbedPane
-										.getComponentAt(i)).getViewport()
-										.getComponent(0)).upperNode.getId() == cps
-										.getId()) {
-							((ButtonTabComponent) tabbedPane
-									.getTabComponentAt(i)).removeTabs();
-							break;
-						}
-					}
-				}
-				toolTip = false;
-			}
-			controller.clearSelection();
-			tempCps = null;
-			repaint();
-		});
-
-		itemCut.addActionListener(actionEvent -> {
-			controller.cut(null);
-			itemPaste.setEnabled(true);
-			repaint();
-		});
-
-		itemCopy.addActionListener(actionEvent -> {
-			if(tempCps instanceof GroupNode)
-				controller.getObjectsInDepth();
-			controller.copy(null);
-			itemPaste.setEnabled(true);
-			repaint();
-		});
-
-		itemAlign.addActionListener(actionEvent ->
-		{
-			for(AbstractCanvasObject cps: model.getSelectedCpsObjects())
-				align(cps, model.getScaleDiv2());
-			repaint();
-		});
-		itemPaste
-				.addActionListener(actionEvent -> {
-					try {
-						controller.paste(null, mousePosition);
-
-					} catch (JsonParseException | UnsupportedFlavorException
-							| IOException e1) {
-						JLabel message = new JLabel(
-								"The Clipboard information cannot be pastet into Application.");
-						JOptionPane.showMessageDialog(null, message, "",
-								JOptionPane.ERROR_MESSAGE);
-					}
-					repaint();
-				});
-		
-		/*
-		 * create Template
-		 */
-		itemCreateTemplate.addActionListener(actionEvent -> {
-			controller.createTemplate((HolonObject)tempCps,(JFrame)SwingUtilities.getRoot(this));
-		});
-
-		this.addMouseListener(this);
-		this.addMouseMotionListener(this);
-	}
-
-	/**
-	 * Paints all Components on the Canvas.
-	 *
-	 * @param g
-	 *            Graphics
-	 */
-	
-	public static Color getStateColor(HolonObjectState state) {
-		switch(state) {
-		case NOT_SUPPLIED:
-			return ColorPreference.HolonObject.NotSupplied;
-		case NO_ENERGY:
-			return ColorPreference.HolonObject.NoEnergy;
-		case OVER_SUPPLIED:
-			return ColorPreference.HolonObject.OverSupplied;
-		case PARTIALLY_SUPPLIED:
-			return ColorPreference.HolonObject.PartiallySupplied;
-		case PRODUCER:
-			return ColorPreference.HolonObject.Producer;
-		case SUPPLIED:
-			return ColorPreference.HolonObject.Supplied;
-		default:
-			return Color.BLACK;
-		}
-	}
-	private void paintCanvasObject(Graphics2D g, DecoratedHolonObject decoratedHolonObject){
-		Vector2Int pos = decoratedHolonObject.getModel().getPosition();
-		Color statecolor = getStateColor(decoratedHolonObject.getState());
-		g.setColor(statecolor);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
-		drawCanvasObject(g, decoratedHolonObject.getModel().getImage(), pos);
-	}
-	private void drawCanvasObjectString(Graphics2D g, Vector2Int posOfCanvasObject, float energy) {
-		g.setColor(Color.BLACK);
-		g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (controller.getScale() / 4f) )); 
-		g.drawString((energy > 0)? "+" + Float.toString(energy): Float.toString(energy), posOfCanvasObject.getX() - controller.getScaleDiv2(), posOfCanvasObject.getY() - controller.getScaleDiv2() - 1);
-	}
-	private void paintConsumer(Graphics2D g, Consumer con){
-		paintCanvasObject(g, con);
-		paintSupplyBar(g,con.getSupplyBarPercentage(), getStateColor(con.getState()), con.getModel().getPosition());
-		drawCanvasObjectString(g, con.getModel().getPosition(), -con.getEnergyNeededFromNetwork());
-	}
-	private void paintSupplier(Graphics2D g, Supplier sup){
-		paintCanvasObject(g, sup);
-		drawCanvasObjectString(g, sup.getModel().getPosition(), sup.getEnergyToSupplyNetwork());
-	}
-	
-	private void drawCanvasObject(Graphics2D g, String Image, Vector2Int pos) {
-		g.drawImage(ImageImport.loadImage(Image, controller.getScale(), controller.getScale()) , 
-				pos.getX() - controller.getScaleDiv2(),
-				pos.getY() - controller.getScaleDiv2(),
-				controller.getScale(), controller.getScale() , null);
-	}
-	
-	private void paintCable(Graphics2D g, DecoratedCable cable, boolean isSelected)
-	{
-		Vector2Int start = cable.getModel().getA().getPosition();
-		Vector2Int end =  cable.getModel().getB().getPosition();
-		float currentEnergy = cable.getFlowEnergy();
-		float capacity = cable.getModel().getCapacity();
-		boolean unlimited = cable.getModel().isUnlimitedCapacity();
-		switch(cable.getState()) {
-		case Burned:
-			g.setColor(Color.RED);
-			g.setStroke(new BasicStroke(2));
-			break;
-		case Working:
-			g.setColor(new Color(13, 175, 28));
-			g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
-			break;
-		}
-		if(isSelected){
-			g.setColor(Color.lightGray);
-		}
-		g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
-		if(showConnectionInformation) {			
-			Vector2Int middle = new Vector2Int((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
-			g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-			g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
-		}
-	}
-	private void paintSwitch(Graphics2D g, DecoratedSwitch dSwitch)
-	{
-		drawCanvasObject(g, dSwitch.getState() == SwitchState.Open ? HolonSwitch.getSwitchOpenImage(): HolonSwitch.getSwitchClosedImage() , dSwitch.getModel().getPosition());
-	}
-	
-	private void paintExitCable(Graphics2D g, ExitCable eCable) {
-		Vector2Int start = eCable.getStart().getPosition();
-		Vector2Int end = eCable.getFinish().getPosition();
-		float currentEnergy = eCable.getCable().getFlowEnergy();
-		float capacity = eCable.getCable().getModel().getCapacity();
-		boolean unlimited = eCable.getCable().getModel().isUnlimitedCapacity();
-		switch(eCable.getCable().getState()) {
-		case Burned:
-			g.setColor(Color.RED);
-			g.setStroke(new BasicStroke(2));
-			break;
-		case Working:
-			g.setColor(new Color(13, 175, 28));
-			g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
-			break;
-		}
-		g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
-		Vector2Int middle = new Vector2Int((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
-		g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-		g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
-	}
-	private void paintGroupNode(Graphics2D g, DecoratedGroupNode dGroupNode) {
-		Vector2Int pos = dGroupNode.getModel().getPosition();
-		g.setColor(Color.lightGray);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
-		drawCanvasObject(g, "/Images/upper_node.png" , pos);
-		paintGroupNodeBar(g, dGroupNode, pos);
-	}
-	private void paintGroupNodeBar(Graphics2D g, DecoratedGroupNode dGroupNode , Vector2Int pos) {
-		// +1, -2, -1 little Adjustment for pixel perfect alignment
-		int barWidth = (int) (controller.getScale());
-		int barHeight = (int) (controller.getScale() / 5);
-		g.setColor(Color.WHITE);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
-		float[] percentages = getGroupNodeBarPercentages(dGroupNode);
-		Color[] colors = new Color[6];
-		colors[0] = getStateColor(HolonObjectState.PRODUCER);
-		colors[1] = getStateColor(HolonObjectState.NOT_SUPPLIED);
-		colors[2] = getStateColor(HolonObjectState.PARTIALLY_SUPPLIED);
-		colors[3] = getStateColor(HolonObjectState.SUPPLIED);
-		colors[4] = getStateColor(HolonObjectState.OVER_SUPPLIED);
-		colors[5] = getStateColor(HolonObjectState.NO_ENERGY);
-				
-		for(int i = 5; i>=0; i--) {
-			g.setColor(colors[i]);
-			g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * percentages[i] - 1), barHeight);		
-		}
-//		g.setColor(color);
-//		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
-		g.setColor(Color.BLACK);
-		g.setStroke(new BasicStroke(1));
-		g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
-	}
-	/**
-	 * HardCoded Stuff dont try at Home ;)
-	 * @param dGroupNode
-	 * @return
-	 */
-	public float[] getGroupNodeBarPercentages(DecoratedGroupNode dGroupNode) {
-		int[] amountOfObjects = new int[6];
-		amountOfObjects[0] = dGroupNode.getAmountOfSupplier();
-		amountOfObjects[1] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.NOT_SUPPLIED);
-		amountOfObjects[2] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.PARTIALLY_SUPPLIED);
-		amountOfObjects[3] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.SUPPLIED);
-		amountOfObjects[4] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.OVER_SUPPLIED);
-		amountOfObjects[5] = dGroupNode.getAmountOfPassiv();
-		int countHolonObjects = amountOfObjects[0] + 	amountOfObjects[1] + amountOfObjects[2] + amountOfObjects[3] + amountOfObjects[4] + amountOfObjects[5];
-		float[] percentages = new float[6];
-		int count = 0;
-		for(int i = 0; i < 6; i++) {
-			count += amountOfObjects[i];
-			percentages[i] = (float)count / (float)countHolonObjects;
-		}
-		return percentages;
-	}
-	private void paintSupplyBar(Graphics2D g, float percentage, Color color, Vector2Int pos) {
-		// +1, -2, -1 little Adjustment for pixel perfect alignment
-		int barWidth = (int) (controller.getScale());
-		int barHeight = (int) (controller.getScale() / 5);
-		g.setColor(Color.WHITE);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
-		g.setColor(color);
-		g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
-		g.setColor(Color.BLACK);
-		g.setStroke(new BasicStroke(1));
-		g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
-		g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (barHeight * 1.5) - 2)); 
-		String percentageString = (Math.round((percentage * 100))) + "%";
-		int stringWidth = (int) g.getFontMetrics().getStringBounds(percentageString, g).getWidth();
-		if(percentage > 1.0f) g.setColor(Color.WHITE); //Just to see better on purple
-		g.drawString(percentageString, pos.getX() + 1 - stringWidth / 2, pos.getY() + controller.getScaleDiv2() - 1+ barHeight);
-		
-	}
-	
-	//old code
-	void drawMarker(Graphics2D g) {
-		Color transparentGrey = new Color(128, 174, 247, 40);
-		if (sx > x && sy > y) {
-			g.drawRect(x, y, sx - x, sy - y);
-			g.setColor(transparentGrey);
-			g.fillRect(x, y, sx - x, sy - y);
-		} else if (sx < x && sy < y) {
-			g.drawRect(sx, sy, x - sx, y - sy);
-			g.setColor(transparentGrey);
-			g.fillRect(sx, sy, x - sx, y - sy);
-		} else if (sx >= x) {
-			g.drawRect(x, sy, sx - x, y - sy);
-			g.setColor(transparentGrey);
-			g.fillRect(x, sy, sx - x, y - sy);
-		} else if (sy >= y) {
-			g.drawRect(sx, y, x - sx, sy - y);
-			g.setColor(transparentGrey);
-			g.fillRect(sx, y, x - sx, sy - y);
-		}
-	}
-	public void paintComponent(Graphics g) {		
-		super.paintComponent(g);
-		Graphics2D g2d = (Graphics2D) g;
-		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
-		HashSet<Edge> selectedEdges = new HashSet<Edge>();
-		for(AbstractCanvasObject aCps:  model.getSelectedCpsObjects()) {
-			for(Edge edge: aCps.getConnections()) {
-				selectedEdges.add(edge);
-			}
-		}
-		if(model.getSelectedEdge() != null) selectedEdges.add(model.getSelectedEdge());
-		//timstep:
-		g.setFont(new Font("TimesNewRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-		g2d.setColor(Color.BLACK);
-		
-		VisualRepresentationalState  visualState = controller.getSimManager().getActualVisualRepresentationalState();
-		//VisualState Representation:
-		if(visualState == null) System.out.println("AHHH"); 
-		for(ExitCable cable : visualState.getExitCableList()) {
-			paintExitCable(g2d, cable);
-		}
-		for(DecoratedCable cable : visualState.getCableList()) {
-			paintCable(g2d, cable, selectedEdges.contains(cable.getModel()));
-		}
-		for(DecoratedGroupNode dGroupNode : visualState.getGroupNodeList()) {
-			paintGroupNode(g2d, dGroupNode);
-		}
-		for(Consumer con: visualState.getConsumerList()) {
-			paintConsumer(g2d, con);					
-		}
-		for(Supplier sup: visualState.getSupplierList()) {
-			paintSupplier(g2d, sup);				
-		}
-		for(Passiv pas: visualState.getPassivList()) {
-			paintCanvasObject(g2d, pas);
-		}
-		for(DecoratedSwitch dSwitch : visualState.getSwitchList()) {
-				paintSwitch(g2d, dSwitch);
-		}
-		for(Node node : visualState.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.setColor(Color.BLUE);
-		g2d.setStroke(new BasicStroke(1));
-		Color transparentGrey = new Color(128, 174, 247, 40);
-		for(AbstractCanvasObject aCps:  model.getSelectedCpsObjects()) {
-			if(aCps instanceof Node) {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()),  controller.getScale(),  controller.getScale());
-				g2d.setColor(Color.LIGHT_GRAY);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()),  controller.getScale(),  controller.getScale());
-			}
-			else {
-				Vector2Int pos = aCps.getPosition();
-				g2d.setColor(transparentGrey);
-				g2d.fillRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));
-				g2d.setColor(Color.LIGHT_GRAY);
-				g2d.setStroke(new BasicStroke(2));
-				g2d.drawRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));				
-			}
-
-		}
-		//maybeReplace:
-		if(mayBeReplaced != null){
-			g2d.setColor(Color.RED);
-			Vector2Int pos = mayBeReplaced.getPosition();
-			g2d.drawImage(ImageImport.loadImage("/Images/replace.png") , 
-					pos.getX() + controller.getScaleDiv2(),
-					pos.getY() - controller.getScale(),
-					controller.getScaleDiv2(), controller.getScaleDiv2(), null);
-		}
-		//<-- OldCode
-	}
-
-	@Override
-	public void mouseClicked(MouseEvent e) {
-		if(!disabled){
-			if (e.getButton() == MouseEvent.BUTTON1) {
-			DefaulTable propertyTable = model.getPropertyTable();
-			if (propertyTable.getRowCount() > 0) {
-				for (int i = propertyTable.getRowCount() - 1; i > -1; i--) {
-					propertyTable.removeRow(i);
-				}
-			}
-
-			triggerUpdateController();
-			}
-			stopEditing();
-		}
-	}
-
-	@Override
-	public void mouseEntered(MouseEvent e) {
-	}
-
-	@Override
-	public void mouseExited(MouseEvent e) {
-	}
-
-	@Override
-	public void mousePressed(MouseEvent e) {
-		if(!disabled){
-		stopEditing();
-		tempCps = null;
-		edgeHighlight = null;
-		controller.setSelecteEdge(null);
-		// Object Selection
-		for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-			cx = cps.getPosition().getX() - controller.getScaleDiv2();
-			cy = cps.getPosition().getY() - controller.getScaleDiv2();
-			if (x - controller.getScale() <= cx
-					&& y - controller.getScale() <= cy && x >= cx && y >= cy) {
-				tempCps = cps;
-
-
-				dragging = true;
-
-				if (e.isControlDown() && tempCps != null) {
-					if (model.getSelectedCpsObjects().contains(tempCps)) {
-						controller.removeSelectedObjectFromSelection(tempCps);
-							//TODO: RemoveDepth
-					} else {
-						controller.addSelectedObject(tempCps);
-						if(tempCps instanceof GroupNode)
-							controller.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;
-				}
-			}
-		}
-
-		// Edge Selection
-		if (tempCps == null) {
-			edgeHighlight = mousePositionOnEdge(x, y);
-			controller.setSelecteEdge(edgeHighlight);
-			controller.setSelectedObjectID(0);
-			if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
-				controller.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) {
-			try {
-				/**
-				 * Save before further Dragged interactions happen
-				 */
-				controller.autoSave();
-				
-			} catch (IOException ex) {
-				System.err.println("AutoSave error by dragging");
-				ex.printStackTrace();
-			}
-			
-			/**
-			 * check if a unique tempCps could replace an Object on the canvas
-			 */
-			if(model.getSelectedCpsObjects().size()==1 
-					&& checkForReplacement(model.getObjectsOnCanvas(), 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 (will save)
-				 */
-				controller.replaceCanvasObject(mayBeReplaced, tempCps);
-				mayBeReplaced=null;
-			}
-		}
-
-		if (!e.isControlDown() && !dragged && tempCps != null
-				&& MouseEvent.BUTTON3 != e.getButton()) {
-			controller.clearSelection();
-			controller.addSelectedObject(tempCps);
-			if(tempCps instanceof GroupNode)
-				controller.getObjectsInDepth();
-		}
-
-		dragged = false;
-
-		// Rightclick List
-		setRightClickMenu(e);
-
-		markObjects();
-
-		if (doubleClick() && tempCps instanceof HolonSwitch 
-				&& MouseEvent.BUTTON3 != e.getButton()&& tempCps != null) {
-			((HolonSwitch) tempCps).switchState();
-
-		}
-		controller.calculateStateAndVisualForTimeStep(model.getCurIteration());
-
-		triggerUpdateController();
-
-		repaint();
-		}
-	}
-
-	@Override
-	public void mouseDragged(MouseEvent e) {
-		if(!disabled){
-		// If Edge is drawn
-		x = e.getX();
-		y = e.getY();
-		
-		if (!model.getSelectedCpsObjects().contains(tempCps) && !doMark) {
-			controller.clearSelection();
-			if (tempCps != null) {
-				controller.addSelectedObject(tempCps);
-			}
-		}
-		if (dragging) {
-			try {
-				dragged = true;
-				float xDist, yDist; // Distance
-
-				x = e.getX();
-				y = e.getY();
-
-				// Make sure its in bounds
-				int scaleDiv2 = controller.getScaleDiv2();
-				if (e.getX() < scaleDiv2)
-					x = scaleDiv2;
-				else if (e.getX() > this.getWidth() - scaleDiv2)
-					x = this.getWidth() - scaleDiv2;
-				if (e.getY() < scaleDiv2)
-					y = scaleDiv2;
-				else if (e.getY() > this.getHeight()
-						- scaleDiv2)
-					y = this.getHeight() - scaleDiv2;
-
-				// Distance
-				xDist = x - tempCps.getPosition().getX();
-				yDist = y - tempCps.getPosition().getY();
-
-				tempCps.setPosition(x, y); // Drag Position
-				// ToolTipText Position and name
-				toolTip = true;
-				toolTipText = tempCps.getName() + ", " + tempCps.getId();
-				toolTipPos.setX(tempCps.getPosition().getX()
-						- scaleDiv2);
-				toolTipPos.setY(tempCps.getPosition().getY()
-						+ scaleDiv2);
-
-				// All Selected Objects
-				for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
-					if (cps != tempCps) {
-						x = (int) (cps.getPosition().getX() + xDist);
-						y = (int) (cps.getPosition().getY() + yDist);
-
-						// Make sure its in bounds
-						if (x <= scaleDiv2)
-							x = scaleDiv2;
-						else if (x > this.getWidth()
-								- scaleDiv2)
-							x = this.getWidth() - scaleDiv2;
-						if (y <= scaleDiv2)
-							y = scaleDiv2;
-						else if (y > this.getHeight()
-								- scaleDiv2)
-							y = this.getHeight() - scaleDiv2;
-
-						cps.setPosition(x, y);
-					}
-				}
-				
-				/**
-				 * check if something might be replaced
-				 */
-				if(model.getSelectedCpsObjects().size()==1)
-					checkForReplacement(model.getObjectsOnCanvas(), tempCps, x, y);
-				
-				repaint();
-			} catch (Exception eex) {
-			}
-		}
-
-		// Mark Objects
-		if (doMark) {
-			tempSelected.clear();
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-				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() + model.getScaleDiv2()
-						&& y1 <= cps.getPosition().getY() + model.getScaleDiv2()
-						&& x2 >= cps.getPosition().getX()
-						&& y2 >= cps.getPosition().getY()) {
-					tempSelected.add(cps);
-
-				}
-			}
-		}
-
-		repaint();
-		}
-	}
-
-	@Override
-	public void mouseMoved(MouseEvent e) {	
-		if(!disabled){
-		x = e.getX();
-		y = e.getY();
-
-		// Everything for the tooltip :)
-		boolean on = false;
-		for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-			cx = cps.getPosition().getX() - controller.getScaleDiv2();
-			cy = cps.getPosition().getY() - controller.getScaleDiv2();
-
-			on = setToolTipInfoAndPosition(on, cps);
-		}
-		if(on||(!on && toolTip))
-		repaint();
-		toolTip = on;
-		}
-	}
-
-
-	/**
-	 * Draws or Deletes an Edge.
-	 */
-	void drawDeleteEdge() {
-		if (getMousePosition() != null) {
-			boolean node = true;
-			boolean newEdge = true;
-			boolean onEdge = true;
-			boolean deleteNode = false;
-			Edge e = null;
-
-			for (AbstractCanvasObject cps : model.getObjectsOnCanvas()) {
-				cx = cps.getPosition().getX() - controller.getScaleDiv2();
-				cy = cps.getPosition().getY() - controller.getScaleDiv2();
-				if (x - controller.getScale() <= cx
-						&& y - controller.getScale() <= cy && x >= cx
-						&& y >= cy && cps != tempCps) {
-					node = false;
-					onEdge = false;
-					for (Edge p : tempCps.getConnections()) {
-						if ((p.getA() == tempCps && p.getB() == cps)
-								|| (p.getB() == tempCps && p.getA() == cps)) {
-							newEdge = false;
-							e = p;
-						}
-					}
-					if (!newEdge) {
-						controller.removeEdgesOnCanvas(e);
-						// Node ohne Edge?
-						if (e.getA().getClass() == Node.class
-								&& e.getA().getConnections().isEmpty()) {
-							tempCps = e.getA();
-							deleteNode = true;
-						}
-						if (e.getB().getClass() == Node.class
-								&& e.getB().getConnections().isEmpty()) {
-							deleteNode = true;
-						}
-					} else {
-						if(!(cps instanceof GroupNode || tempCps instanceof GroupNode)) {
-							e = new Edge(cps, tempCps, model.getMaxCapacity());
-							controller.addEdgeOnCanvas(e);
-						}else if (cps instanceof GroupNode && !(tempCps instanceof GroupNode)){
-							GroupNode thisUpperNode = (GroupNode)cps;
-							Object[] possibilities = thisUpperNode.getNodes().stream().map(aCps -> new ACpsHandle(aCps)).filter(aCpsHandle -> !(aCpsHandle.object instanceof GroupNode)).toArray();
-							if(possibilities.length != 0) {
-								ACpsHandle selected = (ACpsHandle) JOptionPane.showInputDialog(this, "Select a inside Object:", "Connection To?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
-								if(selected != null) {
-									e = new Edge(selected.object, tempCps, model.getMaxCapacity());
-									controller.addEdgeOnCanvas(e);
-								}
-							}else {
-								Node n = new Node("Node");
-
-								n.setPosition(x, y);
-								controller.addObjUpperNode(n, thisUpperNode);
-								e = new Edge(n, tempCps, model.getMaxCapacity());
-								controller.addEdgeOnCanvas(e);
-							}
-							
-						}
-						
-					}
-				}
-			}
-			// Edge auf eine Edge gezogen?
-			if (onEdge && !checkForReplacement(x, y)) {
-				Edge p = mousePositionOnEdge(x, y);
-				if (p != null) {
-					Edge e1;
-					Edge e2;
-
-					node = false;
-
-					Node n = new Node("Node");
-
-					n.setPosition(x, y);
-					controller.addObjectCanvas(n);
-
-					AbstractCanvasObject r, k;
-					r = p.getA();
-					k = p.getB();
-
-					e = new Edge(n, tempCps, model.getMaxCapacity());
-
-					e1 = new Edge(n, r, model.getMaxCapacity());
-
-					e2 = new Edge(n, k, model.getMaxCapacity());
-
-					controller.removeEdgesOnCanvas(p);
-					controller.addEdgeOnCanvas(e);
-					controller.addEdgeOnCanvas(e1);
-					controller.addEdgeOnCanvas(e2);
-				}
-			}else{
-				mayBeReplaced = null;
-			}
-
-			// ins leere Gedragged
-			if (node && !checkForReplacement(x, y)) {
-				Node n = new Node("Node");
-
-				n.setPosition(x, y);
-				
-					controller.addObjectCanvas(n);
-
-				e = new Edge(n, tempCps, model.getMaxCapacity());
-
-				controller.addEdgeOnCanvas(e);
-			}else{
-				mayBeReplaced = null;
-			}
-
-			// Wenn ein Node ohne Connections da ist
-			if (deleteNode) {
-				controller.delCanvasObject(tempCps, true);
-				tempCps = null;
-			}
-		}
-	}
-
-	/**
-	 * Checks if the mouse is on an Edge.
-	 *
-	 * @param x
-	 *            Position of the Mouse
-	 * @param y
-	 *            Position of the Mouse
-	 * @return CpsEdge the Mouse is on, null if the mouse is not on an Edge
-	 */
-	private Edge mousePositionOnEdge(int x, int y) {
-		x += controller.getScaleDiv2();
-		y += controller.getScaleDiv2();
-		for (Edge p : model.getEdgesOnCanvas()) {
-			Line2D l = new Line2D.Float(p.getA().getPosition().getX(), p.getA()
-					.getPosition().getY(), p.getB().getPosition().getX(), p.getB()
-					.getPosition().getY());
-
-			int[] positions = determineMousePositionOnEdge(p);
-			int lx = positions[0];
-			int ly = positions[1];
-			int hx = positions[2];
-			int hy = positions[3];
-
-			// distance from a point to a line and between both Objects
-			if (l.ptLineDistSq(x - model.getScaleDiv2(),
-					y - model.getScaleDiv2()) < 20
-					&& x > lx && x < hx && y > ly && y < hy) {
-				return p;
-			}
-		}
-		return null;
-	}
-
-	void updateLanguages() {
-		itemCut.setText("Cut");
-		itemCopy.setText("Copy");
-		itemPaste.setText("Paste");
-		itemDelete.setText("Delete");
-		itemGroup.setText("Group");
-		itemUngroup.setText("Ungroup");
-	}
-
-	/**
-	 * Set if Information should be shown.
-	 *
-	 * @param connection
-	 *            boolean for conecction
-	 * @param object
-	 *            boolean for objects
-	 * @param nodeOfnode
-	 */
-	void setShowedInformation(boolean connection, boolean object,
-			boolean border, boolean nodeOfnode) {
-		showConnectionInformation = connection;
-		showedInformation[1] = object;
-		showedInformation[3] = border;
-		showedInformation[4] = nodeOfnode;
-	}
-
-	/**
-	 * Returns if Information should be shown.
-	 *
-	 * @return Array of boolean [0] = connection, [1] = objects
-	 */
-	boolean[] getShowedInformation() {
-		return showedInformation;
-	}
-
-	/**
-	 * set toolTip
-	 *
-	 * @param bool
-	 */
-	void setToolTip(boolean bool) {
-		this.toolTip = bool;
-	}
-
-	/**
-	 * Set the Mouse
-	 *
-	 * @param x
-	 * @param y
-	 */
-	void setXY(int x, int y) {
-		this.x = x;
-		this.y = y;
-	}
-
-	@Override
-	public boolean checkForReplacement(int x, int y) {
-		
-		return checkForReplacement(model.getObjectsOnCanvas(), null, x, y);
-	}
-	
-	@Override
-	public void tryToAlignObjects(){
-		/**
-		 * Align all Objects
-		 */
-		for(AbstractCanvasObject cps: model.getObjectsOnCanvas())
-			align(cps,3*model.getScaleDiv2());
-		
-		/**
-		 * AutoSave new Positons
-		 */
-		try{	
-			controller.autoSave();
-		} catch (IOException ex) {
-			System.err.println("AutoSave error by aligning");
-			ex.printStackTrace();
-		}
-	}
-	
-	
-	@Override
-	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)).upperNode.getId() == upperNodeId) {
-				tabbedPaneInner.remove(i);
-				break;
-			}
-		}
-	}
-	
-	
-	   
-}

+ 0 - 244
src/ui/view/Outliner.java.orig

@@ -1,244 +0,0 @@
-package ui.view;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.util.ArrayList;
-
-import javax.swing.ImageIcon;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTree;
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import classes.AbstractCanvasObject;
-import ui.controller.Control;
-import ui.model.Consumer;
-import ui.model.DecoratedCable;
-import ui.model.DecoratedHolonObject.HolonObjectState;
-import utility.ImageImport;
-import ui.model.DecoratedNetwork;
-import ui.model.DecoratedState;
-import ui.model.DecoratedSwitch;
-import ui.model.MinimumNetwork;
-import ui.model.Model;
-import ui.model.Passiv;
-import ui.model.Supplier;
-
-
-
-
-
-
-public class Outliner extends JFrame {
-	private static final long serialVersionUID = 1L;
-	JTabbedPane tabbedPane = new JTabbedPane();
-	JPanel listPanel = new JPanel(new BorderLayout());
-	JPanel statePanel = new JPanel(new BorderLayout());
-	public boolean isClosed = false;
-	ArrayList<MinimumNetwork> list;
-	Outliner(JFrame parentFrame, Model model, Control controller){ 
-		setBounds(0, 0, 400, parentFrame.getHeight());
-		this.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
-		this.setTitle("Outliner");
-		setLocationRelativeTo(parentFrame);
-		this.setVisible(true);
-		repaintWithDecoratedState(controller.getSimManager().getActualDecorState());
-		this.getContentPane().add(tabbedPane);
-		this.addWindowListener(new java.awt.event.WindowAdapter() {
-		    @Override
-		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
-		    	isClosed = true;
-		    }
-		});
-		tabbedPane.addTab("List", listPanel);
-		tabbedPane.addTab("State", statePanel);
-	}
-
-	public void repaintWithDecoratedState(DecoratedState decoratedState) {
-		//tabbedPane.removeAll();
-		listPanel.removeAll();
-		statePanel.removeAll();
-		DefaultMutableTreeNode topListPanel = new DefaultMutableTreeNode();
-		DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects");
-		DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches");
-		DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes");
-		DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable");
-		topListPanel.add(objects);
-		topListPanel.add(switches);
-		topListPanel.add(nodes);
-		topListPanel.add(cables);
-		DefaultMutableTreeNode topStatePanel = new DefaultMutableTreeNode();
-		
-		for(DecoratedSwitch dSwitch: decoratedState.getDecoratedSwitches()) {
-			switches.add(new DefaultMutableTreeNode(dSwitch.getModel().getName()));
-		}
-		
-		/*for(CpsNode node: decoratedState.getNodeList()) {
-			nodes.add(new DefaultMutableTreeNode(node.getName()));
-		}*/
-		
-		for(DecoratedNetwork dNet: decoratedState.getNetworkList()) {
-			DefaultMutableTreeNode network = new DefaultMutableTreeNode("Network");
-			if(!dNet.getConsumerList().isEmpty() || !dNet.getConsumerSelfSuppliedList().isEmpty()) {
-				DefaultMutableTreeNode consumer = new DefaultMutableTreeNode("ConsumerList");
-				for (Consumer con : dNet.getConsumerList()) {
-					DefaultMutableTreeNode consumerNode = new ColoredTreeNode(con.toString(),con.getState().toString(), getStateColor(con.getState()) );
-					consumer.add(consumerNode);
-					objects.add(new DefaultMutableTreeNode(con.getModel().getName()));
-				}
-				for (Consumer con : dNet.getConsumerSelfSuppliedList()) {
-					DefaultMutableTreeNode consumerNode = new DefaultMutableTreeNode(con.toString() + con.getState());
-					consumer.add(consumerNode);
-					objects.add(new DefaultMutableTreeNode(con.getModel().getName()));
-				}
-				network.add(consumer);
-			}
-			if(!dNet.getSupplierList().isEmpty()) {
-				DefaultMutableTreeNode supplier = new DefaultMutableTreeNode("SupplierList");
-				for (Supplier sup : dNet.getSupplierList()) {
-					supplier.add(new DefaultMutableTreeNode(sup.toString()));
-					objects.add(new DefaultMutableTreeNode(sup.getModel().getName()));
-				}
-				network.add(supplier);
-			}
-			for(Passiv pas: dNet.getPassivNoEnergyList()) {
-				objects.add(new DefaultMutableTreeNode(pas.getModel().getName()));
-			}
-			topStatePanel.add(network);
-			for(DecoratedCable cable : dNet.getDecoratedCableList()) {
-				cables.add(new DefaultMutableTreeNode(cable.getModel().toString()));
-			}
-		}
-		
-		for(DecoratedCable cable : decoratedState.getLeftOverEdges()) {
-			cables.add(new DefaultMutableTreeNode(cable.getModel().toString()));
-		}
-		
-		
-		JTree listTree = new JTree(topListPanel);
-		signIconsForTree(listTree);
-		listTree.setRootVisible(false);
-		for (int i = 0; i < listTree.getRowCount(); i++) {
-			listTree.expandRow(i);
-		}
-		JScrollPane listScroller = new JScrollPane(listTree);
-		listPanel.add(listScroller);
-		
-		JTree stateTree = new JTree(topStatePanel);
-		signIconsForTree(stateTree);
-		stateTree.setRootVisible(false);
-		for (int i = 0; i < stateTree.getRowCount(); i++) {
-			stateTree.expandRow(i);
-		}
-		statePanel.add(new JScrollPane(stateTree));
-		
-		listPanel.revalidate();;
-		statePanel.revalidate();
-		listPanel.repaint();
-	}
-
-
-
-
-
-
-	private void signIconsForTree(JTree t) {
-		ImageIcon ClosedIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/Close.png",9,9));
-		ImageIcon OpenIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/Open.png",9,9));
-		ImageIcon LeafIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/Leaf.png",9,9));
-		if (ClosedIcon != null && OpenIcon != null && LeafIcon!= null) {
-		    DefaultTreeCellRenderer renderer = 
-		        new DefaultTreeCellRenderer();
-		    renderer.setClosedIcon(ClosedIcon);
-		    renderer.setOpenIcon(OpenIcon);
-		    renderer.setLeafIcon(LeafIcon);
-		    t.setCellRenderer(renderer);
-		}
-	}
-	
-	class MyTreeModelListener implements TreeModelListener {
-
-		@Override
-		public void treeNodesChanged(TreeModelEvent tmE) {
-			// TODO Auto-generated method stub
-			System.out.println("treeNodesChanged");
-		}
-
-		@Override
-		public void treeNodesInserted(TreeModelEvent tmE) {
-			// TODO Auto-generated method stub
-			System.out.println("treeNodesInserted");
-		}
-
-		@Override
-		public void treeNodesRemoved(TreeModelEvent tmE) {
-			// TODO Auto-generated method stub
-			System.out.println("treeNodesRemoved");
-		}
-
-		@Override
-		public void treeStructureChanged(TreeModelEvent tmE) {
-			// TODO Auto-generated method stub
-			System.out.println("treeStructureChanged");
-		}
-	
-	}
-	private Color getStateColor(HolonObjectState state) {
-		switch(state) {
-		case NOT_SUPPLIED:
-			return new Color(230, 120, 100);
-		case NO_ENERGY:
-			return Color.white;
-		case OVER_SUPPLIED:
-			return new Color(166, 78, 229);
-		case PARTIALLY_SUPPLIED:
-			return Color.yellow;
-		case PRODUCER:
-			return Color.lightGray;
-		case SUPPLIED:
-			return new Color(13, 175, 28);
-		default:
-			return Color.BLACK;
-		}
-	}
-	
-	
-	class ColoredTreeNode extends DefaultMutableTreeNode{
-		private Color color;
-		public ColoredTreeNode(String string, String state, Color color) {
-			//"<html>Some text <font color='red'>" + "bla" + "some text in red</font></html>"
-			//Integer.toHexString(color.getRGB()).substring(2)
-			//String c = string + "<html><font bgcolor='#132122'>" + state +"</font></html>";
-			super(( "<html>" + string + "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + state +"</font></html>"));
-			//this.color = color;
-		}
-		public Color getColor(){
-			return color;
-		}
-		public void setColor(Color color) {
-			this.color = color;
-		}
-		
-	}
-	
-	class AbstractCpsObjectInfo {
-		private AbstractCanvasObject aCps;
-		AbstractCpsObjectInfo(AbstractCanvasObject aCps){
-			this.aCps = aCps;
-		}
-		@Override
-		public String toString(){
-			return aCps.getName() + " Id:"+ aCps.getId();
-		}
-		
-		public AbstractCanvasObject getAbstractCpsObject()
-		{
-			return aCps;
-		}
-	}
-}

+ 226 - 0
src/ui/view/information/FilterableGroupNode.java

@@ -0,0 +1,226 @@
+package ui.view.information;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import classes.Node;
+import jdk.jfr.Unsigned;
+import classes.GroupNode;
+import classes.HolonElement;
+import classes.Flexibility;
+import ui.model.Consumer;
+import ui.model.DecoratedCable;
+import ui.model.DecoratedGroupNode;
+import ui.model.DecoratedHolonObject;
+import ui.model.DecoratedSwitch;
+import ui.model.ExitCable;
+import ui.model.Passiv;
+import ui.model.Supplier;
+import ui.model.DecoratedHolonObject.HolonObjectState;
+
+/**
+ * For the @VisualRepresentationalState only.
+ * 
+ * @author Tom
+ *
+ */
+public class FilterableGroupNode {
+	private GroupNode model;
+	private ArrayList<Supplier> supplierList;
+	private ArrayList<Passiv> passivList;
+	private ArrayList<Consumer> consumerList;
+	private ArrayList<Node> nodeList;
+	/**
+	 * Cables that only exist on that group node. From a object in that group node
+	 * to a object in that group Node. Not exit the group node (a layer down).
+	 */
+	private ArrayList<DecoratedCable> internCableList;
+	/**
+	 * Cables that exit this group node (a Layer Up). From a object in this group
+	 * node to a object in a upper layer.
+	 */
+	private ArrayList<ExitCable> exitCableList;
+	private ArrayList<DecoratedSwitch> switchList;
+	private ArrayList<FilterableGroupNode> groupNodeList;
+	private int iteration;
+	public FilterableGroupNode(GroupNode model, int iteration) {
+		this.model = model;
+		this.iteration = iteration;
+		this.supplierList = new ArrayList<Supplier>();
+		this.passivList = new ArrayList<Passiv>();
+		this.consumerList = new ArrayList<Consumer>();
+		this.nodeList = new ArrayList<Node>();
+		this.internCableList = new ArrayList<DecoratedCable>();
+		this.exitCableList = new ArrayList<ExitCable>();
+		this.switchList = new ArrayList<DecoratedSwitch>();
+		this.groupNodeList = new ArrayList<FilterableGroupNode>();
+	}
+
+	public FilterableGroupNode(DecoratedGroupNode dGroupNode, int iteration) {
+		model = dGroupNode.getModel();
+		this.iteration = iteration;
+		supplierList = dGroupNode.getSupplierList();
+		passivList = dGroupNode.getPassivList();
+		consumerList = dGroupNode.getConsumerList();
+		nodeList = dGroupNode.getNodeList();
+		internCableList = dGroupNode.getInternCableList();
+		exitCableList = dGroupNode.getExitCableList();
+		switchList = dGroupNode.getSwitchList();
+		groupNodeList = (ArrayList<FilterableGroupNode>) dGroupNode.getGroupNodeList().stream()
+				.map(node -> new FilterableGroupNode(node, iteration)).collect(Collectors.toList());
+	}
+
+	public GroupNode getModel() {
+		return model;
+	}
+
+	public ArrayList<Supplier> getSupplierList() {
+		return supplierList;
+	}
+
+	public ArrayList<Passiv> getPassivList() {
+		return passivList;
+	}
+
+	public ArrayList<Consumer> getConsumerList() {
+		return consumerList;
+	}
+
+	public ArrayList<Node> getNodeList() {
+		return nodeList;
+	}
+
+	public ArrayList<DecoratedCable> getInternCableList() {
+		return internCableList;
+	}
+
+	public ArrayList<ExitCable> getExitCableList() {
+		return exitCableList;
+	}
+
+	public ArrayList<DecoratedSwitch> getSwitchList() {
+		return switchList;
+	}
+
+	public ArrayList<FilterableGroupNode> getGroupNodeList() {
+		return groupNodeList;
+	}
+
+	// Returns the amount of holons and count himself
+	public int getAmountOfGroupNodes() {
+		return groupNodeList.stream().map(groupNode -> groupNode.getAmountOfGroupNodes()).reduce(1, Integer::sum);
+	}
+
+	public Stream<Flexibility> getFlexibilitiesStream(Predicate<DecoratedHolonObject> stateFilter,
+			Predicate<HolonElement> priorityFilter) {
+
+		Stream<Flexibility> flexInChildGorupNode = this.groupNodeList.stream()
+				.flatMap(groupNode -> groupNode.getFlexibilitiesStream(stateFilter, priorityFilter));
+
+		Stream<Flexibility> flexInThisGorupNode = objectStream().filter(stateFilter).flatMap(object -> object.getModel()
+				.getElements().stream().filter(priorityFilter).flatMap(ele -> ele.flexList.stream()));
+
+		return Stream.concat(flexInChildGorupNode, flexInThisGorupNode);
+	}
+
+	public Stream<DecoratedHolonObject> objectStream() {
+		return Stream.concat(Stream.concat(this.consumerList.stream(), this.supplierList.stream()),
+				this.passivList.stream());
+	}
+
+	// Gather Informations:
+	public int getAmountOfSupplier(Predicate<DecoratedHolonObject> stateFilter) {
+		return (int) supplierList.stream().filter(stateFilter).count() + groupNodeList.stream()
+				.map(groupNode -> groupNode.getAmountOfSupplier(stateFilter)).reduce(0, Integer::sum);
+	}
+
+	public int getAmountOfConsumer(Predicate<DecoratedHolonObject> stateFilter) {
+		return (int) consumerList.stream().filter(stateFilter).count() + groupNodeList.stream()
+				.map(groupNode -> groupNode.getAmountOfConsumer(stateFilter)).reduce(0, Integer::sum);
+	}
+
+	public int getAmountOfPassiv(Predicate<DecoratedHolonObject> stateFilter) {
+		return (int) passivList.stream().filter(stateFilter).count() + groupNodeList.stream()
+				.map(groupNode -> groupNode.getAmountOfPassiv(stateFilter)).reduce(0, Integer::sum);
+	}
+
+	public int getAmountOfConsumerWithState(Predicate<DecoratedHolonObject> stateFilter, HolonObjectState state) {
+		return ((int) consumerList.stream().filter(stateFilter).map(con -> con.getState())
+				.filter(rightState -> (rightState == state)).count())
+				+ groupNodeList.stream().map(groupNode -> groupNode.getAmountOfConsumerWithState(stateFilter, state))
+						.reduce(0, Integer::sum);
+	}
+
+
+	public PriorityCounts getPriorityCounts(Predicate<DecoratedHolonObject> stateFilter) {
+		PriorityCounts priority = new PriorityCounts();
+		objectStream().filter(stateFilter)
+				.forEach(object -> object.getModel().getElements().stream().forEach(ele -> priority.Count(ele)));
+		groupNodeList.stream().forEach(groupNode -> priority.Add(groupNode.getPriorityCounts(stateFilter)));
+		return priority;
+	}
+
+	public class PriorityCounts {
+		@Unsigned
+		public int low, medium, high, essential;
+
+		public void Add(PriorityCounts other) {
+			low += other.low;
+			medium += other.medium;
+			high += other.high;
+			essential += other.essential;
+		}
+
+		public void Count(HolonElement element) {
+			switch (element.getPriority()) {
+			case Essential:
+				essential++;
+				break;
+			case High:
+				high++;
+				break;
+			case Medium:
+				medium++;
+				break;
+			case Low:
+				low++;
+				break;
+			default:
+				break;
+
+			}
+		}
+	}
+
+	public int getAmountOfElementsFromHolonObjects(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
+		return objectStream().filter(stateFilter).map(object -> (int)object.getModel().getElements().stream().filter(priorityFilter).count()).reduce(0,
+				Integer::sum)
+				+ groupNodeList.stream().map(groupNode -> groupNode.getAmountOfElementsFromHolonObjects(stateFilter, priorityFilter))
+				.reduce(0, Integer::sum);
+	}
+	public int getAmountOfAktiveElementsFromHolonObjects(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
+		return objectStream().filter(stateFilter).map(object -> (int)object.getModel().getElements().stream().filter(priorityFilter).count()).reduce(0, Integer::sum)
+				+ groupNodeList.stream()
+						.map(groupNode -> groupNode.getAmountOfAktiveElementsFromHolonObjects(stateFilter, priorityFilter))
+						.reduce(0, Integer::sum);
+	}
+
+	public float getConsumption(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
+		return ((Stream<DecoratedHolonObject>) Stream.concat(this.consumerList.stream(), supplierList.stream())).filter(stateFilter).map(con -> con.getModel().getElements().stream().filter(priorityFilter.and(ele -> ele.getEnergyAtTimeStep(iteration) < 0)).map(ele -> -ele.getEnergyAtTimeStep(iteration)).reduce(0.0f, Float::sum)).reduce(0.f,
+				Float::sum)
+				+ groupNodeList.stream().map(groupNode -> groupNode.getConsumption(stateFilter, priorityFilter)).reduce(0.f,
+						Float::sum);
+	}
+
+	public float getProduction(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
+		return ((Stream<DecoratedHolonObject>) Stream.concat(this.consumerList.stream(), supplierList.stream())).filter(stateFilter).map(con -> con.getModel().getElements().stream().filter(priorityFilter.and(ele -> ele.getEnergyAtTimeStep(iteration) > 0)).map(ele -> ele.getEnergyAtTimeStep(iteration)).reduce(0.0f, Float::sum)).reduce(0.f,
+				Float::sum)
+				+ groupNodeList.stream().map(groupNode -> groupNode.getProduction(stateFilter, priorityFilter)).reduce(0.f,
+						Float::sum);
+	}
+
+
+}

+ 28 - 74
src/ui/view/HolonInformationPanel.java.orig → src/ui/view/information/HolonInformationPanel.java

@@ -1,15 +1,15 @@
-package ui.view;
+package ui.view.information;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
 import java.awt.Insets;
 import java.util.HashMap;
 import java.util.List;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -18,7 +18,6 @@ import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JLayeredPane;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 import javax.swing.OverlayLayout;
 import javax.swing.border.EmptyBorder;
 
@@ -29,8 +28,9 @@ import org.knowm.xchart.XChartPanel;
 import org.knowm.xchart.style.PieStyler;
 import org.knowm.xchart.style.PieStyler.LabelType;
 
-import classes.AbstractCanvasObject;
 import classes.GroupNode;
+import classes.HolonElement;
+import classes.HolonElement.Priority;
 import classes.HolonObject;
 import preferences.ColorPreference;
 import ui.controller.Control;
@@ -38,7 +38,6 @@ import ui.controller.FlexManager;
 import ui.controller.FlexManager.FlexWrapper;
 import ui.model.Consumer;
 import ui.model.DecoratedGroupNode;
-import ui.model.DecoratedGroupNode.PriorityCounts;
 import ui.model.DecoratedHolonObject;
 import ui.model.DecoratedHolonObject.HolonObjectState;
 import ui.model.Model;
@@ -47,7 +46,8 @@ import ui.model.Supplier;
 import utility.FormatFloat;
 
 public class HolonInformationPanel extends JPanel {
-
+	private Predicate<DecoratedHolonObject> stateFilter = (object) -> true;//= (object) -> object.getState() == HolonObjectState.PRODUCER;
+	private Predicate<HolonElement> priorityFilter = (ele) -> ele.getPriority() == Priority.Low;
 	private final int defaultWidth = 50;
 	private final int defaultHeight = 200;
 
@@ -63,49 +63,26 @@ public class HolonInformationPanel extends JPanel {
 	private XChartPanel<PieChart> panelEnergy;
 	private XChartPanel<PieChart> panelActive;
 
-	// TODO is this needed to be fields
 	private JPanel graphPanel = new JPanel(new GridLayout(0, 2));
 	private JPanel titlePanel = new JPanel(new BorderLayout(0, 0));
 
 	private Control control;
-	private JTextField titleTextField;
-	private JLabel differenceEnergyLabelAmount;
-
-	public static void main(String[] args) {
-		HolonInformationPanel exampleChart = new HolonInformationPanel(new Control(new Model()));
-		JFrame frame = new JFrame();
-		frame.setContentPane(exampleChart);
-
-		frame.pack();
-		frame.setBounds(0, 0, 540, 600);
-		frame.setLocationRelativeTo(null);
-		frame.setVisible(true);
-	}
+	private JLabel differenceEnergyLabelAmount = new JLabel("");
 
 	public void updateCharts() {
-		DecoratedGroupNode decoratedGroupNode;
-		switch (control.getModel().getSelectedObjects().size()) {
-		case 0:
+		if (control.getModel().getSelectedObjects().isEmpty()) {
 			return;
-		case 1:
-//			titleTextField.setText(control.getModel().getSelectedObjects().getName());
-			titleTextField.setText("TODO");
-			decoratedGroupNode = multiSelectionToDecoratedGroupNode();
-			break;
-		default:
-			titleTextField.setText(getMultiSelectionName());
-			decoratedGroupNode = multiSelectionToDecoratedGroupNode();
-			break;
 		}
+		FilterableGroupNode decoratedGroupNode = multiSelectionToFilterableGroupNode();
 
 		// UPDATE SUPPLY STATE
-		int producerAmount = decoratedGroupNode.getAmountOfSupplier();
-		int overSuppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(HolonObjectState.OVER_SUPPLIED);
-		int suppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(HolonObjectState.SUPPLIED);
+		int producerAmount = decoratedGroupNode.getAmountOfSupplier(stateFilter);
+		int overSuppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(stateFilter, HolonObjectState.OVER_SUPPLIED);
+		int suppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(stateFilter, HolonObjectState.SUPPLIED);
 		int partiallySuppliedAmount = decoratedGroupNode
-				.getAmountOfConsumerWithState(HolonObjectState.PARTIALLY_SUPPLIED);
-		int notSuppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(HolonObjectState.NOT_SUPPLIED);
-		int noEnergyAmount = decoratedGroupNode.getAmountOfPassiv();
+				.getAmountOfConsumerWithState(stateFilter, HolonObjectState.PARTIALLY_SUPPLIED);
+		int notSuppliedAmount = decoratedGroupNode.getAmountOfConsumerWithState(stateFilter, HolonObjectState.NOT_SUPPLIED);
+		int noEnergyAmount = decoratedGroupNode.getAmountOfPassiv(stateFilter);
 
 		supplyChart.updatePieSeries("Producer", producerAmount);
 		supplyChart.updatePieSeries("Over supplied", overSuppliedAmount);
@@ -116,7 +93,7 @@ public class HolonInformationPanel extends JPanel {
 		panelHolonObject.updateToolTips();
 
 		// UPDATE PRIORITYS
-		PriorityCounts priorityCounts = decoratedGroupNode.getPriorityCounts();
+		ui.view.information.FilterableGroupNode.PriorityCounts priorityCounts = decoratedGroupNode.getPriorityCounts(stateFilter);
 
 		priorityChart.updatePieSeries("Essential", priorityCounts.essential);
 		priorityChart.updatePieSeries("High", priorityCounts.high);
@@ -128,8 +105,10 @@ public class HolonInformationPanel extends JPanel {
 		panelPriority.updateToolTips();
 
 		// UPDATE PRODUCTION
-		float production = decoratedGroupNode.getProductionFromSupplier();
-		float consumption = decoratedGroupNode.getConsumptionFromConsumer();
+		float production = decoratedGroupNode.getProduction(stateFilter, priorityFilter);
+		float consumption = decoratedGroupNode.getConsumption(stateFilter,priorityFilter);
+		System.out.println("production" + production);
+		System.out.println("consumption" + consumption);
 		float difference = Math.abs(production - consumption);
 		energyChart.updatePieSeries("Production", production);
 		energyChart.updatePieSeries("Consumption", consumption);
@@ -143,7 +122,7 @@ public class HolonInformationPanel extends JPanel {
 		int notOffered = 0;
 		int unavailable = 0;
 		FlexManager manager = control.getSimManager().getActualFlexManager();
-		Stream<FlexWrapper> flexWrapperStream = decoratedGroupNode.getFlexibilitiesStream()
+		Stream<FlexWrapper> flexWrapperStream = decoratedGroupNode.getFlexibilitiesStream(stateFilter, priorityFilter)
 				.map(flex -> manager.getFlexWrapperFromFlexibility(flex));
 		List<FlexWrapper> wrapperList = flexWrapperStream.collect(Collectors.toList());
 		for (FlexWrapper wrapper : wrapperList) {
@@ -178,8 +157,8 @@ public class HolonInformationPanel extends JPanel {
 		panelFlexibility.updateToolTips();
 
 		// UPDATE ActiveInActive
-		int activeAmount = decoratedGroupNode.getAmountOfAktiveElemntsFromHolonObjects();
-		int inactiveAmounts = decoratedGroupNode.getAmountOfElemntsFromHolonObjects() - activeAmount;
+		int activeAmount = decoratedGroupNode.getAmountOfAktiveElementsFromHolonObjects(stateFilter, priorityFilter);
+		int inactiveAmounts = decoratedGroupNode.getAmountOfElementsFromHolonObjects(stateFilter, priorityFilter) - activeAmount;
 		activeChart.updatePieSeries("Active", activeAmount);
 		activeChart.updatePieSeries("Inactive", inactiveAmounts);
 		panelActive.updateToolTips();
@@ -188,28 +167,15 @@ public class HolonInformationPanel extends JPanel {
 		this.repaint();
 	}
 
-	private String getMultiSelectionName() {
-		String name =  control.getModel().getSelectedObjects().stream().map(AbstractCanvasObject::getName)
-				.collect(Collectors.joining(", "));
-		if(name.length() > 25) {
-			name = name.substring(0, 25);
-			name += "...";
-		}
-		return name;
-	}
-
-
-	private DecoratedGroupNode multiSelectionToDecoratedGroupNode() {
-		// TODO Create DecoratedGroupNode
-		DecoratedGroupNode temp = new DecoratedGroupNode(new GroupNode("Temp"));
+	private FilterableGroupNode multiSelectionToFilterableGroupNode() {
+		FilterableGroupNode temp = new FilterableGroupNode(new GroupNode("Temp"), control.getModel().getCurrentIteration());
 
-		// TODO get consumer, supplier, passiv
 		// GroupNodes
 		HashMap<GroupNode, DecoratedGroupNode> accessMapGroupNode = control.getSimManager()
 				.getActualVisualRepresentationalState().getCreatedGroupNodes();
-		List<DecoratedGroupNode> groupNodeList = control.getModel().getSelectedObjects().stream()
+		List<FilterableGroupNode> groupNodeList = control.getModel().getSelectedObjects().stream()
 				.filter(object -> object instanceof GroupNode).map(object -> accessMapGroupNode.get(object))
-				.collect(Collectors.toList());
+				.map(node -> new FilterableGroupNode(node, control.getModel().getCurrentIteration())).collect(Collectors.toList());
 
 		temp.getGroupNodeList().addAll(groupNodeList);
 
@@ -282,7 +248,7 @@ public class HolonInformationPanel extends JPanel {
 		difference.setForeground(ColorPreference.Panel.Title);
 		difference.setFont(new java.awt.Font("Arial", java.awt.Font.BOLD, 10));
 		panelMiddle.add(difference, c);
-		differenceEnergyLabelAmount = new JLabel("");
+
 		differenceEnergyLabelAmount.setHorizontalAlignment(JLabel.CENTER);
 		differenceEnergyLabelAmount.setForeground(Color.red);
 		differenceEnergyLabelAmount.setAlignmentX(Component.CENTER_ALIGNMENT);
@@ -299,15 +265,8 @@ public class HolonInformationPanel extends JPanel {
 	}
 
 	public void initTitlePanel() {
-		titleTextField = new JTextField("");
-		titleTextField.setFont(new Font("Arial", Font.BOLD, 24));
-		titleTextField.setForeground(ColorPreference.Panel.Title);
-		titleTextField.setBackground(ColorPreference.Panel.Background);
-		titleTextField.setBackground(null);
-		titleTextField.setBorder(null);
 		titlePanel.setBackground(ColorPreference.Panel.Background);
 		titlePanel.setBorder(new EmptyBorder(5, 5, 2, 0));
-		titlePanel.add(titleTextField, BorderLayout.CENTER);
 	}
 
 	public void setDefaultPieChartSettings(PieChart chart) {
@@ -348,7 +307,6 @@ public class HolonInformationPanel extends JPanel {
 	}
 
 	public PieChart createPriorityChart() {
-		// Create Chart
 		PieChart chart = new PieChartBuilder().width(defaultWidth).height(defaultHeight).title("Priotities").build();
 		setDefaultPieChartSettings(chart);
 		// Customize Chart
@@ -366,8 +324,6 @@ public class HolonInformationPanel extends JPanel {
 	}
 
 	public PieChart createFlexibilityChart() {
-		// IN_USE, ON_COOLDOWN, OFFERED, NOT_OFFERED, UNAVAILABLE
-		// Create Chart
 		PieChart chart = new PieChartBuilder().width(defaultWidth).height(defaultHeight).title("Flexibilities").build();
 		setDefaultPieChartSettings(chart);
 		// Customize Chart
@@ -386,7 +342,6 @@ public class HolonInformationPanel extends JPanel {
 	}
 
 	public PieChart createProductionChart() {
-		// Create Chart
 		PieChart chart = new PieChartBuilder().width(defaultWidth).height(defaultHeight)
 				.title("Production vs. Consumption").build();
 		setDefaultPieChartSettings(chart);
@@ -402,7 +357,6 @@ public class HolonInformationPanel extends JPanel {
 	}
 
 	public PieChart createActiveChart() {
-		// Create Chart
 		PieChart chart = new PieChartBuilder().width(defaultWidth).height(defaultHeight).title("Active").build();
 		setDefaultPieChartSettings(chart);
 		// Customize Chart

+ 1 - 1
src/ui/view/inspector/Inspector.java

@@ -64,7 +64,7 @@ public class Inspector extends JSplitPane {
 		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 		this.setTopComponent(scrollPane);
 		this.setBottomComponent(scrollGraph);
-		this.setDividerLocation(1000);
+		this.setDividerLocation(550);
 		scrollGraph.setLayout(new BorderLayout());
 		scrollGraph.add(unitGraph, BorderLayout.CENTER);
 		// Set up of the Properties section

+ 11 - 7
src/ui/view/main/GUI.java

@@ -91,6 +91,7 @@ import ui.view.dialog.BackgroundPopUp;
 import ui.view.dialog.CanvasResizePopUp;
 import ui.view.dialog.CreateNewDialog;
 import ui.view.dialog.CreateNewDialog.Option;
+import ui.view.information.HolonInformationPanel;
 import ui.view.inspector.Inspector;
 import ui.view.inspector.UnitGraph;
 import ui.view.dialog.EditEdgesPopUp;
@@ -180,9 +181,8 @@ public class GUI {
 	 * HolonElements Information, Properties and Consumption/Production graph.
 	 **/
 	private final Inspector inspector;
+	private final HolonInformationPanel informationPanel;
 	private final JSplitPane splitHolonElPro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-	private final JSplitPane splitGraphHolonEl = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-	private final int distanceBetweenElementsAndGraph = 350;
 
 	// Prechoosed local Periods
 
@@ -261,6 +261,7 @@ public class GUI {
 	 */
 	GUI(Control control) {
 		this.controller = control;
+		this.informationPanel = new HolonInformationPanel(control);
 		this.model = control.getModel();
 		inspector = new Inspector(control);
 		control.setGui(this);
@@ -1345,20 +1346,23 @@ public class GUI {
 
 		splitHolonElPro.setDividerLocation(700);
 		// containing the graph and the elements-list
-		splitHolonElPro.setTopComponent(splitGraphHolonEl);
+		splitHolonElPro.setTopComponent(inspector);
 		// containing the object's properties
 		splitHolonElPro.setBottomComponent(scrollProperties);
 
-		splitGraphHolonEl.setTopComponent(inspector);
-		splitGraphHolonEl.setDividerLocation(distanceBetweenElementsAndGraph);
 		canvasSP.setViewportView(canvas);
-
+		// Set up of the Properties section
+		scrollProperties.setViewportView(this.informationPanel);
+		scrollProperties.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+		scrollProperties.getVerticalScrollBar().setUnitIncrement(16);
+		
+		
+		
 		tabbedPaneOriginal.setBorder(null);
 		scrollProperties.setBorder(null);
 		splitPane.setBorder(null);
 		splitPane1.setBorder(null);
 		splitHolonElPro.setBorder(null);
-		splitGraphHolonEl.setBorder(null);
 		panelHolonEl.setBorder(null);
 		canvasSP.setBorder(null);