Browse Source

Merge branch 'master' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons

Edgardo Palza 7 years ago
parent
commit
ca014c86e7

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

@@ -733,7 +733,11 @@ public class Control {
 	 */
 
 	public void addUpperNode(String nodeName, CpsUpperNode upperNode) {
-		nodeController.addNode(nodeName, upperNode);
+		nodeController.doUpperNode(nodeName, upperNode);
+	}
+	
+	public void delUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
+		nodeController.undoUpperNode(node, upperNode);
 	}
 	
 	public void addObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
@@ -745,10 +749,10 @@ public class Control {
 	}
 	
 	public void addEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
-		nodeController.addEdgeInUpperNode(edge, upperNode);
+		nodeController.addEdge(edge, upperNode);
 	}
 	
 	public void delEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
-		nodeController.deleteEdgeInUpperNode(edge, upperNode);
+		nodeController.deleteEdge(edge, upperNode);
 	}
 }

+ 197 - 69
src/ui/controller/NodeController.java

@@ -29,11 +29,13 @@ public class NodeController {
 	 * 
 	 * @param nodeName
 	 */
-	public void addNode(String nodeName, CpsUpperNode upperNode) {
+	public void doUpperNode(String nodeName, CpsUpperNode upperNode) {
+
 		CpsUpperNode node = new CpsUpperNode(nodeName);
 		node.setPosition(calculatePos());
-		connectAdjacent(node, upperNode);
+		makeAdjacent(node, upperNode);
 		makeNodeOfNodes(node, upperNode);
+		backupOldEdges(node, upperNode);
 		if (upperNode == null)
 			cvs.addNewObject(node);
 		else
@@ -41,73 +43,19 @@ public class NodeController {
 
 	}
 
-	/**
-	 * Add a Object into a CpsUpperNode
-	 * 
-	 * @param object
-	 * @param upperNode
-	 */
-	public void addObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
-		object.setSav("UPPER" + upperNode.getID());
-		upperNode.getNodesIdx().put(object.getID(), upperNode.getNodes().size());
-		upperNode.getNodes().add(object);
-	}
-
 	/**
 	 * Delete a CpsUpperNode from the Canvas
 	 * 
 	 * @param node
 	 */
-	public void deleteNode(CpsUpperNode node) {
-
-	}
-
-	/**
-	 * Delete a AbstactCpsObject from CPSUpperNode
-	 * 
-	 * @param object
-	 * @param upperNode
-	 */
-	public void deleteObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
-		CpsEdge e = null;
-		for (AbstractCpsObject cps : upperNode.getNodes()) {
-			for (CpsEdge p : cps.getConnections()) {
-				if (p.getA() == object || p.getB() == object) {
-					e = p;
-				}
-			}
-			if (!model.getClipboradObjects().contains(cps)) {
-				cps.getConnectedTo().remove(e);
-			}
-			upperNode.getNodeEdges().remove(e);
-		}
-		mpC.decIdx(object.getID(), upperNode.getNodesIdx());
-		upperNode.getNodesIdx().remove(object.getID());
-		upperNode.getNodes().remove(object);
-	}
-
-	/**
-	 * Add Edge in UpperNode
-	 * 
-	 * @param edge
-	 * @param upperNode
-	 */
-	public void addEdgeInUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
-		edge.getA().getConnections().add(edge);
-		edge.getB().getConnections().add(edge);
-		upperNode.getNodeEdges().add(edge);
-	}
-
-	/**
-	 * Delete Edge in UpperNode
-	 * 
-	 * @param edge
-	 * @param upperNode
-	 */
-	public void deleteEdgeInUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
-		edge.getA().getConnections().remove(edge);
-		edge.getB().getConnections().remove(edge);
-		upperNode.getNodeEdges().remove(edge);
+	public void undoUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
+		restoreOldEdges(node, upperNode);
+		unmakeNodesOfNodes(node, upperNode);
+		unmakeAdjacent(node, upperNode);
+		if (upperNode == null)
+			cvs.deleteObjectOnCanvas(node);
+		else
+			deleteObjectInUpperNode(node, upperNode);
 	}
 
 	/**
@@ -118,13 +66,16 @@ public class NodeController {
 	private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
 
 		ArrayList<AbstractCpsObject> nodes = node.getNodes();
-		ArrayList<CpsEdge> nodeEdges = node.getNodeEdges();
+		//ArrayList<CpsEdge> nodeEdges = node.getNodeEdges();
 
 		// Put all selected Nodes into the Upper Node
 		for (Iterator<AbstractCpsObject> it = model.getSelectedCpsObjects().iterator(); it.hasNext();) {
 
 			// füge Neue Objecte in Neuen Node hinzu
 			AbstractCpsObject obj = it.next();
+			// POSITION MUSS NEU GEMACHT WERDEN FÜR OBJECTS IN NODE OF NODE
+			// obj.setPosition((obj.getPosition().x + node.getPosition().x) / 2,
+			// (obj.getPosition().y + node.getPosition().y) / 2);
 			addObjectInUpperNode(obj, node);
 		}
 
@@ -133,8 +84,10 @@ public class NodeController {
 				.iterator(); it.hasNext();) {
 
 			CpsEdge edge = it.next();
+
+			// kopiere edge in UpperNode
 			if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) {
-				addEdgeInUpperNode(edge, node);
+				addEdge(edge, node);
 			}
 
 		}
@@ -148,11 +101,18 @@ public class NodeController {
 
 	}
 
+	private void unmakeNodesOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
+		// TODO Auto-generated method stub
+		(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).addAll(node.getNodes());
+		(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).putAll(node.getNodesIdx());
+		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getNodeEdges());
+	}
+
 	/**
 	 * 
 	 * @return
 	 */
-	private void connectAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
+	private void makeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
 
 		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
 		ArrayList<Float> maxCapacity = new ArrayList<>();
@@ -161,7 +121,8 @@ public class NodeController {
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
 		// für alle Edges auf dem Canvas
-		for (Iterator<CpsEdge> it = model.getEdgesOnCanvas().iterator(); it.hasNext();) {
+		for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
+				.iterator(); it.hasNext();) {
 
 			CpsEdge edge = it.next();
 
@@ -198,7 +159,7 @@ public class NodeController {
 			}
 		}
 
-		model.getEdgesOnCanvas().removeAll(toDelete);
+		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
 
 		// für alle objekte in adjazenzliste mach
 		for (AbstractCpsObject cps : adj) {
@@ -213,6 +174,113 @@ public class NodeController {
 		}
 	}
 
+	/**
+	 * 
+	 * @param node
+	 * @param upperNode
+	 */
+	private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
+		// TODO Auto-generated method stub
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
+
+		for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
+				.iterator(); it.hasNext();) {
+
+			CpsEdge edge = it.next();
+			if (edge.getA().equals(node) || edge.getB().equals(node))
+				toDelete.add(edge);
+
+		}
+		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
+		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
+	}
+
+	/**
+	 * Backups Old Edges into next lower layer in Current UpperNode anymore
+	 * 
+	 * @param node
+	 * @param upperNode
+	 */
+	private void backupOldEdges(CpsUpperNode node, CpsUpperNode upperNode) {
+
+		ArrayList<CpsEdge> backup = new ArrayList<>();
+		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
+		ArrayList<Float> maxCapacity = new ArrayList<>();
+
+		// wenn upperNode in UpperNode erzeugt wird
+		if (upperNode != null) {
+			// für alle oldEdges die die zu gruppierenden nodes enthält werden
+			// in die neuen upperNOde verschoben
+			for (CpsEdge edge : upperNode.getOldEdges()) {
+				if (!upperNode.getNodes().contains(edge.getA()) && !upperNode.getNodes().contains(edge.getB()))
+					backup.add(edge);
+			}
+			// hier wird verschoben
+			node.getOldEdges().addAll(backup);
+
+			// neue adjazent muss hergestellt werden in den alten oldEdges
+			for (CpsEdge edge : upperNode.getOldEdges()) {
+
+				if (node.getNodes().contains(edge.getA()))
+					if (!adj.contains(edge.getB())) {
+						adj.add(edge.getB());
+						maxCapacity.add(edge.getCapacity());
+					} else if (maxCapacity.get(adj.indexOf(edge.getB())) < edge.getCapacity()) {
+						maxCapacity.set(adj.indexOf(edge.getB()), edge.getCapacity());
+
+					}
+				if (node.getNodes().contains(edge.getB()))
+					if (!adj.contains(edge.getA())) {
+						adj.add(edge.getA());
+						maxCapacity.add(edge.getCapacity());
+					} else if (maxCapacity.get(adj.indexOf(edge.getA())) < edge.getCapacity()) {
+						maxCapacity.set(adj.indexOf(edge.getA()), edge.getCapacity());
+
+					}
+			}
+			// alle übertragenen Edges werden gelöscht
+			upperNode.getOldEdges().removeAll(backup);
+			// neue edges werden erzeugt
+			for (AbstractCpsObject cps : adj)
+				upperNode.getOldEdges().add(new CpsEdge(cps, node, maxCapacity.get(adj.indexOf(cps))));
+
+		}
+	}
+
+	/**
+	 * Restore Old Edges into next higher layer of UpperNode
+	 * 
+	 * @param node
+	 * @param upperNode
+	 */
+	private void restoreOldEdges(CpsUpperNode node, CpsUpperNode upperNode) {
+
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
+
+		if (upperNode != null) {
+			for (CpsEdge edge : node.getOldEdges()) {
+				// wenn upperNode weder A oder B von von den OldEdges enthält
+				if (!upperNode.getNodes().contains(edge.getA()) && !upperNode.getNodes().contains(edge.getB()))
+					// Übertrage die OldEdges eine Schicht höher
+					toDelete.add(edge);
+			}
+			// übertrage sie hier
+			upperNode.getOldEdges().addAll(toDelete);
+			// lösch sie aus den zu löschenden node, da sonst durch unmake
+			// Adjacent probleme auftauchen
+			node.getOldEdges().removeAll(toDelete);
+			toDelete.clear();
+			// lösche alle OldEdges aus der höheren schicht die zu den zu
+			// löschenden Node vorher führten
+			for (CpsEdge edge : upperNode.getOldEdges()) {
+				if (edge.getA().equals(node) || edge.getB().equals(node))
+					toDelete.add(edge);
+			}
+			upperNode.getOldEdges().removeAll(toDelete);
+		}
+
+	}
+
 	/**
 	 * Calculate new Position of the Upper Node
 	 * 
@@ -233,4 +301,64 @@ public class NodeController {
 		return pos;
 	}
 
+	/**
+	 * Add a Object into a CpsUpperNode
+	 * 
+	 * @param object
+	 * @param upperNode
+	 */
+	public void addObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
+		object.setSav("UPPER" + upperNode.getID());
+		upperNode.getNodesIdx().put(object.getID(), upperNode.getNodes().size());
+		upperNode.getNodes().add(object);
+	}
+
+	/**
+	 * Delete a AbstactCpsObject from CPSUpperNode
+	 * 
+	 * @param object
+	 * @param upperNode
+	 */
+	public void deleteObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
+		CpsEdge e = null;
+		for (AbstractCpsObject cps : upperNode.getNodes()) {
+			for (CpsEdge p : cps.getConnections()) {
+				if (p.getA() == object || p.getB() == object) {
+					e = p;
+				}
+			}
+			if (!model.getClipboradObjects().contains(cps)) {
+				cps.getConnectedTo().remove(e);
+			}
+			upperNode.getNodeEdges().remove(e);
+		}
+		mpC.decIdx(object.getID(), upperNode.getNodesIdx());
+		upperNode.getNodesIdx().remove(object.getID());
+		upperNode.getNodes().remove(object);
+	}
+
+	/**
+	 * Add Edge in UpperNode
+	 * 
+	 * @param edge
+	 * @param upperNode
+	 */
+	public void addEdge(CpsEdge edge, CpsUpperNode upperNode) {
+		edge.getA().getConnections().add(edge);
+		edge.getB().getConnections().add(edge);
+		upperNode.getNodeEdges().add(edge);
+	}
+
+	/**
+	 * Delete Edge in UpperNode
+	 * 
+	 * @param edge
+	 * @param upperNode
+	 */
+	public void deleteEdge(CpsEdge edge, CpsUpperNode upperNode) {
+		edge.getA().getConnections().remove(edge);
+		edge.getB().getConnections().remove(edge);
+		upperNode.getNodeEdges().remove(edge);
+	}
+
 }

+ 24 - 6
src/ui/view/MyCanvas.java

@@ -73,7 +73,8 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 	private JMenuItem itemCut = new JMenuItem("Cut");
 	private JMenuItem itemCopy = new JMenuItem("Copy");
 	public JMenuItem itemPaste = new JMenuItem("Paste");
-	public JMenuItem itemCollapse = new JMenuItem("Colapse Nodes");
+	public JMenuItem itemGroup = new JMenuItem("Group");
+	public JMenuItem itemUngroup = new JMenuItem("Ungroup");
 	public JMenuItem itemTrack = new JMenuItem("Track");
 	public JMenuItem itemUntrack = new JMenuItem("Untrack");
 	private JToolTip objectTT = new JToolTip();
@@ -108,7 +109,8 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		popmenu.add(itemPaste);
 		popmenu.add(itemDelete);
 		popmenu.addSeparator();
-		popmenu.add(itemCollapse);
+		popmenu.add(itemGroup);
+		popmenu.add(itemUngroup);
 		popmenu.add(itemTrack);
 		popmenu.add(itemUntrack);
 
@@ -116,11 +118,12 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		itemCut.setEnabled(false);
 		itemCopy.setEnabled(false);
 		itemPaste.setEnabled(false);
-		itemCollapse.setEnabled(false);
+		itemGroup.setEnabled(false);
+		itemUngroup.setEnabled(false);
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
 
-		itemCollapse.addActionListener(new ActionListener() {
+		itemGroup.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				controller.addUpperNode("NodeOfNode", null);
@@ -128,6 +131,14 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 			}
 		});
 
+		itemUngroup.addActionListener(new ActionListener() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				controller.delUpperNode((CpsUpperNode) tempCps, null);
+				repaint();
+			}
+		});
+
 		itemTrack.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
@@ -517,7 +528,13 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				itemDelete.setEnabled(true);
 				itemCut.setEnabled(true);
 				itemCopy.setEnabled(true);
-				itemCollapse.setEnabled(true);
+				if (tempCps != null)
+					itemGroup.setEnabled(true);
+				if (tempCps instanceof CpsUpperNode)
+					itemUngroup.setEnabled(true);
+				else
+					itemUngroup.setEnabled(false);
+
 				if (!(tempCps instanceof HolonSwitch)) {
 					itemTrack.setEnabled(true);
 					itemUntrack.setEnabled(true);
@@ -532,7 +549,8 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				itemCut.setEnabled(false);
 				itemCopy.setEnabled(false);
 				itemDelete.setEnabled(false);
-				itemCollapse.setEnabled(false);
+				itemGroup.setEnabled(false);
+				itemUngroup.setEnabled(false);
 				itemTrack.setEnabled(false);
 				itemUntrack.setEnabled(false);
 			}

+ 23 - 6
src/ui/view/UpperNodeCanvas.java

@@ -82,7 +82,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	private JMenuItem itemCut = new JMenuItem("Cut");
 	private JMenuItem itemCopy = new JMenuItem("Copy");
 	public JMenuItem itemPaste = new JMenuItem("Paste");
-	public JMenuItem itemCollapse = new JMenuItem("Colapse Nodes");
+	public JMenuItem itemGroup = new JMenuItem("Group");
+	public JMenuItem itemUngroup = new JMenuItem("Ungroup");
 	public JMenuItem itemTrack = new JMenuItem("Track");
 	public JMenuItem itemUntrack = new JMenuItem("Untrack");
 	private JToolTip objectTT = new JToolTip();
@@ -120,7 +121,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		popmenu.add(itemPaste);
 		popmenu.add(itemDelete);
 		popmenu.addSeparator();
-		popmenu.add(itemCollapse);
+		popmenu.add(itemGroup);
+		popmenu.add(itemUngroup);
 		popmenu.add(itemTrack);
 		popmenu.add(itemUntrack);
 
@@ -128,17 +130,26 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		itemCut.setEnabled(false);
 		itemCopy.setEnabled(false);
 		itemPaste.setEnabled(false);
-		itemCollapse.setEnabled(false);
+		itemGroup.setEnabled(false);
+		itemUngroup.setEnabled(false);
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
 
-		itemCollapse.addActionListener(new ActionListener() {
+		itemGroup.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
 				controller.addUpperNode("NodeOfNode", UpperNode);
 				repaint();
 			}
 		});
+		
+		itemUngroup.addActionListener(new ActionListener() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				controller.delUpperNode((CpsUpperNode) tempCps, UpperNode);
+				repaint();
+			}
+		});
 
 		itemTrack.addActionListener(new ActionListener() {
 			@Override
@@ -531,7 +542,12 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				itemDelete.setEnabled(true);
 				itemCut.setEnabled(true);
 				itemCopy.setEnabled(true);
-				itemCollapse.setEnabled(true);
+				if (tempCps != null)
+					itemGroup.setEnabled(true);
+				if (tempCps instanceof CpsUpperNode)
+					itemUngroup.setEnabled(true);
+				else
+					itemUngroup.setEnabled(false);
 				if (!(tempCps instanceof HolonSwitch)) {
 					itemTrack.setEnabled(true);
 					itemUntrack.setEnabled(true);
@@ -546,7 +562,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				itemCut.setEnabled(false);
 				itemCopy.setEnabled(false);
 				itemDelete.setEnabled(false);
-				itemCollapse.setEnabled(false);
+				itemGroup.setEnabled(false);
+				itemUngroup.setEnabled(false);
 				itemTrack.setEnabled(false);
 				itemUntrack.setEnabled(false);
 			}