Browse Source

Changes Window Event

TomTroppmann 2 years ago
parent
commit
a728a41f3f

+ 3 - 6
src/holeg/model/HolonElement.java

@@ -14,6 +14,7 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.ListIterator;
 import java.util.AbstractMap.SimpleEntry;
+import java.util.logging.Logger;
 /**
  * The class "HolonElement" represents any possible element that can be added to
  * a CpsObject (such as TV (consumer) or any energyPerElement source/producer).
@@ -21,7 +22,7 @@ import java.util.AbstractMap.SimpleEntry;
  * @author Gruppe14
  */
 public class HolonElement implements TimelineDependent{
-
+    private static final Logger log = Logger.getLogger(HolonElement.class.getName());
 	/*
 	 * MODEL
 	 */
@@ -176,6 +177,7 @@ public class HolonElement implements TimelineDependent{
      * @param energyPerElement the energyPerElement to set
      */
     public void setEnergy(float energyPerElement) {
+    	log.finest(this.energy + " -> " + energyPerElement);
     	this.energy = energyPerElement;
     }
     
@@ -208,11 +210,6 @@ public class HolonElement implements TimelineDependent{
     public void setPriority(Priority priority) {
     	this.priority = priority;
     }    
-    
-
-
-  
-
 
     /**
      * @return the saving

+ 1 - 12
src/holeg/ui/controller/CanvasController.java

@@ -4,7 +4,6 @@ import java.awt.Point;
 import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
-import java.util.Optional;
 import java.util.stream.Collectors;
 
 import holeg.model.AbstractCanvasObject;
@@ -13,7 +12,6 @@ import holeg.model.GroupNode;
 import holeg.model.HolonObject;
 import holeg.model.HolonSwitch;
 import holeg.model.Node;
-import holeg.ui.model.DecoratedState;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.model.Model;
 import holeg.ui.view.main.GUI;
@@ -229,7 +227,7 @@ public class CanvasController {
 	 * 
 	 * @param node
 	 */
-	public void bfsNodeCleaner(GroupNode node) {
+	public void deleteAllObjectsInGroupNode(GroupNode node) {
 		List<AbstractCanvasObject> objectsInGroupNode = node.getAllObjectsRecursive().toList();
 		ListIterator<Edge>  iter = model.getEdgesOnCanvas().listIterator();
 		while(iter.hasNext() ) {
@@ -250,15 +248,6 @@ public class CanvasController {
 		}
 	}
 	
-	public void updateOutliner(SimulationManager manager ) {
-		Optional<DecoratedState> decorState = manager.getActualDecorState();
-		decorState.ifPresent(state -> gui.updateOutliners(state));
-	}
-	public void updateFlexWindow() {
-		gui.updateFlexWindows();
-	}
-	
-	
 	public void updateCanvas() {
 		gui.repaintCanvas();
 	}

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

@@ -149,10 +149,10 @@ public class ClipboardController {
             if (upperNode == null)
                 cvsC.deleteObjectOnCanvas(abs);
             else
-                uppC.deleteObjectInUpperNode(abs, upperNode);
+                uppC.deleteObjectInGroupNode(abs, upperNode);
 
             if (abs instanceof GroupNode groupnode)
-                cvsC.bfsNodeCleaner(groupnode);
+                cvsC.deleteAllObjectsInGroupNode(groupnode);
         }
         GuiSettings.getSelectedObjects().clear();
         this.simManager.calculateStateForTimeStep(model.getCurrentIteration(), true);
@@ -209,14 +209,14 @@ public class ClipboardController {
             if (upperNode == null)
                 cvsC.addObject(temp, false);
             else
-                uppC.addObjectInUpperNode(temp, upperNode, false);
+                uppC.addObjectInGroupNode(temp, upperNode, false);
             // mark the Pasted Objects
             GuiSettings.getSelectedObjects().add(temp);
         } else {
             // else look up the table and put it into the right Uppernode
             GroupNode temp2 = (GroupNode) objDispatch.get(objIDMap.get(Integer.parseInt(temp.getSav())));
             if(temp2!=null)
-            	uppC.addObjectInUpperNode(temp, temp2, false);
+            	uppC.addObjectInGroupNode(temp, temp2, false);
             else{
             	/**
             	 * if corresponding Uppernode doesn't exist:
@@ -225,7 +225,7 @@ public class ClipboardController {
             	 if (upperNode == null)
                      cvsC.addObject(temp, false);
                  else
-                     uppC.addObjectInUpperNode(temp, upperNode, false);
+                     uppC.addObjectInGroupNode(temp, upperNode, false);
             }
         }
 

+ 23 - 25
src/holeg/ui/controller/Control.java

@@ -10,6 +10,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 import javax.swing.JFrame;
@@ -37,6 +38,9 @@ import holeg.utility.events.Event;
  * @author Gruppe14
  */
 public class Control {
+	private static final Logger log = Logger.getLogger(Control.class.getName());
+	
+	
 	private final CategoryController categoryController;
 	private final CanvasController canvasController;
 	private final SaveController saveController;
@@ -55,6 +59,8 @@ public class Control {
 
 	public Event OnCategoryChanged = new Event();
 	public Event OnSelectionChanged = new Event();
+	public Event OnCanvasUpdate = new Event();
+	
 
 	/**
 	 * Constructor.
@@ -282,7 +288,7 @@ public class Control {
 	public void delCanvasObject(AbstractCanvasObject obj, boolean save) {
 		canvasController.deleteObjectOnCanvas(obj);
 		if (obj instanceof GroupNode groupnode) {
-			canvasController.bfsNodeCleaner(groupnode);
+			canvasController.deleteAllObjectsInGroupNode(groupnode);
 		}
 		calculateStateAndVisualForCurrentTimeStep();
 		if (save) {
@@ -389,9 +395,8 @@ public class Control {
 	 */
 	public void calculateStateAndVisualForTimeStep(int x) {
 		simulationManager.calculateStateForTimeStep(x, true);
+		OnCanvasUpdate.broadcast();
 		// TODO(Tom2021-12-2): Convert to Events
-		updateOutliner();
-		updateFlexWindow();
 		this.updateCanvas();
 	}
 
@@ -408,7 +413,7 @@ public class Control {
 	 *
 	 * @throws IOException Exception
 	 */
-	public void autoSave() throws IOException {
+	private void autoSave() throws IOException {
 		autoSaveController.increaseAutoSaveNr();
 		saveController.writeAutosave(autosaveDir + rand + GuiSettings.autoSaveNr);
 		if (autoSaveController.allowed()) {
@@ -420,7 +425,7 @@ public class Control {
 		try {
 			autoSave();
 		} catch (IOException e) {
-			e.printStackTrace();
+			log.warning(e.getStackTrace().toString());
 		}
 	}
 
@@ -519,30 +524,30 @@ public class Control {
 	// ========================== MANAGING TRACKED OBJECTS END ================
 
 	/**
-	 * Controlling Nodes of Nodes
+	 * Controlling GroupNodes
 	 */
 
-	public void addUpperNode(String nodeName, GroupNode upperNode, List<AbstractCanvasObject> toGroup) {
-		nodeController.doUpperNode(nodeName, upperNode, toGroup);
+	public void addGroupNode(String nodeName, GroupNode groupNode, List<AbstractCanvasObject> toGroup) {
+		nodeController.addGroupNode(nodeName, groupNode, toGroup);
 		tryAutoSave();
 	}
 
-	public void ungroupGroupNode(GroupNode node, GroupNode upperNode) {
-		nodeController.undoUpperNode(node, upperNode);
+	public void undoGroupNode(GroupNode node, GroupNode groupNode) {
+		nodeController.undoGroupNode(node, groupNode);
 		tryAutoSave();
 	}
 
-	public void addObjUpperNode(AbstractCanvasObject object, GroupNode upperNode) {
-		nodeController.addObjectInUpperNode(object, upperNode, true);
+	public void addObjectInGroupNode(AbstractCanvasObject object, GroupNode groupNode) {
+		nodeController.addObjectInGroupNode(object, groupNode, true);
 		tryAutoSave();
 	}
 
-	public void delObjUpperNode(AbstractCanvasObject object, GroupNode upperNode) {
-		nodeController.deleteObjectInUpperNode(object, upperNode);
-		if (object instanceof GroupNode groupnode)
-			canvasController.bfsNodeCleaner(groupnode);
+	public void deleteObjectInGroupNode(AbstractCanvasObject object, GroupNode groupNode) {
+		nodeController.deleteObjectInGroupNode(object, groupNode);
+		if (object instanceof GroupNode groupnode) {
+			canvasController.deleteAllObjectsInGroupNode(groupnode);			
+		}
 		tryAutoSave();
-
 	}
 
 	/**
@@ -552,7 +557,7 @@ public class Control {
 	 * @param by
 	 * @param upperNode
 	 */
-	public void replaceObjUpperNode(AbstractCanvasObject toBeReplaced, AbstractCanvasObject by, GroupNode upperNode) {
+	public void replaceObjectInGroupNode(AbstractCanvasObject toBeReplaced, AbstractCanvasObject by, GroupNode upperNode) {
 		nodeController.replaceObjectInUpperNode(toBeReplaced, by, upperNode);
 		tryAutoSave();
 	}
@@ -592,13 +597,6 @@ public class Control {
 		clipboardController.getObjectsInDepth();
 	}
 
-	public void updateOutliner() {
-		this.canvasController.updateOutliner(simulationManager);
-	}
-
-	public void updateFlexWindow() {
-		canvasController.updateFlexWindow();
-	}
 
 	public void updateCanvas() {
 		canvasController.updateCanvas();

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

@@ -291,7 +291,7 @@ public class LoadController {
             // else look up the table and put it into the right Uppernode
             GroupNode temp2 = (GroupNode) objDispatch.get(Integer.parseInt(temp.getSav()));
             if(temp2 != null)
-            	uppC.addObjectInUpperNode(temp, temp2, false);
+            	uppC.addObjectInGroupNode(temp, temp2, false);
             else{
             	/**
             	 * if null try to load on canvas

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

@@ -28,21 +28,23 @@ class NodeController {
 	/**
 	 * Add a CpsUpperNode into Canvas
 	 */
-    void doUpperNode(String nodeName, GroupNode upperNode, List<AbstractCanvasObject> toGroup) {
+    void addGroupNode(String nodeName, GroupNode groupNode, List<AbstractCanvasObject> toGroup) {
 		GroupNode node = new GroupNode(nodeName);
 		node.setPosition(calculatePos(toGroup));
-		makeNodeOfNodes(node, upperNode, toGroup);
-		if (upperNode == null)
+		makeGroupNode(node, groupNode, toGroup);
+		if (groupNode == null) {
 			cvs.addNewObject(node);
-		else
-			addObjectInUpperNode(node, upperNode, false);
+		}
+		else {
+			addObjectInGroupNode(node, groupNode, false);			
+		}
 
 	}
 
 	/**
 	 * Delete a CpsUpperNode from the Canvas
 	 */
-    void undoUpperNode(GroupNode node, GroupNode upperNode) {
+    void undoGroupNode(GroupNode node, GroupNode groupNode) {
     	if(node.getObjectsInThisLayer().findAny().isPresent()) {
     		cvs.deleteObjectOnCanvas(node);
     		return;
@@ -51,29 +53,29 @@ class NodeController {
 		Vector2Int p = node.getPosition();
 		point = new Point(old.getX() - p.getX(), old.getY() - p.getY());
 
-		unmakeNodesOfNodes(node, upperNode);
-		if (upperNode == null)
+		unmakeNodesOfNodes(node, groupNode);
+		if (groupNode == null)
 			cvs.deleteObjectOnCanvas(node);
 		else
-			deleteObjectInUpperNode(node, upperNode);
+			deleteObjectInGroupNode(node, groupNode);
 	}
 
 	/**
 	 * Put selected Nodes inside the Upper Node
 	 */
-	private void makeNodeOfNodes(GroupNode node, GroupNode upperNode, List<AbstractCanvasObject> toGroup) {
+	private void makeGroupNode(GroupNode node, GroupNode groupNode, List<AbstractCanvasObject> toGroup) {
 	
 
 		// Put all selected Nodes into the Upper Node
         for (AbstractCanvasObject obj : toGroup) {
-			addObjectInUpperNode(obj, node, false);
+			addObjectInGroupNode(obj, node, false);
 		}
 
 		for (AbstractCanvasObject abs : toGroup) {
-			if (upperNode == null)
+			if (groupNode == null)
 				removeForNodeOfNode(abs);
 			else
-				removeForNodeOfNode(abs, upperNode);
+				removeForNodeOfNode(abs, groupNode);
 		}
 
 	}
@@ -101,19 +103,6 @@ class NodeController {
 	}
 
 
-	/**
-	 * Just checking if an Egde already exists
-	 */
-    boolean lookforDuplicates(AbstractCanvasObject a, AbstractCanvasObject b, List<Edge> list) {
-        for (Edge cpsEdge : list) {
-			if ((a.equals(cpsEdge.getA()) && b.equals(cpsEdge.getB()))
-					|| (b.equals(cpsEdge.getA()) && a.equals(cpsEdge.getB())))
-				return true;
-		}
-		return false;
-	}
-
-
 
 	/**
 	 * Calculate new Position of the Upper Node
@@ -147,7 +136,7 @@ class NodeController {
 	 * @param upperNode
 	 * @param replace
 	 */
-    void addObjectInUpperNode(AbstractCanvasObject object, GroupNode upperNode, boolean replace) {
+    void addObjectInGroupNode(AbstractCanvasObject object, GroupNode upperNode, boolean replace) {
         if(object == null){
         		new Error("object == null while adding to "+upperNode.toString()).printStackTrace();
         		return;
@@ -206,7 +195,7 @@ class NodeController {
 	/**
 	 * Delete a AbstactCpsObject from CPSUpperNode
 	 */
-    void deleteObjectInUpperNode(AbstractCanvasObject object, GroupNode groupNode) {
+    void deleteObjectInGroupNode(AbstractCanvasObject object, GroupNode groupNode) {
 		LinkedList<Edge> edgesToDelete = new LinkedList<Edge>();
 		for (Edge p : model.getEdgesOnCanvas()) {
 			if(p.isConnectedTo(object)) {
@@ -230,7 +219,7 @@ class NodeController {
 		 * set Position of by to exactly toBeReplaced
 		 */
 		by.setPosition(toBeReplaced.getPosition());
-		deleteObjectInUpperNode(toBeReplaced, upperNode);
+		deleteObjectInGroupNode(toBeReplaced, upperNode);
 	}
 
     private void updatePosition(AbstractCanvasObject temp, GroupNode upperNode) {

+ 5 - 19
src/holeg/ui/view/canvas/Canvas.java

@@ -136,7 +136,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 					for (int i = 0; i < animCps.size(); i++) {
 						animCps.get(i).getPosition().set(savePos.get(i));
 					}
-					control.addUpperNode("GroupNode", groupNode, animCps);
+					control.addGroupNode("GroupNode", groupNode, animCps);
 					control.calculateStateAndVisualForCurrentTimeStep();
 					control.clearSelection();
 					repaint();
@@ -153,7 +153,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 
 			savePos = new ArrayList<>();
 			animCps = ((GroupNode) tempCps).getAllObjectsRecursive().toList();
-			control.ungroupGroupNode((GroupNode) tempCps, groupNode);
+			control.undoGroupNode((GroupNode) tempCps, groupNode);
 
 			for (int i = 0; i < animCps.size(); i++) {
 				savePos.add(new Vector2Int(animCps.get(i).getPosition()));
@@ -640,16 +640,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 			}
 
 			if (dragged) {
-				try {
-					/**
-					 * Save before further Dragged interactions happen
-					 */
-					control.autoSave();
-
-				} catch (IOException ex) {
-					System.err.println("AutoSave error by dragging");
-					ex.printStackTrace();
-				}
+				control.tryAutoSave();
 
 				/**
 				 * check if a unique tempCps could replace an Object on the canvas
@@ -872,7 +863,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 								Node n = new Node("Node");
 
 								n.setPosition(x, y);
-								control.addObjUpperNode(n, thisUpperNode);
+								control.addObjectInGroupNode(n, thisUpperNode);
 								e = new Edge(n, tempCps, GuiSettings.maxCapacityForNewCreatedEdges);
 								control.addEdgeOnCanvas(e);
 							}
@@ -1004,12 +995,7 @@ public class Canvas extends AbstractCanvas implements MouseListener, MouseMotion
 		/**
 		 * AutoSave new Positons
 		 */
-		try {
-			control.autoSave();
-		} catch (IOException ex) {
-			System.err.println("AutoSave error by aligning");
-			ex.printStackTrace();
-		}
+		control.tryAutoSave();
 	}
 
 	@Override

+ 2 - 10
src/holeg/ui/view/canvas/GroupNodeCanvas.java

@@ -7,7 +7,6 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.MouseEvent;
-import java.io.IOException;
 import java.util.Optional;
 import java.util.logging.Logger;
 
@@ -228,14 +227,7 @@ public class GroupNodeCanvas extends Canvas {
 			}
 
 			if (dragged) {
-				try {
-					/**
-					 * Save State before performing NodePlacement, replacement e.g.
-					 */
-					control.autoSave();
-				} catch (IOException ex) {
-					ex.printStackTrace();
-				}
+				control.tryAutoSave();
 
 				/**
 				 * check if tempCps could replace an Object on the UpperNodeanvas
@@ -250,7 +242,7 @@ public class GroupNodeCanvas extends Canvas {
 					/**
 					 * replace on canvas
 					 */
-					control.replaceObjUpperNode(mayBeReplaced, tempCps, groupNode);
+					control.replaceObjectInGroupNode(mayBeReplaced, tempCps, groupNode);
 					mayBeReplaced = null;
 				}
 			}

+ 11 - 10
src/holeg/ui/view/information/HolonInformationPanel.java

@@ -87,6 +87,17 @@ public class HolonInformationPanel extends JPanel {
 	private Control control;
 	private JLabel differenceEnergyLabelAmount = new JLabel("");
 
+	public HolonInformationPanel(Control control) {
+		control.OnSelectionChanged.addListener(() -> updateCharts());
+		this.control = control;
+		this.setLayout(new BorderLayout());
+		initGraphPanel();
+		initTitlePanel();
+		this.setBackground(ColorPreference.Panel.Background);
+		this.add(titlePanel, BorderLayout.PAGE_START);
+		this.add(graphPanel, BorderLayout.CENTER);
+	}
+	
 	public void updateCharts() {
 		if (GuiSettings.getSelectedObjects().isEmpty()) {
 			return;
@@ -231,16 +242,6 @@ public class HolonInformationPanel extends JPanel {
 		return Optional.of(temp);
 	}
 
-	public HolonInformationPanel(Control control) {
-		control.OnSelectionChanged.addListener(() -> updateCharts());
-		this.control = control;
-		this.setLayout(new BorderLayout());
-		initGraphPanel();
-		initTitlePanel();
-		this.setBackground(ColorPreference.Panel.Background);
-		this.add(titlePanel, BorderLayout.PAGE_START);
-		this.add(graphPanel, BorderLayout.CENTER);
-	}
 
 	public void initGraphPanel() {
 		graphPanel.setBackground(ColorPreference.Panel.Background);

+ 5 - 41
src/holeg/ui/view/main/GUI.java

@@ -27,8 +27,6 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
 import java.util.Optional;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
@@ -75,7 +73,6 @@ import holeg.model.HolonObject;
 import holeg.model.HolonSwitch;
 import holeg.preferences.ColorPreference;
 import holeg.ui.controller.Control;
-import holeg.ui.model.DecoratedState;
 import holeg.ui.model.GuiSettings;
 import holeg.ui.model.IdCounter;
 import holeg.ui.model.Model;
@@ -245,9 +242,6 @@ public class GUI {
 	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");
 
 	/**
@@ -413,7 +407,7 @@ public class GUI {
 				if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
 					for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
 						if (groupNodeCanvas.getGroupNode().getObjectsInThisLayer().anyMatch(object -> object == cps)) {
-							control.delObjUpperNode(cps, groupNodeCanvas.getGroupNode());
+							control.deleteObjectInGroupNode(cps, groupNodeCanvas.getGroupNode());
 							unc.setToolTip(false);
 
 							// remove UpperNodeTab if UpperNode deleted
@@ -890,7 +884,7 @@ public class GUI {
 									&& groupNodeCanvas.mayBeReplaced instanceof GroupNode) {
 								groupNodeCanvas.closeUpperNodeTab(groupNodeCanvas.mayBeReplaced.getId());
 							}
-							control.addObjUpperNode(h, groupNodeCanvas.getGroupNode());
+							control.addObjectInGroupNode(h, groupNodeCanvas.getGroupNode());
 
 							/**
 							 * object would be replaced
@@ -1377,7 +1371,7 @@ public class GUI {
 		JMenuItem openOutliner = new JMenuItem("Open Outliner", new ImageIcon(ImageImport
 				.loadImage("/Button_Images/iconOutliner.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openOutliner.addActionListener(actionEvent -> {
-			outlinerList.add(new Outliner(holegJFrame, model, control));
+			new Outliner(holegJFrame, model, control);
 		});
 		openOutliner
 				.setAccelerator(KeyStroke.getKeyStroke('O', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
@@ -1386,39 +1380,13 @@ public class GUI {
 		JMenuItem openFlexMenuItem = new JMenuItem("Open Flexibility Panel", new ImageIcon(ImageImport
 				.loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
 		openFlexMenuItem.addActionListener(actionEvent -> {
-			flexList.add(new FlexWindow(holegJFrame, control));
+			new FlexWindow(holegJFrame, control);
 		});
 		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 boolean isUpperPanelInsideBounds() {
 		int x = holegJFrame.getX();
 		int y = holegJFrame.getY();
@@ -1448,11 +1416,7 @@ public class GUI {
 	 */
 	private void setUpAutoSave(File dest) {
 		dest.mkdirs();
-		try {
-			control.autoSave();
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
+		control.tryAutoSave();
 	}
 
 	/**

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

@@ -60,6 +60,7 @@ import holeg.preferences.ColorPreference;
 import holeg.ui.controller.Control;
 import holeg.ui.model.Model;
 import holeg.utility.ImageImport;
+import holeg.utility.listener.WindowClosingListener;
 
 
 public class FlexWindow extends JFrame {
@@ -90,21 +91,20 @@ public class FlexWindow extends JFrame {
 	String gridTabString = "Grid";
 	String orderTabString = "Order";
 	
-	public FlexWindow(JFrame parentFrame, holeg.ui.controller.Control  controller){
+	Runnable update = this::update;
+	
+	public FlexWindow(JFrame parentFrame, Control  control){
 		this.intermediateFlex.name = "name";
-		this.control = controller;
-		this.model = controller.getModel();
+		this.control = control;
+		this.model = control.getModel();
 		//InitWindow
 		createMenuBar();
 		initWindowPanel(parentFrame);
-		this.addWindowListener(new java.awt.event.WindowAdapter() {
-		    @Override
-		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
-		    	isClosed = true;
-		    }
+		this.addWindowListener((WindowClosingListener) e -> {
+			control.OnCanvasUpdate.removeListener(update);
 		});
 		updateSelectedPanel();
-		//this.pack();
+		control.OnCanvasUpdate.addListener(update);
 	}
 
 
@@ -450,8 +450,6 @@ public class FlexWindow extends JFrame {
 			return;
 		}
 		
-		
-		
 		Flexibility toDeleteFlex =(Flexibility) JOptionPane.showInputDialog(this, "Select to Delete Flexibility:", "Flexibility?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , allFlexes, "");
 		if(toDeleteFlex != null) {
 			toDeleteFlex.getElement().flexList.remove(toDeleteFlex);

+ 20 - 13
src/holeg/ui/view/window/Outliner.java

@@ -3,6 +3,7 @@ package holeg.ui.view.window;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.util.ArrayList;
+import java.util.logging.Logger;
 
 import javax.swing.ImageIcon;
 import javax.swing.JFrame;
@@ -28,6 +29,7 @@ import holeg.ui.model.Model;
 import holeg.ui.model.Passiv;
 import holeg.ui.model.Supplier;
 import holeg.utility.ImageImport;
+import holeg.utility.listener.WindowClosingListener;
 
 
 
@@ -35,29 +37,34 @@ import holeg.utility.ImageImport;
 
 
 public class Outliner extends JFrame {
-	private static final long serialVersionUID = 1L;
+	private static final Logger log = Logger.getLogger(Outliner.class.getName());
+	Control control;
 	JTabbedPane tabbedPane = new JTabbedPane();
 	JPanel listPanel = new JPanel(new BorderLayout());
 	JPanel statePanel = new JPanel(new BorderLayout());
-	public boolean isClosed = false;
 	ArrayList<MinimumNetwork> list;
-	public Outliner(JFrame parentFrame, Model model, Control controller){ 
+	Runnable update = this::update;
+	public Outliner(JFrame parentFrame, Model model, Control control){ 
 		setBounds(0, 0, 400, parentFrame.getHeight());
 		this.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
 		this.setTitle("Outliner");
 		setLocationRelativeTo(parentFrame);
 		this.setVisible(true);
-		controller.getSimManager().getActualDecorState().ifPresent(state -> repaintWithDecoratedState(state));
+		this.control = control;
+		update();
 		this.getContentPane().add(tabbedPane);
-		this.addWindowListener(new java.awt.event.WindowAdapter() {
-		    @Override
-		    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
-		    	isClosed = true;
-		    }
+		this.addWindowListener((WindowClosingListener) e -> {
+		  control.OnCanvasUpdate.removeListener(update);
 		});
+		control.OnCanvasUpdate.addListener(update);
 		tabbedPane.addTab("List", listPanel);
 		tabbedPane.addTab("State", statePanel);
 	}
+	
+	
+	public void update() {
+		control.getSimManager().getActualDecorState().ifPresent(this::repaintWithDecoratedState);
+	}
 
 	public void repaintWithDecoratedState(DecoratedState decoratedState) {
 		//tabbedPane.removeAll();
@@ -165,22 +172,22 @@ public class Outliner extends JFrame {
 
 		@Override
 		public void treeNodesChanged(TreeModelEvent tmE) {
-			System.out.println("treeNodesChanged");
+			log.info("treeNodesChanged");
 		}
 
 		@Override
 		public void treeNodesInserted(TreeModelEvent tmE) {
-			System.out.println("treeNodesInserted");
+			log.info("treeNodesInserted");
 		}
 
 		@Override
 		public void treeNodesRemoved(TreeModelEvent tmE) {
-			System.out.println("treeNodesRemoved");
+			log.info("treeNodesRemoved");
 		}
 
 		@Override
 		public void treeStructureChanged(TreeModelEvent tmE) {
-			System.out.println("treeStructureChanged");
+			log.info("treeStructureChanged");
 		}
 	
 	}

+ 5 - 1
src/holeg/utility/events/Action.java

@@ -11,7 +11,11 @@ public class Action<T> {
         listeners.add(listener);
     }
 
+    public void removeListener(Consumer<T> listener) {
+    	listeners.remove(listener);
+    }
+    
     public void broadcast(T argument) {
-        listeners.forEach(x -> x.accept(argument));
+    	listeners.forEach(x -> x.accept(argument));
     }
 }

+ 4 - 0
src/holeg/utility/events/Event.java

@@ -11,4 +11,8 @@ public class Event {
     public void broadcast() {
         listeners.forEach(x -> x.run());
     }
+    
+    public void removeListener(Runnable listener) {
+    	listeners.remove(listener);
+    }
 }

+ 31 - 0
src/holeg/utility/listener/WindowClosingListener.java

@@ -0,0 +1,31 @@
+package holeg.utility.listener;
+import java.awt.event.WindowListener;
+import java.awt.event.WindowEvent;
+
+@FunctionalInterface
+public interface WindowClosingListener extends WindowListener {
+	void update(WindowEvent e);
+	@Override
+	default void windowOpened(WindowEvent e) {
+	}
+	@Override
+	default void windowClosing(WindowEvent e) {
+		update(e);
+	}
+	@Override
+	default void windowClosed(WindowEvent e) {
+	}
+	@Override
+	default void windowIconified(WindowEvent e) {
+	}
+	@Override
+	default void windowDeiconified(WindowEvent e) {
+	}
+	@Override
+	default void windowActivated(WindowEvent e) {
+	}
+	@Override
+	default void windowDeactivated(WindowEvent e) {
+	}
+	
+}