source: src/main/java/weka/gui/experiment/ResultsPanel.java @ 4

Last change on this file since 4 was 4, checked in by gnappo, 14 years ago

Import di weka.

File size: 44.2 KB
RevLine 
[4]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 *    ResultsPanel.java
19 *    Copyright (C) 1999 University of Waikato, Hamilton, New Zealand
20 *
21 */
22
23package weka.gui.experiment;
24
25import java.awt.BorderLayout;
26import java.awt.Dimension;
27import java.awt.Font;
28import java.awt.GridBagConstraints;
29import java.awt.GridBagLayout;
30import java.awt.GridLayout;
31import java.awt.Insets;
32import java.awt.event.ActionEvent;
33import java.awt.event.ActionListener;
34import java.awt.event.WindowAdapter;
35import java.awt.event.WindowEvent;
36import java.io.BufferedReader;
37import java.io.File;
38import java.io.FileReader;
39import java.io.Reader;
40import java.text.SimpleDateFormat;
41import java.util.Date;
42import java.util.StringTokenizer;
43import java.util.Vector;
44
45import javax.swing.BorderFactory;
46import javax.swing.DefaultComboBoxModel;
47import javax.swing.DefaultListModel;
48import javax.swing.JButton;
49import javax.swing.JCheckBox;
50import javax.swing.JComboBox;
51import javax.swing.JFileChooser;
52import javax.swing.JFrame;
53import javax.swing.JLabel;
54import javax.swing.JList;
55import javax.swing.JOptionPane;
56import javax.swing.JPanel;
57import javax.swing.JScrollPane;
58import javax.swing.JSplitPane;
59import javax.swing.JTextArea;
60import javax.swing.JTextField;
61import javax.swing.ListSelectionModel;
62import javax.swing.SwingConstants;
63import javax.swing.SwingUtilities;
64
65import weka.core.Attribute;
66import weka.core.ClassDiscovery;
67import weka.core.Instance;
68import weka.core.Instances;
69import weka.core.Range;
70import weka.core.converters.CSVLoader;
71import weka.experiment.CSVResultListener;
72import weka.experiment.DatabaseResultListener;
73import weka.experiment.Experiment;
74import weka.experiment.InstanceQuery;
75import weka.experiment.PairedCorrectedTTester;
76import weka.experiment.ResultMatrix;
77import weka.experiment.ResultMatrixPlainText;
78import weka.experiment.Tester;
79import weka.gui.DatabaseConnectionDialog;
80import weka.gui.ExtensionFileFilter;
81import weka.gui.GenericObjectEditor;
82import weka.gui.ListSelectorDialog;
83import weka.gui.PropertyDialog;
84import weka.gui.ResultHistoryPanel;
85import weka.gui.SaveBuffer;
86
87/**
88 * This panel controls simple analysis of experimental results.
89 *
90 * @author Len Trigg (trigg@cs.waikato.ac.nz)
91 * @version $Revision: 6087 $
92 */
93public class ResultsPanel
94  extends JPanel {
95
96  /** for serialization. */
97  private static final long serialVersionUID = -4913007978534178569L;
98
99  /** Message shown when no experimental results have been loaded. */
100  protected static final String NO_SOURCE = "No source";
101
102  /** Click to load results from a file. */
103  protected JButton m_FromFileBut = new JButton("File...");
104
105  /** Click to load results from a database. */
106  protected JButton m_FromDBaseBut = new JButton("Database...");
107
108  /** Click to get results from the destination given in the experiment. */
109  protected JButton m_FromExpBut = new JButton("Experiment");
110
111  /** Displays a message about the current result set. */
112  protected JLabel m_FromLab = new JLabel(NO_SOURCE);
113
114  /**
115   * This is needed to get around a bug in Swing <= 1.1 -- Once everyone
116   * is using Swing 1.1.1 or higher just remove this variable and use the
117   * no-arg constructor to DefaultComboBoxModel.
118   */
119  private static String [] FOR_JFC_1_1_DCBM_BUG = {""};
120
121  /** The model embedded in m_DatasetCombo. */
122  protected DefaultComboBoxModel m_DatasetModel =
123    new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);
124 
125  /** The model embedded in m_CompareCombo. */
126  protected DefaultComboBoxModel m_CompareModel = 
127    new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);
128 
129  /** The model embedded in m_SortCombo. */
130  protected DefaultComboBoxModel m_SortModel = 
131    new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);
132 
133  /** The model embedded in m_TestsList. */
134  protected DefaultListModel m_TestsModel = new DefaultListModel();
135 
136  /** The model embedded in m_DisplayedList. */
137  protected DefaultListModel m_DisplayedModel = new DefaultListModel();
138
139  /** Displays the currently selected Tester-Class. */
140  protected JLabel m_TesterClassesLabel = new JLabel("Testing with",
141                                                 SwingConstants.RIGHT);
142 
143  /** Contains all the available classes implementing the Tester-Interface
144   * (the display names).
145   * @see Tester */
146  protected static DefaultComboBoxModel m_TesterClassesModel = 
147    new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);
148
149  /** Contains all the available classes implementing the Tester-Interface
150   * (the actual Classes).
151   * @see Tester */
152  protected static Vector m_Testers = null;
153 
154  /** determine all classes implementing the Tester interface (in the same
155   * package!).
156   * @see Tester
157   * @see ClassDiscovery */
158  static {
159    Vector classes = GenericObjectEditor.getClassnames(Tester.class.getName());
160
161    // set names and classes
162    m_Testers            = new Vector();
163    m_TesterClassesModel = new DefaultComboBoxModel();
164    for (int i = 0; i < classes.size(); i++) {
165      try {
166        Class cls = Class.forName(classes.get(i).toString());
167        Tester tester = (Tester) cls.newInstance();
168        m_Testers.add(cls);
169        m_TesterClassesModel.addElement(tester.getDisplayName());
170      }
171      catch (Exception e) {
172        e.printStackTrace();
173      }
174    }
175  }
176
177  /** Lists all the available classes implementing the Tester-Interface.
178   * @see Tester */
179  protected JComboBox m_TesterClasses = 
180    new JComboBox(m_TesterClassesModel);
181
182  /** Label for the dataset and result key buttons. */
183  protected JLabel m_DatasetAndResultKeysLabel = new JLabel("Select rows and cols",
184                                                 SwingConstants.RIGHT);
185
186  /** the panel encapsulating the Rows/Columns/Swap buttons. */
187  protected JPanel m_PanelDatasetResultKeys = new JPanel(new GridLayout(1, 3));
188 
189  /** Click to edit the columns used to determine the scheme. */
190  protected JButton m_DatasetKeyBut = new JButton("Rows");
191
192  /** Stores the list of attributes for selecting the scheme columns. */
193  protected DefaultListModel m_DatasetKeyModel = new DefaultListModel();
194
195  /** Displays the list of selected columns determining the scheme. */
196  protected JList m_DatasetKeyList = new JList(m_DatasetKeyModel);
197
198  /** Click to edit the columns used to determine the scheme. */
199  protected JButton m_ResultKeyBut = new JButton("Cols");
200
201  /** For swapping rows and columns. */
202  protected JButton m_SwapDatasetKeyAndResultKeyBut = new JButton("Swap");
203
204  /** Stores the list of attributes for selecting the scheme columns. */
205  protected DefaultListModel m_ResultKeyModel = new DefaultListModel();
206
207  /** Displays the list of selected columns determining the scheme. */
208  protected JList m_ResultKeyList = new JList(m_ResultKeyModel);
209
210  /** Lets the user select which scheme to base comparisons against. */
211  protected JButton m_TestsButton = new JButton("Select");
212
213  /** Lets the user select which schemes are compared to base. */
214  protected JButton m_DisplayedButton = new JButton("Select");
215
216  /** Holds the list of schemes to base the test against. */
217  protected JList m_TestsList = new JList(m_TestsModel);
218
219  /** Holds the list of schemes to display. */
220  protected JList m_DisplayedList = new JList(m_DisplayedModel);
221
222  /** Lets the user select which performance measure to analyze. */
223  protected JComboBox m_CompareCombo = new JComboBox(m_CompareModel);
224
225  /** Lets the user select which column to use for sorting. */
226  protected JComboBox m_SortCombo = new JComboBox(m_SortModel);
227
228  /** Lets the user edit the test significance. */
229  protected JTextField m_SigTex = new JTextField(
230      "" + ExperimenterDefaults.getSignificance());
231
232  /** Lets the user select whether standard deviations are to be output
233      or not. */
234  protected JCheckBox m_ShowStdDevs = 
235    new JCheckBox("");
236 
237  /** lets the user choose the format for the output. */
238  protected JButton m_OutputFormatButton = new JButton("Select");
239
240  /** Click to start the test. */
241  protected JButton m_PerformBut = new JButton("Perform test");
242 
243  /** Click to save test output to a file. */
244  protected JButton m_SaveOutBut = new JButton("Save output");
245
246  /** The buffer saving object for saving output. */
247  SaveBuffer m_SaveOut = new SaveBuffer(null, this);
248
249  /** Displays the output of tests. */
250  protected JTextArea m_OutText = new JTextArea();
251
252  /** A panel controlling results viewing. */
253  protected ResultHistoryPanel m_History = new ResultHistoryPanel(m_OutText);
254 
255  /** The file chooser for selecting result files. */
256  protected JFileChooser m_FileChooser = new JFileChooser(new File(System.getProperty("user.dir")));
257 
258  // File filters for various file types.
259  /** CSV file filter. */
260  protected ExtensionFileFilter m_csvFileFilter = 
261    new ExtensionFileFilter(CSVLoader.FILE_EXTENSION, "CSV data files");
262
263  /** ARFF file filter. */
264  protected ExtensionFileFilter m_arffFileFilter = 
265    new ExtensionFileFilter(Instances.FILE_EXTENSION, "Arff data files");
266
267  /** The PairedTTester object. */
268  protected Tester m_TTester = new PairedCorrectedTTester();
269 
270  /** The instances we're extracting results from. */
271  protected Instances m_Instances;
272
273  /** Does any database querying for us. */
274  protected InstanceQuery m_InstanceQuery;
275
276  /** A thread to load results instances from a file or database. */
277  protected Thread m_LoadThread;
278 
279  /** An experiment (used for identifying a result source) -- optional. */
280  protected Experiment m_Exp;
281
282  /** the size for a combobox. */
283  private Dimension COMBO_SIZE = new Dimension(210, m_ResultKeyBut.getPreferredSize().height);
284
285  /** the initial result matrix. */
286  protected ResultMatrix m_ResultMatrix = new ResultMatrixPlainText();
287 
288  /**
289   * Creates the results panel with no initial experiment.
290   */
291  public ResultsPanel() {
292
293    // defaults
294    m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
295    m_TTester.setShowStdDevs(ExperimenterDefaults.getShowStdDevs());
296    m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
297    m_ResultMatrix.setShowStdDev(ExperimenterDefaults.getShowStdDevs());
298    m_ResultMatrix.setMeanPrec(ExperimenterDefaults.getMeanPrecision());
299    m_ResultMatrix.setStdDevPrec(ExperimenterDefaults.getStdDevPrecision());
300    m_ResultMatrix.setRemoveFilterName(ExperimenterDefaults.getRemoveFilterClassnames());
301    m_ResultMatrix.setShowAverage(ExperimenterDefaults.getShowAverage());
302
303    // Create/Configure/Connect components
304   
305    m_FileChooser.
306      addChoosableFileFilter(m_csvFileFilter);
307    m_FileChooser.
308      addChoosableFileFilter(m_arffFileFilter);
309
310    m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
311    m_FromExpBut.setEnabled(false);
312    m_FromExpBut.setMnemonic('E');
313    m_FromExpBut.addActionListener(new ActionListener() {
314      public void actionPerformed(ActionEvent e) {
315        if (m_LoadThread == null) {
316          m_LoadThread = new Thread() {
317            public void run() {
318              setInstancesFromExp(m_Exp);
319              m_LoadThread = null;
320            }
321          };
322          m_LoadThread.start();
323        }
324      }
325    });
326    m_FromDBaseBut.setMnemonic('D');
327    m_FromDBaseBut.addActionListener(new ActionListener() {
328      public void actionPerformed(ActionEvent e) {
329        if (m_LoadThread == null) {
330          m_LoadThread = new Thread() {
331            public void run() {
332              setInstancesFromDBaseQuery();
333            m_LoadThread = null;
334            }
335          };
336          m_LoadThread.start();
337        }
338      }
339    });
340    m_FromFileBut.setMnemonic('F');
341    m_FromFileBut.addActionListener(new ActionListener() {
342      public void actionPerformed(ActionEvent e) {
343        int returnVal = m_FileChooser.showOpenDialog(ResultsPanel.this);
344        if (returnVal == JFileChooser.APPROVE_OPTION) {
345          final File selected = m_FileChooser.getSelectedFile();
346          if (m_LoadThread == null) {
347            m_LoadThread = new Thread() {
348              public void run() {
349                setInstancesFromFile(selected);
350                m_LoadThread = null;
351              }
352            };
353            m_LoadThread.start();
354          }
355        }
356      }
357    });
358    setComboSizes();
359    m_TesterClasses.setEnabled(false);
360    m_DatasetKeyBut.setEnabled(false);
361    m_DatasetKeyBut.setToolTipText("For selecting the keys that are shown as rows.");
362    m_DatasetKeyBut.addActionListener(new ActionListener() {
363      public void actionPerformed(ActionEvent e) {
364        setDatasetKeyFromDialog();
365      }
366    });
367    m_DatasetKeyList.setSelectionMode(ListSelectionModel
368                                      .MULTIPLE_INTERVAL_SELECTION);
369    m_ResultKeyBut.setEnabled(false);
370    m_ResultKeyBut.setToolTipText("For selecting the keys that are shown as columns.");
371    m_ResultKeyBut.addActionListener(new ActionListener() {
372      public void actionPerformed(ActionEvent e) {
373        setResultKeyFromDialog();
374      }
375    });
376    m_ResultKeyList.setSelectionMode(ListSelectionModel
377                                     .MULTIPLE_INTERVAL_SELECTION);
378    m_SwapDatasetKeyAndResultKeyBut.setEnabled(false);
379    m_SwapDatasetKeyAndResultKeyBut.setToolTipText("Swaps the keys for selecting rows and columns.");
380    m_SwapDatasetKeyAndResultKeyBut.addActionListener(new ActionListener() {
381      public void actionPerformed(ActionEvent e) {
382        swapDatasetKeyAndResultKey();
383      }
384    });
385    m_CompareCombo.setEnabled(false);
386    m_SortCombo.setEnabled(false);
387
388    m_SigTex.setEnabled(false);
389    m_TestsButton.setEnabled(false);
390    m_TestsButton.addActionListener(new ActionListener() {
391        public void actionPerformed(ActionEvent e) {
392          setTestBaseFromDialog();
393        }
394      });
395
396    m_DisplayedButton.setEnabled(false);
397    m_DisplayedButton.addActionListener(new ActionListener() {
398      public void actionPerformed(ActionEvent e) {
399        setDisplayedFromDialog();
400      }
401      });
402
403    m_ShowStdDevs.setEnabled(false);
404    m_ShowStdDevs.setSelected(ExperimenterDefaults.getShowStdDevs());
405    m_OutputFormatButton.setEnabled(false);
406    m_OutputFormatButton.addActionListener(new ActionListener() {
407      public void actionPerformed(ActionEvent e) {
408        setOutputFormatFromDialog();
409      }
410      });
411   
412    m_PerformBut.setEnabled(false);
413    m_PerformBut.addActionListener(new ActionListener() {
414      public void actionPerformed(ActionEvent e) {
415        performTest();
416        m_SaveOutBut.setEnabled(true);
417      }
418    });
419
420    m_PerformBut.setToolTipText(m_TTester.getToolTipText());
421
422    m_SaveOutBut.setEnabled(false);
423    m_SaveOutBut.addActionListener(new ActionListener() {
424        public void actionPerformed(ActionEvent e) {
425          saveBuffer();
426        }
427      });
428    m_OutText.setFont(new Font("Monospaced", Font.PLAIN, 12));
429    m_OutText.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
430    m_OutText.setEditable(false);
431    m_History.setBorder(BorderFactory.createTitledBorder("Result list"));
432
433
434    // Set up the GUI layout
435    JPanel p1 = new JPanel();
436    p1.setBorder(BorderFactory.createTitledBorder("Source"));
437    JPanel p2 = new JPanel();
438    GridBagLayout gb = new GridBagLayout();
439    GridBagConstraints constraints = new GridBagConstraints();
440    p2.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
441    //    p2.setLayout(new GridLayout(1, 3));
442    p2.setLayout(gb);
443    constraints.gridx=0;constraints.gridy=0;constraints.weightx=5;
444    constraints.fill = GridBagConstraints.HORIZONTAL;
445    constraints.gridwidth=1;constraints.gridheight=1;
446    constraints.insets = new Insets(0,2,0,2);
447    p2.add(m_FromFileBut,constraints);
448    constraints.gridx=1;constraints.gridy=0;constraints.weightx=5;
449    constraints.gridwidth=1;constraints.gridheight=1;
450    p2.add(m_FromDBaseBut,constraints);
451    constraints.gridx=2;constraints.gridy=0;constraints.weightx=5;
452    constraints.gridwidth=1;constraints.gridheight=1;
453    p2.add(m_FromExpBut,constraints);
454    p1.setLayout(new BorderLayout());
455    p1.add(m_FromLab, BorderLayout.CENTER);
456    p1.add(p2, BorderLayout.EAST);
457
458    JPanel p3 = new JPanel();
459    p3.setBorder(BorderFactory.createTitledBorder("Configure test"));
460    GridBagLayout gbL = new GridBagLayout();
461    p3.setLayout(gbL);
462
463    int y = 0;
464    GridBagConstraints gbC = new GridBagConstraints();
465    gbC.anchor = GridBagConstraints.EAST;
466    gbC.gridy = y;     gbC.gridx = 0;
467    gbC.insets = new Insets(2, 10, 2, 10);
468    gbL.setConstraints(m_TesterClassesLabel,gbC);
469    m_TesterClassesLabel.setDisplayedMnemonic('w');
470    m_TesterClassesLabel.setLabelFor(m_TesterClasses);
471    p3.add(m_TesterClassesLabel);
472    gbC = new GridBagConstraints();
473    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
474    gbC.insets = new Insets(5,0,5,0);
475    gbC.fill = GridBagConstraints.HORIZONTAL;
476    gbL.setConstraints(m_TesterClasses, gbC);
477    p3.add(m_TesterClasses);
478    m_TesterClasses.addActionListener(new ActionListener() {
479        public void actionPerformed(ActionEvent e) {
480          setTester();
481        }
482      });
483    setSelectedItem(m_TesterClasses, ExperimenterDefaults.getTester());
484   
485    y++;
486    gbC = new GridBagConstraints();
487    gbC.anchor = GridBagConstraints.EAST;
488    gbC.gridy = y;     gbC.gridx = 0;
489    gbC.insets = new Insets(2, 10, 2, 10);
490    gbL.setConstraints(m_DatasetAndResultKeysLabel,gbC);
491    m_DatasetAndResultKeysLabel.setDisplayedMnemonic('R');
492    m_DatasetAndResultKeysLabel.setLabelFor(m_DatasetKeyBut);
493    p3.add(m_DatasetAndResultKeysLabel);
494   
495    m_PanelDatasetResultKeys.add(m_DatasetKeyBut);
496    m_PanelDatasetResultKeys.add(m_ResultKeyBut);
497    m_PanelDatasetResultKeys.add(m_SwapDatasetKeyAndResultKeyBut);
498    gbC = new GridBagConstraints();
499    gbC.fill = GridBagConstraints.HORIZONTAL;
500    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
501    gbC.insets = new Insets(5,0,5,0);
502    gbL.setConstraints(m_PanelDatasetResultKeys, gbC);
503    p3.add(m_PanelDatasetResultKeys);
504   
505    y++;
506    JLabel lab = new JLabel("Comparison field", SwingConstants.RIGHT);
507    lab.setDisplayedMnemonic('m');
508    lab.setLabelFor(m_CompareCombo);
509    gbC = new GridBagConstraints();
510    gbC.anchor = GridBagConstraints.EAST;
511    gbC.gridy = y;     gbC.gridx = 0;
512    gbC.insets = new Insets(2, 10, 2, 10);
513    gbL.setConstraints(lab, gbC);
514    p3.add(lab);
515    gbC = new GridBagConstraints();
516    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
517    gbC.insets = new Insets(5,0,5,0);
518    gbC.fill = GridBagConstraints.HORIZONTAL;
519    gbL.setConstraints(m_CompareCombo, gbC);
520    p3.add(m_CompareCombo);
521   
522    y++;
523    lab = new JLabel("Significance", SwingConstants.RIGHT);
524    lab.setDisplayedMnemonic('g');
525    lab.setLabelFor(m_SigTex);
526    gbC = new GridBagConstraints();
527    gbC.anchor = GridBagConstraints.EAST;
528    gbC.gridy = y;     gbC.gridx = 0;
529    gbC.insets = new Insets(2, 10, 2, 10);
530    gbL.setConstraints(lab, gbC);
531    p3.add(lab);
532    gbC = new GridBagConstraints();
533    gbC.fill = GridBagConstraints.HORIZONTAL;
534    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
535    gbL.setConstraints(m_SigTex, gbC);
536    p3.add(m_SigTex);
537   
538    y++;
539    lab = new JLabel("Sorting (asc.) by", SwingConstants.RIGHT);
540    lab.setDisplayedMnemonic('S');
541    lab.setLabelFor(m_SortCombo);
542    gbC = new GridBagConstraints();
543    gbC.anchor = GridBagConstraints.EAST;
544    gbC.gridy = y;     gbC.gridx = 0;
545    gbC.insets = new Insets(2, 10, 2, 10);
546    gbL.setConstraints(lab, gbC);
547    p3.add(lab);
548    gbC = new GridBagConstraints();
549    gbC.anchor = GridBagConstraints.WEST;
550    gbC.fill = GridBagConstraints.HORIZONTAL;
551    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
552    gbC.insets = new Insets(5,0,5,0);
553    gbL.setConstraints(m_SortCombo, gbC);
554    p3.add(m_SortCombo);
555   
556    y++;
557    lab = new JLabel("Test base", SwingConstants.RIGHT);
558    lab.setDisplayedMnemonic('b');
559    lab.setLabelFor(m_TestsButton);
560    gbC = new GridBagConstraints();
561    gbC.anchor = GridBagConstraints.EAST;
562    gbC.gridy = y;     gbC.gridx = 0;
563    gbC.insets = new Insets(2, 10, 2, 10);
564    gbL.setConstraints(lab, gbC);
565    p3.add(lab);
566    gbC = new GridBagConstraints();
567    gbC.fill = GridBagConstraints.HORIZONTAL;
568    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
569    gbC.insets = new Insets(5,0,5,0);
570    gbL.setConstraints(m_TestsButton, gbC);
571    p3.add(m_TestsButton);
572
573    y++;
574    lab = new JLabel("Displayed Columns", SwingConstants.RIGHT);
575    lab.setDisplayedMnemonic('i');
576    lab.setLabelFor(m_DisplayedButton);
577    gbC = new GridBagConstraints();
578    gbC.anchor = GridBagConstraints.EAST;
579    gbC.gridy = y;     gbC.gridx = 0;
580    gbC.insets = new Insets(2, 10, 2, 10);
581    gbL.setConstraints(lab, gbC);
582    p3.add(lab);
583    gbC = new GridBagConstraints();
584    gbC.fill = GridBagConstraints.HORIZONTAL;
585    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
586    gbC.insets = new Insets(5,0,5,0);
587    gbL.setConstraints(m_DisplayedButton, gbC);
588    p3.add(m_DisplayedButton);
589
590    y++;
591    lab = new JLabel("Show std. deviations", SwingConstants.RIGHT);
592    lab.setDisplayedMnemonic('a');
593    lab.setLabelFor(m_ShowStdDevs);
594    gbC = new GridBagConstraints();
595    gbC.anchor = GridBagConstraints.EAST;
596    gbC.gridy = y;     gbC.gridx = 0;
597    gbC.insets = new Insets(2, 10, 2, 10);
598    gbL.setConstraints(lab, gbC);
599    p3.add(lab);
600    gbC = new GridBagConstraints();
601    gbC.anchor = GridBagConstraints.WEST;
602    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
603    gbC.insets = new Insets(5,0,5,0);
604    gbL.setConstraints(m_ShowStdDevs, gbC);
605    p3.add(m_ShowStdDevs);
606
607    y++;
608    lab = new JLabel("Output Format", SwingConstants.RIGHT);
609    lab.setDisplayedMnemonic('O');
610    lab.setLabelFor(m_OutputFormatButton);
611    gbC = new GridBagConstraints();
612    gbC.anchor = GridBagConstraints.EAST;
613    gbC.gridy = y;     gbC.gridx = 0;
614    gbC.insets = new Insets(2, 10, 2, 10);
615    gbL.setConstraints(lab, gbC);
616    p3.add(lab);
617    gbC = new GridBagConstraints();
618    gbC.anchor = GridBagConstraints.WEST;
619    gbC.fill = GridBagConstraints.HORIZONTAL;
620    gbC.gridy = y;     gbC.gridx = 1;  gbC.weightx = 100;
621    gbC.insets = new Insets(5,0,5,0);
622    gbL.setConstraints(m_OutputFormatButton, gbC);
623    p3.add(m_OutputFormatButton);
624   
625    JPanel output = new JPanel();
626    output.setLayout(new BorderLayout());
627    output.setBorder(BorderFactory.createTitledBorder("Test output"));
628    output.add(new JScrollPane(m_OutText), BorderLayout.CENTER);
629
630    JPanel mondo = new JPanel();
631    gbL = new GridBagLayout();
632    mondo.setLayout(gbL);
633    gbC = new GridBagConstraints();
634    //    gbC.anchor = GridBagConstraints.WEST;
635    //    gbC.fill = GridBagConstraints.HORIZONTAL;
636    gbC.gridy = 0;     gbC.gridx = 0;
637    gbL.setConstraints(p3, gbC);
638    mondo.add(p3);
639
640    JPanel bts = new JPanel();
641    m_PerformBut.setMnemonic('t');
642    m_SaveOutBut.setMnemonic('S');
643    bts.setLayout(new GridLayout(1,2,5,5));
644    bts.add(m_PerformBut);
645    bts.add(m_SaveOutBut);
646
647    gbC = new GridBagConstraints();
648    gbC.anchor = GridBagConstraints.NORTH;
649    gbC.fill = GridBagConstraints.HORIZONTAL;
650    gbC.gridy = 1;     gbC.gridx = 0;
651    gbC.insets = new Insets(5,5,5,5);
652    gbL.setConstraints(bts, gbC);
653    mondo.add(bts);
654    gbC = new GridBagConstraints();
655    //gbC.anchor = GridBagConstraints.NORTH;
656    gbC.fill = GridBagConstraints.BOTH;
657    gbC.gridy = 2;     gbC.gridx = 0; gbC.weightx = 0;
658    gbC.weighty = 100;
659    gbL.setConstraints(m_History, gbC);
660    mondo.add(m_History);
661    /*gbC = new GridBagConstraints();
662    gbC.fill = GridBagConstraints.BOTH;
663    gbC.gridy = 0;     gbC.gridx = 1;
664    gbC.gridheight = 3;
665    gbC.weightx = 100; gbC.weighty = 100;
666    gbL.setConstraints(output, gbC);*/
667    //mondo.add(output);
668    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
669                                          mondo, output);
670    splitPane.setOneTouchExpandable(true);
671    //splitPane.setDividerLocation(100);
672
673    setLayout(new BorderLayout());
674    add(p1, BorderLayout.NORTH);
675    //add(mondo , BorderLayout.CENTER);
676    add(splitPane , BorderLayout.CENTER);
677  }
678
679  /**
680   * Sets the combo-boxes to a fixed size so they don't take up too much room
681   * that would be better devoted to the test output box.
682   */
683  protected void setComboSizes() {
684   
685    m_TesterClasses.setPreferredSize(COMBO_SIZE);
686    m_PanelDatasetResultKeys.setPreferredSize(COMBO_SIZE);
687    m_CompareCombo.setPreferredSize(COMBO_SIZE);
688    m_SigTex.setPreferredSize(COMBO_SIZE);
689    m_SortCombo.setPreferredSize(COMBO_SIZE);
690
691    m_TesterClasses.setMaximumSize(COMBO_SIZE);
692    m_PanelDatasetResultKeys.setMaximumSize(COMBO_SIZE);
693    m_CompareCombo.setMaximumSize(COMBO_SIZE);
694    m_SigTex.setMaximumSize(COMBO_SIZE);
695    m_SortCombo.setMaximumSize(COMBO_SIZE);
696
697    m_TesterClasses.setMinimumSize(COMBO_SIZE);
698    m_PanelDatasetResultKeys.setMinimumSize(COMBO_SIZE);
699    m_CompareCombo.setMinimumSize(COMBO_SIZE);
700    m_SigTex.setMinimumSize(COMBO_SIZE);
701    m_SortCombo.setMinimumSize(COMBO_SIZE);
702  }
703 
704  /**
705   * Tells the panel to use a new experiment.
706   *
707   * @param exp a value of type 'Experiment'
708   */
709  public void setExperiment(Experiment exp) {
710   
711    m_Exp = exp;
712    m_FromExpBut.setEnabled(exp != null);
713  }
714
715  /**
716   * Queries the user enough to make a database query to retrieve experiment
717   * results.
718   */
719  protected void setInstancesFromDBaseQuery() {
720
721    try {
722      if (m_InstanceQuery == null) {
723        m_InstanceQuery = new InstanceQuery();
724      }
725      String dbaseURL = m_InstanceQuery.getDatabaseURL();
726      String username = m_InstanceQuery.getUsername();
727      String passwd = m_InstanceQuery.getPassword();
728      /*dbaseURL = (String) JOptionPane.showInputDialog(this,
729                                             "Enter the database URL",
730                                             "Query Database",
731                                             JOptionPane.PLAIN_MESSAGE,
732                                             null,
733                                             null,
734                                             dbaseURL);*/
735     
736     
737     
738      DatabaseConnectionDialog dbd= new DatabaseConnectionDialog(null,dbaseURL,username);
739      dbd.setVisible(true);
740     
741      //if (dbaseURL == null) {
742      if (dbd.getReturnValue()==JOptionPane.CLOSED_OPTION) {
743        m_FromLab.setText("Cancelled");
744        return;
745      }
746      dbaseURL=dbd.getURL();
747      username=dbd.getUsername();
748      passwd=dbd.getPassword();
749      m_InstanceQuery.setDatabaseURL(dbaseURL);
750      m_InstanceQuery.setUsername(username);
751      m_InstanceQuery.setPassword(passwd);
752      m_InstanceQuery.setDebug(dbd.getDebug());
753     
754      m_InstanceQuery.connectToDatabase();
755      if (!m_InstanceQuery.experimentIndexExists()) {
756        System.err.println("not found");
757        m_FromLab.setText("No experiment index");
758        m_InstanceQuery.disconnectFromDatabase();
759        return;
760      }
761      System.err.println("found");
762      m_FromLab.setText("Getting experiment index");
763      Instances index = m_InstanceQuery.retrieveInstances("SELECT * FROM "
764                                       + InstanceQuery.EXP_INDEX_TABLE);
765      if (index.numInstances() == 0) {
766        m_FromLab.setText("No experiments available");
767        m_InstanceQuery.disconnectFromDatabase();
768        return; 
769      }
770      m_FromLab.setText("Got experiment index");
771
772      DefaultListModel lm = new DefaultListModel();
773      for (int i = 0; i < index.numInstances(); i++) {
774        lm.addElement(index.instance(i).toString());
775      }
776      JList jl = new JList(lm);
777      jl.setSelectedIndex(0);
778      int result;
779      // display dialog only if there's not just one result!
780      if (jl.getModel().getSize() != 1) {
781        ListSelectorDialog jd = new ListSelectorDialog(null, jl);
782        result = jd.showDialog();
783      }
784      else {
785        result = ListSelectorDialog.APPROVE_OPTION;
786      }
787      if (result != ListSelectorDialog.APPROVE_OPTION) {
788        m_FromLab.setText("Cancelled");
789        m_InstanceQuery.disconnectFromDatabase();
790        return;
791      }
792      Instance selInst = index.instance(jl.getSelectedIndex());
793      Attribute tableAttr = index.attribute(InstanceQuery.EXP_RESULT_COL);
794      String table = InstanceQuery.EXP_RESULT_PREFIX
795        + selInst.toString(tableAttr);
796      setInstancesFromDatabaseTable(table);
797     
798    } catch (Exception ex) {
799       // 1. print complete stacktrace
800       ex.printStackTrace();
801       // 2. print message in panel
802       m_FromLab.setText("Problem reading database: '" + ex.getMessage() + "'");
803    }
804  }
805 
806  /**
807   * Examines the supplied experiment to determine the results destination
808   * and attempts to load the results.
809   *
810   * @param exp a value of type 'Experiment'
811   */
812  protected void setInstancesFromExp(Experiment exp) {
813
814    if ((exp.getResultListener() instanceof CSVResultListener)) { 
815      File resultFile = ((CSVResultListener) exp.getResultListener())
816        .getOutputFile();
817      if ((resultFile == null)) {
818        m_FromLab.setText("No result file");
819      } else {
820        setInstancesFromFile(resultFile);
821      }
822    } else if (exp.getResultListener() instanceof DatabaseResultListener) {
823      String dbaseURL = ((DatabaseResultListener) exp.getResultListener())
824        .getDatabaseURL();
825      try {
826        if (m_InstanceQuery == null) {
827          m_InstanceQuery = new InstanceQuery();
828        }
829        m_InstanceQuery.setDatabaseURL(dbaseURL);
830        m_InstanceQuery.connectToDatabase();
831        String tableName = m_InstanceQuery
832          .getResultsTableName(exp.getResultProducer());
833        setInstancesFromDatabaseTable(tableName);
834      } catch (Exception ex) {
835        m_FromLab.setText("Problem reading database");
836      }
837    } else {
838      m_FromLab.setText("Can't get results from experiment");
839    }
840  }
841
842 
843  /**
844   * Queries a database to load results from the specified table name. The
845   * database connection must have already made by m_InstanceQuery.
846   *
847   * @param tableName the name of the table containing results to retrieve.
848   */
849  protected void setInstancesFromDatabaseTable(String tableName) {
850
851    try {
852      m_FromLab.setText("Reading from database, please wait...");
853      final Instances i = m_InstanceQuery.retrieveInstances("SELECT * FROM "
854                                                      + tableName);
855      SwingUtilities.invokeAndWait(new Runnable() {
856        public void run() {
857          setInstances(i);
858        }
859      });
860      m_InstanceQuery.disconnectFromDatabase();
861    } catch (Exception ex) {
862      m_FromLab.setText(ex.getMessage());
863    }
864  }
865 
866  /**
867   * Loads results from a set of instances contained in the supplied
868   * file.
869   *
870   * @param f a value of type 'File'
871   */
872  protected void setInstancesFromFile(File f) {
873
874    String fileType = f.getName();
875    try {
876      m_FromLab.setText("Reading from file...");
877      if (f.getName().toLowerCase().endsWith(Instances.FILE_EXTENSION)) {           
878        fileType = "arff";
879        Reader r = new BufferedReader(new FileReader(f));
880        setInstances(new Instances(r));
881        r.close();
882      } else if (f.getName().toLowerCase().endsWith(CSVLoader.FILE_EXTENSION)) {
883        fileType = "csv";
884        CSVLoader cnv = new CSVLoader();
885        cnv.setSource(f);
886        Instances inst = cnv.getDataSet();
887        setInstances(inst);
888      } else {
889        throw new Exception("Unrecognized file type");
890      }
891    } catch (Exception ex) {
892      m_FromLab.setText("File '" + f.getName() + "' not recognised as an "
893                          +fileType+" file.");
894      if (JOptionPane.showOptionDialog(ResultsPanel.this,
895                                       "File '" + f.getName()
896                                       + "' not recognised as an "
897                                       +fileType+" file.\n"
898                                       + "Reason:\n" + ex.getMessage(),
899                                       "Load Instances",
900                                       0,
901                                       JOptionPane.ERROR_MESSAGE,
902                                       null,
903                                       new String[] {"OK"},
904                                       null) == 1) {
905       
906      }
907    } 
908  }
909 
910  /**
911   * Returns a vector with column names of the dataset, listed in "list". If
912   * a column cannot be found or the list is empty the ones from the default
913   * list are returned.
914   *
915   * @param list           comma-separated list of attribute names
916   * @param defaultList    the default list of attribute names
917   * @param inst           the instances to get the attribute names from
918   * @return               a vector containing attribute names
919   */
920  protected Vector determineColumnNames(String list, String defaultList, Instances inst) {
921    Vector              result;
922    Vector              atts;
923    StringTokenizer     tok;
924    int                 i;
925    String              item;
926   
927    // get attribute names
928    atts = new Vector();
929    for (i = 0; i < inst.numAttributes(); i++)
930      atts.add(inst.attribute(i).name().toLowerCase());
931
932    // process list
933    result = new Vector();
934    tok = new StringTokenizer(list, ",");
935    while (tok.hasMoreTokens()) {
936      item = tok.nextToken().toLowerCase();
937      if (atts.contains(item)) {
938        result.add(item);
939      }
940      else {
941        result.clear();
942        break;
943      }
944    }
945   
946    // do we have to return defaults?
947    if (result.size() == 0) {
948      tok = new StringTokenizer(defaultList, ",");
949      while (tok.hasMoreTokens())
950        result.add(tok.nextToken().toLowerCase());
951    }
952   
953    return result;
954  }
955
956  /**
957   * Sets up the panel with a new set of instances, attempting
958   * to guess the correct settings for various columns.
959   *
960   * @param newInstances the new set of results.
961   */
962  public void setInstances(Instances newInstances) {
963
964    m_Instances = newInstances;
965    m_TTester.setInstances(m_Instances);
966    m_FromLab.setText("Got " + m_Instances.numInstances() + " results");
967   
968    // setup row and column names
969    Vector rows = determineColumnNames(
970        ExperimenterDefaults.getRow(), "Key_Dataset", m_Instances);
971    Vector cols = determineColumnNames(
972        ExperimenterDefaults.getColumn(), "Key_Scheme,Key_Scheme_options,Key_Scheme_version_ID", m_Instances);
973   
974    // Do other stuff
975    m_DatasetKeyModel.removeAllElements();
976    m_ResultKeyModel.removeAllElements();
977    m_CompareModel.removeAllElements();
978    m_SortModel.removeAllElements();
979    m_SortModel.addElement("<default>");
980    m_TTester.setSortColumn(-1);
981    String selectedList = "";
982    String selectedListDataset = "";
983    boolean comparisonFieldSet = false; 
984    for (int i = 0; i < m_Instances.numAttributes(); i++) {
985      String name = m_Instances.attribute(i).name();
986      if (name.toLowerCase().startsWith("key_", 0)) {
987        m_DatasetKeyModel.addElement(name.substring(4));
988        m_ResultKeyModel.addElement(name.substring(4));
989        m_CompareModel.addElement(name.substring(4));
990      } else {
991        m_DatasetKeyModel.addElement(name);
992        m_ResultKeyModel.addElement(name);
993        m_CompareModel.addElement(name);
994        if (m_Instances.attribute(i).isNumeric())
995          m_SortModel.addElement(name);
996      }
997
998      if (rows.contains(name.toLowerCase())) {
999        m_DatasetKeyList.addSelectionInterval(i, i);
1000        selectedListDataset += "," + (i + 1);
1001      } else if (name.toLowerCase().equals("key_run")) {
1002        m_TTester.setRunColumn(i);
1003      } else if (name.toLowerCase().equals("key_fold")) {
1004        m_TTester.setFoldColumn(i);
1005      } else if (cols.contains(name.toLowerCase())) {
1006        m_ResultKeyList.addSelectionInterval(i, i);
1007        selectedList += "," + (i + 1);
1008      } else if (name.toLowerCase().indexOf(ExperimenterDefaults.getComparisonField()) != -1) {
1009        m_CompareCombo.setSelectedIndex(i);
1010        comparisonFieldSet = true;
1011        //      break;
1012      } else if ((name.toLowerCase().indexOf("root_relative_squared_error") != -1) &&
1013          (!comparisonFieldSet)) {
1014        m_CompareCombo.setSelectedIndex(i);
1015        comparisonFieldSet = true;
1016      }
1017    }
1018    m_TesterClasses.setEnabled(true);
1019    m_DatasetKeyBut.setEnabled(true);
1020    m_ResultKeyBut.setEnabled(true);
1021    m_SwapDatasetKeyAndResultKeyBut.setEnabled(true);
1022    m_CompareCombo.setEnabled(true);
1023    m_SortCombo.setEnabled(true);
1024    if (ExperimenterDefaults.getSorting().length() != 0)
1025      setSelectedItem(m_SortCombo, ExperimenterDefaults.getSorting());
1026
1027    Range generatorRange = new Range();
1028    if (selectedList.length() != 0) {
1029      try {
1030        generatorRange.setRanges(selectedList);
1031      } catch (Exception ex) {
1032        ex.printStackTrace();
1033        System.err.println(ex.getMessage());
1034      }
1035    }
1036    m_TTester.setResultsetKeyColumns(generatorRange);
1037
1038    generatorRange = new Range();
1039    if (selectedListDataset.length() != 0) {
1040      try {
1041        generatorRange.setRanges(selectedListDataset);
1042      } catch (Exception ex) {
1043        ex.printStackTrace();
1044        System.err.println(ex.getMessage());
1045      }
1046    }
1047    m_TTester.setDatasetKeyColumns(generatorRange);
1048
1049    m_SigTex.setEnabled(true);
1050
1051    setTTester();
1052  }
1053
1054  /**
1055   * Sets the selected item of an combobox, since using setSelectedItem(...)
1056   * doesn't work, if one checks object references!
1057   *
1058   * @param cb      the combobox to set the item for
1059   * @param item    the item to set active
1060   */
1061  protected void setSelectedItem(JComboBox cb, String item) {
1062    int       i;
1063
1064    for (i = 0; i < cb.getItemCount(); i++) {
1065      if (cb.getItemAt(i).toString().equals(item)) {
1066        cb.setSelectedIndex(i);
1067        break;
1068      }
1069    }
1070  }
1071
1072  /**
1073   * Updates the test chooser with possible tests.
1074   */
1075  protected void setTTester() {
1076   
1077    // default is to display all columns
1078    m_TTester.setDisplayedResultsets(null);       
1079
1080    String name = (new SimpleDateFormat("HH:mm:ss - "))
1081      .format(new Date())
1082      + "Available resultsets";
1083    StringBuffer outBuff = new StringBuffer();
1084    outBuff.append("Available resultsets\n"
1085                   + m_TTester.resultsetKey() + "\n\n");
1086    m_History.addResult(name, outBuff);
1087    m_History.setSingle(name);
1088
1089    m_TestsModel.removeAllElements();
1090    for (int i = 0; i < m_TTester.getNumResultsets(); i++) {
1091      String tname = m_TTester.getResultsetName(i);
1092      /*      if (tname.length() > 20) {
1093        tname = tname.substring(0, 20);
1094        } */
1095      m_TestsModel.addElement(tname);
1096    }
1097   
1098    m_DisplayedModel.removeAllElements();
1099    for (int i = 0; i < m_TestsModel.size(); i++)
1100      m_DisplayedModel.addElement(m_TestsModel.elementAt(i));
1101   
1102    m_TestsModel.addElement("Summary");
1103    m_TestsModel.addElement("Ranking");
1104
1105    m_TestsList.setSelectedIndex(0);
1106    m_DisplayedList.setSelectionInterval(0, m_DisplayedModel.size() - 1);
1107   
1108    m_TestsButton.setEnabled(true);
1109    m_DisplayedButton.setEnabled(true);
1110    m_ShowStdDevs.setEnabled(true);
1111    m_OutputFormatButton.setEnabled(true);
1112    m_PerformBut.setEnabled(true);
1113   
1114  }
1115
1116 
1117  /**
1118   * Carries out a t-test using the current configuration.
1119   */
1120  protected void performTest() {
1121
1122    String sigStr = m_SigTex.getText();
1123    if (sigStr.length() != 0) {
1124      m_TTester.setSignificanceLevel((new Double(sigStr)).doubleValue());
1125    } else {
1126      m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
1127    }
1128
1129    // Carry out the test chosen and biff the results to the output area
1130    m_TTester.setShowStdDevs(m_ShowStdDevs.isSelected());
1131    if (m_Instances.attribute(m_SortCombo.getSelectedItem().toString()) != null)
1132      m_TTester.setSortColumn(
1133          m_Instances.attribute(
1134            m_SortCombo.getSelectedItem().toString()).index());
1135    else
1136      m_TTester.setSortColumn(-1);
1137    int compareCol = m_CompareCombo.getSelectedIndex();
1138    int tType = m_TestsList.getSelectedIndex();
1139
1140    String name = (new SimpleDateFormat("HH:mm:ss - "))
1141      .format(new Date())
1142      + (String) m_CompareCombo.getSelectedItem() + " - "
1143      + (String) m_TestsList.getSelectedValue();
1144    StringBuffer outBuff = new StringBuffer();
1145    outBuff.append(m_TTester.header(compareCol));
1146    outBuff.append("\n");
1147    m_History.addResult(name, outBuff);
1148    m_History.setSingle(name);
1149    m_TTester.setDisplayedResultsets(m_DisplayedList.getSelectedIndices());
1150    m_TTester.setResultMatrix(m_ResultMatrix);
1151    try {
1152      if (tType < m_TTester.getNumResultsets()) {
1153        outBuff.append(m_TTester.multiResultsetFull(tType, compareCol));
1154      } else if (tType == m_TTester.getNumResultsets()) {
1155        outBuff.append(m_TTester.multiResultsetSummary(compareCol));
1156      } else {
1157        outBuff.append(m_TTester.multiResultsetRanking(compareCol));
1158      }
1159      outBuff.append("\n");
1160    } catch (Exception ex) {
1161      outBuff.append(ex.getMessage() + "\n");
1162    }
1163    m_History.updateResult(name);
1164  }
1165
1166 
1167  public void setResultKeyFromDialog() {
1168
1169    ListSelectorDialog jd = new ListSelectorDialog(null, m_ResultKeyList);
1170
1171    // Open the dialog
1172    int result = jd.showDialog();
1173 
1174    // If accepted, update the ttester
1175    if (result == ListSelectorDialog.APPROVE_OPTION) {
1176      int [] selected = m_ResultKeyList.getSelectedIndices();
1177      String selectedList = "";
1178      for (int i = 0; i < selected.length; i++) {
1179        selectedList += "," + (selected[i] + 1);
1180      }
1181      Range generatorRange = new Range();
1182      if (selectedList.length() != 0) {
1183        try {
1184          generatorRange.setRanges(selectedList);
1185        } catch (Exception ex) {
1186          ex.printStackTrace();
1187          System.err.println(ex.getMessage());
1188        }
1189      }
1190      m_TTester.setResultsetKeyColumns(generatorRange);
1191      setTTester();
1192    }
1193  }
1194 
1195  public void setDatasetKeyFromDialog() {
1196
1197    ListSelectorDialog jd = new ListSelectorDialog(null, m_DatasetKeyList);
1198
1199    // Open the dialog
1200    int result = jd.showDialog();
1201   
1202    // If accepted, update the ttester
1203    if (result == ListSelectorDialog.APPROVE_OPTION) {
1204      int [] selected = m_DatasetKeyList.getSelectedIndices();
1205      String selectedList = "";
1206      for (int i = 0; i < selected.length; i++) {
1207        selectedList += "," + (selected[i] + 1);
1208      }
1209      Range generatorRange = new Range();
1210      if (selectedList.length() != 0) {
1211        try {
1212          generatorRange.setRanges(selectedList);
1213        } catch (Exception ex) {
1214          ex.printStackTrace();
1215          System.err.println(ex.getMessage());
1216        }
1217      }
1218      m_TTester.setDatasetKeyColumns(generatorRange);
1219      setTTester();
1220    }
1221  }
1222
1223  /**
1224   * Swaps the keys for dataset and result.
1225   */
1226  protected void swapDatasetKeyAndResultKey() {
1227    int[]       tmpSelected;
1228    Range       tmpRange;
1229   
1230    // lists
1231    tmpSelected = m_DatasetKeyList.getSelectedIndices();
1232    m_DatasetKeyList.setSelectedIndices(m_ResultKeyList.getSelectedIndices());
1233    m_ResultKeyList.setSelectedIndices(tmpSelected);
1234   
1235    // tester
1236    tmpRange = m_TTester.getDatasetKeyColumns();
1237    m_TTester.setDatasetKeyColumns(m_TTester.getResultsetKeyColumns());
1238    m_TTester.setResultsetKeyColumns(tmpRange);
1239    setTTester();
1240  }
1241 
1242  public void setTestBaseFromDialog() {
1243    ListSelectorDialog jd = new ListSelectorDialog(null, m_TestsList);
1244
1245    // Open the dialog
1246    jd.showDialog();
1247  }
1248
1249  public void setDisplayedFromDialog() {
1250    ListSelectorDialog jd = new ListSelectorDialog(null, m_DisplayedList);
1251
1252    // Open the dialog
1253    jd.showDialog();
1254  }
1255 
1256  /**
1257   * displays the Dialog for the output format and sets the chosen settings,
1258   * if the user approves.
1259   */
1260  public void setOutputFormatFromDialog() {
1261    OutputFormatDialog dialog = new OutputFormatDialog(PropertyDialog.getParentFrame(this));
1262
1263    m_ResultMatrix.setShowStdDev(m_ShowStdDevs.isSelected());
1264    dialog.setResultMatrix(m_ResultMatrix);
1265    dialog.setLocationRelativeTo(this);
1266   
1267    if (dialog.showDialog() == OutputFormatDialog.APPROVE_OPTION) {
1268      m_ResultMatrix = dialog.getResultMatrix();
1269      m_ShowStdDevs.setSelected(m_ResultMatrix.getShowStdDev());
1270    }
1271  }
1272
1273  /**
1274   * Save the currently selected result buffer to a file.
1275   */
1276  protected void saveBuffer() {
1277    StringBuffer sb = m_History.getSelectedBuffer();
1278    if (sb != null) {
1279      if (m_SaveOut.save(sb)) {
1280        JOptionPane.showMessageDialog(this,
1281                                      "File saved",
1282                                      "Results",
1283                                      JOptionPane.INFORMATION_MESSAGE);
1284      }
1285    } else {
1286      m_SaveOutBut.setEnabled(false);
1287    }
1288  }
1289
1290  /**
1291   * sets the currently selected Tester-Class.
1292   */
1293  protected void setTester() {
1294    Tester        tester;
1295    Tester        t;
1296    int           i;
1297   
1298    if (m_TesterClasses.getSelectedItem() == null)
1299      return;
1300
1301    tester = null;
1302   
1303    // find display name
1304    try {
1305      for (i = 0; i < m_Testers.size(); i++) {
1306        t = (Tester) ((Class) m_Testers.get(i)).newInstance();
1307        if (t.getDisplayName().equals(m_TesterClasses.getSelectedItem())) {
1308          tester = t;
1309          break;
1310        }
1311      }
1312    }
1313    catch (Exception e) {
1314      e.printStackTrace();
1315    }
1316
1317    if (tester == null) {
1318      tester  = new PairedCorrectedTTester();  // default
1319      m_TesterClasses.setSelectedItem(tester.getDisplayName());
1320    }
1321
1322    tester.assign(m_TTester);
1323    m_TTester = tester;
1324    m_PerformBut.setToolTipText(m_TTester.getToolTipText());
1325    System.out.println("Tester set to: " + m_TTester.getClass().getName());
1326  }
1327 
1328  /**
1329   * Tests out the results panel from the command line.
1330   *
1331   * @param args ignored
1332   */
1333  public static void main(String [] args) {
1334
1335    try {
1336      final JFrame jf = new JFrame("Weka Experiment: Results Analysis");
1337      jf.getContentPane().setLayout(new BorderLayout());
1338      final ResultsPanel sp = new ResultsPanel();
1339      //sp.setBorder(BorderFactory.createTitledBorder("Setup"));
1340      jf.getContentPane().add(sp, BorderLayout.CENTER);
1341      jf.addWindowListener(new WindowAdapter() {
1342        public void windowClosing(WindowEvent e) {
1343          jf.dispose();
1344          System.exit(0);
1345        }
1346      });
1347      jf.pack();
1348      jf.setSize(700, 550);
1349      jf.setVisible(true);
1350    } catch (Exception ex) {
1351      ex.printStackTrace();
1352      System.err.println(ex.getMessage());
1353    }
1354  }
1355}
Note: See TracBrowser for help on using the repository browser.