CanvasController.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package holeg.ui.controller;
  2. import java.awt.Point;
  3. import java.util.Collection;
  4. import java.util.List;
  5. import java.util.ListIterator;
  6. import java.util.stream.Collectors;
  7. import holeg.model.AbstractCanvasObject;
  8. import holeg.model.Edge;
  9. import holeg.model.GroupNode;
  10. import holeg.model.HolonObject;
  11. import holeg.model.HolonSwitch;
  12. import holeg.model.Node;
  13. import holeg.ui.model.GuiSettings;
  14. import holeg.ui.model.Model;
  15. import holeg.ui.view.main.GUI;
  16. import holeg.utility.math.vector.Vec2i;
  17. /**
  18. * Controller for the Canvas.
  19. *
  20. * @author Gruppe14
  21. */
  22. //TODO(Tom2022-01-11): remove CanvasController and merge with NodeController
  23. @Deprecated
  24. public class CanvasController {
  25. private Model model;
  26. private GUI gui;
  27. /**
  28. * Constructor.
  29. *
  30. * @param model
  31. * the Model
  32. * @param mp
  33. * the MultipurposeController
  34. */
  35. public CanvasController(Model model) {
  36. this.model = model;
  37. }
  38. /**
  39. * Add an CpsObject to the model and notify the ObjectListener for update.
  40. *
  41. * @param object
  42. * CpsObject to be added.
  43. * @param replace when true objects could be replaced
  44. */
  45. public void addObject(AbstractCanvasObject object, boolean replace) {
  46. model.getCanvas().add(object);
  47. /**
  48. * check if we should drag & drop replace
  49. */
  50. if(!(object instanceof Node) && replace){
  51. /** x of the dragged Object */
  52. int x = object.getPosition().getX();
  53. /** y of the dragged Object */
  54. int y = object.getPosition().getY();
  55. /** distance treshold for replacement */
  56. int treshhold = GuiSettings.getPictureScale()/2;
  57. /** number of Objects that might be replaced (should be 1) */
  58. int replaceCounter = 0;
  59. /** last object that could be replaced */
  60. AbstractCanvasObject toBeReplaced = null;
  61. /** for each cps on Canvas */
  62. for (AbstractCanvasObject cps : model.getCanvas().getObjectsInThisLayer().toList()){
  63. /** same object -> ignore */
  64. if(cps == object)continue;
  65. /** x of object that might get replaced */
  66. int c_x = cps.getPosition().getX();
  67. /** y of object that might get replaced */
  68. int c_y = cps.getPosition().getY();
  69. /** if near enough */
  70. if(Math.abs(x-c_x)<treshhold && Math.abs(y-c_y)<treshhold){
  71. replaceCounter++;
  72. toBeReplaced = cps;
  73. }
  74. }
  75. /** if replacement of exactly one object possible */
  76. if(replaceCounter == 1 && toBeReplaced != null){
  77. replaceObjectOnCanvas(toBeReplaced, object);
  78. }
  79. }
  80. }
  81. /**
  82. * Add a new Object.
  83. *
  84. * @param object
  85. * the Object
  86. */
  87. public void addNewObject(AbstractCanvasObject object) {
  88. object.setSav("CVS");
  89. // object.setConnections(new ArrayList<CpsEdge>());
  90. addObject(object, true);
  91. }
  92. /**
  93. * Deletes an CpsObject on the Canvas and its connections.
  94. *
  95. * @param obj
  96. * AbstractCpsObject
  97. */
  98. public void deleteObjectOnCanvas(AbstractCanvasObject obj) {
  99. removeAllConnectionsFromObject(obj);
  100. model.getCanvas().remove(obj);
  101. }
  102. public void deleteObjectsOnCanvas(Collection<AbstractCanvasObject> objects) {
  103. for(AbstractCanvasObject obj: objects) {
  104. removeAllConnectionsFromObject(obj);
  105. model.getCanvas().remove(obj);
  106. }
  107. }
  108. /**
  109. * Replaces {@code toBeReplaced} by {@code by} on the canvas
  110. * @param toBeReplaced the object that will be replaced
  111. * @param by the object that will replace it
  112. */
  113. public void replaceObjectOnCanvas(AbstractCanvasObject toBeReplaced, AbstractCanvasObject by) {
  114. //Replace edges
  115. ListIterator<Edge> iter = model.getEdgesOnCanvas().listIterator();
  116. while(iter.hasNext() ) {
  117. Edge edge = iter.next();
  118. if(edge.getA() == toBeReplaced && edge.getB() != by) {
  119. edge.setA(by);
  120. }
  121. else if( edge.getB() == toBeReplaced && edge.getA() != by) {
  122. edge.setB(by);
  123. }
  124. }
  125. /**
  126. * set Position of by to exactly toBeReplaced
  127. */
  128. by.setPosition(toBeReplaced.getPosition());
  129. deleteObjectOnCanvas(toBeReplaced);
  130. }
  131. /**
  132. * Add an edge to the Canvas.
  133. *
  134. * @param edge
  135. * the edge
  136. */
  137. public void addEdgeOnCanvas(Edge edge) {
  138. model.getEdgesOnCanvas().add(edge);
  139. }
  140. /**
  141. * Removes an Edge from the Canvas.
  142. *
  143. * @param edge
  144. * the edge to remove
  145. */
  146. public void removeEdgesOnCanvas(Edge edge) {
  147. model.getEdgesOnCanvas().remove(edge);
  148. }
  149. /**
  150. * Paste all Selected Objects.
  151. *
  152. * @param p
  153. * the mouse Position
  154. */
  155. public void pasteObjects(Point p) {
  156. GuiSettings.getSelectedObjects().clear();
  157. AbstractCanvasObject tCps = null;
  158. int x = Integer.MAX_VALUE, y = Integer.MAX_VALUE;
  159. // Location whre to copy the Elements
  160. for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
  161. if (cps.getPosition().getX() < x) {
  162. x = cps.getPosition().getX();
  163. }
  164. if (cps.getPosition().getY() < y) {
  165. y = cps.getPosition().getY();
  166. }
  167. }
  168. // Objects
  169. for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
  170. if (cps instanceof HolonObject hO) {
  171. tCps = new HolonObject(hO);
  172. } else if (cps instanceof HolonSwitch sw) {
  173. tCps = new HolonSwitch(sw);
  174. } else {
  175. tCps = new Node("Node");
  176. }
  177. tCps.setPosition(new Vec2i(p.x + (cps.getPosition().getX() - x), p.y + (cps.getPosition().getY() - y)));
  178. tCps.setSav(cps.getSav());
  179. addObject(tCps, false);
  180. }
  181. }
  182. /**
  183. * Cut all Selected Objects.
  184. */
  185. public void cutObjects() {
  186. GuiSettings.setClipboardObjects(GuiSettings.getSelectedObjects().stream().collect(Collectors.toSet()));
  187. for (AbstractCanvasObject cps : GuiSettings.getClipboardObjects()) {
  188. deleteObjectOnCanvas(cps);
  189. }
  190. GuiSettings.getSelectedObjects().clear();
  191. }
  192. /**
  193. * Some cleaning Algorithm which traverses the UpperNode through BFS Can be
  194. * extended with other cleaning stuff No need for coloring since there tree
  195. * is only directed in one direction
  196. *
  197. * @param node
  198. */
  199. public void deleteAllObjectsInGroupNode(GroupNode node) {
  200. List<AbstractCanvasObject> objectsInGroupNode = node.getAllObjectsRecursive().toList();
  201. ListIterator<Edge> iter = model.getEdgesOnCanvas().listIterator();
  202. while(iter.hasNext() ) {
  203. Edge edge = iter.next();
  204. if(objectsInGroupNode.contains(edge.getA()) || objectsInGroupNode.contains(edge.getB())) {
  205. iter.remove();
  206. }
  207. }
  208. }
  209. public void removeAllConnectionsFromObject(AbstractCanvasObject obj) {
  210. ListIterator<Edge> iter = model.getEdgesOnCanvas().listIterator();
  211. while(iter.hasNext() ) {
  212. Edge edge = iter.next();
  213. if(edge.getA() == obj || edge.getB() == obj) {
  214. iter.remove();
  215. }
  216. }
  217. }
  218. }