SimulationMenu.java 6.5 KB

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