Teh-Hai Julian Zheng 7 rokov pred
rodič
commit
8816efe75e

+ 13 - 2
src/ui/controller/Control.java

@@ -109,6 +109,17 @@ public class Control {
 	public AbstractCpsObject searchByID(int id) {
 		return multiPurposeController.searchByID(id);
 	}
+	
+	/**
+	 * Search for Object by ID in upperNode
+	 * 
+	 * @param id
+	 *            the id of the Object
+	 * @return the CpsObject
+	 */
+	public AbstractCpsObject searchByIDUpperNode(int id, CpsUpperNode upperNode) {
+		return multiPurposeController.searchByIDUpperNode(id, upperNode);
+	}
 
 	/**
 	 * Search for Object in a Category.
@@ -736,8 +747,8 @@ public class Control {
 	 * Controlling Nodes of Nodes
 	 */
 
-	public void addUpperNode(String nodeName, CpsUpperNode upperNode) {
-		nodeController.doUpperNode(nodeName, upperNode);
+	public void addUpperNode(String nodeName, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
+		nodeController.doUpperNode(nodeName, upperNode, toGroup);
 	}
 
 	public void delUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {

+ 1 - 1
src/ui/controller/MultiPurposeController.java

@@ -122,7 +122,7 @@ public class MultiPurposeController {
 	 * @param id
 	 * @return
 	 */
-	public AbstractCpsObject searchIDUpperNode(CpsUpperNode upperNode, int id) {
+	public AbstractCpsObject searchByIDUpperNode(int id, CpsUpperNode upperNode) {
 
 		Integer idx;
 

+ 97 - 17
src/ui/controller/NodeController.java

@@ -8,6 +8,7 @@ import classes.AbstractCpsObject;
 import classes.CpsEdge;
 import classes.CpsUpperNode;
 import classes.Position;
+import javafx.collections.ListChangeListener;
 import ui.model.Model;
 import ui.view.UpperNodeCanvas;
 
@@ -30,12 +31,12 @@ public class NodeController {
 	 * @param nodeName
 	 * @param upperNode
 	 */
-	public void doUpperNode(String nodeName, CpsUpperNode upperNode) {
+	public void doUpperNode(String nodeName, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
 
 		CpsUpperNode node = new CpsUpperNode(nodeName);
-		node.setPosition(calculatePos());
-		makeAdjacent(node, upperNode);
-		makeNodeOfNodes(node, upperNode);
+		node.setPosition(calculatePos(toGroup));
+		makeAdjacent(node, upperNode, toGroup);
+		makeNodeOfNodes(node, upperNode, toGroup);
 		backupOldEdges(node, upperNode);
 		if (upperNode == null)
 			cvs.addNewObject(node);
@@ -66,13 +67,13 @@ public class NodeController {
 	 * @param node
 	 * @param upperNode
 	 */
-	private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
+	private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
 
 		ArrayList<AbstractCpsObject> nodes = node.getNodes();
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
 		// Put all selected Nodes into the Upper Node
-		for (Iterator<AbstractCpsObject> it = model.getSelectedCpsObjects().iterator(); it.hasNext();) {
+		for (Iterator<AbstractCpsObject> it = toGroup.iterator(); it.hasNext();) {
 
 			// füge Neue Objecte in Neuen Node hinzu
 			AbstractCpsObject obj = it.next();
@@ -98,7 +99,7 @@ public class NodeController {
 
 		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
 		// Lösche dann die Edges aus der nächst höheren schicht
-		for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
+		for (AbstractCpsObject abs : toGroup) {
 			if (upperNode == null)
 				removeForNodeOfNode(abs, null);
 			else
@@ -117,9 +118,18 @@ public class NodeController {
 	private void unmakeNodesOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
 		// TODO Auto-generated method stub
 		// add all nodes into upperNode
+
+		for (CpsEdge edge : node.getConnections()) {
+			if (edge.getA().equals(node))
+				edge.getB().getConnections().remove(edge);
+			if (edge.getB().equals(node))
+				edge.getA().getConnections().remove(edge);
+		}
+
 		(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).addAll(node.getNodes());
 		// change the indices accordingly the higher layer
-		mpC.adjustIdx(mpC.getHighestIdx((upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx())), node.getNodesIdx());
+		mpC.adjustIdx(mpC.getHighestIdx((upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx())),
+				node.getNodesIdx());
 		// add all indices of nodes into upperNode
 		(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).putAll(node.getNodesIdx());
 		// add all Edges of node into upperNode
@@ -133,7 +143,7 @@ public class NodeController {
 	 * @param node
 	 * @param upperNode
 	 */
-	private void makeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
+	private void makeAdjacent(CpsUpperNode node, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
 
 		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
 		ArrayList<Float> maxCapacity = new ArrayList<>();
@@ -148,8 +158,8 @@ public class NodeController {
 			CpsEdge edge = it.next();
 
 			// wenn ausgewählte Objekte in edge und andere auserhalb
-			if (model.getSelectedCpsObjects().contains(edge.getA())
-					&& !model.getSelectedCpsObjects().contains(edge.getB())) {
+			if (toGroup.contains(edge.getA())
+					&& !toGroup.contains(edge.getB())) {
 				// und wenn in der adj noch nicht vorhanden und füg
 				if (!adj.contains(edge.getB())) {
 					adj.add(edge.getB());
@@ -166,8 +176,8 @@ public class NodeController {
 			}
 
 			// Analog
-			else if (!model.getSelectedCpsObjects().contains(edge.getA())
-					&& model.getSelectedCpsObjects().contains(edge.getB())) {
+			else if (!toGroup.contains(edge.getA())
+					&& toGroup.contains(edge.getB())) {
 				if (!adj.contains(edge.getA())) {
 					adj.add(edge.getA());
 					maxCapacity.add(edge.getCapacity());
@@ -204,6 +214,9 @@ public class NodeController {
 	private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
 		// TODO Auto-generated method stub
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
+		ArrayList<CpsEdge> lostEdges = new ArrayList<>();
+		ArrayList<AbstractCpsObject> found = (upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes());
+		ArrayList<AbstractCpsObject> lostChildren = new ArrayList<>();
 
 		// für jede Edge aus upperNode die Node enthält tu sie in toDelete
 		for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
@@ -214,6 +227,49 @@ public class NodeController {
 				toDelete.add(edge);
 
 		}
+		// mark all object that arent in the restored oldEdges
+		for (CpsEdge edge : node.getOldEdges()) {
+			if (node.getNodes().contains(edge.getA()) && !found.contains(edge.getB()) && !lostEdges.contains(edge)) {
+				lostChildren.add(edge.getA());
+				lostEdges.add(edge);
+				// edge.getB().getConnections().remove(edge);
+			}
+
+			else if (node.getNodes().contains(edge.getB()) && !found.contains(edge.getA())
+					&& !lostEdges.contains(edge)) {
+				lostChildren.add(edge.getB());
+				lostEdges.add(edge);
+				// edge.getA().getConnections().remove(edge);
+			}
+		}
+		node.getOldEdges().removeAll(lostEdges);
+
+		// LOST = DIE IN NODE SIND, TOSEARCH = IHRE PARTNER DIE IN ANDEREN NODES
+		// SIND
+
+		for (CpsEdge edge : lostEdges) {
+			AbstractCpsObject toSearch = null;
+			AbstractCpsObject lost = null;
+
+			if (lostChildren.contains(edge.getA())) {
+				toSearch = edge.getB();
+				lost = edge.getA();
+			} else if (lostChildren.contains(edge.getB())) {
+				toSearch = edge.getA();
+				lost = edge.getB();
+			}
+
+			for (AbstractCpsObject cps : found) {
+				if (!cps.equals(node) && !lostChildren.contains(cps))
+					if (backtrackLostChild(cps, toSearch, lost)) {
+						CpsEdge temp = new CpsEdge(cps, lost, edge.getCapacity());
+
+						node.getOldEdges().add(temp);
+					}
+			}
+
+		}
+
 		// lösch alle Edges die in toDelete sind und wiederherstell alte Edges
 		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
 		(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
@@ -310,17 +366,17 @@ public class NodeController {
 	 * 
 	 * @return
 	 */
-	private Position calculatePos() {
+	private Position calculatePos(ArrayList<AbstractCpsObject> toGroup) {
 
 		Position pos = new Position(0, 0);
 
 		// sum(x0 .. xn) / numOfPos, y analog
-		for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
+		for (AbstractCpsObject abs : toGroup) {
 			pos.x += abs.getPosition().x;
 			pos.y += abs.getPosition().y;
 		}
-		pos.x /= model.getSelectedCpsObjects().size();
-		pos.y /= model.getSelectedCpsObjects().size();
+		pos.x /= toGroup.size();
+		pos.y /= toGroup.size();
 
 		return pos;
 	}
@@ -332,6 +388,30 @@ public class NodeController {
 		(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
 	}
 
+	/**
+	 * Search Lost Nodes by Backtracking
+	 * 
+	 * @param lost
+	 * @param object
+	 * @return
+	 */
+	private boolean backtrackLostChild(AbstractCpsObject object, AbstractCpsObject find, AbstractCpsObject lost) {
+		if (!(object instanceof CpsUpperNode)) {
+			for (CpsEdge edge : object.getConnections()) {
+				if (edge.getA().equals(find) && edge.getB().equals(lost)
+						|| edge.getA().equals(lost) && edge.getB().equals(find))
+					return true;
+			}
+			return false;
+		} else {
+			for (AbstractCpsObject cps : ((CpsUpperNode) object).getNodes()) {
+				if (backtrackLostChild(cps, find, lost))
+					return true;
+			}
+			return false;
+		}
+	}
+
 	/**
 	 * Add a Object into a CpsUpperNode
 	 * 

+ 14 - 0
src/ui/controller/UpdateController.java

@@ -14,6 +14,7 @@ import ui.view.DefaulTable;
 import ui.view.Languages;
 import ui.view.PropertyTable;
 import ui.view.UnitGraph;
+import ui.view.UpperNodeCanvas;
 import ui.model.*;
 import ui.controller.*;
 
@@ -205,6 +206,19 @@ public class UpdateController {
 		AbstractCpsObject tempCps = controller.searchByID(tempID);
 		return tempCps;
 	}
+	
+	/**
+	 * Getter for selected CpsObject.
+	 * 
+	 * @return selected CpsObject
+	 */
+	public AbstractCpsObject getActualCpsUpperNode(UpperNodeCanvas canvas) {
+		int tempID = model.getSelectedObjectID();
+		AbstractCpsObject tempCps = controller.searchByIDUpperNode(tempID, canvas.upperNode);
+		return tempCps;
+	}
+	
+	
 
 	public void paintProperties(AbstractCpsObject obj) {
 		if (obj != null) {