CanvasController.java 6.8 KB

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