package ui.controller; import java.awt.Point; import java.util.ArrayList; import Interfaces.CategoryListener; import Interfaces.ObjectListener; import classes.CpsEdge; import classes.CpsNode; import classes.AbstractCpsObject; import classes.HolonObject; import classes.HolonSwitch; import classes.Position; import ui.model.Model; public class CanvasController { private Model MODEL; private MultiPurposeController mpC; public CanvasController(Model model, MultiPurposeController mp) { this.MODEL = model; this.mpC = mp; } /** * Add an CpsObject to the model and notify the ObjectListener for update. * * @param object * CpsObject to be added. */ public void addObject(AbstractCpsObject object) { MODEL.getCvsObjIdx().put(object.getID(), MODEL.getObjectsOnCanvas().size()); MODEL.getObjectsOnCanvas().add(object); notifyObjListeners(); } /** * * @param object */ public void addNewObject(AbstractCpsObject object) { object.setSav("CVS"); object.setConnections(new ArrayList()); addObject(object); } public void addObjectListener(ObjectListener objLis) { MODEL.getObjectListeners().add(objLis); } /** * notifies all listeners about changes in the Canvas */ public void notifyObjListeners() { for (ObjectListener l : MODEL.getObjectListeners()) { l.onChange(MODEL.getObjectsOnCanvas()); } } /** * Deletes an CpsObject on the Canvas and its connections * * @param AbstractCpsObject */ public void deleteObjectOnCanvas(AbstractCpsObject obj) { CpsEdge e = null; for (AbstractCpsObject cps : MODEL.getObjectsOnCanvas()) { for (CpsEdge p : cps.getConnections()) { if (p.getA() == obj || p.getB() == obj) { e = p; } } if (!MODEL.getClipboradObjects().contains(cps)) { cps.getConnectedTo().remove(e); } MODEL.getEdgesOnCanvas().remove(e); } mpC.decIdx(obj.getID(), MODEL.getCvsObjIdx()); MODEL.getCvsObjIdx().remove(obj.getID()); MODEL.getObjectsOnCanvas().remove(obj); } /** * @param objectsOnCanvas * the objectsOnCanvas to set */ public void addEdgeOnCanvas(CpsEdge edge) { MODEL.getEdgesOnCanvas().add(edge); } /** * @param edgesOnCanvas * the edge to remove */ public void removeEdgesOnCanvas(CpsEdge edge) { edge.getA().getConnections().remove(edge); edge.getB().getConnections().remove(edge); MODEL.getEdgesOnCanvas().remove(edge); } /** * Copy all Selected Objects */ @SuppressWarnings("unchecked") public void copyObjects() { MODEL.setClipboradObjects((ArrayList) MODEL.getSelectedCpsObjects().clone()); } /** * Paste all Selected Objects * * @param Point * the mouse Position */ public void pasteObjects(Point p) { System.out.println("paste"); MODEL.getSelectedCpsObjects().clear(); AbstractCpsObject tCps = null; int x = Integer.MAX_VALUE, y = Integer.MAX_VALUE; // Location whre to copy the Elements for (AbstractCpsObject cps : MODEL.getClipboradObjects()) { if (cps.getPosition().x < x) { x = cps.getPosition().x; } if (cps.getPosition().y < y) { y = cps.getPosition().y; } } ArrayList tempList = new ArrayList<>(); // Objects for (AbstractCpsObject cps : MODEL.getClipboradObjects()) { if (cps instanceof HolonObject) { tCps = new HolonObject((HolonObject) cps); } else if (cps instanceof HolonSwitch) { tCps = new HolonSwitch((HolonSwitch) cps); } else { tCps = new CpsNode("Node"); } tCps.setPosition(new Position(p.x + (cps.getPosition().x - x), p.y + (cps.getPosition().y - y))); tempList.add(tCps); addObject(tCps); // MODEL.getSelectedCpsObjects().add(tCps); } // Edges boolean newEdge = true; for (AbstractCpsObject cps : MODEL.getClipboradObjects()) { System.out.println("Object edges: " + cps.getConnectedTo().size()); for (CpsEdge e : cps.getConnectedTo()) { // A and B of e in the copied Elements? if (MODEL.getClipboradObjects().indexOf(e.getA()) != -1 && MODEL.getClipboradObjects().indexOf(e.getB()) != -1) { AbstractCpsObject A = tempList.get(MODEL.getClipboradObjects().indexOf(e.getA())); AbstractCpsObject B = tempList.get(MODEL.getClipboradObjects().indexOf(e.getB())); //was this Edge created or not? for (CpsEdge et : tempList.get(MODEL.getClipboradObjects().indexOf(cps)).getConnectedTo()) { for (CpsEdge etA : et.getA().getConnectedTo()) { if (et.getA() == A && et.getB() == B) { System.out.println("false"); newEdge = false; } } for (CpsEdge etB : et.getB().getConnectedTo()) { if (et.getA() == A && et.getB() == B) { System.out.println("false"); newEdge = false; } } } if (newEdge) { System.out.println("new edge"); CpsEdge tempE = new CpsEdge(tempList.get(MODEL.getClipboradObjects().indexOf(e.getA())), // A tempList.get(MODEL.getClipboradObjects().indexOf(e.getB())), /* B */ e.getCapacity()); addEdgeOnCanvas(tempE); } newEdge = true; } } } } /** * Cut all Selected Objects */ @SuppressWarnings("unchecked") public void cutObjects() { MODEL.setClipboradObjects((ArrayList) MODEL.getSelectedCpsObjects().clone()); for (AbstractCpsObject cps : MODEL.getClipboradObjects()) { deleteObjectOnCanvas(cps); } MODEL.getSelectedCpsObjects().clear(); } }