AddOnWindow.java 7.3 KB

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