AddOnWindow.java 6.8 KB

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