HolonCanvas.java 7.8 KB

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