浏览代码

Group und Ungroup finished implementier.. vorerst bis die nächsten Bugs gefunden sind xDD

Teh-Hai Julian Zheng 8 年之前
父节点
当前提交
82e6b315b1
共有 1 个文件被更改,包括 162 次插入70 次删除
  1. 162 70
      src/ui/controller/NodeController.java

+ 162 - 70
src/ui/controller/NodeController.java

@@ -35,11 +35,12 @@ public class NodeController {
 		node.setPosition(calculatePos());
 		makeAdjacent(node, upperNode);
 		makeNodeOfNodes(node, upperNode);
+		backupEdges(node, upperNode);
 		if (upperNode == null)
 			cvs.addNewObject(node);
 		else
 			addObjectInUpperNode(node, upperNode);
-		
+
 	}
 
 	/**
@@ -48,7 +49,7 @@ public class NodeController {
 	 * @param node
 	 */
 	public void undoUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
-
+		restoreEdges(node, upperNode);
 		unmakeNodesOfNodes(node, upperNode);
 		unmakeAdjacent(node, upperNode);
 		if (upperNode == null)
@@ -57,66 +58,6 @@ public class NodeController {
 			deleteObjectInUpperNode(node, upperNode);
 	}
 
-	/**
-	 * 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 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);
-	}
-
 	/**
 	 * Put selected Nodes inside the Upper Node
 	 * 
@@ -125,7 +66,7 @@ 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();) {
@@ -160,6 +101,13 @@ 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
@@ -226,13 +174,11 @@ 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());
-	}
-
+	/**
+	 * 
+	 * @param node
+	 * @param upperNode
+	 */
 	private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
 		// TODO Auto-generated method stub
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
@@ -249,6 +195,92 @@ public class NodeController {
 		(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 backupEdges(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 restoreEdges(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
 	 * 
@@ -269,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 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);
+	}
+
 }