package ui.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import classes.AbstractCpsObject; import classes.CpsEdge; import classes.CpsUpperNode; import classes.Position; import ui.model.Model; public class NodeController { public enum MODE { CANVAS, UPPERNODECANVAS } private Model model; private CanvasController cvs; private MultiPurposeController mpC; public NodeController(Model model, CanvasController cvs, MultiPurposeController mpC) { // TODO Auto-generated constructor stub this.model = model; this.cvs = cvs; this.mpC = mpC; } /** * Add a CpsUpperNode into Canvas * * @param nodeName */ public void addNode(String nodeName, MODE mode) { CpsUpperNode node = new CpsUpperNode(nodeName); node.setPosition(calculatePos()); connectAdjacent(node, mode); makeNodeOfNodes(node, mode); cvs.addNewObject(node); } public void addObjectInUpperNode(AbstractCpsObject object) { } /** * Delete a CpsUpperNode from the Canvas * * @param node */ public void deleteNode(CpsUpperNode node) { } /** * Put selected Nodes inside the Upper Node * @param node */ private void makeNodeOfNodes(CpsUpperNode node, MODE mode) { ArrayList nodes = node.getNodes(); ArrayList nodeEdges = node.getNodeEdges(); HashMap nodeIdx = node.getNodesIdx(); //Put all selected Nodes into the Upper Node for (Iterator it = model.getSelectedCpsObjects().iterator(); it.hasNext();) { AbstractCpsObject obj = it.next(); nodeIdx.put(obj.getID(), nodes.size()); nodes.add(obj); } //remove selected nodes for (Iterator it = model.getEdgesOnCanvas().iterator(); it.hasNext();) { CpsEdge edge = it.next(); if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) { nodeEdges.add(edge); } } for (AbstractCpsObject abs : model.getSelectedCpsObjects()) { cvs.deleteObjectOnCanvas(abs); } } /** * * @return */ private void connectAdjacent(CpsUpperNode node, MODE mode) { ArrayList adj = new ArrayList<>(); ArrayList maxCapacity = new ArrayList<>(); ArrayList oldEdges = node.getOldEdges(); ArrayList toDelete = new ArrayList<>(); // float maxCapacity = 0; // für alle Edges auf dem Canvas for (Iterator it = model.getEdgesOnCanvas().iterator(); it.hasNext();) { CpsEdge edge = it.next(); // if (edge.getCapacity() > maxCapacity) // maxCapacity = edge.getCapacity(); // wenn ausgewählte Objekte in edge und andere auserhalb if (model.getSelectedCpsObjects().contains(edge.getA()) && !model.getSelectedCpsObjects().contains(edge.getB())) { // und wenn in der adj noch nicht vorhanden und füg if (!adj.contains(edge.getB())) { adj.add(edge.getB()); maxCapacity.add(edge.getCapacity()); } // wenn vorhanden teste maxCapacity else if (maxCapacity.get(adj.indexOf(edge.getB())) < edge.getCapacity()) { maxCapacity.set(adj.indexOf(edge.getB()), edge.getCapacity()); } // speichere alte edge oldEdges.add(edge); toDelete.add(edge); } // Analog else if (!model.getSelectedCpsObjects().contains(edge.getA()) && model.getSelectedCpsObjects().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()); } oldEdges.add(edge); toDelete.add(edge); } } model.getEdgesOnCanvas().removeAll(toDelete); // für alle objekte in adjazenzliste mach for (AbstractCpsObject cps : adj) { CpsEdge newEdge = new CpsEdge(cps, node, maxCapacity.get(adj.indexOf(cps))); // !! Eventuell noch bei getConnections() hinzufügem cvs.addEdgeOnCanvas(newEdge); node.getConnections().add(newEdge); } } /** * Calculate new Position of the Upper Node * @return */ private Position calculatePos() { Position pos = new Position(0, 0); // sum(x0 .. xn) / numOfPos, y analog for (AbstractCpsObject abs : model.getSelectedCpsObjects()) { pos.x += abs.getPosition().x; pos.y += abs.getPosition().y; } pos.x /= model.getSelectedCpsObjects().size(); pos.y /= model.getSelectedCpsObjects().size(); return pos; } }