SimulationMenu.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package ui.view;
  2. import javax.swing.JButton;
  3. import javax.swing.JComboBox;
  4. import javax.swing.JFileChooser;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JMenuBar;
  8. import javax.swing.JPanel;
  9. import javax.swing.JRadioButton;
  10. import javax.swing.JTextField;
  11. import javax.swing.event.CaretEvent;
  12. import javax.swing.event.CaretListener;
  13. import javax.tools.JavaCompiler;
  14. import javax.tools.ToolProvider;
  15. import ui.controller.Control;
  16. import ui.model.Model;
  17. import java.util.HashMap;
  18. import java.awt.GridBagLayout;
  19. import java.awt.Dimension;
  20. import java.awt.GridBagConstraints;
  21. import java.awt.Insets;
  22. import java.awt.event.ActionEvent;
  23. import java.awt.event.ActionListener;
  24. import java.io.BufferedReader;
  25. import java.io.File;
  26. import java.io.FileReader;
  27. import java.net.URL;
  28. import java.net.URLClassLoader;
  29. /**
  30. * This Class represents the Menu, where you can edit stuff about the
  31. * Simulation.
  32. *
  33. * @author Gruppe14
  34. */
  35. public class SimulationMenu extends JMenuBar {
  36. private static final long serialVersionUID = 1L;
  37. private JPanel menuPanel = new JPanel();
  38. JRadioButton simButton = new JRadioButton(Languages.getLanguage()[83]);
  39. JLabel simSpeedLabel = new JLabel(Languages.getLanguage()[84]);
  40. private JTextField simSpeedText = new JTextField("1000");
  41. private JComboBox<Object> algoCombo = new JComboBox<>();
  42. JButton algoFolderButton = new JButton(Languages.getLanguage()[85]);
  43. private HashMap<String, File> algosHash = new HashMap<>();
  44. // root Directory
  45. File root = null;
  46. Model model;
  47. Control controller;
  48. /**
  49. * Constructor.
  50. *
  51. * @param mod
  52. * the Model
  53. * @param cont
  54. * the Controller
  55. */
  56. public SimulationMenu(Model mod, Control cont) {
  57. super();
  58. // Init Stuff
  59. this.model = mod;
  60. this.controller = cont;
  61. simSpeedLabel.setMaximumSize(simSpeedLabel.getPreferredSize());
  62. simSpeedLabel.setMinimumSize(simSpeedLabel.getPreferredSize());
  63. algoCombo.addItem("None");
  64. // Algorithm ComboBox Action
  65. algoCombo.addActionListener(new ActionListener() {
  66. @Override
  67. public void actionPerformed(ActionEvent e) {
  68. if (algoCombo.getSelectedIndex() != 0) {
  69. setAlgorithm(algosHash.get(algoCombo.getSelectedItem()), algoCombo.getSelectedItem() + "");
  70. }else{
  71. setAlgorithm(null, "non Chosen");
  72. }
  73. }
  74. });
  75. // algoFolderButton Action
  76. algoFolderButton.addActionListener(new ActionListener() {
  77. @Override
  78. public void actionPerformed(java.awt.event.ActionEvent evt) {
  79. menuSetFolderActionPerformed(evt);
  80. }
  81. private void menuSetFolderActionPerformed(java.awt.event.ActionEvent evt) {
  82. JFileChooser fileChooser = new JFileChooser();
  83. JFrame test = new JFrame();
  84. fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  85. fileChooser.setAcceptAllFileFilterUsed(false);
  86. if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) {
  87. algoCombo.removeAllItems();
  88. algoCombo.addItem("non chosen");
  89. File[] files = fileChooser.getSelectedFile().listFiles();
  90. // Set Root Folder Path
  91. root = new File(fileChooser.getCurrentDirectory().getPath());
  92. for (int i = 0; i < files.length; i++) {
  93. if (files[i].toString()
  94. .endsWith(".java") /*
  95. * || files[i].toString().
  96. * endsWith(".class")
  97. */) {
  98. String name = files[i].getName();
  99. int tmpB = name.lastIndexOf('.');
  100. name = name.substring(0, tmpB);
  101. algosHash.put(name, files[i]);
  102. algoCombo.addItem(name);
  103. }
  104. }
  105. }
  106. }
  107. });
  108. // Add to Panel
  109. GridBagLayout gblmenuPanel = new GridBagLayout();
  110. gblmenuPanel.columnWidths = new int[] { 79, 105, 34, 60, 31, 151, 0 };
  111. gblmenuPanel.rowHeights = new int[] { 25, 0 };
  112. gblmenuPanel.columnWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
  113. gblmenuPanel.rowWeights = new double[] { 0.0, Double.MIN_VALUE };
  114. menuPanel.setLayout(gblmenuPanel);
  115. // isSimulation
  116. simButton.addActionListener(new ActionListener() {
  117. @Override
  118. public void actionPerformed(ActionEvent e) {
  119. controller.setIsSimulation(simButton.isSelected());
  120. controller.calculateStateForCurrentTimeStep();
  121. }
  122. });
  123. GridBagConstraints gbcsimButton = new GridBagConstraints();
  124. gbcsimButton.anchor = GridBagConstraints.NORTHWEST;
  125. gbcsimButton.insets = new Insets(0, 0, 0, 5);
  126. gbcsimButton.gridx = 0;
  127. gbcsimButton.gridy = 0;
  128. menuPanel.add(simButton, gbcsimButton);
  129. GridBagConstraints gbcsimSpeedLabel = new GridBagConstraints();
  130. gbcsimSpeedLabel.anchor = GridBagConstraints.WEST;
  131. gbcsimSpeedLabel.insets = new Insets(0, 0, 0, 5);
  132. gbcsimSpeedLabel.gridx = 1;
  133. gbcsimSpeedLabel.gridy = 0;
  134. menuPanel.add(simSpeedLabel, gbcsimSpeedLabel);
  135. // timerSpeed
  136. simSpeedText.setMaximumSize(new Dimension(300, 300));
  137. // simSpeedText.setMinimumSize(new Dimension(300, 300));
  138. simSpeedText.addCaretListener(new CaretListener() {
  139. @Override
  140. public void caretUpdate(CaretEvent e) {
  141. try {
  142. controller.setTimerSpeed(Integer.parseInt(simSpeedText.getText()));
  143. } catch (Exception ex) {
  144. // TODO: handle exception
  145. }
  146. }
  147. });
  148. GridBagConstraints gbcSimSpeedText = new GridBagConstraints();
  149. gbcSimSpeedText.anchor = GridBagConstraints.WEST;
  150. gbcSimSpeedText.insets = new Insets(0, 0, 0, 5);
  151. gbcSimSpeedText.gridx = 2;
  152. gbcSimSpeedText.gridy = 0;
  153. menuPanel.add(simSpeedText, gbcSimSpeedText);
  154. GridBagConstraints gbcAlgoFolderButton = new GridBagConstraints();
  155. gbcAlgoFolderButton.anchor = GridBagConstraints.WEST;
  156. gbcAlgoFolderButton.insets = new Insets(0, 0, 0, 5);
  157. gbcAlgoFolderButton.gridx = 3;
  158. gbcAlgoFolderButton.gridy = 0;
  159. menuPanel.add(algoFolderButton, gbcAlgoFolderButton);
  160. GridBagConstraints gbcAlgoCombo = new GridBagConstraints();
  161. gbcAlgoCombo.anchor = GridBagConstraints.WEST;
  162. gbcAlgoCombo.insets = new Insets(0, 0, 0, 5);
  163. gbcAlgoCombo.gridx = 4;
  164. gbcAlgoCombo.gridy = 0;
  165. menuPanel.add(algoCombo, gbcAlgoCombo);
  166. // algoCombo.addItem(Languages.getLanguage()[86]);
  167. // Add Panel to SimulationMenu
  168. this.add(menuPanel);
  169. }
  170. public void setAlgorithm(File file, String name) {
  171. try {
  172. BufferedReader br = new BufferedReader(new FileReader(file.getPath()));
  173. String line = br.readLine();
  174. // Package Name
  175. String packageName = "";
  176. while (line != null) {
  177. line = line.trim();
  178. if (!line.isEmpty()) {
  179. if (line.length() >= 7 && line.substring(0, 7).equals("package")) {
  180. packageName = line.substring(8, line.length() - 1);
  181. }
  182. }
  183. if (packageName.isEmpty()) {
  184. line = br.readLine();
  185. } else {
  186. line = null;
  187. }
  188. }
  189. // Compile source file.
  190. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  191. compiler.run(null, null, null, file.getPath());
  192. // Load and instantiate compiled class.
  193. URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
  194. Class<?> cls;
  195. if (packageName.isEmpty()) {
  196. cls = Class.forName(name, true, classLoader);
  197. } else {
  198. cls = Class.forName(packageName + "." + name, true, classLoader);
  199. }
  200. Object t = cls.newInstance();
  201. controller.setAlgorithm(t);
  202. } catch (Exception e) {
  203. controller.addTextToConsole(e.toString());
  204. }
  205. }
  206. }