|
@@ -8,6 +8,7 @@ import classes.AbstractCpsObject;
|
|
import classes.CpsEdge;
|
|
import classes.CpsEdge;
|
|
import classes.CpsUpperNode;
|
|
import classes.CpsUpperNode;
|
|
import classes.Position;
|
|
import classes.Position;
|
|
|
|
+import javafx.collections.ListChangeListener;
|
|
import ui.model.Model;
|
|
import ui.model.Model;
|
|
import ui.view.UpperNodeCanvas;
|
|
import ui.view.UpperNodeCanvas;
|
|
|
|
|
|
@@ -30,12 +31,12 @@ public class NodeController {
|
|
* @param nodeName
|
|
* @param nodeName
|
|
* @param upperNode
|
|
* @param upperNode
|
|
*/
|
|
*/
|
|
- public void doUpperNode(String nodeName, CpsUpperNode upperNode) {
|
|
|
|
|
|
+ public void doUpperNode(String nodeName, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
|
|
|
|
|
|
CpsUpperNode node = new CpsUpperNode(nodeName);
|
|
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);
|
|
backupOldEdges(node, upperNode);
|
|
if (upperNode == null)
|
|
if (upperNode == null)
|
|
cvs.addNewObject(node);
|
|
cvs.addNewObject(node);
|
|
@@ -66,13 +67,13 @@ public class NodeController {
|
|
* @param node
|
|
* @param node
|
|
* @param upperNode
|
|
* @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<AbstractCpsObject> nodes = node.getNodes();
|
|
ArrayList<CpsEdge> toDelete = new ArrayList<>();
|
|
ArrayList<CpsEdge> toDelete = new ArrayList<>();
|
|
|
|
|
|
// Put all selected Nodes into the Upper Node
|
|
// 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
|
|
// füge Neue Objecte in Neuen Node hinzu
|
|
AbstractCpsObject obj = it.next();
|
|
AbstractCpsObject obj = it.next();
|
|
@@ -98,7 +99,7 @@ public class NodeController {
|
|
|
|
|
|
(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
|
|
(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
|
|
// Lösche dann die Edges aus der nächst höheren schicht
|
|
// Lösche dann die Edges aus der nächst höheren schicht
|
|
- for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
|
|
|
|
|
|
+ for (AbstractCpsObject abs : toGroup) {
|
|
if (upperNode == null)
|
|
if (upperNode == null)
|
|
removeForNodeOfNode(abs, null);
|
|
removeForNodeOfNode(abs, null);
|
|
else
|
|
else
|
|
@@ -117,9 +118,18 @@ public class NodeController {
|
|
private void unmakeNodesOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
|
|
private void unmakeNodesOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
|
|
// TODO Auto-generated method stub
|
|
// TODO Auto-generated method stub
|
|
// add all nodes into upperNode
|
|
// 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());
|
|
(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).addAll(node.getNodes());
|
|
// change the indices accordingly the higher layer
|
|
// 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
|
|
// add all indices of nodes into upperNode
|
|
(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).putAll(node.getNodesIdx());
|
|
(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).putAll(node.getNodesIdx());
|
|
// add all Edges of node into upperNode
|
|
// add all Edges of node into upperNode
|
|
@@ -133,7 +143,7 @@ public class NodeController {
|
|
* @param node
|
|
* @param node
|
|
* @param upperNode
|
|
* @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<AbstractCpsObject> adj = new ArrayList<>();
|
|
ArrayList<Float> maxCapacity = new ArrayList<>();
|
|
ArrayList<Float> maxCapacity = new ArrayList<>();
|
|
@@ -148,8 +158,8 @@ public class NodeController {
|
|
CpsEdge edge = it.next();
|
|
CpsEdge edge = it.next();
|
|
|
|
|
|
// wenn ausgewählte Objekte in edge und andere auserhalb
|
|
// 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
|
|
// und wenn in der adj noch nicht vorhanden und füg
|
|
if (!adj.contains(edge.getB())) {
|
|
if (!adj.contains(edge.getB())) {
|
|
adj.add(edge.getB());
|
|
adj.add(edge.getB());
|
|
@@ -166,8 +176,8 @@ public class NodeController {
|
|
}
|
|
}
|
|
|
|
|
|
// Analog
|
|
// 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())) {
|
|
if (!adj.contains(edge.getA())) {
|
|
adj.add(edge.getA());
|
|
adj.add(edge.getA());
|
|
maxCapacity.add(edge.getCapacity());
|
|
maxCapacity.add(edge.getCapacity());
|
|
@@ -204,6 +214,9 @@ public class NodeController {
|
|
private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
|
|
private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
|
|
// TODO Auto-generated method stub
|
|
// TODO Auto-generated method stub
|
|
ArrayList<CpsEdge> toDelete = new ArrayList<>();
|
|
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
|
|
// für jede Edge aus upperNode die Node enthält tu sie in toDelete
|
|
for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
|
|
for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
|
|
@@ -214,6 +227,49 @@ public class NodeController {
|
|
toDelete.add(edge);
|
|
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
|
|
// 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()).removeAll(toDelete);
|
|
(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
|
|
(upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
|
|
@@ -310,17 +366,17 @@ public class NodeController {
|
|
*
|
|
*
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private Position calculatePos() {
|
|
|
|
|
|
+ private Position calculatePos(ArrayList<AbstractCpsObject> toGroup) {
|
|
|
|
|
|
Position pos = new Position(0, 0);
|
|
Position pos = new Position(0, 0);
|
|
|
|
|
|
// sum(x0 .. xn) / numOfPos, y analog
|
|
// sum(x0 .. xn) / numOfPos, y analog
|
|
- for (AbstractCpsObject abs : model.getSelectedCpsObjects()) {
|
|
|
|
|
|
+ for (AbstractCpsObject abs : toGroup) {
|
|
pos.x += abs.getPosition().x;
|
|
pos.x += abs.getPosition().x;
|
|
pos.y += abs.getPosition().y;
|
|
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;
|
|
return pos;
|
|
}
|
|
}
|
|
@@ -332,6 +388,30 @@ public class NodeController {
|
|
(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
|
|
(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
|
|
* Add a Object into a CpsUpperNode
|
|
*
|
|
*
|