NodeController.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package ui.controller;
  2. import classes.AbstractCpsObject;
  3. import classes.CpsEdge;
  4. import classes.CpsNode;
  5. import classes.CpsUpperNode;
  6. import classes.Position;
  7. import classes.IntermediateCalculationCable;
  8. import ui.model.Model;
  9. import java.awt.*;
  10. import java.util.ArrayList;
  11. import java.util.Iterator;
  12. class NodeController {
  13. private Model model;
  14. private CanvasController cvs;
  15. private MultiPurposeController mpC;
  16. private Point point;
  17. NodeController(Model model, CanvasController cvs, MultiPurposeController mpC) {
  18. this.model = model;
  19. this.cvs = cvs;
  20. this.mpC = mpC;
  21. }
  22. /**
  23. * Add a CpsUpperNode into Canvas
  24. */
  25. void doUpperNode(String nodeName, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
  26. CpsUpperNode node = new CpsUpperNode(nodeName);
  27. node.setPosition(calculatePos(toGroup));
  28. makeAdjacent(node, upperNode, toGroup);
  29. makeNodeOfNodes(node, upperNode, toGroup);
  30. backupOldEdges(node, upperNode);
  31. if (upperNode == null)
  32. cvs.addNewObject(node);
  33. else
  34. addObjectInUpperNode(node, upperNode, false);
  35. }
  36. /**
  37. * Delete a CpsUpperNode from the Canvas
  38. */
  39. void undoUpperNode(CpsUpperNode node, CpsUpperNode upperNode) {
  40. Position old = calculatePos(node.getNodes());
  41. Position p = node.getPosition();
  42. point = new Point(old.x - p.x, old.y - p.y);
  43. restoreOldEdges(node, upperNode);
  44. unmakeNodesOfNodes(node, upperNode);
  45. unmakeAdjacent(node, upperNode);
  46. if (upperNode == null)
  47. cvs.deleteObjectOnCanvas(node);
  48. else
  49. deleteObjectInUpperNode(node, upperNode);
  50. }
  51. /**
  52. * Put selected Nodes inside the Upper Node
  53. */
  54. private void makeNodeOfNodes(CpsUpperNode node, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
  55. ArrayList<AbstractCpsObject> nodes = node.getNodes();
  56. ArrayList<CpsEdge> toDelete = new ArrayList<>();
  57. // Put all selected Nodes into the Upper Node
  58. for (AbstractCpsObject obj : toGroup) {
  59. // füge Neue Objecte in Neuen Node hinzu
  60. addObjectInUpperNode(obj, node, false);
  61. }
  62. // Füge die Edges die Alle Objekte vorher verbunden hat in neuen Node
  63. for (CpsEdge edge : (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())) {
  64. // kopiere edge in UpperNode
  65. if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) {
  66. toDelete.add(edge);
  67. addEdge(edge, node);
  68. }
  69. }
  70. // Lösche dann die Edges aus der nächst höheren schicht
  71. (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
  72. for (AbstractCpsObject abs : toGroup) {
  73. if (upperNode == null)
  74. removeForNodeOfNode(abs, null);
  75. else
  76. removeForNodeOfNode(abs, upperNode);
  77. }
  78. }
  79. /**
  80. * Transfer all relevant data from Node into the next higher layer of Node
  81. * (upperNode)
  82. */
  83. private void unmakeNodesOfNodes(CpsUpperNode node, CpsUpperNode upperNode) {
  84. // add all nodes into upperNode
  85. for (CpsEdge edge : node.getConnections()) {
  86. if (edge.getA().equals(node))
  87. edge.getB().getConnections().remove(edge);
  88. if (edge.getB().equals(node))
  89. edge.getA().getConnections().remove(edge);
  90. }
  91. for (AbstractCpsObject obj : node.getNodes()) {
  92. updatePosition(obj, upperNode);
  93. if (upperNode == null)
  94. obj.setSav("CVS");
  95. else
  96. obj.setSav("" + upperNode.getId());
  97. }
  98. (upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).addAll(node.getNodes());
  99. // change the indices accordingly the higher layer
  100. mpC.adjustIdx(mpC.getHighestIdx((upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx())),
  101. node.getNodesIdx());
  102. // add all indices of nodes into upperNode
  103. (upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).putAll(node.getNodesIdx());
  104. // add all Edges of node into upperNode
  105. (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getNodeEdges());
  106. }
  107. /**
  108. * Look for adjacent Nodes connected with the new CpsUpperNode and make
  109. * Connections
  110. */
  111. private void makeAdjacent(CpsUpperNode node, CpsUpperNode upperNode, ArrayList<AbstractCpsObject> toGroup) {
  112. ArrayList<AbstractCpsObject> adj = new ArrayList<>();
  113. ArrayList<Float> maxCapacity = new ArrayList<>();
  114. ArrayList<CpsEdge> oldEdges = node.getOldEdges();
  115. ArrayList<CpsEdge> toDelete = new ArrayList<>();
  116. // für alle Edges auf dem Canvas
  117. for (Iterator<CpsEdge> it = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges())
  118. .iterator(); it.hasNext();) {
  119. CpsEdge edge = it.next();
  120. // wenn ausgewählte Objekte in edge und andere auserhalb
  121. if (toGroup.contains(edge.getA()) && !toGroup.contains(edge.getB())) {
  122. // und wenn in der adj noch nicht vorhanden und füg
  123. if (!adj.contains(edge.getB())) {
  124. adj.add(edge.getB());
  125. maxCapacity.add(edge.getCapacity());
  126. }
  127. // wenn vorhanden teste maxCapacity
  128. else if (maxCapacity.get(adj.indexOf(edge.getB())) < edge.getCapacity()) {
  129. maxCapacity.set(adj.indexOf(edge.getB()), edge.getCapacity());
  130. }
  131. // speichere alte edge
  132. oldEdges.add(edge);
  133. toDelete.add(edge);
  134. }
  135. // Analog
  136. else if (!toGroup.contains(edge.getA()) && toGroup.contains(edge.getB())) {
  137. if (!adj.contains(edge.getA())) {
  138. adj.add(edge.getA());
  139. maxCapacity.add(edge.getCapacity());
  140. } else if (maxCapacity.get(adj.indexOf(edge.getA())) < edge.getCapacity()) {
  141. maxCapacity.set(adj.indexOf(edge.getA()), edge.getCapacity());
  142. }
  143. oldEdges.add(edge);
  144. toDelete.add(edge);
  145. }
  146. }
  147. (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
  148. }
  149. /**
  150. * Restore the Old Connections from the adjacent Object
  151. */
  152. private void unmakeAdjacent(CpsUpperNode node, CpsUpperNode upperNode) {
  153. ArrayList<CpsEdge> toDelete = new ArrayList<>();
  154. ArrayList<CpsEdge> lostEdges = new ArrayList<>();
  155. ArrayList<CpsEdge> foundEdges = (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges());
  156. ArrayList<AbstractCpsObject> lostChildren = new ArrayList<>();
  157. ArrayList<AbstractCpsObject> foundChildren = (upperNode == null ? model.getObjectsOnCanvas()
  158. : upperNode.getNodes());
  159. // für jede Edge aus upperNode die Node enthält tu sie in toDelete
  160. for (CpsEdge edge : foundEdges) {
  161. if (edge.getA().equals(node) || edge.getB().equals(node))
  162. toDelete.add(edge);
  163. }
  164. // mark all object that arent in the restored oldEdges
  165. for (CpsEdge edge : node.getOldEdges()) {
  166. if (node.getNodes().contains(edge.getA()) && !foundChildren.contains(edge.getB())
  167. && !lostEdges.contains(edge)) {
  168. lostChildren.add(edge.getA());
  169. lostEdges.add(edge);
  170. }
  171. else if (node.getNodes().contains(edge.getB()) && !foundChildren.contains(edge.getA())
  172. && !lostEdges.contains(edge)) {
  173. lostChildren.add(edge.getB());
  174. lostEdges.add(edge);
  175. }
  176. }
  177. node.getOldEdges().removeAll(lostEdges);
  178. // für alle Edges für die nix passendes gefunden ist
  179. for (CpsEdge edge : lostEdges) {
  180. AbstractCpsObject toSearch = null;
  181. AbstractCpsObject lost = null;
  182. boolean foundCps = false;
  183. // bestimmung welcher verloren ist und wen man suchen muss
  184. if (lostChildren.contains(edge.getA())) {
  185. toSearch = edge.getB();
  186. lost = edge.getA();
  187. } else if (lostChildren.contains(edge.getB())) {
  188. toSearch = edge.getA();
  189. lost = edge.getB();
  190. }
  191. // wenn der zu suchende ein CpsUpperNode war
  192. if (toSearch instanceof CpsUpperNode) {
  193. System.out.println("UpperNode!");
  194. // guck einfach in den Connections des Verlorenen nach Edges die
  195. // auf der Canvas sind.
  196. for (CpsEdge e : lost.getConnections()) {
  197. if (foundChildren.contains(e.getA()) && foundChildren.contains(e.getB())
  198. && !node.getOldEdges().contains(e) && !foundEdges.contains(e)) {
  199. node.getOldEdges().add(e);
  200. foundCps = true;
  201. }
  202. }
  203. }
  204. // wenn das verlorene Object nicht gefunden
  205. if (!foundCps)
  206. // für alle auf der Ebene liegende Objekte
  207. outerLoop: for (AbstractCpsObject cps : foundChildren) {
  208. if (!cps.equals(node) && !lostChildren.contains(cps))
  209. // such per Backtracking Algorithmus ob der enthalten ist
  210. if (backtrackLostChild(cps, toSearch, lost)) {
  211. // wenns stimmt dann überspringe den aktuellen Loop
  212. for (CpsEdge f : node.getOldEdges())
  213. if ((f.getA().equals(cps) && f.getB().equals(toSearch)) || (f.getB().equals(cps) && f.getA().equals(toSearch)))
  214. continue outerLoop;
  215. // guck nach duplikaten in den Old Edges
  216. if (!lookforDuplicates(cps, lost, node.getOldEdges())) {
  217. // wenn es keine gibt erzeuge eine neue Oldedge
  218. CpsEdge temp = new CpsEdge(cps, lost, edge.getCapacity());
  219. node.getOldEdges().add(temp);
  220. }
  221. // falls das Objekt ein CpsUpperNode gewesen ist verschiebe
  222. // bitte die OldEdge dahin
  223. if (cps instanceof CpsUpperNode) {
  224. ((CpsUpperNode) cps).getOldEdges().add(edge);
  225. }
  226. }
  227. }
  228. }
  229. // lösch alle Edges die in toDelete sind und wiederherstell alte Edges
  230. (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).removeAll(toDelete);
  231. (upperNode == null ? model.getEdgesOnCanvas() : upperNode.getNodeEdges()).addAll(node.getOldEdges());
  232. }
  233. /**
  234. * Just checking if an Egde already exists
  235. */
  236. boolean lookforDuplicates(AbstractCpsObject a, AbstractCpsObject b, ArrayList<CpsEdge> list) {
  237. for (CpsEdge cpsEdge : list) {
  238. if ((a.equals(cpsEdge.getA()) && b.equals(cpsEdge.getB()))
  239. || (b.equals(cpsEdge.getA()) && a.equals(cpsEdge.getB())))
  240. return true;
  241. }
  242. return false;
  243. }
  244. /**
  245. * Backups Old Edges into next lower layer in Current UpperNode anymore
  246. */
  247. private void backupOldEdges(CpsUpperNode node, CpsUpperNode upperNode) {
  248. ArrayList<CpsEdge> backup = new ArrayList<>();
  249. ArrayList<AbstractCpsObject> adj = new ArrayList<>();
  250. ArrayList<Float> maxCapacity = new ArrayList<>();
  251. // wenn upperNode in UpperNode erzeugt wird
  252. if (upperNode != null) {
  253. // für alle oldEdges die die zu gruppierenden nodes enthält werden
  254. // in die neuen upperNOde verschoben
  255. for (CpsEdge edge : upperNode.getOldEdges()) {
  256. if (!upperNode.getNodes().contains(edge.getA()) && !upperNode.getNodes().contains(edge.getB()))
  257. backup.add(edge);
  258. }
  259. // hier wird verschoben
  260. node.getOldEdges().addAll(backup);
  261. // neue adjazent muss hergestellt werden in den alten oldEdges
  262. // for (CpsEdge edge : upperNode.getOldEdges()) {
  263. //
  264. // if (node.getNodes().contains(edge.getA()))
  265. // if (!adj.contains(edge.getB())) {
  266. // adj.add(edge.getB());
  267. // maxCapacity.add(edge.getCapacity());
  268. // } else if (maxCapacity.get(adj.indexOf(edge.getB())) < edge.getCapacity()) {
  269. // maxCapacity.set(adj.indexOf(edge.getB()), edge.getCapacity());
  270. //
  271. // }
  272. // if (node.getNodes().contains(edge.getB()))
  273. // if (!adj.contains(edge.getA())) {
  274. // adj.add(edge.getA());
  275. // maxCapacity.add(edge.getCapacity());
  276. // } else if (maxCapacity.get(adj.indexOf(edge.getA())) < edge.getCapacity()) {
  277. // maxCapacity.set(adj.indexOf(edge.getA()), edge.getCapacity());
  278. //
  279. // }
  280. // }
  281. // alle übertragenen Edges werden gelöscht
  282. upperNode.getOldEdges().removeAll(backup);
  283. // neue edges werden erzeugt
  284. for (AbstractCpsObject cps : adj)
  285. upperNode.getOldEdges().add(new CpsEdge(cps, node, maxCapacity.get(adj.indexOf(cps))));
  286. }
  287. }
  288. /**
  289. * Restore Old Edges into next higher layer of UpperNode
  290. */
  291. private void restoreOldEdges(CpsUpperNode node, CpsUpperNode upperNode) {
  292. ArrayList<CpsEdge> toDelete = new ArrayList<>();
  293. if (upperNode != null) {
  294. for (CpsEdge edge : node.getOldEdges()) {
  295. // wenn upperNode weder A oder B von von den OldEdges enthält
  296. if (!upperNode.getNodes().contains(edge.getA()) && !upperNode.getNodes().contains(edge.getB()))
  297. // Übertrage die OldEdges eine Schicht höher *
  298. toDelete.add(edge);
  299. }
  300. // *übertrage sie hier
  301. upperNode.getOldEdges().addAll(toDelete);
  302. // lösch sie aus den zu löschenden node, da sonst durch unmake
  303. // Adjacent probleme auftauchen
  304. node.getOldEdges().removeAll(toDelete);
  305. toDelete.clear();
  306. // lösche alle OldEdges aus der höheren schicht die zu den zu
  307. // löschenden Node vorher führten
  308. for (CpsEdge edge : upperNode.getOldEdges()) {
  309. if (edge.getA().equals(node) || edge.getB().equals(node))
  310. toDelete.add(edge);
  311. }
  312. upperNode.getOldEdges().removeAll(toDelete);
  313. }
  314. }
  315. /**
  316. * Calculate new Position of the Upper Node
  317. */
  318. Position calculatePos(ArrayList<AbstractCpsObject> toGroup) {
  319. Position pos = new Position(0, 0);
  320. // sum(x0 .. xn) / numOfPos, y analog
  321. for (AbstractCpsObject abs : toGroup) {
  322. pos.x += abs.getPosition().x;
  323. pos.y += abs.getPosition().y;
  324. }
  325. pos.x /= toGroup.size();
  326. pos.y /= toGroup.size();
  327. return pos;
  328. }
  329. /**
  330. * Removes the Given Obj from current Layer and adjusts the idx
  331. */
  332. private void removeForNodeOfNode(AbstractCpsObject obj, CpsUpperNode upperNode) {
  333. mpC.decIdx(obj.getId(), (upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()));
  334. (upperNode == null ? model.getCvsObjIdx() : upperNode.getNodesIdx()).remove(obj.getId());
  335. (upperNode == null ? model.getObjectsOnCanvas() : upperNode.getNodes()).remove(obj);
  336. }
  337. /**
  338. * Search Lost Nodes by Backtracking by looking for edges
  339. *
  340. * @param object
  341. * actual object which we are looking at
  342. * @param find
  343. * one part of the Edge
  344. * @param lost
  345. * other part of the Edge
  346. * @return boolean if found
  347. */
  348. private boolean backtrackLostChild(AbstractCpsObject object, AbstractCpsObject find, AbstractCpsObject lost) {
  349. //if not instance of CpsUpperNode
  350. if (!(object instanceof CpsUpperNode)) {
  351. //forEach connection look if lost and found inside
  352. for (CpsEdge edge : object.getConnections()) {
  353. if (edge.getA().equals(find) && edge.getB().equals(lost)
  354. || edge.getA().equals(lost) && edge.getB().equals(find))
  355. return true;
  356. }
  357. return false;
  358. } else {
  359. //if instance of Uppernode Call again
  360. for (AbstractCpsObject cps : ((CpsUpperNode) object).getNodes()) {
  361. if (backtrackLostChild(cps, find, lost))
  362. return true;
  363. }
  364. return false;
  365. }
  366. }
  367. /**
  368. * Adds object to the upperNode, might replace objects if replace==true
  369. * @param object
  370. * @param upperNode
  371. * @param replace
  372. */
  373. void addObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode, boolean replace) {
  374. if(object == null){
  375. new Error("object == null while adding to "+upperNode.toString()).printStackTrace();
  376. return;
  377. }
  378. if(upperNode == null){
  379. new Error("upperNode == null while adding "+object.toString()).printStackTrace();
  380. return;
  381. }
  382. object.setSav("" + upperNode.getId());
  383. upperNode.getNodesIdx().put(object.getId(), upperNode.getNodes().size());
  384. upperNode.getNodes().add(object);
  385. /**
  386. * check if we should drag & drop replace
  387. */
  388. if(replace && !(object instanceof CpsNode) ){
  389. /** x of the dragged Object */
  390. int x = object.getPosition().x;
  391. /** y of the dragged Object */
  392. int y = object.getPosition().y;
  393. /** distance threshold for replacement */
  394. int treshhold = model.getScale()/2;
  395. /** number of Objects that might be replaced (should be 1) */
  396. int replaceCounter = 0;
  397. /** last object that could be replaced */
  398. AbstractCpsObject toBeReplaced = null;
  399. /** for each cps on Canvas */
  400. for (AbstractCpsObject cps : upperNode.getNodes()){
  401. /** same object -> ignore */
  402. if(cps == object)continue;
  403. /** x of object that might get replaced */
  404. int c_x = cps.getPosition().x;
  405. /** y of object that might get replaced */
  406. int c_y = cps.getPosition().y;
  407. /** if near enough */
  408. if(Math.abs(x-c_x)<treshhold && Math.abs(y-c_y)<treshhold){
  409. replaceCounter++;
  410. toBeReplaced = cps;
  411. }
  412. }
  413. /** if replacement of exactly one object possible */
  414. if(replaceCounter == 1 && toBeReplaced != null){
  415. replaceObjectInUpperNode(toBeReplaced, object, upperNode);
  416. }
  417. }
  418. }
  419. /**
  420. * Delete a AbstactCpsObject from CPSUpperNode
  421. */
  422. void deleteObjectInUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
  423. CpsEdge e = null;
  424. for (AbstractCpsObject cps : upperNode.getNodes()) {
  425. for (CpsEdge p : cps.getConnections()) {
  426. if (p.getA() == object || p.getB() == object) {
  427. e = p;
  428. }
  429. }
  430. if (!model.getClipboradObjects().contains(cps) && !(cps instanceof CpsUpperNode)) {
  431. cps.getConnectedTo().remove(e);
  432. }
  433. upperNode.getNodeEdges().remove(e);
  434. }
  435. mpC.decIdx(object.getId(), upperNode.getNodesIdx());
  436. upperNode.getNodesIdx().remove(object.getId());
  437. upperNode.getNodes().remove(object);
  438. }
  439. /**
  440. * Replaces {@code toBePlaced} by {@code by} in {@code upperNode}
  441. * @param toBeReplaced
  442. * @param by
  443. * @param upperNode
  444. */
  445. public void replaceObjectInUpperNode(AbstractCpsObject toBeReplaced,
  446. AbstractCpsObject by, CpsUpperNode upperNode) {
  447. /** let all edges of 'toBeReplaced' connect to 'by' */
  448. for(CpsEdge e: toBeReplaced.getConnections()){
  449. if(e.getA() == toBeReplaced){
  450. e.setA(by);
  451. }else if(e.getB() == toBeReplaced){
  452. e.setB(by);
  453. }
  454. /** if edge from an object to itself -> remove it */
  455. if(e.getA() == e.getB())
  456. deleteEdge(e, upperNode);
  457. else/** else add edge to 'by' */
  458. by.addConnection(e);
  459. }
  460. /** delete 'toBeReplaced' new empty connections, to prevent Nullpointer*/
  461. toBeReplaced.setConnections(new ArrayList<CpsEdge>(1));
  462. /**
  463. * set Position of by to exactly toBeReplaced
  464. */
  465. by.setPosition(toBeReplaced.getPosition());
  466. deleteObjectInUpperNode(toBeReplaced, upperNode);
  467. }
  468. /**
  469. * Add Edge in UpperNode
  470. */
  471. void addEdge(CpsEdge edge, CpsUpperNode upperNode) {
  472. upperNode.getNodeEdges().add(edge);
  473. }
  474. /**
  475. * Delete Edge in UpperNode
  476. */
  477. void deleteEdge(CpsEdge edge, CpsUpperNode upperNode) {
  478. edge.getA().getConnections().remove(edge);
  479. edge.getB().getConnections().remove(edge);
  480. upperNode.getNodeEdges().remove(edge);
  481. if (edge.getA() instanceof CpsUpperNode || edge.getB() instanceof CpsUpperNode)
  482. cvs.handleUpperNodes(edge);
  483. }
  484. /**
  485. * Connect Objects outside of current Layer to Objects inside the Layer
  486. */
  487. void connectNodes(CpsEdge edge, CpsUpperNode upperNode) {
  488. // keine Connections nötig, da automatisch erzeugt bei Instanziierung
  489. // mache diese Edge auch in OldEdges rein des aktuellen CpsUpperNodes
  490. upperNode.getOldEdges().add(edge);
  491. }
  492. /**
  493. * Disconnect Objects outside of current Layer to Objects inside the Layer
  494. */
  495. void disconnectNodes(CpsEdge edge, CpsUpperNode upperNode) {
  496. edge.getA().getConnections().remove(edge);
  497. edge.getB().getConnections().remove(edge);
  498. if (upperNode != null)
  499. upperNode.getOldEdges().remove(edge);
  500. }
  501. /**
  502. * If Position is out of boundaries adjust it
  503. */
  504. private void updatePosition(AbstractCpsObject temp, CpsUpperNode upperNode) {
  505. int x = temp.getPosition().x - point.x;
  506. int y = temp.getPosition().y - point.y;
  507. if (y < 0)
  508. y = 0 + model.getScaleDiv2() + 1;
  509. if (upperNode != null) {
  510. if (x < upperNode.getLeftBorder() + model.getScaleDiv2() + 1)
  511. x = upperNode.getLeftBorder() + model.getScaleDiv2() + 1;
  512. } else if (x < 0)
  513. x = 0 + model.getScaleDiv2() + 1;
  514. if (x > model.getCanvasX())
  515. x = model.getCanvasX() - model.getScaleDiv2() - 1;
  516. if (y > model.getCanvasX())
  517. y = model.getCanvasY() - model.getScaleDiv2() - 1;
  518. temp.setPosition(new Position(x, y));
  519. }
  520. }