Kaynağa Gözat

Merge branch 'master' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons

Conflicts:
	src/ui/view/UpperNodeCanvas.java
Edgardo Palza 8 yıl önce
ebeveyn
işleme
359fb16184

+ 51 - 2
src/ui/controller/CanvasController.java

@@ -10,9 +10,9 @@ import classes.AbstractCpsObject;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.Position;
-import interfaces.CategoryListener;
 import interfaces.ObjectListener;
 import ui.model.Model;
+import ui.view.UpperNodeCanvas;
 
 /**
  * Controller for the Canvas.
@@ -57,7 +57,7 @@ public class CanvasController {
 	 */
 	public void addNewObject(AbstractCpsObject object) {
 		object.setSav("CVS");
-		//object.setConnections(new ArrayList<CpsEdge>());
+		// object.setConnections(new ArrayList<CpsEdge>());
 		addObject(object);
 	}
 
@@ -125,6 +125,8 @@ public class CanvasController {
 		edge.getA().getConnections().remove(edge);
 		edge.getB().getConnections().remove(edge);
 		model.getEdgesOnCanvas().remove(edge);
+		if (edge.getA() instanceof CpsUpperNode || edge.getB() instanceof CpsUpperNode)
+			handleUpperNodes(edge);
 	}
 
 	/**
@@ -221,4 +223,51 @@ public class CanvasController {
 
 		model.getSelectedCpsObjects().clear();
 	}
+
+	/**
+	 * In Case if a One or Both Side of the to Removing Edge is a CpsUpperNode
+	 * @param edge
+	 * @param upperNode
+	 */
+	public void handleUpperNodes(CpsEdge edge) {
+		CpsUpperNode upper = null;
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
+
+		// wenn A ist upperNOde
+		if (edge.getA() instanceof CpsUpperNode) {
+
+			upper = (CpsUpperNode) edge.getA();
+
+			//wenn in OldEdges eine B enhält
+			for (CpsEdge cpsEdge : upper.getOldEdges()) {
+				if (cpsEdge.getA().equals(edge.getB()) || cpsEdge.getB().equals(edge.getB()))
+					toDelete.add(cpsEdge);
+			}
+			//lösche alle Edges mit B
+			upper.getOldEdges().removeAll(toDelete);
+			//lösche hier alle Connections
+			for (CpsEdge cpsEdge : toDelete) {
+				cpsEdge.getA().getConnections().remove(cpsEdge);
+				cpsEdge.getB().getConnections().remove(cpsEdge);
+			}
+			toDelete.clear();
+		}
+		//Hier analog
+		if (edge.getB() instanceof CpsUpperNode) {
+
+			upper = (CpsUpperNode) edge.getB();
+
+			for (CpsEdge cpsEdge : upper.getOldEdges()) {
+				if (cpsEdge.getA().equals(edge.getA()) || cpsEdge.getB().equals(edge.getA()))
+					toDelete.add(cpsEdge);
+			}
+			upper.getOldEdges().removeAll(toDelete);
+			for (CpsEdge cpsEdge : toDelete) {
+				cpsEdge.getA().getConnections().remove(cpsEdge);
+				cpsEdge.getB().getConnections().remove(cpsEdge);
+			}
+			toDelete.clear();
+		}
+
+	}
 }

+ 14 - 10
src/ui/controller/Control.java

@@ -686,7 +686,7 @@ public class Control {
 	public void setCanvasY(int canvasY) {
 		globalController.setCanvasY(canvasY);
 	}
-	
+
 	public void setMaxCapacity(float cap) {
 		globalController.setMaxCapacity(cap);
 	}
@@ -731,7 +731,7 @@ public class Control {
 	public void removeTrackingObj(HolonObject obj) {
 		statsController.removeTrackingObj(obj);
 	}
-	
+
 	/**
 	 * Controlling Nodes of Nodes
 	 */
@@ -739,28 +739,32 @@ public class Control {
 	public void addUpperNode(String nodeName, CpsUpperNode upperNode) {
 		nodeController.doUpperNode(nodeName, upperNode);
 	}
-	
+
 	public void delUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
 		nodeController.undoUpperNode(node, upperNode);
 	}
-	
+
 	public void addObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
 		nodeController.addObjectInUpperNode(object, upperNode);
 	}
-	
+
 	public void delObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
 		nodeController.deleteObjectInUpperNode(object, upperNode);
 	}
-	
+
 	public void addEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
 		nodeController.addEdge(edge, upperNode);
 	}
-	
+
 	public void delEdgeUpperNode(CpsEdge edge, CpsUpperNode upperNode) {
 		nodeController.deleteEdge(edge, upperNode);
 	}
-	
-	public void connectNodes(AbstractCpsObject a, AbstractCpsObject b, CpsUpperNode node) {
-		nodeController.connectNodes(a, b, node);
+
+	public void connectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		nodeController.connectNodes(edge, upperNode);
+	}
+
+	public void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		nodeController.disconnectNodes(edge, upperNode);
 	}
 }

+ 24 - 20
src/ui/controller/NodeController.java

@@ -69,7 +69,7 @@ public class NodeController {
 	private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
 
 		ArrayList<AbstractCpsObject> nodes = node.getNodes();
-		// ArrayList<CpsEdge> nodeEdges = node.getNodeEdges();
+		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
 		// Put all selected Nodes into the Upper Node
 		for (Iterator<AbstractCpsObject> it = model.getSelectedCpsObjects().iterator(); it.hasNext();) {
@@ -90,10 +90,13 @@ public class NodeController {
 
 			// kopiere edge in UpperNode
 			if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) {
+				toDelete.add(edge);
 				addEdge(edge, node);
 			}
 
 		}
+
+		(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()) {
 			if (upperNode == null)
@@ -122,7 +125,8 @@ public class NodeController {
 	}
 
 	/**
-	 * Look for adjacent Nodes connected with the new CpsUpperNode and make Connections
+	 * Look for adjacent Nodes connected with the new CpsUpperNode and make
+	 * Connections
 	 * 
 	 * @param node
 	 * @param upperNode
@@ -131,7 +135,7 @@ public class NodeController {
 
 		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
 		ArrayList<Float> maxCapacity = new ArrayList<>();
-		
+
 		ArrayList<CpsEdge> oldEdges = node.getOldEdges();
 		ArrayList<CpsEdge> toDelete = new ArrayList<>();
 
@@ -179,7 +183,6 @@ public class NodeController {
 		// für alle objekte in adjazenzliste mach
 		for (AbstractCpsObject cps : adj) {
 			CpsEdge newEdge = new CpsEdge(cps, node, maxCapacity.get(adj.indexOf(cps)));
-			removeEdges(cps, node, newEdge);
 			// !! Eventuell noch bei getConnections() hinzufügem
 			// node.getConnections().add(newEdge);
 			if (upperNode == null)
@@ -200,7 +203,7 @@ public class NodeController {
 		// TODO Auto-generated method stub
 		ArrayList<CpsEdge> toDelete = 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())
 				.iterator(); it.hasNext();) {
 
@@ -209,7 +212,7 @@ public class NodeController {
 				toDelete.add(edge);
 
 		}
-		//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()).addAll(node.getOldEdges());
 	}
@@ -319,12 +322,12 @@ public class NodeController {
 
 		return pos;
 	}
-	
+
 	private void removeForNodeOfNode(AbstractCpsObject obj, CpsUpperNode upperNode) {
-		
-		mpC.decIdx(obj.getID(), (upperNode == null? model.getCvsObjIdx() : upperNode.getNodesIdx()));
-		(upperNode == null? model.getCvsObjIdx() : upperNode.getNodesIdx()).remove(obj.getID());
-		(upperNode == null? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
+
+		mpC.decIdx(obj.getID(), (upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()));
+		(upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).remove(obj.getID());
+		(upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
 	}
 
 	/**
@@ -370,8 +373,6 @@ public class NodeController {
 	 * @param upperNode
 	 */
 	public void addEdge(CpsEdge edge, CpsUpperNode upperNode) {
-		edge.getA().getConnections().add(edge);
-		edge.getB().getConnections().add(edge);
 		upperNode.getNodeEdges().add(edge);
 	}
 
@@ -385,6 +386,8 @@ public class NodeController {
 		edge.getA().getConnections().remove(edge);
 		edge.getB().getConnections().remove(edge);
 		upperNode.getNodeEdges().remove(edge);
+		if (edge.getA() instanceof CpsUpperNode || edge.getB() instanceof CpsUpperNode)
+			cvs.handleUpperNodes(edge);
 	}
 
 	/**
@@ -393,16 +396,17 @@ public class NodeController {
 	 * @param a
 	 * @param b
 	 */
-	public void connectNodes(AbstractCpsObject a, AbstractCpsObject b, CpsUpperNode node) {
+	public void connectNodes(CpsEdge edge, CpsUpperNode upperNode) {
 		// mache hier Connections in A und B rein
 		// mache diese Edge auch in OldEdges rein des aktuellen CpsUpperNodes
-		 CpsEdge edge = new CpsEdge(a, b, model.getMaxCapacity());
-		 node.getOldEdges().add(edge);
+		upperNode.getOldEdges().add(edge);
 	}
-	
-	private void removeEdges(AbstractCpsObject a, AbstractCpsObject b, CpsEdge edge) {
-		a.getConnections().remove(edge);
-		b.getConnections().remove(edge);
+
+	public void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
+		edge.getA().getConnections().remove(edge);
+		edge.getB().getConnections().remove(edge);
+		if (upperNode != null)
+			upperNode.getOldEdges().remove(edge);
 	}
 
 }

+ 17 - 14
src/ui/view/GUI.java

@@ -1024,22 +1024,25 @@ public class GUI<E> implements CategoryListener {
 							int x = (int) unc.getMousePosition().getX();
 							int y = (int) unc.getMousePosition().getY();
 
-							AbstractCpsObject h = null;
-							if (tempCps instanceof HolonObject) {
-								h = new HolonObject(tempCps);
-							}
-							if (tempCps instanceof HolonSwitch) {
-								h = new HolonSwitch(tempCps);
-							}
-							if (tempCps instanceof HolonTransformer) {
-								h = new HolonTransformer(tempCps);
-							}
+							if (x > unc.borderPos) {
 
-							h.setPosition(x, y);
+								AbstractCpsObject h = null;
+								if (tempCps instanceof HolonObject) {
+									h = new HolonObject(tempCps);
+								}
+								if (tempCps instanceof HolonSwitch) {
+									h = new HolonSwitch(tempCps);
+								}
+								if (tempCps instanceof HolonTransformer) {
+									h = new HolonTransformer(tempCps);
+								}
 
-							controller.addObjUpperNode(h, unc.upperNode);
-							unc.invalidate();
-							unc.repaint();
+								h.setPosition(x, y);
+
+								controller.addObjUpperNode(h, unc.upperNode);
+								unc.invalidate();
+								unc.repaint();
+							}
 						} else {
 							int x = (int) canvas.getMousePosition().getX();
 							int y = (int) canvas.getMousePosition().getY();

+ 1 - 1
src/ui/view/MyCanvas.java

@@ -472,7 +472,7 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 		dataSelected = null;
 		edgeHighlight = null;
 		controller.setSelecteEdge(null);
-
+		System.out.println(model.getEdgesOnCanvas().size());
 		// Object Selection
 		for (AbstractCpsObject cps : model.getObjectsOnCanvas()) {
 			cx = cps.getPosition().x;

+ 113 - 10
src/ui/view/UpperNodeCanvas.java

@@ -59,7 +59,7 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 	private int cx, cy;
 	private int sx, sy; // Mark Coords
 	private float scalediv20;
-	private int borderPos = 0; // Border Position
+	public int borderPos = 0; // Border Position
 
 	// Path
 	public String path;
@@ -117,6 +117,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		// this.add(breadCrumb);
 		scalediv20 = model.getScale() / 20;
 
+		// Cps objecte aus dem border links schieben
+		borderPos = (int) (model.getScale() + scalediv20 + scalediv20 + 10);
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
 			if (cps.getPosition().x < model.getScaleDiv2() + borderPos + 5) {
 				cps.setPosition(new Position(borderPos + 5, cps.getPosition().y));
@@ -125,7 +127,6 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 		showedInformation[0] = true;
 		showedInformation[1] = true;
-		control.setMaxCapacity(10000);
 
 		popmenu.add(itemCut);
 		popmenu.add(itemCopy);
@@ -315,8 +316,24 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		if (drawEdge) {
 			g2.setColor(Color.BLACK);
 			g2.setStroke(new BasicStroke(2));
-			g2.drawLine(tempCps.getPosition().x + controller.getScaleDiv2(),
-					tempCps.getPosition().y + controller.getScaleDiv2(), x, y);
+
+			// If TempCps is an outside Object
+			if (!upperNode.getNodes().contains(tempCps)) {
+				int count = 0;
+				for (CpsEdge e : upperNode.getConnections()) {
+					if (e.getA().equals(tempCps)) {
+						g2.drawLine(borderPos >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
+								+ (model.getScale() + scalediv20 + 10) * count), x, y);
+					} else if (e.getB().equals(tempCps)) {
+						g2.drawLine(borderPos >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
+								+ (model.getScale() + scalediv20 + 10) * count), x, y);
+					}
+					count++;
+				}
+			} else {
+				g2.drawLine(tempCps.getPosition().x + controller.getScaleDiv2(),
+						tempCps.getPosition().y + controller.getScaleDiv2(), x, y);
+			}
 		}
 
 		for (CpsEdge con : upperNode.getNodeEdges()) {
@@ -656,6 +673,14 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 			}
 		}
 
+		if (e.isControlDown() && tempCps != null) {
+			if (model.getSelectedCpsObjects().contains(tempCps)) {
+				controller.deleteSelectedObject(tempCps);
+			} else {
+				controller.addSelectedObject(tempCps);
+			}
+		}
+
 		// Selection of CpsObject
 		// model.setSelectedCpsObject(tempCps);
 
@@ -815,8 +840,8 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 							y = (int) (cps.getPosition().y + yDist);
 
 							// Make sure its in bounds
-							if (x <= 0)
-								x = 0;
+							if (x < borderPos + 5)
+								x = borderPos + 5;
 							else if (x > this.getWidth() - controller.getScale())
 								x = this.getWidth() - controller.getScale();
 							if (y <= 0)
@@ -917,14 +942,22 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 		boolean newEdge = true;
 		boolean onEdge = true;
 		boolean deleteNode = false;
+		boolean outsideCon = !upperNode.getNodes().contains(tempCps); // Connection
+																		// to
+																		// the
+																		// outside
+		boolean found = false;
 		CpsEdge e = null;
 		AbstractCpsObject tempCPS = null;
 
 		for (AbstractCpsObject cps : upperNode.getNodes()) {
+
 			cx = cps.getPosition().x;
 			cy = cps.getPosition().y;
+
 			if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
 					&& cps != tempCps) {
+				found = true;
 				node = false;
 				onEdge = false;
 				for (CpsEdge p : tempCps.getConnections()) {
@@ -934,7 +967,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 					}
 				}
 				if (!newEdge) {
-					controller.delEdgeUpperNode(e, upperNode);
+					if (outsideCon) {
+						controller.disconnectNodes(e, upperNode);
+					} else {
+						controller.delEdgeUpperNode(e, upperNode);
+					}
 					// Node ohne Edge?
 					if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
 						tempCps = e.getA();
@@ -947,10 +984,67 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				}
 				if (newEdge) {
 					e = new CpsEdge(cps, tempCps, model.getMaxCapacity());
-					controller.addEdgeUpperNode(e, upperNode);
+					if (outsideCon) {
+						controller.connectNodes(e, upperNode);
+					} else {
+						controller.addEdgeUpperNode(e, upperNode);
+					}
+				}
+			}
+		}
+		if (!found) {
+			int count = 0;
+			for (CpsEdge ed : upperNode.getConnections()) {
+				AbstractCpsObject cps = null;
+				if (ed.getA().equals(upperNode)) {
+					cps = ed.getB();
+				} else {
+					cps = ed.getA();
+				}
+
+				cx = borderPos >> 1;
+				cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
+
+				if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
+						&& cps != tempCps) {
+					outsideCon = true;
+					node = false;
+					onEdge = false;
+					for (CpsEdge p : tempCps.getConnections()) {
+						if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
+							newEdge = false;
+							e = p;
+						}
+					}
+					if (!newEdge) {
+						if (outsideCon) {
+							controller.disconnectNodes(e, upperNode);
+						} else {
+							controller.delEdgeUpperNode(e, upperNode);
+						}
+						// Node ohne Edge?
+						if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
+							tempCps = e.getA();
+							deleteNode = true;
+						}
+						if (e.getB().getClass() == CpsNode.class && e.getB().getConnections().isEmpty()) {
+							tempCPS = e.getB();
+							deleteNode = true;
+						}
+					}
+					if (newEdge) {
+						CpsEdge edge = new CpsEdge(cps, tempCps, model.getMaxCapacity());
+						if (outsideCon) {
+							controller.connectNodes(edge, upperNode);
+						} else {
+							controller.addEdgeUpperNode(edge, upperNode);
+						}
+					}
 				}
+				count++;
 			}
 		}
+
 		// Edge auf eine Edge gezogen?
 		if (onEdge) {
 			CpsEdge p = mousePositionOnEdge(x, y);
@@ -976,7 +1070,12 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 				e2 = new CpsEdge(n, k, model.getMaxCapacity());
 
 				controller.delEdgeUpperNode(p, upperNode);
-				controller.addEdgeUpperNode(e, upperNode);
+				if (outsideCon) {
+					controller.connectNodes(e, upperNode);
+				} else {
+					controller.addEdgeUpperNode(e, upperNode);
+				}
+
 				controller.addEdgeUpperNode(e1, upperNode);
 				controller.addEdgeUpperNode(e2, upperNode);
 			}
@@ -991,7 +1090,11 @@ public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotio
 
 			e = new CpsEdge(n, tempCps, model.getMaxCapacity());
 
-			controller.addEdgeUpperNode(e, upperNode);
+			if (outsideCon) {
+				controller.connectNodes(e, upperNode);
+			} else {
+				controller.addEdgeUpperNode(e, upperNode);
+			}
 		}
 
 		// Wenn ein Node ohne Connections da ist