/* * ClassOptionSelectionPanel.java * Copyright (C) 2007 University of Waikato, Hamilton, New Zealand * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package tr.gov.ulakbim.jDenetX.gui; import tr.gov.ulakbim.jDenetX.core.AutoClassDiscovery; import tr.gov.ulakbim.jDenetX.core.AutoExpandVector; import tr.gov.ulakbim.jDenetX.options.ClassOption; import tr.gov.ulakbim.jDenetX.options.OptionHandler; import tr.gov.ulakbim.jDenetX.tasks.Task; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ClassOptionSelectionPanel extends JPanel { // TODO: idea - why not retain matching options between classes when the // class type is changed // e.g. if user switches from LearnModel to EvaluateLearner, retain whatever // the 'stream' option was set to private static final long serialVersionUID = 1L; protected JComboBox classChoiceBox; protected JComponent chosenObjectEditor; protected Object chosenObject; public ClassOptionSelectionPanel(Class<?> requiredType, String initialCLIString, String nullString) { // Class<?>[] classesFound = AutoClassDiscovery.findClassesOfType("moa", // requiredType); Class<?>[] classesFound = findSuitableClasses(requiredType); this.classChoiceBox = new JComboBox(classesFound); setLayout(new BorderLayout()); add(this.classChoiceBox, BorderLayout.NORTH); Object initialObject = null; try { initialObject = ClassOption.cliStringToObject(initialCLIString, requiredType, null); } catch (Exception ignored) { // ignore exception } if (initialObject != null) { this.classChoiceBox.setSelectedItem(initialObject.getClass()); classChoiceChanged(initialObject); } else { try { Object chosen = ((Class<?>) ClassOptionSelectionPanel.this.classChoiceBox .getSelectedItem()).newInstance(); classChoiceChanged(chosen); } catch (Exception ex) { GUIUtils.showExceptionDialog(ClassOptionSelectionPanel.this, "Problem", ex); } } this.classChoiceBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { Object chosen = ((Class<?>) ClassOptionSelectionPanel.this.classChoiceBox .getSelectedItem()).newInstance(); classChoiceChanged(chosen); } catch (Exception ex) { GUIUtils.showExceptionDialog( ClassOptionSelectionPanel.this, "Problem", ex); } } }); } public Class<?>[] findSuitableClasses(Class<?> requiredType) { AutoExpandVector<Class<?>> finalClasses = new AutoExpandVector<Class<?>>(); Class<?>[] classesFound = AutoClassDiscovery.findClassesOfType("tr.gov.ulakbim.jDenetX", requiredType); for (Class<?> foundClass : classesFound) { finalClasses.add(foundClass); } Class<?>[] tasksFound = AutoClassDiscovery.findClassesOfType("tr.gov.ulakbim.jDenetX", Task.class); for (Class<?> foundTask : tasksFound) { try { Task task = (Task) foundTask.newInstance(); if (requiredType.isAssignableFrom(task.getTaskResultType())) { finalClasses.add(foundTask); } } catch (Exception e) { // ignore } } return finalClasses.toArray(new Class<?>[finalClasses.size()]); } public static String showSelectClassDialog(Component parent, String title, Class<?> requiredType, String initialCLIString, String nullString) { ClassOptionSelectionPanel panel = new ClassOptionSelectionPanel( requiredType, initialCLIString, nullString); if (JOptionPane.showOptionDialog(parent, panel, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null) == JOptionPane.OK_OPTION) { return panel.getChosenObjectCLIString(requiredType); } return initialCLIString; } public String getChosenObjectCLIString(Class<?> requiredType) { if (this.chosenObjectEditor instanceof OptionsConfigurationPanel) { ((OptionsConfigurationPanel) this.chosenObjectEditor) .applyChanges(); } return ClassOption.objectToCLIString(this.chosenObject, requiredType); } public void classChoiceChanged(Object chosen) { this.chosenObject = chosen; JComponent newChosenObjectEditor = null; if (this.chosenObject instanceof OptionHandler) { OptionHandler chosenOptionHandler = (OptionHandler) this.chosenObject; newChosenObjectEditor = new OptionsConfigurationPanel( chosenOptionHandler.getPurposeString(), chosenOptionHandler .getOptions()); } if (this.chosenObjectEditor != null) { remove(this.chosenObjectEditor); } this.chosenObjectEditor = newChosenObjectEditor; if (this.chosenObjectEditor != null) { add(this.chosenObjectEditor, BorderLayout.CENTER); } Component component = this; while ((component != null) && !(component instanceof JDialog)) { component = component.getParent(); } if (component != null) { Window window = (Window) component; window.pack(); } } }