package de.gaalop.gui; import de.gaalop.*; import de.gaalop.algebra.AlStrategy; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.colorchooser.AbstractColorChooserPanel; import org.apache.commons.beanutils.BeanUtils; /** * * @author Christian Steinmetz */ public class PanelPluginSelection extends JPanel { private JComboBox globalSettings; private JComboBox visualCodeInserter; private JComboBox algebra; private JComboBox optimization; private JComboBox generator; private String errorMessage; private String errorPlugin1; private String errorPlugin2; private Color defaultColor; private JTextArea errorTextArea = new JTextArea(); private JComboBox algebraChooser = new JComboBox(); public static String lastUsedAlgebra; public static boolean lastUsedAlgebraRessource; public static String lastUsedGenerator; public static String lastUsedVisualCodeInserter; public static String lastUsedOptimization; private ItemListener itemListener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (areConstraintsFulfilled()) { errorTextArea.setText(""); setColorOnAllComboBoxes(); } else { errorTextArea.setText(errorMessage); setColorOnAllComboBoxes(); } } }; private boolean isErrorPlugin(JComboBox comboBox) { String name = comboBox.getSelectedItem().getClass().getCanonicalName(); return name.equals(errorPlugin1) || name.equals(errorPlugin2); } private void setColorOnAllComboBoxes() { if (isErrorPlugin(visualCodeInserter)) visualCodeInserter.setBackground(Color.red); else visualCodeInserter.setBackground(defaultColor); if (isErrorPlugin(algebra)) algebra.setBackground(Color.red); else algebra.setBackground(defaultColor); if (isErrorPlugin(optimization)) optimization.setBackground(Color.red); else optimization.setBackground(defaultColor); if (isErrorPlugin(generator)) generator.setBackground(Color.red); else generator.setBackground(defaultColor); } public PanelPluginSelection() { setLayout(new GridLayout(7,1,5,5)); ListCellRenderer c = new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value == null) return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); String valueStr = ((Plugin) value).getName(); JLabel label = (JLabel) super.getListCellRendererComponent(list, valueStr, index, isSelected, cellHasFocus); Image icon = (((Plugin) value).getIcon()); if (icon != null) label.setIcon(new ImageIcon(((Plugin) value).getIcon())); return label ; } }; add(new JPanel()); addLabeledComponent("Algebra to use:", algebraChooser); PluginSorter comparator = new PluginSorter(); GlobalSettingsStrategyPlugin[] globalPlugins = Plugins.getGlobalSettingsStrategyPlugins().toArray(new GlobalSettingsStrategyPlugin[0]); Arrays.sort(globalPlugins, comparator); globalSettings = new JComboBox(globalPlugins); globalSettings.setSelectedItem(search(globalPlugins, "de.gaalop.globalSettings.Plugin")); globalSettings.addItemListener(itemListener); globalSettings.setRenderer(c); if (Plugins.getGlobalSettingsStrategyPlugins().size() > 1) addLabeledComponent("Global Settings Plugin:", globalSettings); VisualCodeInserterStrategyPlugin[] visPlugins = Plugins.getVisualizerStrategyPlugins().toArray(new VisualCodeInserterStrategyPlugin[0]); Arrays.sort(visPlugins, comparator); visualCodeInserter = new JComboBox(visPlugins); visualCodeInserter.setSelectedItem(search(visPlugins, "de.gaalop.visualCodeInserter.Plugin")); visualCodeInserter.addItemListener(itemListener); visualCodeInserter.setRenderer(c); if (Plugins.getVisualizerStrategyPlugins().size() > 1) addLabeledComponent("VisualCodeInserter:", visualCodeInserter); AlgebraStrategyPlugin[] algPlugins = Plugins.getAlgebraStrategyPlugins().toArray(new AlgebraStrategyPlugin[0]); Arrays.sort(algPlugins, comparator); algebra = new JComboBox(algPlugins); algebra.setSelectedItem(search(algPlugins, "de.gaalop.algebra.Plugin")); algebra.addItemListener(itemListener); algebra.setRenderer(c); if (Plugins.getAlgebraStrategyPlugins().size() > 1) addLabeledComponent("Algebra:", algebra); OptimizationStrategyPlugin[] optPlugins = Plugins.getOptimizationStrategyPlugins().toArray(new OptimizationStrategyPlugin[0]); Arrays.sort(optPlugins, comparator); optimization = new JComboBox(optPlugins); optimization.setSelectedItem(search(optPlugins, "de.gaalop.tba.Plugin")); optimization.addItemListener(itemListener); optimization.setRenderer(c); if (Plugins.getOptimizationStrategyPlugins().size() > 1) addLabeledComponent("Optimization:", optimization); CodeGeneratorPlugin[] codegenPlugins = Plugins.getCodeGeneratorPlugins().toArray(new CodeGeneratorPlugin[0]); Arrays.sort(codegenPlugins, comparator); generator = new JComboBox(codegenPlugins); generator.addItemListener(itemListener); generator.setRenderer(c); if (Plugins.getCodeGeneratorPlugins().size() > 1) addLabeledComponent("CodeGenerator:", generator); errorTextArea.setLineWrap(true); errorTextArea.setWrapStyleWord(true); errorTextArea.setBackground(getBackground()); add(errorTextArea); defaultColor = generator.getBackground(); } private void addLabeledComponent(String label, JComboBox c) { JPanel panel = new JPanel(new GridLayout(2,1)); panel.add(new JLabel(label)); panel.add(c); add(panel); } public GlobalSettingsStrategyPlugin getGlobalSettingsStrategyPlugin() { return (GlobalSettingsStrategyPlugin) globalSettings.getSelectedItem(); } public VisualCodeInserterStrategyPlugin getVisualizerStrategyPlugin() { return (VisualCodeInserterStrategyPlugin) visualCodeInserter.getSelectedItem(); } public AlgebraStrategyPlugin getAlgebraStrategyPlugin() { return (AlgebraStrategyPlugin) algebra.getSelectedItem(); } public OptimizationStrategyPlugin getOptimizationStrategyPlugin() { return (OptimizationStrategyPlugin) optimization.getSelectedItem(); } public CodeGeneratorPlugin getCodeGeneratorPlugin() { return (CodeGeneratorPlugin) generator.getSelectedItem(); } private Object search(Plugin[] plugins, String search) { for (Plugin p: plugins) if (p.getClass().getCanonicalName().equals(search)) return p; if (plugins.length>0) return plugins[0]; return null; } public boolean areConstraintsFulfilled() { errorMessage = ""; errorPlugin1 = null; errorPlugin2 = null; LinkedList<Plugin> plugins = new LinkedList<Plugin>(); plugins.add(getVisualizerStrategyPlugin()); plugins.add(getAlgebraStrategyPlugin()); plugins.add(getOptimizationStrategyPlugin()); plugins.add(getCodeGeneratorPlugin()); if (!depends( "de.gaalop.codegenGapp.Plugin", "de.gaalop.gapp.Plugin", "The GAPPCodeGenerator needs the GAPP Optimizer!", plugins)) return false; if (!depends( "de.gaalop.gappopencl.Plugin", "de.gaalop.gapp.Plugin", "The GAPPOpenCL codeGenerator needs the GAPP Optimizer!", plugins)) return false; if (!depends( "de.gaalop.vis2d.Plugin", "de.gaalop.visualCodeInserter2d.Plugin", "The Vis2d plugin needs the visualCodeInserter2d plugin!", plugins)) return false; if (!depends( "de.gaalop.visualizer.Plugin", "de.gaalop.visualCodeInserter.Plugin", "The Visualizer plugin needs the visualCodeInserter plugin!", plugins)) return false; if (!depends( "de.gaalop.gappDebugger.Plugin", "de.gaalop.gapp.Plugin", "The GAPP debugger needs the GAPP Optimizer!", plugins)) return false; return true; } private boolean contains(String plugin, LinkedList<Plugin> plugins) { for (Plugin p: plugins) if (p.getClass().getCanonicalName().equals(plugin)) return true; return false; } private boolean depends(String plugin, String needs, String message, LinkedList<Plugin> plugins) { if (contains(plugin, plugins)) if (!contains(needs, plugins)) { errorMessage = message; errorPlugin1 = needs; errorPlugin2 = plugin; return false; } return true; } public String getErrorMessage() { return errorMessage; } public void refreshAlgebras() { VisualCodeInserterStrategyPlugin[] visualCodeInserterStrategyPlugins = Plugins.getVisualizerStrategyPlugins().toArray(new VisualCodeInserterStrategyPlugin[0]); visualCodeInserter.setSelectedItem(search(visualCodeInserterStrategyPlugins, lastUsedVisualCodeInserter)); OptimizationStrategyPlugin[] optimizationPlugins = Plugins.getOptimizationStrategyPlugins().toArray(new OptimizationStrategyPlugin[0]); optimization.setSelectedItem(search(optimizationPlugins, lastUsedOptimization)); CodeGeneratorPlugin[] codegenPlugins = Plugins.getCodeGeneratorPlugins().toArray(new CodeGeneratorPlugin[0]); generator.setSelectedItem(search(codegenPlugins, lastUsedGenerator)); DefaultComboBoxModel model = new DefaultComboBoxModel(); try { InputStream inputStream = AlStrategy.class.getResourceAsStream("algebra/definedAlgebras.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(";"); model.addElement(new AlgebraChooserItem(true, parts[0], parts[0]+" - "+parts[1])); } reader.close(); } catch (IOException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } AlgebraStrategyPlugin algebra = Plugins.getAlgebraStrategyPlugins().iterator().next(); try { Field field = algebra.getClass().getField("additionalBaseDirectory"); String value = BeanUtils.getProperty(algebra, field.getName()).trim(); if (!value.isEmpty()) { File file = new File(value); File[] dirs = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); if (dirs != null) for (File dir: dirs) model.addElement(new AlgebraChooserItem(false, dir.getName(), "Own - "+dir.getName())); } } catch (IllegalAccessException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchMethodException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchFieldException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(PanelPluginSelection.class.getName()).log(Level.SEVERE, null, ex); } algebraChooser.setModel(model); if (lastUsedAlgebra == null) { lastUsedAlgebra = "5d"; lastUsedAlgebraRessource = true; } AlgebraChooserItem defaultItem = new AlgebraChooserItem(lastUsedAlgebraRessource, lastUsedAlgebra, ""); FOR: for (int i=0;i<model.getSize();i++) { AlgebraChooserItem iItem = (AlgebraChooserItem) model.getElementAt(i); if (defaultItem.algebraName.equals(iItem.algebraName) && defaultItem.ressource == iItem.ressource) { defaultItem = iItem; break FOR; } } algebraChooser.setSelectedItem(defaultItem); } public AlgebraChooserItem getAlgebraToUse() { return (AlgebraChooserItem) algebraChooser.getSelectedItem(); } public void updateLastUsedPlugins() { lastUsedGenerator = generator.getSelectedItem().getClass().getCanonicalName(); lastUsedVisualCodeInserter = visualCodeInserter.getSelectedItem().getClass().getCanonicalName(); lastUsedOptimization = optimization.getSelectedItem().getClass().getCanonicalName(); } }