HolonCanvas.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package ui.view;
  2. import classes.HolonBody;
  3. import classes.SubNet;
  4. import classes.Vector2d;
  5. import ui.controller.Control;
  6. import ui.controller.HolonCanvasController;
  7. import ui.model.Model;
  8. import javax.swing.*;
  9. import java.awt.*;
  10. import java.awt.event.*;
  11. import java.util.ArrayList;
  12. public class HolonCanvas extends JPanel implements MouseWheelListener, MouseListener, MouseMotionListener {
  13. /**
  14. *
  15. */
  16. private static final long serialVersionUID = 1L;
  17. // Ball objects
  18. private ArrayList<HolonBody> bodies = new ArrayList<>();
  19. private int subCount;
  20. private long previousTime = System.currentTimeMillis();
  21. private long currentTime = previousTime;
  22. private long totalElapsedTime = 0;
  23. private int frameCount = 0;
  24. private Dimension center;
  25. private ArrayList<SubNet> subnets;
  26. private HolonCanvasController hCController;
  27. private Control controller;
  28. private Model model;
  29. private JComboBox<String> combo = new JComboBox<>();
  30. private int comboChoice = 0;
  31. private JCheckBox chckbxSort = new JCheckBox("sort by size");
  32. private boolean sizeChange = false;
  33. private HolonBody toDrag;
  34. HolonCanvas(Model mod, Control control) {
  35. // Wire up Events
  36. this.controller = control;
  37. this.model = mod;
  38. hCController = new HolonCanvasController(mod);
  39. JLabel lblBodyInfo = new JLabel("Holon Info:");
  40. add(lblBodyInfo);
  41. this.add(combo);
  42. subnets = controller.getSimManager().getSubNets();
  43. subCount = subnets.size();
  44. previousTime = System.currentTimeMillis();
  45. currentTime = previousTime;
  46. totalElapsedTime = 0;
  47. frameCount = 0;
  48. this.addMouseWheelListener(this);
  49. combo.addItem("ID");
  50. combo.addItem("Nr. of Objects");
  51. combo.addItem("Nr. of Edges");
  52. combo.addItem("Nr. of Switches");
  53. combo.addItem("Total Production");
  54. combo.addItem("Total Consumption");
  55. combo.addItem("Nr. of Elements");
  56. combo.addItem("Nr. of Producers");
  57. combo.addItem("Nr. of active Elements");
  58. combo.addActionListener(e -> comboChoice = combo.getSelectedIndex());
  59. this.addMouseListener(this);
  60. this.addMouseMotionListener(this);
  61. chckbxSort.addChangeListener(e -> sizeChange = true);
  62. add(chckbxSort);
  63. }
  64. // Start Render and Update Threads
  65. public void paintComponent(Graphics g) {
  66. super.paintComponent(g);
  67. // add new colors if necessary
  68. for (int i = 0; i < controller.getSimManager().getSubNets().size(); i++) {
  69. if (model.getSubNetColors().size() - 1 < i) {
  70. controller.addSubNetColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
  71. (int) (Math.random() * 255)));
  72. }
  73. }
  74. // check if subnets have changed
  75. if (!controller.getSimManager().getSubNets().equals(subnets)) {
  76. subnets = controller.getSimManager().getSubNets();
  77. subCount = subnets.size();
  78. calcCenter();
  79. hCController.addNewBodies(subCount,subnets, center, controller.getHolonBodyScale());
  80. sizeChange = true;
  81. }
  82. currentTime = System.currentTimeMillis();
  83. long elapsedTime = (currentTime - previousTime);
  84. totalElapsedTime += elapsedTime;
  85. if (totalElapsedTime > 1000) {
  86. // int currentFrameRate = frameCount;
  87. frameCount = 0;
  88. totalElapsedTime = 0;
  89. }
  90. // check if HolonBodys should be sorted after size
  91. if (chckbxSort.isSelected() && sizeChange) {
  92. hCController.rearrangeAfterSize();
  93. sizeChange = false;
  94. }
  95. hCController.updateBodies(elapsedTime / 1000f);
  96. render(g);
  97. try {
  98. // Thread.sleep(getFpsDelay(maxFrameRate));
  99. Thread.sleep(5);
  100. } catch (Exception e) {
  101. e.printStackTrace();
  102. }
  103. previousTime = currentTime;
  104. frameCount++;
  105. repaint();
  106. }
  107. private void render(Graphics g) {
  108. Graphics2D g2 = (Graphics2D) g;
  109. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  110. // Render Background
  111. g2.setColor(Color.WHITE);
  112. g2.fillRect(0, 0, getWidth(), getHeight());
  113. bodies = hCController.getBodies();
  114. // Render Objects
  115. for (int i = 0; i < subCount; i++) {
  116. int bodyNr = bodies.get(i).getId();
  117. String info;
  118. switch (comboChoice) {
  119. case 0:
  120. info = "" + bodyNr;
  121. break;
  122. case 1:
  123. info = "" + subnets.get(bodyNr).getObjects().size();
  124. break;
  125. case 2:
  126. info = "" + subnets.get(bodyNr).getEdges().size();
  127. break;
  128. case 3:
  129. info = "" + subnets.get(bodyNr).getSwitches().size();
  130. break;
  131. case 4:
  132. info = "" + hCController.getTotalProduction(new ArrayList<>(subnets.get(bodyNr).getObjects()));
  133. break;
  134. case 5:
  135. info = "" + hCController.getTotalConsumption(new ArrayList<>(subnets.get(bodyNr).getObjects()));
  136. break;
  137. case 6:
  138. info = "" + hCController.getTotalElements(new ArrayList<>(subnets.get(bodyNr).getObjects()));
  139. break;
  140. case 7:
  141. info = "" + hCController.getTotalProducers(new ArrayList<>(subnets.get(bodyNr).getObjects()));
  142. break;
  143. case 8:
  144. info = "" + hCController.getActiveElements(new ArrayList<>(subnets.get(bodyNr).getObjects()));
  145. break;
  146. default:
  147. info = "" + bodyNr;
  148. break;
  149. }
  150. bodies.get(i).setRadius((subnets.get(bodies.get(i).getId()).getObjects().size() * 5 + 10)
  151. * controller.getHolonBodyScale() / 100);
  152. bodies.get(i).draw(g2, info);
  153. }
  154. }
  155. // calc the center of the canvas
  156. private void calcCenter() {
  157. center = this.getSize();
  158. center.height /= 2;
  159. center.width /= 2;
  160. }
  161. @Override
  162. public void mouseWheelMoved(MouseWheelEvent e) {
  163. controller.setHolonBodyScale(model.getHolonBodyScale() + (-e.getScrollAmount() * e.getWheelRotation()));
  164. }
  165. @Override
  166. public void mouseClicked(MouseEvent e) {
  167. }
  168. @Override
  169. public void mouseEntered(MouseEvent e) {
  170. }
  171. @Override
  172. public void mouseExited(MouseEvent e) {
  173. }
  174. @Override
  175. public void mousePressed(MouseEvent e) {
  176. // Body Selection
  177. for (int i = 0; i < subCount; i++) {
  178. float cx = bodies.get(i).position.getX();
  179. float cy = bodies.get(i).position.getY();
  180. float cr = bodies.get(i).getRadius();
  181. if (e.getX() - cr <= cx && e.getY() - cr <= cy && e.getX() + cr >= cx && e.getY() + cr >= cy) {
  182. controller.addSelectedHolonBody(bodies.get(i).getId());
  183. hCController.setBodyToDrag(bodies.get(i).getId());
  184. toDrag = bodies.get(i);
  185. break;
  186. } else {
  187. controller.addSelectedHolonBody(-1);
  188. toDrag = null;
  189. }
  190. hCController.setBodyToDrag(-1);
  191. }
  192. }
  193. @Override
  194. public void mouseReleased(MouseEvent e) {
  195. hCController.setDrag(false);
  196. }
  197. @Override
  198. public void mouseDragged(MouseEvent e) {
  199. hCController.setDrag(true);
  200. if (toDrag != null) {
  201. toDrag.position = new Vector2d(e.getX(), e.getY());
  202. }
  203. repaint();
  204. }
  205. @Override
  206. public void mouseMoved(MouseEvent e) {
  207. }
  208. }