HolonCanvas.java 8.0 KB

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