AlgoWindow.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.Font;
  5. import java.io.File;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileReader;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.net.URLClassLoader;
  11. import java.util.Arrays;
  12. import java.util.Scanner;
  13. import java.util.stream.Collectors;
  14. import javax.swing.JButton;
  15. import javax.swing.JFileChooser;
  16. import javax.swing.JFrame;
  17. import javax.swing.JLabel;
  18. import javax.swing.JMenu;
  19. import javax.swing.JMenuBar;
  20. import javax.swing.JMenuItem;
  21. import javax.swing.JOptionPane;
  22. import javax.swing.JPanel;
  23. import javax.swing.JTextArea;
  24. import javax.swing.JTextPane;
  25. import javax.swing.filechooser.FileNameExtensionFilter;
  26. import javax.swing.text.SimpleAttributeSet;
  27. import javax.swing.text.StyleConstants;
  28. import javax.swing.text.StyledDocument;
  29. import javax.tools.JavaCompiler;
  30. import javax.tools.ToolProvider;
  31. import api.Algorithm;
  32. import ui.controller.Control;
  33. //TODO delete old class AlgorithmMenu and change this class to AlgorithmMenu;
  34. @SuppressWarnings("serial")
  35. public class AlgoWindow extends JFrame{
  36. private Algorithm actual;
  37. private Control control;
  38. private JPanel content = new JPanel();
  39. AlgoWindow(JFrame parentFrame, Control control){
  40. this.control = control;
  41. this.setTitle("Algorithm");
  42. this.setVisible(true);
  43. this.setContentPane(content);
  44. this.setIconImage(Util.loadImage("/Images/Holeg.png", 30, 30));
  45. initMenuBar();
  46. initDefaultContentPanel();
  47. this.pack();
  48. this.setLocationRelativeTo(parentFrame);
  49. }
  50. private void initMenuBar() {
  51. JMenuBar menuBar = new JMenuBar();
  52. JMenu menuSelect = new JMenu("File");
  53. JMenuItem menuItemAlgorithm= new JMenuItem("Open .java-File..");
  54. menuItemAlgorithm.addActionListener(actionEvent -> openJavaFile());
  55. menuSelect.add(menuItemAlgorithm);
  56. JMenuItem menuItemFolder= new JMenuItem("Open Folder..");
  57. menuItemFolder.addActionListener(actionEvent->openFolder(menuSelect));
  58. menuSelect.add(menuItemFolder);
  59. menuSelect.addSeparator();
  60. JMenu menuHelp = new JMenu("Help");
  61. menuBar.add(menuSelect);
  62. menuBar.add(menuHelp);
  63. this.setJMenuBar(menuBar);
  64. }
  65. private void initDefaultContentPanel() {
  66. content.setLayout(new BorderLayout());
  67. JTextPane textPane = new JTextPane();
  68. SimpleAttributeSet attribs = new SimpleAttributeSet();
  69. StyleConstants.setAlignment(attribs , StyleConstants.ALIGN_JUSTIFIED);
  70. textPane.setParagraphAttributes(attribs, true);
  71. textPane.setText("No algorithm is loaded."
  72. +"\n OPTION[1]:"
  73. +"\n• Select '.java'-file via the file browser. (File\u2192Open .jave-File..)"
  74. +"\n"
  75. +"\n OPTION[2]:"
  76. +"\n• First select the folder where the algorithm '.java'-file is located. (File\u2192Open Folder..)"
  77. +"\n• Second load the algorithm. (File\u2192'YourAlgo')");
  78. textPane.setFont(new Font("Serif", Font.PLAIN, 16));
  79. content.add(textPane, BorderLayout.CENTER);
  80. content.setPreferredSize(new Dimension(500, 500));
  81. }
  82. /**
  83. *
  84. */
  85. private void openJavaFile() {
  86. JFileChooser fileChooser = new JFileChooser();
  87. fileChooser.setFileFilter(new FileNameExtensionFilter("JAVA Source Files", "java"));
  88. fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
  89. fileChooser.setAcceptAllFileFilterUsed(false);
  90. int result = fileChooser.showOpenDialog(this);
  91. if(result == JFileChooser.APPROVE_OPTION) {
  92. //Found a file
  93. loadAlgorithm(fileChooser.getSelectedFile());
  94. }
  95. }
  96. private void openFolder(JMenu menuSelect) {
  97. JFileChooser fileChooser = new JFileChooser();
  98. fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  99. fileChooser.setAcceptAllFileFilterUsed(false);
  100. int result = fileChooser.showOpenDialog(this);
  101. if(result == JFileChooser.APPROVE_OPTION) {
  102. File[] files = fileChooser.getSelectedFile().listFiles(file -> file.getName().endsWith(".java"));
  103. //Remove all Index from old Folder
  104. for(int i= menuSelect.getItemCount()-1; i> 2; i--) {
  105. menuSelect.remove(i);
  106. }
  107. for(File file: files) {
  108. JMenuItem insertMenuItem = new JMenuItem(getNameWithoutExtension(file));
  109. insertMenuItem.addActionListener(actionEvent -> loadAlgorithm(file));
  110. menuSelect.add(insertMenuItem);
  111. }
  112. }
  113. }
  114. /**
  115. * Compile and load a java File.
  116. * @param javafile
  117. */
  118. private void loadAlgorithm(File javafile) {
  119. //Get Class name:
  120. String name = getNameWithoutExtension(javafile);
  121. //get Package name
  122. String packageName = "";
  123. Scanner in = null;
  124. try {
  125. in = new Scanner(javafile);
  126. } catch (FileNotFoundException e) {
  127. generateErrorDialog("File not Found");
  128. }
  129. while(in.hasNext()) {
  130. String line = in.nextLine().trim();
  131. if(line.startsWith("package")) {
  132. packageName = line.substring(8, line.length()-1);
  133. break;
  134. }
  135. }
  136. //GetPathName
  137. //String path = javafile.getParentFile().isDirectory() ? javafile.getParentFile().getAbsolutePath() : "";
  138. File folder = javafile.getParentFile();
  139. // Compile source file.
  140. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  141. if (ToolProvider.getSystemJavaCompiler() == null) {
  142. generateErrorDialog("Please install the JDK on your system.");
  143. }else {
  144. compiler.run(null, null, null, javafile.getAbsolutePath());
  145. }
  146. try {
  147. URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { folder.toURI().toURL() });
  148. Class<?> cls = Class.forName(packageName.isEmpty()?name:packageName + "." +name, true, classLoader);
  149. Object object = cls.newInstance();
  150. if(!(object instanceof Algorithm)) {
  151. generateErrorDialog("Class does not implement CpsAlgorithm!");
  152. }else {
  153. actual = (Algorithm)object;
  154. actual.setController(control);
  155. this.setContentPane(actual.getAlgorithmPanel());
  156. this.pack();
  157. }
  158. } catch (MalformedURLException e) {
  159. generateErrorDialog("URLClassLoader error");
  160. } catch (ClassNotFoundException e) {
  161. generateErrorDialog("ClassNotFound error" + e.getMessage());
  162. } catch (InstantiationException e) {
  163. generateErrorDialog("Class does not implement a Constructor." + e.getMessage());
  164. } catch (IllegalAccessException e) {
  165. generateErrorDialog("Class set this method privat or protected needs to be public." + e.getMessage());
  166. }
  167. }
  168. /**
  169. * Returns the Name of a file without Extension.
  170. * @param file
  171. * @return
  172. */
  173. private String getNameWithoutExtension(File file) {
  174. return file.getName().substring(0, file.getName().lastIndexOf("."));
  175. }
  176. /**
  177. * Generate a little Error Dialog to inform the User.
  178. * @param message
  179. */
  180. private void generateErrorDialog(String message) {
  181. System.out.println(message);
  182. JOptionPane.showConfirmDialog(this, message, "Error", JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE);
  183. }
  184. }