[29] | 1 | /* |
---|
| 2 | * This program is free software; you can redistribute it and/or modify |
---|
| 3 | * it under the terms of the GNU General Public License as published by |
---|
| 4 | * the Free Software Foundation; either version 2 of the License, or |
---|
| 5 | * (at your option) any later version. |
---|
| 6 | * |
---|
| 7 | * This program is distributed in the hope that it will be useful, |
---|
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 10 | * GNU General Public License for more details. |
---|
| 11 | * |
---|
| 12 | * You should have received a copy of the GNU General Public License |
---|
| 13 | * along with this program; if not, write to the Free Software |
---|
| 14 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
---|
| 15 | */ |
---|
| 16 | |
---|
| 17 | /* |
---|
| 18 | * SetupPanel.java |
---|
| 19 | * Copyright (C) 1999 University of Waikato, Hamilton, New Zealand |
---|
| 20 | * |
---|
| 21 | */ |
---|
| 22 | |
---|
| 23 | package weka.gui.experiment; |
---|
| 24 | |
---|
| 25 | import weka.core.Utils; |
---|
| 26 | import weka.core.xml.KOML; |
---|
| 27 | import weka.experiment.Experiment; |
---|
| 28 | import weka.experiment.PropertyNode; |
---|
| 29 | import weka.experiment.RemoteExperiment; |
---|
| 30 | import weka.experiment.ResultListener; |
---|
| 31 | import weka.experiment.ResultProducer; |
---|
| 32 | import weka.gui.ExtensionFileFilter; |
---|
| 33 | import weka.gui.GenericObjectEditor; |
---|
| 34 | import weka.gui.PropertyPanel; |
---|
| 35 | |
---|
| 36 | import java.awt.BorderLayout; |
---|
| 37 | import java.awt.GridBagConstraints; |
---|
| 38 | import java.awt.GridBagLayout; |
---|
| 39 | import java.awt.GridLayout; |
---|
| 40 | import java.awt.Insets; |
---|
| 41 | import java.awt.event.ActionEvent; |
---|
| 42 | import java.awt.event.ActionListener; |
---|
| 43 | import java.awt.event.FocusAdapter; |
---|
| 44 | import java.awt.event.FocusEvent; |
---|
| 45 | import java.awt.event.KeyAdapter; |
---|
| 46 | import java.awt.event.KeyEvent; |
---|
| 47 | import java.awt.event.WindowAdapter; |
---|
| 48 | import java.awt.event.WindowEvent; |
---|
| 49 | import java.beans.PropertyChangeEvent; |
---|
| 50 | import java.beans.PropertyChangeListener; |
---|
| 51 | import java.beans.PropertyChangeSupport; |
---|
| 52 | import java.io.BufferedInputStream; |
---|
| 53 | import java.io.BufferedOutputStream; |
---|
| 54 | import java.io.File; |
---|
| 55 | import java.io.FileInputStream; |
---|
| 56 | import java.io.FileOutputStream; |
---|
| 57 | import java.io.ObjectInputStream; |
---|
| 58 | import java.io.ObjectOutputStream; |
---|
| 59 | |
---|
| 60 | import javax.swing.BorderFactory; |
---|
| 61 | import javax.swing.ButtonGroup; |
---|
| 62 | import javax.swing.JButton; |
---|
| 63 | import javax.swing.JFileChooser; |
---|
| 64 | import javax.swing.JFrame; |
---|
| 65 | import javax.swing.JOptionPane; |
---|
| 66 | import javax.swing.JPanel; |
---|
| 67 | import javax.swing.JRadioButton; |
---|
| 68 | import javax.swing.JScrollPane; |
---|
| 69 | import javax.swing.JTextArea; |
---|
| 70 | import javax.swing.filechooser.FileFilter; |
---|
| 71 | |
---|
| 72 | /** |
---|
| 73 | * This panel controls the configuration of an experiment. |
---|
| 74 | * <p> |
---|
| 75 | * If <a href="http://koala.ilog.fr/XML/serialization/" target="_blank">KOML</a> |
---|
| 76 | * is in the classpath the experiments can also be saved to XML instead of a |
---|
| 77 | * binary format. |
---|
| 78 | * |
---|
| 79 | * @author Len Trigg (trigg@cs.waikato.ac.nz) |
---|
| 80 | * @author Mark Hall (mhall@cs.waikato.ac.nz) |
---|
| 81 | * @author FracPete (fracpete at waikato dot ac dot nz) |
---|
| 82 | * @version $Revision: 5841 $ |
---|
| 83 | */ |
---|
| 84 | public class SetupPanel |
---|
| 85 | extends JPanel { |
---|
| 86 | |
---|
| 87 | /** for serialization */ |
---|
| 88 | private static final long serialVersionUID = 6552671886903170033L; |
---|
| 89 | |
---|
| 90 | /** The experiment being configured */ |
---|
| 91 | protected Experiment m_Exp; |
---|
| 92 | |
---|
| 93 | /** Click to load an experiment */ |
---|
| 94 | protected JButton m_OpenBut = new JButton("Open..."); |
---|
| 95 | |
---|
| 96 | /** Click to save an experiment */ |
---|
| 97 | protected JButton m_SaveBut = new JButton("Save..."); |
---|
| 98 | |
---|
| 99 | /** Click to create a new experiment with default settings */ |
---|
| 100 | protected JButton m_NewBut = new JButton("New"); |
---|
| 101 | |
---|
| 102 | /** A filter to ensure only experiment files get shown in the chooser */ |
---|
| 103 | protected FileFilter m_ExpFilter = |
---|
| 104 | new ExtensionFileFilter(Experiment.FILE_EXTENSION, |
---|
| 105 | "Experiment configuration files (*" + Experiment.FILE_EXTENSION + ")"); |
---|
| 106 | |
---|
| 107 | /** A filter to ensure only experiment (in KOML format) files get shown in the chooser */ |
---|
| 108 | protected FileFilter m_KOMLFilter = |
---|
| 109 | new ExtensionFileFilter(KOML.FILE_EXTENSION, |
---|
| 110 | "Experiment configuration files (*" + KOML.FILE_EXTENSION + ")"); |
---|
| 111 | |
---|
| 112 | /** A filter to ensure only experiment (in XML format) files get shown in the chooser */ |
---|
| 113 | protected FileFilter m_XMLFilter = |
---|
| 114 | new ExtensionFileFilter(".xml", |
---|
| 115 | "Experiment configuration files (*.xml)"); |
---|
| 116 | |
---|
| 117 | /** The file chooser for selecting experiments */ |
---|
| 118 | protected JFileChooser m_FileChooser = new JFileChooser(new File(System.getProperty("user.dir"))); |
---|
| 119 | |
---|
| 120 | /** The ResultProducer editor */ |
---|
| 121 | protected GenericObjectEditor m_RPEditor = new GenericObjectEditor(); |
---|
| 122 | |
---|
| 123 | /** The panel to contain the ResultProducer editor */ |
---|
| 124 | protected PropertyPanel m_RPEditorPanel = new PropertyPanel(m_RPEditor); |
---|
| 125 | |
---|
| 126 | /** The ResultListener editor */ |
---|
| 127 | protected GenericObjectEditor m_RLEditor = new GenericObjectEditor(); |
---|
| 128 | |
---|
| 129 | /** The panel to contain the ResultListener editor */ |
---|
| 130 | protected PropertyPanel m_RLEditorPanel = new PropertyPanel(m_RLEditor); |
---|
| 131 | |
---|
| 132 | /** The panel that configures iteration on custom resultproducer property */ |
---|
| 133 | protected GeneratorPropertyIteratorPanel m_GeneratorPropertyPanel |
---|
| 134 | = new GeneratorPropertyIteratorPanel(); |
---|
| 135 | |
---|
| 136 | /** The panel for configuring run numbers */ |
---|
| 137 | protected RunNumberPanel m_RunNumberPanel = new RunNumberPanel(); |
---|
| 138 | |
---|
| 139 | /** The panel for enabling a distributed experiment */ |
---|
| 140 | protected DistributeExperimentPanel m_DistributeExperimentPanel = |
---|
| 141 | new DistributeExperimentPanel(); |
---|
| 142 | |
---|
| 143 | /** The panel for configuring selected datasets */ |
---|
| 144 | protected DatasetListPanel m_DatasetListPanel = new DatasetListPanel(); |
---|
| 145 | |
---|
| 146 | /** A button for bringing up the notes */ |
---|
| 147 | protected JButton m_NotesButton = new JButton("Notes"); |
---|
| 148 | |
---|
| 149 | /** Frame for the notes */ |
---|
| 150 | protected JFrame m_NotesFrame = new JFrame("Notes"); |
---|
| 151 | |
---|
| 152 | /** Area for user notes Default of 10 rows */ |
---|
| 153 | protected JTextArea m_NotesText = new JTextArea(null, 10, 0); |
---|
| 154 | |
---|
| 155 | /** |
---|
| 156 | * Manages sending notifications to people when we change the experiment, |
---|
| 157 | * at this stage, only the resultlistener so the resultpanel can update. |
---|
| 158 | */ |
---|
| 159 | protected PropertyChangeSupport m_Support = new PropertyChangeSupport(this); |
---|
| 160 | |
---|
| 161 | /** Click to advacne data set before custom generator */ |
---|
| 162 | protected JRadioButton m_advanceDataSetFirst = |
---|
| 163 | new JRadioButton("Data sets first"); |
---|
| 164 | |
---|
| 165 | /** Click to advance custom generator before data set */ |
---|
| 166 | protected JRadioButton m_advanceIteratorFirst = |
---|
| 167 | new JRadioButton("Custom generator first"); |
---|
| 168 | |
---|
| 169 | /** Handle radio buttons */ |
---|
| 170 | ActionListener m_RadioListener = new ActionListener() { |
---|
| 171 | public void actionPerformed(ActionEvent e) { |
---|
| 172 | updateRadioLinks(); |
---|
| 173 | } |
---|
| 174 | }; |
---|
| 175 | |
---|
| 176 | // Registers the appropriate property editors |
---|
| 177 | static { |
---|
| 178 | GenericObjectEditor.registerEditors(); |
---|
| 179 | } |
---|
| 180 | |
---|
| 181 | /** |
---|
| 182 | * Creates the setup panel with the supplied initial experiment. |
---|
| 183 | * |
---|
| 184 | * @param exp a value of type 'Experiment' |
---|
| 185 | */ |
---|
| 186 | public SetupPanel(Experiment exp) { |
---|
| 187 | |
---|
| 188 | this(); |
---|
| 189 | setExperiment(exp); |
---|
| 190 | } |
---|
| 191 | |
---|
| 192 | /** |
---|
| 193 | * Creates the setup panel with no initial experiment. |
---|
| 194 | */ |
---|
| 195 | public SetupPanel() { |
---|
| 196 | |
---|
| 197 | m_DistributeExperimentPanel. |
---|
| 198 | addCheckBoxActionListener(new ActionListener() { |
---|
| 199 | public void actionPerformed(ActionEvent e) { |
---|
| 200 | if (m_DistributeExperimentPanel.distributedExperimentSelected()) { |
---|
| 201 | if (!(m_Exp instanceof RemoteExperiment)) { |
---|
| 202 | try { |
---|
| 203 | RemoteExperiment re = new RemoteExperiment(m_Exp); |
---|
| 204 | setExperiment(re); |
---|
| 205 | } catch (Exception ex) { |
---|
| 206 | ex.printStackTrace(); |
---|
| 207 | } |
---|
| 208 | } |
---|
| 209 | } else { |
---|
| 210 | if (m_Exp instanceof RemoteExperiment) { |
---|
| 211 | setExperiment(((RemoteExperiment)m_Exp).getBaseExperiment()); |
---|
| 212 | } |
---|
| 213 | } |
---|
| 214 | } |
---|
| 215 | }); |
---|
| 216 | |
---|
| 217 | m_NewBut.setMnemonic('N'); |
---|
| 218 | m_NewBut.addActionListener(new ActionListener() { |
---|
| 219 | public void actionPerformed(ActionEvent e) { |
---|
| 220 | setExperiment(new Experiment()); |
---|
| 221 | } |
---|
| 222 | }); |
---|
| 223 | m_SaveBut.setMnemonic('S'); |
---|
| 224 | m_SaveBut.setEnabled(false); |
---|
| 225 | m_SaveBut.addActionListener(new ActionListener() { |
---|
| 226 | public void actionPerformed(ActionEvent e) { |
---|
| 227 | saveExperiment(); |
---|
| 228 | } |
---|
| 229 | }); |
---|
| 230 | m_OpenBut.setMnemonic('O'); |
---|
| 231 | m_OpenBut.addActionListener(new ActionListener() { |
---|
| 232 | public void actionPerformed(ActionEvent e) { |
---|
| 233 | openExperiment(); |
---|
| 234 | } |
---|
| 235 | }); |
---|
| 236 | m_FileChooser.addChoosableFileFilter(m_ExpFilter); |
---|
| 237 | if (KOML.isPresent()) |
---|
| 238 | m_FileChooser.addChoosableFileFilter(m_KOMLFilter); |
---|
| 239 | m_FileChooser.addChoosableFileFilter(m_XMLFilter); |
---|
| 240 | m_FileChooser.setFileFilter(m_ExpFilter); |
---|
| 241 | m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); |
---|
| 242 | |
---|
| 243 | m_GeneratorPropertyPanel.addActionListener(new ActionListener() { |
---|
| 244 | public void actionPerformed(ActionEvent e) { |
---|
| 245 | updateRadioLinks(); |
---|
| 246 | } |
---|
| 247 | }); |
---|
| 248 | |
---|
| 249 | m_RPEditor.setClassType(ResultProducer.class); |
---|
| 250 | m_RPEditor.setEnabled(false); |
---|
| 251 | m_RPEditor.addPropertyChangeListener(new PropertyChangeListener() { |
---|
| 252 | public void propertyChange(PropertyChangeEvent e) { |
---|
| 253 | m_Exp.setResultProducer((ResultProducer) m_RPEditor.getValue()); |
---|
| 254 | m_Exp.setUsePropertyIterator(false); |
---|
| 255 | m_Exp.setPropertyArray(null); |
---|
| 256 | m_Exp.setPropertyPath(null); |
---|
| 257 | m_GeneratorPropertyPanel.setExperiment(m_Exp); |
---|
| 258 | repaint(); |
---|
| 259 | } |
---|
| 260 | }); |
---|
| 261 | |
---|
| 262 | m_RLEditor.setClassType(ResultListener.class); |
---|
| 263 | m_RLEditor.setEnabled(false); |
---|
| 264 | m_RLEditor.addPropertyChangeListener(new PropertyChangeListener() { |
---|
| 265 | public void propertyChange(PropertyChangeEvent e) { |
---|
| 266 | m_Exp.setResultListener((ResultListener) m_RLEditor.getValue()); |
---|
| 267 | m_Support.firePropertyChange("", null, null); |
---|
| 268 | repaint(); |
---|
| 269 | } |
---|
| 270 | }); |
---|
| 271 | |
---|
| 272 | m_NotesFrame.addWindowListener(new WindowAdapter() { |
---|
| 273 | public void windowClosing(WindowEvent e) { |
---|
| 274 | m_NotesButton.setEnabled(true); |
---|
| 275 | } |
---|
| 276 | }); |
---|
| 277 | m_NotesFrame.getContentPane().add(new JScrollPane(m_NotesText)); |
---|
| 278 | m_NotesFrame.setSize(600, 400); |
---|
| 279 | |
---|
| 280 | m_NotesButton.addActionListener(new ActionListener() { |
---|
| 281 | public void actionPerformed(ActionEvent e) { |
---|
| 282 | m_NotesButton.setEnabled(false); |
---|
| 283 | m_NotesFrame.setVisible(true); |
---|
| 284 | } |
---|
| 285 | }); |
---|
| 286 | m_NotesButton.setEnabled(false); |
---|
| 287 | |
---|
| 288 | m_NotesText.setEditable(true); |
---|
| 289 | //m_NotesText.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
---|
| 290 | m_NotesText.addKeyListener(new KeyAdapter() { |
---|
| 291 | public void keyReleased(KeyEvent e) { |
---|
| 292 | m_Exp.setNotes(m_NotesText.getText()); |
---|
| 293 | } |
---|
| 294 | }); |
---|
| 295 | m_NotesText.addFocusListener(new FocusAdapter() { |
---|
| 296 | public void focusLost(FocusEvent e) { |
---|
| 297 | m_Exp.setNotes(m_NotesText.getText()); |
---|
| 298 | } |
---|
| 299 | }); |
---|
| 300 | |
---|
| 301 | // Set up the GUI layout |
---|
| 302 | JPanel buttons = new JPanel(); |
---|
| 303 | GridBagLayout gb = new GridBagLayout(); |
---|
| 304 | GridBagConstraints constraints = new GridBagConstraints(); |
---|
| 305 | buttons.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5)); |
---|
| 306 | // buttons.setLayout(new GridLayout(1, 3, 5, 5)); |
---|
| 307 | buttons.setLayout(gb); |
---|
| 308 | constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; |
---|
| 309 | constraints.fill = GridBagConstraints.HORIZONTAL; |
---|
| 310 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 311 | constraints.insets = new Insets(0,2,0,2); |
---|
| 312 | buttons.add(m_OpenBut,constraints); |
---|
| 313 | constraints.gridx=1;constraints.gridy=0;constraints.weightx=5; |
---|
| 314 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 315 | buttons.add(m_SaveBut,constraints); |
---|
| 316 | constraints.gridx=2;constraints.gridy=0;constraints.weightx=5; |
---|
| 317 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 318 | buttons.add(m_NewBut,constraints); |
---|
| 319 | |
---|
| 320 | JPanel src = new JPanel(); |
---|
| 321 | src.setLayout(new BorderLayout()); |
---|
| 322 | src.setBorder(BorderFactory.createCompoundBorder( |
---|
| 323 | BorderFactory.createTitledBorder("Result generator"), |
---|
| 324 | BorderFactory.createEmptyBorder(0, 5, 5, 5) |
---|
| 325 | )); |
---|
| 326 | src.add(m_RPEditorPanel, BorderLayout.NORTH); |
---|
| 327 | m_RPEditorPanel.setEnabled(false); |
---|
| 328 | |
---|
| 329 | JPanel dest = new JPanel(); |
---|
| 330 | dest.setLayout(new BorderLayout()); |
---|
| 331 | dest.setBorder(BorderFactory.createCompoundBorder( |
---|
| 332 | BorderFactory.createTitledBorder("Destination"), |
---|
| 333 | BorderFactory.createEmptyBorder(0, 5, 5, 5) |
---|
| 334 | )); |
---|
| 335 | dest.add(m_RLEditorPanel, BorderLayout.NORTH); |
---|
| 336 | m_RLEditorPanel.setEnabled(false); |
---|
| 337 | |
---|
| 338 | m_advanceDataSetFirst.setEnabled(false); |
---|
| 339 | m_advanceIteratorFirst.setEnabled(false); |
---|
| 340 | m_advanceDataSetFirst. |
---|
| 341 | setToolTipText("Advance data set before custom generator"); |
---|
| 342 | m_advanceIteratorFirst. |
---|
| 343 | setToolTipText("Advance custom generator before data set"); |
---|
| 344 | m_advanceDataSetFirst.setSelected(true); |
---|
| 345 | ButtonGroup bg = new ButtonGroup(); |
---|
| 346 | bg.add(m_advanceDataSetFirst); |
---|
| 347 | bg.add(m_advanceIteratorFirst); |
---|
| 348 | m_advanceDataSetFirst.addActionListener(m_RadioListener); |
---|
| 349 | m_advanceIteratorFirst.addActionListener(m_RadioListener); |
---|
| 350 | |
---|
| 351 | JPanel radioButs = new JPanel(); |
---|
| 352 | radioButs.setBorder(BorderFactory. |
---|
| 353 | createTitledBorder("Iteration control")); |
---|
| 354 | radioButs.setLayout(new GridLayout(1, 2)); |
---|
| 355 | radioButs.add(m_advanceDataSetFirst); |
---|
| 356 | radioButs.add(m_advanceIteratorFirst); |
---|
| 357 | |
---|
| 358 | JPanel simpleIterators = new JPanel(); |
---|
| 359 | simpleIterators.setLayout(new BorderLayout()); |
---|
| 360 | |
---|
| 361 | JPanel tmp = new JPanel(); |
---|
| 362 | tmp.setLayout(new GridBagLayout()); |
---|
| 363 | // tmp.setLayout(new GridLayout(1, 2)); |
---|
| 364 | constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; |
---|
| 365 | constraints.fill = GridBagConstraints.HORIZONTAL; |
---|
| 366 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 367 | constraints.insets = new Insets(0,2,0,2); |
---|
| 368 | tmp.add(m_RunNumberPanel,constraints); |
---|
| 369 | |
---|
| 370 | constraints.gridx=1;constraints.gridy=0;constraints.weightx=5; |
---|
| 371 | constraints.fill = GridBagConstraints.HORIZONTAL; |
---|
| 372 | constraints.gridwidth=1;constraints.gridheight=2; |
---|
| 373 | tmp.add(m_DistributeExperimentPanel, constraints); |
---|
| 374 | |
---|
| 375 | JPanel tmp2 = new JPanel(); |
---|
| 376 | // tmp2.setLayout(new GridLayout(2, 1)); |
---|
| 377 | tmp2.setLayout(new GridBagLayout()); |
---|
| 378 | |
---|
| 379 | constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; |
---|
| 380 | constraints.fill = GridBagConstraints.HORIZONTAL; |
---|
| 381 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 382 | constraints.insets = new Insets(0,2,0,2); |
---|
| 383 | tmp2.add(tmp,constraints); |
---|
| 384 | |
---|
| 385 | constraints.gridx=0;constraints.gridy=1;constraints.weightx=5; |
---|
| 386 | constraints.fill = GridBagConstraints.HORIZONTAL; |
---|
| 387 | constraints.gridwidth=1;constraints.gridheight=1; |
---|
| 388 | tmp2.add(radioButs,constraints); |
---|
| 389 | |
---|
| 390 | |
---|
| 391 | simpleIterators.add(tmp2, BorderLayout.NORTH); |
---|
| 392 | simpleIterators.add(m_DatasetListPanel, BorderLayout.CENTER); |
---|
| 393 | JPanel iterators = new JPanel(); |
---|
| 394 | iterators.setLayout(new GridLayout(1, 2)); |
---|
| 395 | iterators.add(simpleIterators); |
---|
| 396 | iterators.add(m_GeneratorPropertyPanel); |
---|
| 397 | |
---|
| 398 | JPanel top = new JPanel(); |
---|
| 399 | top.setLayout(new GridLayout(2, 1)); |
---|
| 400 | top.add(dest); |
---|
| 401 | top.add(src); |
---|
| 402 | |
---|
| 403 | JPanel notes = new JPanel(); |
---|
| 404 | notes.setLayout(new BorderLayout()); |
---|
| 405 | notes.add(m_NotesButton, BorderLayout.CENTER); |
---|
| 406 | |
---|
| 407 | JPanel p2 = new JPanel(); |
---|
| 408 | // p2.setLayout(new GridLayout(2, 1)); |
---|
| 409 | p2.setLayout(new BorderLayout()); |
---|
| 410 | p2.add(iterators, BorderLayout.CENTER); |
---|
| 411 | p2.add(notes, BorderLayout.SOUTH); |
---|
| 412 | |
---|
| 413 | JPanel p3 = new JPanel(); |
---|
| 414 | p3.setLayout(new BorderLayout()); |
---|
| 415 | p3.add(buttons, BorderLayout.NORTH); |
---|
| 416 | p3.add(top, BorderLayout.SOUTH); |
---|
| 417 | setLayout(new BorderLayout()); |
---|
| 418 | add(p3, BorderLayout.NORTH); |
---|
| 419 | add(p2, BorderLayout.CENTER); |
---|
| 420 | } |
---|
| 421 | |
---|
| 422 | /** |
---|
| 423 | * Deletes the notes frame. |
---|
| 424 | */ |
---|
| 425 | protected void removeNotesFrame() { |
---|
| 426 | m_NotesFrame.setVisible(false); |
---|
| 427 | } |
---|
| 428 | |
---|
| 429 | /** |
---|
| 430 | * Sets the experiment to configure. |
---|
| 431 | * |
---|
| 432 | * @param exp a value of type 'Experiment' |
---|
| 433 | */ |
---|
| 434 | public void setExperiment(Experiment exp) { |
---|
| 435 | |
---|
| 436 | boolean iteratorOn = exp.getUsePropertyIterator(); |
---|
| 437 | Object propArray = exp.getPropertyArray(); |
---|
| 438 | PropertyNode [] propPath = exp.getPropertyPath(); |
---|
| 439 | |
---|
| 440 | m_Exp = exp; |
---|
| 441 | m_SaveBut.setEnabled(true); |
---|
| 442 | m_RPEditor.setValue(m_Exp.getResultProducer()); |
---|
| 443 | m_RPEditor.setEnabled(true); |
---|
| 444 | m_RPEditorPanel.setEnabled(true); |
---|
| 445 | m_RPEditorPanel.repaint(); |
---|
| 446 | m_RLEditor.setValue(m_Exp.getResultListener()); |
---|
| 447 | m_RLEditor.setEnabled(true); |
---|
| 448 | m_RLEditorPanel.setEnabled(true); |
---|
| 449 | m_RLEditorPanel.repaint(); |
---|
| 450 | |
---|
| 451 | m_NotesText.setText(exp.getNotes()); |
---|
| 452 | m_NotesButton.setEnabled(true); |
---|
| 453 | |
---|
| 454 | m_advanceDataSetFirst.setSelected(m_Exp.getAdvanceDataSetFirst()); |
---|
| 455 | m_advanceIteratorFirst.setSelected(!m_Exp.getAdvanceDataSetFirst()); |
---|
| 456 | m_advanceDataSetFirst.setEnabled(true); |
---|
| 457 | m_advanceIteratorFirst.setEnabled(true); |
---|
| 458 | |
---|
| 459 | exp.setPropertyPath(propPath); |
---|
| 460 | exp.setPropertyArray(propArray); |
---|
| 461 | exp.setUsePropertyIterator(iteratorOn); |
---|
| 462 | |
---|
| 463 | m_GeneratorPropertyPanel.setExperiment(m_Exp); |
---|
| 464 | m_RunNumberPanel.setExperiment(m_Exp); |
---|
| 465 | m_DatasetListPanel.setExperiment(m_Exp); |
---|
| 466 | m_DistributeExperimentPanel.setExperiment(m_Exp); |
---|
| 467 | m_Support.firePropertyChange("", null, null); |
---|
| 468 | } |
---|
| 469 | |
---|
| 470 | /** |
---|
| 471 | * Gets the currently configured experiment. |
---|
| 472 | * |
---|
| 473 | * @return the currently configured experiment. |
---|
| 474 | */ |
---|
| 475 | public Experiment getExperiment() { |
---|
| 476 | |
---|
| 477 | return m_Exp; |
---|
| 478 | } |
---|
| 479 | |
---|
| 480 | /** |
---|
| 481 | * Prompts the user to select an experiment file and loads it. |
---|
| 482 | */ |
---|
| 483 | private void openExperiment() { |
---|
| 484 | |
---|
| 485 | int returnVal = m_FileChooser.showOpenDialog(this); |
---|
| 486 | if (returnVal != JFileChooser.APPROVE_OPTION) { |
---|
| 487 | return; |
---|
| 488 | } |
---|
| 489 | File expFile = m_FileChooser.getSelectedFile(); |
---|
| 490 | |
---|
| 491 | // add extension if necessary |
---|
| 492 | if (m_FileChooser.getFileFilter() == m_ExpFilter) { |
---|
| 493 | if (!expFile.getName().toLowerCase().endsWith(Experiment.FILE_EXTENSION)) |
---|
| 494 | expFile = new File(expFile.getParent(), expFile.getName() + Experiment.FILE_EXTENSION); |
---|
| 495 | } |
---|
| 496 | else if (m_FileChooser.getFileFilter() == m_KOMLFilter) { |
---|
| 497 | if (!expFile.getName().toLowerCase().endsWith(KOML.FILE_EXTENSION)) |
---|
| 498 | expFile = new File(expFile.getParent(), expFile.getName() + KOML.FILE_EXTENSION); |
---|
| 499 | } |
---|
| 500 | else if (m_FileChooser.getFileFilter() == m_XMLFilter) { |
---|
| 501 | if (!expFile.getName().toLowerCase().endsWith(".xml")) |
---|
| 502 | expFile = new File(expFile.getParent(), expFile.getName() + ".xml"); |
---|
| 503 | } |
---|
| 504 | |
---|
| 505 | try { |
---|
| 506 | Experiment exp = Experiment.read(expFile.getAbsolutePath()); |
---|
| 507 | setExperiment(exp); |
---|
| 508 | System.err.println("Opened experiment:\n" + m_Exp); |
---|
| 509 | } catch (Exception ex) { |
---|
| 510 | ex.printStackTrace(); |
---|
| 511 | JOptionPane.showMessageDialog(this, "Couldn't open experiment file:\n" |
---|
| 512 | + expFile |
---|
| 513 | + "\nReason:\n" + ex.getMessage(), |
---|
| 514 | "Open Experiment", |
---|
| 515 | JOptionPane.ERROR_MESSAGE); |
---|
| 516 | // Pop up error dialog |
---|
| 517 | } |
---|
| 518 | } |
---|
| 519 | |
---|
| 520 | /** |
---|
| 521 | * Prompts the user for a filename to save the experiment to, then saves |
---|
| 522 | * the experiment. |
---|
| 523 | */ |
---|
| 524 | private void saveExperiment() { |
---|
| 525 | |
---|
| 526 | int returnVal = m_FileChooser.showSaveDialog(this); |
---|
| 527 | if (returnVal != JFileChooser.APPROVE_OPTION) { |
---|
| 528 | return; |
---|
| 529 | } |
---|
| 530 | File expFile = m_FileChooser.getSelectedFile(); |
---|
| 531 | |
---|
| 532 | // add extension if necessary |
---|
| 533 | if (m_FileChooser.getFileFilter() == m_ExpFilter) { |
---|
| 534 | if (!expFile.getName().toLowerCase().endsWith(Experiment.FILE_EXTENSION)) |
---|
| 535 | expFile = new File(expFile.getParent(), expFile.getName() + Experiment.FILE_EXTENSION); |
---|
| 536 | } |
---|
| 537 | else if (m_FileChooser.getFileFilter() == m_KOMLFilter) { |
---|
| 538 | if (!expFile.getName().toLowerCase().endsWith(KOML.FILE_EXTENSION)) |
---|
| 539 | expFile = new File(expFile.getParent(), expFile.getName() + KOML.FILE_EXTENSION); |
---|
| 540 | } |
---|
| 541 | else if (m_FileChooser.getFileFilter() == m_XMLFilter) { |
---|
| 542 | if (!expFile.getName().toLowerCase().endsWith(".xml")) |
---|
| 543 | expFile = new File(expFile.getParent(), expFile.getName() + ".xml"); |
---|
| 544 | } |
---|
| 545 | |
---|
| 546 | try { |
---|
| 547 | Experiment.write(expFile.getAbsolutePath(), m_Exp); |
---|
| 548 | System.err.println("Saved experiment:\n" + m_Exp); |
---|
| 549 | } catch (Exception ex) { |
---|
| 550 | ex.printStackTrace(); |
---|
| 551 | JOptionPane.showMessageDialog(this, "Couldn't save experiment file:\n" |
---|
| 552 | + expFile |
---|
| 553 | + "\nReason:\n" + ex.getMessage(), |
---|
| 554 | "Save Experiment", |
---|
| 555 | JOptionPane.ERROR_MESSAGE); |
---|
| 556 | } |
---|
| 557 | } |
---|
| 558 | |
---|
| 559 | /** |
---|
| 560 | * Adds a PropertyChangeListener who will be notified of value changes. |
---|
| 561 | * |
---|
| 562 | * @param l a value of type 'PropertyChangeListener' |
---|
| 563 | */ |
---|
| 564 | public void addPropertyChangeListener(PropertyChangeListener l) { |
---|
| 565 | m_Support.addPropertyChangeListener(l); |
---|
| 566 | } |
---|
| 567 | |
---|
| 568 | /** |
---|
| 569 | * Removes a PropertyChangeListener. |
---|
| 570 | * |
---|
| 571 | * @param l a value of type 'PropertyChangeListener' |
---|
| 572 | */ |
---|
| 573 | public void removePropertyChangeListener(PropertyChangeListener l) { |
---|
| 574 | m_Support.removePropertyChangeListener(l); |
---|
| 575 | } |
---|
| 576 | |
---|
| 577 | /** |
---|
| 578 | * Updates the primary loop iteration control of the experiment |
---|
| 579 | */ |
---|
| 580 | private void updateRadioLinks() { |
---|
| 581 | |
---|
| 582 | m_advanceDataSetFirst. |
---|
| 583 | setEnabled(m_GeneratorPropertyPanel.getEditorActive()); |
---|
| 584 | m_advanceIteratorFirst. |
---|
| 585 | setEnabled(m_GeneratorPropertyPanel.getEditorActive()); |
---|
| 586 | |
---|
| 587 | if (m_Exp != null) { |
---|
| 588 | if (!m_GeneratorPropertyPanel.getEditorActive()) { |
---|
| 589 | m_Exp.setAdvanceDataSetFirst(true); |
---|
| 590 | } else { |
---|
| 591 | m_Exp.setAdvanceDataSetFirst(m_advanceDataSetFirst.isSelected()); |
---|
| 592 | } |
---|
| 593 | } |
---|
| 594 | } |
---|
| 595 | |
---|
| 596 | /** |
---|
| 597 | * Tests out the experiment setup from the command line. |
---|
| 598 | * |
---|
| 599 | * @param args arguments to the program. |
---|
| 600 | */ |
---|
| 601 | public static void main(String [] args) { |
---|
| 602 | |
---|
| 603 | try { |
---|
| 604 | boolean readExp = Utils.getFlag('l', args); |
---|
| 605 | final boolean writeExp = Utils.getFlag('s', args); |
---|
| 606 | final String expFile = Utils.getOption('f', args); |
---|
| 607 | if ((readExp || writeExp) && (expFile.length() == 0)) { |
---|
| 608 | throw new Exception("A filename must be given with the -f option"); |
---|
| 609 | } |
---|
| 610 | Experiment exp = null; |
---|
| 611 | if (readExp) { |
---|
| 612 | FileInputStream fi = new FileInputStream(expFile); |
---|
| 613 | ObjectInputStream oi = new ObjectInputStream( |
---|
| 614 | new BufferedInputStream(fi)); |
---|
| 615 | exp = (Experiment)oi.readObject(); |
---|
| 616 | oi.close(); |
---|
| 617 | } else { |
---|
| 618 | exp = new Experiment(); |
---|
| 619 | } |
---|
| 620 | System.err.println("Initial Experiment:\n" + exp.toString()); |
---|
| 621 | final JFrame jf = new JFrame("Weka Experiment Setup"); |
---|
| 622 | jf.getContentPane().setLayout(new BorderLayout()); |
---|
| 623 | final SetupPanel sp = new SetupPanel(); |
---|
| 624 | //sp.setBorder(BorderFactory.createTitledBorder("Setup")); |
---|
| 625 | jf.getContentPane().add(sp, BorderLayout.CENTER); |
---|
| 626 | jf.addWindowListener(new WindowAdapter() { |
---|
| 627 | public void windowClosing(WindowEvent e) { |
---|
| 628 | System.err.println("\nFinal Experiment:\n" |
---|
| 629 | + sp.m_Exp.toString()); |
---|
| 630 | // Save the experiment to a file |
---|
| 631 | if (writeExp) { |
---|
| 632 | try { |
---|
| 633 | FileOutputStream fo = new FileOutputStream(expFile); |
---|
| 634 | ObjectOutputStream oo = new ObjectOutputStream( |
---|
| 635 | new BufferedOutputStream(fo)); |
---|
| 636 | oo.writeObject(sp.m_Exp); |
---|
| 637 | oo.close(); |
---|
| 638 | } catch (Exception ex) { |
---|
| 639 | ex.printStackTrace(); |
---|
| 640 | System.err.println("Couldn't write experiment to: " + expFile |
---|
| 641 | + '\n' + ex.getMessage()); |
---|
| 642 | } |
---|
| 643 | } |
---|
| 644 | jf.dispose(); |
---|
| 645 | System.exit(0); |
---|
| 646 | } |
---|
| 647 | }); |
---|
| 648 | jf.pack(); |
---|
| 649 | jf.setVisible(true); |
---|
| 650 | System.err.println("Short nap"); |
---|
| 651 | Thread.currentThread().sleep(3000); |
---|
| 652 | System.err.println("Done"); |
---|
| 653 | sp.setExperiment(exp); |
---|
| 654 | } catch (Exception ex) { |
---|
| 655 | ex.printStackTrace(); |
---|
| 656 | System.err.println(ex.getMessage()); |
---|
| 657 | } |
---|
| 658 | } |
---|
| 659 | } |
---|