mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/knnc/KNNClassificationEditor.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2005, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * KNNClassificationEditor.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on September 8, 2003, 4:05 PM
2 26 Feb 07 jari 9  */
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 package org.tigr.microarray.mev.cluster.gui.impl.knnc;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.Color;
2 26 Feb 07 jari 14 import java.awt.Dimension;
2 26 Feb 07 jari 15 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 16 import java.awt.GridBagLayout;
2 26 Feb 07 jari 17 import java.awt.Toolkit;
2 26 Feb 07 jari 18 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 19 import java.awt.event.ActionListener;
2 26 Feb 07 jari 20 import java.io.BufferedReader;
2 26 Feb 07 jari 21 import java.io.File;
2 26 Feb 07 jari 22 import java.io.FileOutputStream;
2 26 Feb 07 jari 23 import java.io.FileReader;
2 26 Feb 07 jari 24 import java.io.PrintWriter;
2 26 Feb 07 jari 25 import java.util.Arrays;
2 26 Feb 07 jari 26 import java.util.Vector;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 import javax.swing.ButtonGroup;
2 26 Feb 07 jari 29 import javax.swing.JButton;
2 26 Feb 07 jari 30 import javax.swing.JFileChooser;
2 26 Feb 07 jari 31 import javax.swing.JFrame;
2 26 Feb 07 jari 32 import javax.swing.JMenu;
2 26 Feb 07 jari 33 import javax.swing.JMenuBar;
2 26 Feb 07 jari 34 import javax.swing.JMenuItem;
2 26 Feb 07 jari 35 import javax.swing.JOptionPane;
2 26 Feb 07 jari 36 import javax.swing.JPanel;
2 26 Feb 07 jari 37 import javax.swing.JRadioButton;
2 26 Feb 07 jari 38 import javax.swing.JScrollPane;
2 26 Feb 07 jari 39 import javax.swing.JTable;
2 26 Feb 07 jari 40 import javax.swing.JTextArea;
2 26 Feb 07 jari 41 import javax.swing.border.EtchedBorder;
2 26 Feb 07 jari 42 import javax.swing.event.TableModelEvent;
2 26 Feb 07 jari 43 import javax.swing.event.TableModelListener;
2 26 Feb 07 jari 44 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 45 import javax.swing.table.TableColumn;
2 26 Feb 07 jari 46 import javax.swing.table.TableColumnModel;
2 26 Feb 07 jari 47
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 50 import org.tigr.util.StringSplitter;
2 26 Feb 07 jari 51
2 26 Feb 07 jari 52 /**
2 26 Feb 07 jari 53  *
2 26 Feb 07 jari 54  * @author  nbhagaba
2 26 Feb 07 jari 55  */
2 26 Feb 07 jari 56 public class KNNClassificationEditor extends javax.swing.JDialog {// JFrame {
2 26 Feb 07 jari 57     
2 26 Feb 07 jari 58     IFramework framework;
2 26 Feb 07 jari 59     IData data;
2 26 Feb 07 jari 60     boolean classifyGenes;
2 26 Feb 07 jari 61     private boolean stopHere = true;
2 26 Feb 07 jari 62     private boolean nextPressed = false;
2 26 Feb 07 jari 63     private boolean incompatible = false;
2 26 Feb 07 jari 64     private boolean fileSaved = false;
2 26 Feb 07 jari 65     int numClasses;
2 26 Feb 07 jari 66     String[] fieldNames;
2 26 Feb 07 jari 67     int numGenes, numExps;
2 26 Feb 07 jari 68     JTable knnClassTable;
2 26 Feb 07 jari 69     KNNClassTableModel kModel;
2 26 Feb 07 jari 70     JMenuBar menuBar;
2 26 Feb 07 jari 71     JMenu fileMenu, editMenu, toolsMenu, assignSubMenu, sortAscMenu, sortDescMenu;
2 26 Feb 07 jari 72     JMenuItem saveItem, closeItem, selectAllItem, searchItem, sortByClassItem, origOrderItem;
2 26 Feb 07 jari 73     JMenuItem[] classItem, labelsAscItem, labelsDescItem;
2 26 Feb 07 jari 74     JRadioButton saveButton, doNotSaveButton;
2 26 Feb 07 jari 75     JButton nextButton;
2 26 Feb 07 jari 76     JFrame mainFrame;
2 26 Feb 07 jari 77     
2 26 Feb 07 jari 78     KNNCSearchDialog searchDialog;    
2 26 Feb 07 jari 79     
2 26 Feb 07 jari 80     //SortListener sorter;
2 26 Feb 07 jari 81     
2 26 Feb 07 jari 82     Object[][] origData;
2 26 Feb 07 jari 83     
2 26 Feb 07 jari 84     /** Creates a new instance of KNNClassificationEditor */
2 26 Feb 07 jari 85     public KNNClassificationEditor(IFramework framework, boolean classifyGenes, int numClasses) {
2 26 Feb 07 jari 86         super(framework.getFrame(), true);
2 26 Feb 07 jari 87         this.setTitle("KNN Classification Editor");
2 26 Feb 07 jari 88         mainFrame = (JFrame)(framework.getFrame());
2 26 Feb 07 jari 89         //super((JFrame)(framework.getFrame()), "KNN Classification Editor", true);
2 26 Feb 07 jari 90         setBounds(0, 0, 550, 800);
2 26 Feb 07 jari 91         setBackground(Color.white);
2 26 Feb 07 jari 92         setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
2 26 Feb 07 jari 93         this.framework = framework;
2 26 Feb 07 jari 94         this.data = framework.getData();
2 26 Feb 07 jari 95         this.numGenes = data.getFeaturesSize();
2 26 Feb 07 jari 96         this.numExps = data.getFeaturesCount();
2 26 Feb 07 jari 97         this.fieldNames = data.getFieldNames();
2 26 Feb 07 jari 98         this.classifyGenes = classifyGenes;
2 26 Feb 07 jari 99         this.numClasses = numClasses;
2 26 Feb 07 jari 100         
2 26 Feb 07 jari 101         menuBar = new JMenuBar();
2 26 Feb 07 jari 102         this.setJMenuBar(menuBar);
2 26 Feb 07 jari 103         
2 26 Feb 07 jari 104         GridBagLayout gridbag = new GridBagLayout();
2 26 Feb 07 jari 105         GridBagConstraints constraints = new GridBagConstraints();
2 26 Feb 07 jari 106         constraints.fill = GridBagConstraints.BOTH;
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         JPanel pane = new JPanel();
2 26 Feb 07 jari 109         pane.setLayout(gridbag);
2 26 Feb 07 jari 110         
2 26 Feb 07 jari 111         JPanel tablePanel = new JPanel();
2 26 Feb 07 jari 112         GridBagLayout grid1 = new GridBagLayout();
2 26 Feb 07 jari 113         tablePanel.setLayout(grid1);
2 26 Feb 07 jari 114         
2 26 Feb 07 jari 115         kModel = new KNNClassTableModel();
2 26 Feb 07 jari 116         knnClassTable = new JTable(kModel);
2 26 Feb 07 jari 117         knnClassTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2 26 Feb 07 jari 118         TableColumn column = null;
2 26 Feb 07 jari 119         for (int i = 0; i < kModel.getColumnCount(); i++) {
2 26 Feb 07 jari 120             column = knnClassTable.getColumnModel().getColumn(i);
2 26 Feb 07 jari 121             column.setMinWidth(30);
2 26 Feb 07 jari 122         }
2 26 Feb 07 jari 123         knnClassTable.setColumnModel(new KNNClassTableColumnModel(knnClassTable.getColumnModel()));
2 26 Feb 07 jari 124         knnClassTable.getModel().addTableModelListener(new ClassSelectionListener());
2 26 Feb 07 jari 125         
2 26 Feb 07 jari 126         searchDialog = new KNNCSearchDialog(this, knnClassTable, numClasses, false); //persistent search dialog     
2 26 Feb 07 jari 127         //JOptionPane.getFrameForComponent(this)
2 26 Feb 07 jari 128         JScrollPane scroll = new JScrollPane(knnClassTable);
2 26 Feb 07 jari 129         buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
2 26 Feb 07 jari 130         grid1.setConstraints(scroll, constraints);
2 26 Feb 07 jari 131         tablePanel.add(scroll);
2 26 Feb 07 jari 132         
2 26 Feb 07 jari 133         buildConstraints(constraints, 0, 0, 1, 1, 100, 90);
2 26 Feb 07 jari 134         gridbag.setConstraints(tablePanel, constraints);
2 26 Feb 07 jari 135         pane.add(tablePanel);
2 26 Feb 07 jari 136         
2 26 Feb 07 jari 137         JPanel bottomPanel = new JPanel();
2 26 Feb 07 jari 138         bottomPanel.setBorder(new EtchedBorder());
2 26 Feb 07 jari 139         bottomPanel.setBackground(Color.white);
2 26 Feb 07 jari 140         GridBagLayout grid2 = new GridBagLayout();
2 26 Feb 07 jari 141         bottomPanel.setLayout(grid2);
2 26 Feb 07 jari 142         
2 26 Feb 07 jari 143         saveButton = new JRadioButton("Save classification to file", true);
2 26 Feb 07 jari 144         saveButton.setBackground(Color.white);
2 26 Feb 07 jari 145         doNotSaveButton = new JRadioButton("Do not save classification to file", false);
2 26 Feb 07 jari 146         doNotSaveButton.setBackground(Color.white);
2 26 Feb 07 jari 147         ButtonGroup saveOrNot = new ButtonGroup();
2 26 Feb 07 jari 148         saveOrNot.add(saveButton);
2 26 Feb 07 jari 149         saveOrNot.add(doNotSaveButton);
2 26 Feb 07 jari 150         
2 26 Feb 07 jari 151         final JFileChooser fc = new JFileChooser();
2 26 Feb 07 jari 152         fc.setCurrentDirectory(new File("Data"));
2 26 Feb 07 jari 153         fc.setDialogTitle("Save classification");
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         nextButton = new JButton("Next >");
2 26 Feb 07 jari 156         nextButton.addActionListener(new ActionListener() {
2 26 Feb 07 jari 157             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 158                 if (doNotSaveButton.isSelected()) {
2 26 Feb 07 jari 159                     KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 160                     stopHere = false;
2 26 Feb 07 jari 161                     nextPressed = true;                    
2 26 Feb 07 jari 162                     //KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 163                 } else {
2 26 Feb 07 jari 164                     int returnVal = fc.showSaveDialog(KNNClassificationEditor.this);  
2 26 Feb 07 jari 165                     if (returnVal == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 166                         File file = fc.getSelectedFile();  
2 26 Feb 07 jari 167                         saveToFile(file);
2 26 Feb 07 jari 168                         KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 169                         KNNCSecondDialog kSecDialog = new KNNCSecondDialog(mainFrame, true);
2 26 Feb 07 jari 170                         kSecDialog.setVisible(true);
2 26 Feb 07 jari 171                         if (!kSecDialog.proceed()) {
2 26 Feb 07 jari 172                             stopHere = true;
2 26 Feb 07 jari 173                         } else {
2 26 Feb 07 jari 174                             stopHere = false;
2 26 Feb 07 jari 175                         }
2 26 Feb 07 jari 176                         fileSaved = true;
2 26 Feb 07 jari 177                         nextPressed = true;                        
2 26 Feb 07 jari 178                         /*
2 26 Feb 07 jari 179                         KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 180                         KNNCSecondDialog kSecDialog = new KNNCSecondDialog(mainFrame, true);
2 26 Feb 07 jari 181                         kSecDialog.setVisible(true);
2 26 Feb 07 jari 182                         if (!kSecDialog.proceed()) {
2 26 Feb 07 jari 183                             stopHere = true;
2 26 Feb 07 jari 184                         }
2 26 Feb 07 jari 185                          */
2 26 Feb 07 jari 186                     }                    
2 26 Feb 07 jari 187                 }
2 26 Feb 07 jari 188             }
2 26 Feb 07 jari 189         });
2 26 Feb 07 jari 190         constraints.fill = GridBagConstraints.NONE;
2 26 Feb 07 jari 191
2 26 Feb 07 jari 192         buildConstraints(constraints, 0, 0, 1, 1, 100, 33);
2 26 Feb 07 jari 193         grid2.setConstraints(saveButton, constraints);
2 26 Feb 07 jari 194         bottomPanel.add(saveButton);
2 26 Feb 07 jari 195         
2 26 Feb 07 jari 196         buildConstraints(constraints, 0, 1, 1, 1, 0, 33);
2 26 Feb 07 jari 197         grid2.setConstraints(doNotSaveButton, constraints);
2 26 Feb 07 jari 198         bottomPanel.add(doNotSaveButton);
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         buildConstraints(constraints, 0, 2, 1, 1, 0, 34);
2 26 Feb 07 jari 201         grid2.setConstraints(nextButton, constraints);
2 26 Feb 07 jari 202         bottomPanel.add(nextButton);        
2 26 Feb 07 jari 203         
2 26 Feb 07 jari 204         constraints.fill = GridBagConstraints.BOTH;
2 26 Feb 07 jari 205         buildConstraints(constraints, 0, 1, 1, 1, 0, 10);
2 26 Feb 07 jari 206         gridbag.setConstraints(bottomPanel, constraints);
2 26 Feb 07 jari 207         pane.add(bottomPanel);
2 26 Feb 07 jari 208         
2 26 Feb 07 jari 209         this.setContentPane(pane);
2 26 Feb 07 jari 210         
2 26 Feb 07 jari 211         if (classifyGenes) {
2 26 Feb 07 jari 212             labelsAscItem = new JMenuItem[fieldNames.length];
2 26 Feb 07 jari 213             labelsDescItem =  new JMenuItem[fieldNames.length];
2 26 Feb 07 jari 214             for (int i = 0; i < fieldNames.length; i++) {
2 26 Feb 07 jari 215                 labelsAscItem[i] = new JMenuItem(fieldNames[i]);
2 26 Feb 07 jari 216                 labelsDescItem[i] = new JMenuItem(fieldNames[i]);
2 26 Feb 07 jari 217             }
2 26 Feb 07 jari 218         } else {
2 26 Feb 07 jari 219             labelsAscItem = new JMenuItem[1];
2 26 Feb 07 jari 220             labelsAscItem[0] = new JMenuItem("Sample Name");
2 26 Feb 07 jari 221             labelsDescItem = new JMenuItem[1];
2 26 Feb 07 jari 222             labelsDescItem[0] = new JMenuItem("Sample Name");
2 26 Feb 07 jari 223         }
2 26 Feb 07 jari 224         
2 26 Feb 07 jari 225         for (int i = 0; i < labelsAscItem.length; i++) {
2 26 Feb 07 jari 226             labelsAscItem[i].addActionListener(new SortListener(true, false));
2 26 Feb 07 jari 227             labelsDescItem[i].addActionListener(new SortListener(false, false));
2 26 Feb 07 jari 228         }
2 26 Feb 07 jari 229         
2 26 Feb 07 jari 230         classItem = new JMenuItem[numClasses + 1];
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         for (int i = 0; i < numClasses; i++) {
2 26 Feb 07 jari 233             classItem[i] = new JMenuItem("Class " + (i + 1));
2 26 Feb 07 jari 234         }
2 26 Feb 07 jari 235         
2 26 Feb 07 jari 236         classItem[numClasses] = new JMenuItem("Neutral");
2 26 Feb 07 jari 237         
2 26 Feb 07 jari 238         for (int i = 0; i < classItem.length; i++) {
2 26 Feb 07 jari 239             classItem[i].addActionListener(new AssignListener());
2 26 Feb 07 jari 240         }
2 26 Feb 07 jari 241         /*
2 26 Feb 07 jari 242         fileMenu = new JMenu("File");
2 26 Feb 07 jari 243         saveItem = new JMenuItem("Save classification");
2 26 Feb 07 jari 244         fileMenu.add(saveItem);
2 26 Feb 07 jari 245         closeItem = new JMenuItem("Close editor");
2 26 Feb 07 jari 246         
2 26 Feb 07 jari 247         closeItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 248             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 249                 KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 250             }
2 26 Feb 07 jari 251         });
2 26 Feb 07 jari 252         
2 26 Feb 07 jari 253         fileMenu.add(closeItem);
2 26 Feb 07 jari 254         menuBar.add(fileMenu);
2 26 Feb 07 jari 255         */
2 26 Feb 07 jari 256         editMenu = new JMenu("Edit");
2 26 Feb 07 jari 257         selectAllItem = new JMenuItem("Select all rows");
2 26 Feb 07 jari 258         selectAllItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 259             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 260                 knnClassTable.selectAll();
2 26 Feb 07 jari 261             }
2 26 Feb 07 jari 262         });
2 26 Feb 07 jari 263         editMenu.add(selectAllItem);
2 26 Feb 07 jari 264         assignSubMenu = new JMenu("Assign selected rows to");
2 26 Feb 07 jari 265         for (int i = 0; i < classItem.length; i++) {
2 26 Feb 07 jari 266             assignSubMenu.add(classItem[i]);
2 26 Feb 07 jari 267         }
2 26 Feb 07 jari 268         editMenu.add(assignSubMenu);
2 26 Feb 07 jari 269         menuBar.add(editMenu);
2 26 Feb 07 jari 270         
2 26 Feb 07 jari 271         toolsMenu = new JMenu("Tools");
2 26 Feb 07 jari 272         searchItem = new JMenuItem("Search");
2 26 Feb 07 jari 273         searchItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 274             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 275                 searchTable();
2 26 Feb 07 jari 276             }
2 26 Feb 07 jari 277         });
2 26 Feb 07 jari 278         toolsMenu.add(searchItem);
2 26 Feb 07 jari 279         sortAscMenu = new JMenu("Sort ascending by");
2 26 Feb 07 jari 280         for (int i = 0; i < labelsAscItem.length; i++) {
2 26 Feb 07 jari 281             sortAscMenu.add(labelsAscItem[i]);
2 26 Feb 07 jari 282         }
2 26 Feb 07 jari 283         toolsMenu.add(sortAscMenu);
2 26 Feb 07 jari 284         sortDescMenu = new JMenu("Sort descending by");
2 26 Feb 07 jari 285         for (int i = 0; i < labelsDescItem.length; i++) {
2 26 Feb 07 jari 286             sortDescMenu.add(labelsDescItem[i]);
2 26 Feb 07 jari 287         }
2 26 Feb 07 jari 288         toolsMenu.add(sortDescMenu);
2 26 Feb 07 jari 289         sortByClassItem = new JMenuItem("Sort by classification");
2 26 Feb 07 jari 290         sortByClassItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 291             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 292                 sortByClassification();
2 26 Feb 07 jari 293             }
2 26 Feb 07 jari 294         });
2 26 Feb 07 jari 295         toolsMenu.add(sortByClassItem);
2 26 Feb 07 jari 296         origOrderItem = new JMenuItem("Restore original ordering");
2 26 Feb 07 jari 297         origOrderItem.addActionListener(new SortListener(true, true));
2 26 Feb 07 jari 298         toolsMenu.add(origOrderItem);
2 26 Feb 07 jari 299         
2 26 Feb 07 jari 300         menuBar.add(toolsMenu);
2 26 Feb 07 jari 301     }
2 26 Feb 07 jari 302     
2 26 Feb 07 jari 303     
2 26 Feb 07 jari 304     void buildConstraints(GridBagConstraints gbc, int gx, int gy,
2 26 Feb 07 jari 305     int gw, int gh, int wx, int wy) {
2 26 Feb 07 jari 306         
2 26 Feb 07 jari 307         gbc.gridx = gx;
2 26 Feb 07 jari 308         gbc.gridy = gy;
2 26 Feb 07 jari 309         gbc.gridwidth = gw;
2 26 Feb 07 jari 310         gbc.gridheight = gh;
2 26 Feb 07 jari 311         gbc.weightx = wx;
2 26 Feb 07 jari 312         gbc.weighty = wy;
2 26 Feb 07 jari 313     }
2 26 Feb 07 jari 314     
2 26 Feb 07 jari 315     public void showModal(boolean visible) {
2 26 Feb 07 jari 316         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 317         setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);
2 26 Feb 07 jari 318         showWarningMessage();     
2 26 Feb 07 jari 319         super.setVisible(visible);        
2 26 Feb 07 jari 320     }
2 26 Feb 07 jari 321     
2 26 Feb 07 jari 322     class KNNClassifierTable extends JTable {
2 26 Feb 07 jari 323     }
2 26 Feb 07 jari 324     
2 26 Feb 07 jari 325     class KNNClassTableModel extends AbstractTableModel {
2 26 Feb 07 jari 326         String[] columnNames;
2 26 Feb 07 jari 327         Object tableData[][];
2 26 Feb 07 jari 328         int indexLastClass;
2 26 Feb 07 jari 329         
2 26 Feb 07 jari 330         public KNNClassTableModel() {
2 26 Feb 07 jari 331             indexLastClass = numClasses;
2 26 Feb 07 jari 332             if (classifyGenes) {
2 26 Feb 07 jari 333                 columnNames = new String[fieldNames.length + numClasses + 2];
2 26 Feb 07 jari 334                 columnNames[0] = "Index";
2 26 Feb 07 jari 335                 for (int i = 0; i < numClasses; i++) {
2 26 Feb 07 jari 336                     columnNames[i + 1] = "Class " + (i+1);
2 26 Feb 07 jari 337                 }
2 26 Feb 07 jari 338                 columnNames[numClasses + 1] = "Neutral";
2 26 Feb 07 jari 339                 
2 26 Feb 07 jari 340                 for (int i = 0; i < fieldNames.length; i++) {
2 26 Feb 07 jari 341                     columnNames[numClasses + 2 + i] = fieldNames[i];
2 26 Feb 07 jari 342                 }
2 26 Feb 07 jari 343                 
2 26 Feb 07 jari 344                 tableData = new Object[numGenes][columnNames.length];
2 26 Feb 07 jari 345                 
2 26 Feb 07 jari 346                 for (int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 347                     for (int j = 0; j < columnNames.length; j++) {
2 26 Feb 07 jari 348                         if (j == 0) {
2 26 Feb 07 jari 349                             tableData[i][j] = new Integer(i);
2 26 Feb 07 jari 350                         } else if ((j > 0) && (j < (numClasses + 1))) {
2 26 Feb 07 jari 351                             tableData[i][j] = new Boolean(false);
2 26 Feb 07 jari 352                         } else if (j == numClasses + 1) {
2 26 Feb 07 jari 353                             tableData[i][j] = new Boolean(true);
2 26 Feb 07 jari 354                         } else {
2 26 Feb 07 jari 355                             tableData[i][j] = data.getElementAttribute(i, j - (numClasses + 2));
2 26 Feb 07 jari 356                         }
2 26 Feb 07 jari 357                     }
2 26 Feb 07 jari 358                 }
2 26 Feb 07 jari 359                 
2 26 Feb 07 jari 360             } else { // (!classifyGenes)
2 26 Feb 07 jari 361                 columnNames = new String[numClasses + 3];
2 26 Feb 07 jari 362                 columnNames[0] = "Index";
2 26 Feb 07 jari 363                 for (int i = 0; i < numClasses; i++) {
2 26 Feb 07 jari 364                     columnNames[i + 1] = "Class " + (i+1);
2 26 Feb 07 jari 365                 }
2 26 Feb 07 jari 366                 columnNames[numClasses + 1] = "Neutral";
2 26 Feb 07 jari 367                 columnNames[numClasses + 2] = "Sample Name";
2 26 Feb 07 jari 368                 tableData = new Object[numExps][columnNames.length];
2 26 Feb 07 jari 369                 
2 26 Feb 07 jari 370                 for (int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 371                     for (int j = 0; j < columnNames.length; j++) {
2 26 Feb 07 jari 372                         if (j == 0) {
2 26 Feb 07 jari 373                             tableData[i][j] = new Integer(i);
2 26 Feb 07 jari 374                         } else if ((j > 0) && (j < (numClasses + 1))) {
2 26 Feb 07 jari 375                             tableData[i][j] = new Boolean(false);
2 26 Feb 07 jari 376                         } else if (j == numClasses + 1) {
2 26 Feb 07 jari 377                             tableData[i][j] = new Boolean(true);
2 26 Feb 07 jari 378                         } else if (j == numClasses + 2) {
2 26 Feb 07 jari 379                             tableData[i][j] = data.getFullSampleName(i);
2 26 Feb 07 jari 380                         }
2 26 Feb 07 jari 381                     }
2 26 Feb 07 jari 382                 }
2 26 Feb 07 jari 383             }
2 26 Feb 07 jari 384             
2 26 Feb 07 jari 385             origData = new Object[tableData.length][tableData[0].length];
2 26 Feb 07 jari 386             
2 26 Feb 07 jari 387             for (int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 388                 for (int j = 0; j < tableData[0].length; j++) {
2 26 Feb 07 jari 389                     origData[i][j] = tableData[i][j];
2 26 Feb 07 jari 390                 }
2 26 Feb 07 jari 391             }
2 26 Feb 07 jari 392             
2 26 Feb 07 jari 393         }
2 26 Feb 07 jari 394         
2 26 Feb 07 jari 395         public int getColumnCount() {
2 26 Feb 07 jari 396             return columnNames.length;
2 26 Feb 07 jari 397         }
2 26 Feb 07 jari 398         
2 26 Feb 07 jari 399         public int getRowCount() {
2 26 Feb 07 jari 400             return tableData.length;
2 26 Feb 07 jari 401         }
2 26 Feb 07 jari 402         
2 26 Feb 07 jari 403         public String getColumnName(int col) {
2 26 Feb 07 jari 404             return columnNames[col];
2 26 Feb 07 jari 405         }
2 26 Feb 07 jari 406         
2 26 Feb 07 jari 407         public int getColumnIndex(String name) {
2 26 Feb 07 jari 408             int i;
2 26 Feb 07 jari 409             for (i = 0; i < columnNames.length; i++) {
2 26 Feb 07 jari 410                 if (columnNames[i].equals(name)) {
2 26 Feb 07 jari 411                     break;
2 26 Feb 07 jari 412                 }
2 26 Feb 07 jari 413             }
2 26 Feb 07 jari 414             if (i < columnNames.length) {
2 26 Feb 07 jari 415                 return i;
2 26 Feb 07 jari 416             } else {
2 26 Feb 07 jari 417                 return -1;
2 26 Feb 07 jari 418             }
2 26 Feb 07 jari 419         }
2 26 Feb 07 jari 420         
2 26 Feb 07 jari 421         public Object getValueAt(int row, int col) {
2 26 Feb 07 jari 422             return tableData[row][col];
2 26 Feb 07 jari 423         }
2 26 Feb 07 jari 424         
2 26 Feb 07 jari 425         public void setValueAt(Object value, int row, int col) {
2 26 Feb 07 jari 426             tableData[row][col] = value;
2 26 Feb 07 jari 427             //fireTableCellUpdated(row, col);
2 26 Feb 07 jari 428             this.fireTableChanged(new TableModelEvent(this, row, row, col));
2 26 Feb 07 jari 429         }
2 26 Feb 07 jari 430         
2 26 Feb 07 jari 431         
2 26 Feb 07 jari 432         public Class getColumnClass(int c) {
2 26 Feb 07 jari 433             if (c == 0) {
2 26 Feb 07 jari 434                 return java.lang.Integer.class;
2 26 Feb 07 jari 435             } else if ((c > 0) && (c <= (numClasses + 1))) {
2 26 Feb 07 jari 436                 return java.lang.Boolean.class;
2 26 Feb 07 jari 437             } else {
2 26 Feb 07 jari 438                 return getValueAt(0, c).getClass();
2 26 Feb 07 jari 439             }
2 26 Feb 07 jari 440         }
2 26 Feb 07 jari 441         
2 26 Feb 07 jari 442         
2 26 Feb 07 jari 443         public boolean isCellEditable(int row, int col) {
2 26 Feb 07 jari 444             //Note that the data/cell address is constant,
2 26 Feb 07 jari 445             //no matter where the cell appears onscreen.
2 26 Feb 07 jari 446             if ((col > 0) && (col <= (numClasses + 1))) {
2 26 Feb 07 jari 447                 return true;
2 26 Feb 07 jari 448             } else {
2 26 Feb 07 jari 449                 return false;
2 26 Feb 07 jari 450             }
2 26 Feb 07 jari 451         }
2 26 Feb 07 jari 452     }
2 26 Feb 07 jari 453     
2 26 Feb 07 jari 454     
2 26 Feb 07 jari 455     class KNNClassTableColumnModel implements TableColumnModel {
2 26 Feb 07 jari 456         
2 26 Feb 07 jari 457         TableColumnModel tcm;
2 26 Feb 07 jari 458         
2 26 Feb 07 jari 459         public KNNClassTableColumnModel(TableColumnModel TCM) {
2 26 Feb 07 jari 460             this.tcm = TCM;
2 26 Feb 07 jari 461         }
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         public void addColumn(javax.swing.table.TableColumn tableColumn) {
2 26 Feb 07 jari 464             tcm.addColumn(tableColumn);
2 26 Feb 07 jari 465         }
2 26 Feb 07 jari 466         
2 26 Feb 07 jari 467         public void addColumnModelListener(javax.swing.event.TableColumnModelListener tableColumnModelListener) {
2 26 Feb 07 jari 468             tcm.addColumnModelListener(tableColumnModelListener);
2 26 Feb 07 jari 469         }
2 26 Feb 07 jari 470         
2 26 Feb 07 jari 471         public javax.swing.table.TableColumn getColumn(int param) {
2 26 Feb 07 jari 472             return tcm.getColumn(param);
2 26 Feb 07 jari 473         }
2 26 Feb 07 jari 474         
2 26 Feb 07 jari 475         public int getColumnCount() {
2 26 Feb 07 jari 476             return tcm.getColumnCount();
2 26 Feb 07 jari 477         }
2 26 Feb 07 jari 478         
2 26 Feb 07 jari 479         public int getColumnIndex(Object obj) {
2 26 Feb 07 jari 480             return tcm.getColumnIndex(obj);
2 26 Feb 07 jari 481         }
2 26 Feb 07 jari 482         
2 26 Feb 07 jari 483         public int getColumnIndexAtX(int param) {
2 26 Feb 07 jari 484             return tcm.getColumnIndexAtX(param);
2 26 Feb 07 jari 485         }
2 26 Feb 07 jari 486         
2 26 Feb 07 jari 487         public int getColumnMargin() {
2 26 Feb 07 jari 488             return tcm.getColumnMargin();
2 26 Feb 07 jari 489         }
2 26 Feb 07 jari 490         
2 26 Feb 07 jari 491         public boolean getColumnSelectionAllowed() {
2 26 Feb 07 jari 492             return tcm.getColumnSelectionAllowed();
2 26 Feb 07 jari 493         }
2 26 Feb 07 jari 494         
2 26 Feb 07 jari 495         public java.util.Enumeration getColumns() {
2 26 Feb 07 jari 496             return tcm.getColumns();
2 26 Feb 07 jari 497         }
2 26 Feb 07 jari 498         
2 26 Feb 07 jari 499         public int getSelectedColumnCount() {
2 26 Feb 07 jari 500             return tcm.getSelectedColumnCount();
2 26 Feb 07 jari 501         }
2 26 Feb 07 jari 502         
2 26 Feb 07 jari 503         public int[] getSelectedColumns() {
2 26 Feb 07 jari 504             return tcm.getSelectedColumns();
2 26 Feb 07 jari 505         }
2 26 Feb 07 jari 506         
2 26 Feb 07 jari 507         public javax.swing.ListSelectionModel getSelectionModel() {
2 26 Feb 07 jari 508             return tcm.getSelectionModel();
2 26 Feb 07 jari 509         }
2 26 Feb 07 jari 510         
2 26 Feb 07 jari 511         public int getTotalColumnWidth() {
2 26 Feb 07 jari 512             return tcm.getTotalColumnWidth();
2 26 Feb 07 jari 513         }
2 26 Feb 07 jari 514         
2 26 Feb 07 jari 515         public void moveColumn(int from, int to) {
2 26 Feb 07 jari 516             if (from <= (numClasses + 1) || to <= (numClasses + 1)) {
2 26 Feb 07 jari 517                 return;
2 26 Feb 07 jari 518             } else {
2 26 Feb 07 jari 519                 tcm.moveColumn(from, to);
2 26 Feb 07 jari 520             }
2 26 Feb 07 jari 521         }
2 26 Feb 07 jari 522         
2 26 Feb 07 jari 523         public void removeColumn(javax.swing.table.TableColumn tableColumn) {
2 26 Feb 07 jari 524             tcm.removeColumn(tableColumn);
2 26 Feb 07 jari 525         }
2 26 Feb 07 jari 526         
2 26 Feb 07 jari 527         public void removeColumnModelListener(javax.swing.event.TableColumnModelListener tableColumnModelListener) {
2 26 Feb 07 jari 528             tcm.removeColumnModelListener(tableColumnModelListener);
2 26 Feb 07 jari 529         }
2 26 Feb 07 jari 530         
2 26 Feb 07 jari 531         public void setColumnMargin(int param) {
2 26 Feb 07 jari 532             tcm.setColumnMargin(param);
2 26 Feb 07 jari 533         }
2 26 Feb 07 jari 534         
2 26 Feb 07 jari 535         public void setColumnSelectionAllowed(boolean param) {
2 26 Feb 07 jari 536             tcm.setColumnSelectionAllowed(param);
2 26 Feb 07 jari 537         }
2 26 Feb 07 jari 538         
2 26 Feb 07 jari 539         public void setSelectionModel(javax.swing.ListSelectionModel listSelectionModel) {
2 26 Feb 07 jari 540             tcm.setSelectionModel(listSelectionModel);
2 26 Feb 07 jari 541         }
2 26 Feb 07 jari 542         
2 26 Feb 07 jari 543     }    
2 26 Feb 07 jari 544     
2 26 Feb 07 jari 545     
2 26 Feb 07 jari 546     class ClassSelectionListener implements TableModelListener {
2 26 Feb 07 jari 547         
2 26 Feb 07 jari 548         public void tableChanged(TableModelEvent tme) {
2 26 Feb 07 jari 549             //TableModel tabMod = (TableModel)tme.getSource();
2 26 Feb 07 jari 550             int selectedCol = tme.getColumn(); //
2 26 Feb 07 jari 551             int selectedRow = tme.getFirstRow(); //
2 26 Feb 07 jari 552             
2 26 Feb 07 jari 553             if ((selectedCol < 1) || (selectedCol > (numClasses + 1) )) {
2 26 Feb 07 jari 554                 return;
2 26 Feb 07 jari 555             }
2 26 Feb 07 jari 556             
2 26 Feb 07 jari 557             if( verifySelected(selectedRow, selectedCol)){
2 26 Feb 07 jari 558                 changeNeighbors(selectedRow, selectedCol);
2 26 Feb 07 jari 559             }
2 26 Feb 07 jari 560             
2 26 Feb 07 jari 561             int origDataRow = ((Integer)(kModel.getValueAt(selectedRow, 0))).intValue();
2 26 Feb 07 jari 562             
2 26 Feb 07 jari 563             origData[origDataRow][selectedCol] = new Boolean(true);
2 26 Feb 07 jari 564             
2 26 Feb 07 jari 565             for (int i = 1; i <= (numClasses + 1); i++) {
2 26 Feb 07 jari 566                 if (i != selectedCol) {
2 26 Feb 07 jari 567                     origData[origDataRow][i] = new Boolean(false);
2 26 Feb 07 jari 568                 }
2 26 Feb 07 jari 569             }
2 26 Feb 07 jari 570         }
2 26 Feb 07 jari 571         
2 26 Feb 07 jari 572         private void changeNeighbors(int first, int col){
2 26 Feb 07 jari 573             for (int i = 1; i <= (numClasses + 1); i++) {
2 26 Feb 07 jari 574                 if (i != col) {
2 26 Feb 07 jari 575                     knnClassTable.setValueAt(new Boolean(false), first, i);
2 26 Feb 07 jari 576                     //origData[first][i] = new Boolean(false); 
2 26 Feb 07 jari 577                 }
2 26 Feb 07 jari 578             }
2 26 Feb 07 jari 579         }
2 26 Feb 07 jari 580         
2 26 Feb 07 jari 581         private boolean verifySelected(int row, int col){
2 26 Feb 07 jari 582             
2 26 Feb 07 jari 583             boolean selVal = ((Boolean)knnClassTable.getValueAt(row,col)).booleanValue();
2 26 Feb 07 jari 584             //boolean value1, value2;
2 26 Feb 07 jari 585             
2 26 Feb 07 jari 586             if(selVal == true){
2 26 Feb 07 jari 587                 return true;
2 26 Feb 07 jari 588             } else {
2 26 Feb 07 jari 589                 Vector truthValues = new Vector();
2 26 Feb 07 jari 590                 for (int i = 1; i <=(numClasses + 1); i++) {
2 26 Feb 07 jari 591                     if (i != col) {
2 26 Feb 07 jari 592                         boolean value = ((Boolean)(knnClassTable.getValueAt(row,i))).booleanValue();
2 26 Feb 07 jari 593                         truthValues.add(new Boolean(value));
2 26 Feb 07 jari 594                     }
2 26 Feb 07 jari 595                 }
2 26 Feb 07 jari 596                 boolean val1 = true;
2 26 Feb 07 jari 597                 for (int i = 0; i < truthValues.size(); i++) {
2 26 Feb 07 jari 598                     boolean val2 = ((Boolean)(truthValues.get(i))).booleanValue();
2 26 Feb 07 jari 599                     if (val2 == true) {
2 26 Feb 07 jari 600                         val1 = false;
2 26 Feb 07 jari 601                         break;
2 26 Feb 07 jari 602                     }
2 26 Feb 07 jari 603                 }
2 26 Feb 07 jari 604                 
2 26 Feb 07 jari 605                 if (val1 == true) {
2 26 Feb 07 jari 606                     knnClassTable.setValueAt(new Boolean(true), row, col);
2 26 Feb 07 jari 607                     //origData[row][col] = new Boolean(true);
2 26 Feb 07 jari 608                 }
2 26 Feb 07 jari 609                 
2 26 Feb 07 jari 610             }
2 26 Feb 07 jari 611             return false;
2 26 Feb 07 jari 612             
2 26 Feb 07 jari 613             /*else {
2 26 Feb 07 jari 614                 knnClassTable.setValueAt(new Boolean(true), selectedRow, selectedCol);
2 26 Feb 07 jari 615              
2 26 Feb 07 jari 616                 for (int i = 1; i <= (numClasses + 1); i++) {
2 26 Feb 07 jari 617                     if (i != selectedCol) {
2 26 Feb 07 jari 618                         knnClassTable.setValueAt(new Boolean(false), selectedRow, i);
2 26 Feb 07 jari 619                     }
2 26 Feb 07 jari 620                 }
2 26 Feb 07 jari 621              
2 26 Feb 07 jari 622             }
2 26 Feb 07 jari 623              */
2 26 Feb 07 jari 624             
2 26 Feb 07 jari 625         }
2 26 Feb 07 jari 626         
2 26 Feb 07 jari 627     }
2 26 Feb 07 jari 628     
2 26 Feb 07 jari 629     public void sortByColumn(int column, boolean ascending, boolean originalOrder) {
2 26 Feb 07 jari 630         if (originalOrder) {
2 26 Feb 07 jari 631             //double[] indices = new int[kModel.getRowCount()];
2 26 Feb 07 jari 632             //for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 633                 //indices[i] = ((Integer)(kModel.getValueAt(i, 0))).doubleValue();
2 26 Feb 07 jari 634                 /*
2 26 Feb 07 jari 635                 QSort sortIndices = new QSort(indices);
2 26 Feb 07 jari 636                 int[] sorted = sortIndices.getOrigIndx();
2 26 Feb 07 jari 637                  */
2 26 Feb 07 jari 638             Object[][] sortedData = new Object[kModel.getRowCount()][kModel.getColumnCount()];
2 26 Feb 07 jari 639             
2 26 Feb 07 jari 640             for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 641                 for (int j = 0; j < sortedData[0].length; j++) {
2 26 Feb 07 jari 642                     sortedData[i][j] = origData[i][j];
2 26 Feb 07 jari 643                 }
2 26 Feb 07 jari 644             }
2 26 Feb 07 jari 645             
2 26 Feb 07 jari 646             for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 647                 for (int j = 0; j < sortedData[0].length; j++) {
2 26 Feb 07 jari 648                     kModel.setValueAt(sortedData[i][j], i, j);
2 26 Feb 07 jari 649                 }
2 26 Feb 07 jari 650                 validateTable(sortedData, i);
2 26 Feb 07 jari 651             }
2 26 Feb 07 jari 652             return;
2 26 Feb 07 jari 653             //}
2 26 Feb 07 jari 654             /*
2 26 Feb 07 jari 655             for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 656                 for (int j = 0; j < kModel.getColumnCount(); j++) {
2 26 Feb 07 jari 657                     kModel.setValueAt(origData[i][j], i, j);
2 26 Feb 07 jari 658                 }
2 26 Feb 07 jari 659                 validateTable(origData, i);
2 26 Feb 07 jari 660             }
2 26 Feb 07 jari 661             return;
2 26 Feb 07 jari 662              */
2 26 Feb 07 jari 663         }
2 26 Feb 07 jari 664         if ((column < 0)|| (column > kModel.getColumnCount())) {
2 26 Feb 07 jari 665             return;
2 26 Feb 07 jari 666         }
2 26 Feb 07 jari 667         Object[][] sortedData = new Object[kModel.getRowCount()][kModel.getColumnCount()];
2 26 Feb 07 jari 668         //float[] origArray = new float[kModel.getRowCount()];
2 26 Feb 07 jari 669         SortableField[] sortFields = new SortableField[kModel.getRowCount()];
2 26 Feb 07 jari 670         
2 26 Feb 07 jari 671         for (int i = 0; i < sortFields.length; i++) {
2 26 Feb 07 jari 672             int origDataRow = ((Integer)(kModel.getValueAt(i, 0))).intValue();
2 26 Feb 07 jari 673             sortFields[i] = new SortableField(origDataRow, column);
2 26 Feb 07 jari 674         }
2 26 Feb 07 jari 675         Arrays.sort(sortFields);
2 26 Feb 07 jari 676         int[] sortedIndices = new int[sortFields.length];
2 26 Feb 07 jari 677         for (int i = 0; i < sortedIndices.length; i++) {
2 26 Feb 07 jari 678             sortedIndices[i] = sortFields[i].getIndex();
2 26 Feb 07 jari 679         }
2 26 Feb 07 jari 680         if (!ascending) {
2 26 Feb 07 jari 681             sortedIndices = reverse(sortedIndices);
2 26 Feb 07 jari 682         }
2 26 Feb 07 jari 683         
2 26 Feb 07 jari 684         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 685             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 686                 //sortedData[i][j] = tModel.getValueAt(sortedMeansAIndices[i], j);
2 26 Feb 07 jari 687                 sortedData[i][j] = origData[sortedIndices[i]][j];
2 26 Feb 07 jari 688             }
2 26 Feb 07 jari 689         }
2 26 Feb 07 jari 690         
2 26 Feb 07 jari 691         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 692             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 693                 kModel.setValueAt(sortedData[i][j], i, j);
2 26 Feb 07 jari 694             }
2 26 Feb 07 jari 695             validateTable(sortedData, i);
2 26 Feb 07 jari 696         }
2 26 Feb 07 jari 697         
2 26 Feb 07 jari 698         knnClassTable.removeRowSelectionInterval(0, knnClassTable.getRowCount() - 1);
2 26 Feb 07 jari 699     }
2 26 Feb 07 jari 700     
2 26 Feb 07 jari 701     private int[] reverse(int[] arr) {
2 26 Feb 07 jari 702         int[] revArr = new int[arr.length];
2 26 Feb 07 jari 703         int  revCount = 0;
2 26 Feb 07 jari 704         int count = arr.length - 1;
2 26 Feb 07 jari 705         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 706             revArr[revCount] = arr[count];
2 26 Feb 07 jari 707             revCount++;
2 26 Feb 07 jari 708             count--;
2 26 Feb 07 jari 709         }
2 26 Feb 07 jari 710         return revArr;
2 26 Feb 07 jari 711     }
2 26 Feb 07 jari 712     
2 26 Feb 07 jari 713     private void sortByClassification() {
2 26 Feb 07 jari 714         Vector[] classVectors = new Vector[numClasses + 1];
2 26 Feb 07 jari 715         for (int i = 0; i < classVectors.length; i++) {
2 26 Feb 07 jari 716             classVectors[i] = new Vector();
2 26 Feb 07 jari 717         }
2 26 Feb 07 jari 718         
2 26 Feb 07 jari 719         for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 720             for (int j = 1; (j <= numClasses + 1); j++) {
2 26 Feb 07 jari 721                 boolean b = ((Boolean)(kModel.getValueAt(i, j))).booleanValue();
2 26 Feb 07 jari 722                 if (b) {
2 26 Feb 07 jari 723                     classVectors[j - 1].add(new Integer(i));
2 26 Feb 07 jari 724                     break;
2 26 Feb 07 jari 725                 }
2 26 Feb 07 jari 726             }
2 26 Feb 07 jari 727         }
2 26 Feb 07 jari 728         
2 26 Feb 07 jari 729         int[] sortedIndices = new int[kModel.getRowCount()];
2 26 Feb 07 jari 730         int counter = 0;
2 26 Feb 07 jari 731         
2 26 Feb 07 jari 732         for (int i = 0; i < classVectors.length; i++) {
2 26 Feb 07 jari 733             for (int j = 0; j < classVectors[i].size(); j++) {
2 26 Feb 07 jari 734                 sortedIndices[counter] = ((Integer)(classVectors[i].get(j))).intValue();
2 26 Feb 07 jari 735                 counter++;
2 26 Feb 07 jari 736             }
2 26 Feb 07 jari 737         }
2 26 Feb 07 jari 738         
2 26 Feb 07 jari 739         Object sortedData[][] = new Object[kModel.getRowCount()][kModel.getColumnCount()];
2 26 Feb 07 jari 740         
2 26 Feb 07 jari 741         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 742             for (int j = 0; j < sortedData[0].length; j++) {
2 26 Feb 07 jari 743                 sortedData[i][j] = kModel.getValueAt(sortedIndices[i], j);
2 26 Feb 07 jari 744             }
2 26 Feb 07 jari 745         }
2 26 Feb 07 jari 746         
2 26 Feb 07 jari 747         for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 748             for (int j = 0; j < kModel.getColumnCount(); j++) {
2 26 Feb 07 jari 749                 kModel.setValueAt(sortedData[i][j], i, j);
2 26 Feb 07 jari 750             }
2 26 Feb 07 jari 751             validateTable(sortedData, i);
2 26 Feb 07 jari 752         }
2 26 Feb 07 jari 753         
2 26 Feb 07 jari 754         knnClassTable.removeRowSelectionInterval(0, knnClassTable.getRowCount() - 1);        
2 26 Feb 07 jari 755     }
2 26 Feb 07 jari 756     
2 26 Feb 07 jari 757     private void validateTable(Object[][] tabData, int row) {
2 26 Feb 07 jari 758         for (int i = 1; i <= (numClasses + 1); i++) {
2 26 Feb 07 jari 759             boolean check = ((Boolean)(tabData[row][i])).booleanValue();
2 26 Feb 07 jari 760             if (check) {
2 26 Feb 07 jari 761                 kModel.setValueAt(new Boolean(true), row, i);
2 26 Feb 07 jari 762                 break;
2 26 Feb 07 jari 763             }
2 26 Feb 07 jari 764         }
2 26 Feb 07 jari 765     }
2 26 Feb 07 jari 766     
2 26 Feb 07 jari 767     private void searchTable(){
2 26 Feb 07 jari 768         
2 26 Feb 07 jari 769         searchDialog.setVisible(true);
2 26 Feb 07 jari 770         searchDialog.toFront();
2 26 Feb 07 jari 771         //searchDialog.requestFocus();
2 26 Feb 07 jari 772         searchDialog.setLocation(this.getLocation().x + 100, this.getLocation().y +100);
2 26 Feb 07 jari 773         
2 26 Feb 07 jari 774     }    
2 26 Feb 07 jari 775     
2 26 Feb 07 jari 776     private void saveToFile(File file) {
2 26 Feb 07 jari 777         try {
2 26 Feb 07 jari 778             PrintWriter out = new PrintWriter(new FileOutputStream(file));
2 26 Feb 07 jari 779             for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 780                 out.print(((Integer)(kModel.getValueAt(i, 0))).intValue());
2 26 Feb 07 jari 781                 out.print("\t");
2 26 Feb 07 jari 782                 for (int j = 1; j <= numClasses; j++) {
2 26 Feb 07 jari 783                     if (((Boolean)(kModel.getValueAt(i, j))).booleanValue()) {
2 26 Feb 07 jari 784                         out.print(j);
2 26 Feb 07 jari 785                         break;
2 26 Feb 07 jari 786                     }
2 26 Feb 07 jari 787                 }
2 26 Feb 07 jari 788                 if (((Boolean)(kModel.getValueAt(i, numClasses + 1))).booleanValue()) {
2 26 Feb 07 jari 789                     out.print(-1);
2 26 Feb 07 jari 790                 }
2 26 Feb 07 jari 791                 //out.print("\t");
2 26 Feb 07 jari 792                 for (int j = numClasses + 2; j < kModel.getColumnCount(); j++) {
2 26 Feb 07 jari 793                     out.print("\t");
2 26 Feb 07 jari 794                     out.print(kModel.getValueAt(i, j));
2 26 Feb 07 jari 795                 }
2 26 Feb 07 jari 796                 out.print("\n");
2 26 Feb 07 jari 797             }
2 26 Feb 07 jari 798             out.flush();
2 26 Feb 07 jari 799             out.close();            
2 26 Feb 07 jari 800             
2 26 Feb 07 jari 801         } catch (Exception e) {
2 26 Feb 07 jari 802             //e.printStackTrace();
2 26 Feb 07 jari 803         }
2 26 Feb 07 jari 804     }
2 26 Feb 07 jari 805     
2 26 Feb 07 jari 806     public void loadFromFile (File file) {
2 26 Feb 07 jari 807         Vector indicesVector = new Vector();
2 26 Feb 07 jari 808         Vector classVector = new Vector();
2 26 Feb 07 jari 809         try {
2 26 Feb 07 jari 810            BufferedReader buff = new BufferedReader(new FileReader(file)); 
2 26 Feb 07 jari 811            String line = new String();
2 26 Feb 07 jari 812            StringSplitter st;           
2 26 Feb 07 jari 813            
2 26 Feb 07 jari 814            while ((line = buff.readLine()) != null) {
2 26 Feb 07 jari 815                st = new StringSplitter('\t');
2 26 Feb 07 jari 816                st.init(line);
2 26 Feb 07 jari 817                String currIndex = st.nextToken();
2 26 Feb 07 jari 818                indicesVector.add(new Integer(currIndex));
2 26 Feb 07 jari 819                String currClass = st.nextToken();
2 26 Feb 07 jari 820                classVector.add(new Integer(currClass));
2 26 Feb 07 jari 821            }
2 26 Feb 07 jari 822            
2 26 Feb 07 jari 823            for (int i = 0; i < indicesVector.size(); i++) {
2 26 Feb 07 jari 824                int currInd = ((Integer)(indicesVector.get(i))).intValue();
2 26 Feb 07 jari 825                int currCl = ((Integer)(classVector.get(i))).intValue();
2 26 Feb 07 jari 826                
2 26 Feb 07 jari 827                if (currCl == (-1)) {
2 26 Feb 07 jari 828                    kModel.setValueAt(new Boolean(true), currInd, (numClasses + 1));
2 26 Feb 07 jari 829                } else {
2 26 Feb 07 jari 830                    kModel.setValueAt(new Boolean(true), currInd, currCl);
2 26 Feb 07 jari 831                }
2 26 Feb 07 jari 832            }  
2 26 Feb 07 jari 833            KNNClassificationEditor.this.showModal(true);
2 26 Feb 07 jari 834           
2 26 Feb 07 jari 835            //KNNClassificationEditor.this.setVisible(true);
2 26 Feb 07 jari 836           // showWarningMessage();
2 26 Feb 07 jari 837         } catch (Exception e) {
2 26 Feb 07 jari 838             JOptionPane.showMessageDialog(framework.getFrame(), "Incompatible file!", "Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 839             incompatible = true;
2 26 Feb 07 jari 840             //KNNClassificationEditor.this.dispose();
2 26 Feb 07 jari 841             //e.printStackTrace();
2 26 Feb 07 jari 842         }
2 26 Feb 07 jari 843         /*
2 26 Feb 07 jari 844         for (int i = 0; i < indicesVector.size(); i++) {
2 26 Feb 07 jari 845             int currInd = ((Integer)(indicesVector.get(i))).intValue();
2 26 Feb 07 jari 846             int currCl = ((Integer)(classVector.get(i))).intValue();
2 26 Feb 07 jari 847         }
2 26 Feb 07 jari 848          */
2 26 Feb 07 jari 849     }
2 26 Feb 07 jari 850     
2 26 Feb 07 jari 851     public Vector[] getClassification() {
2 26 Feb 07 jari 852         Vector indicesVector = new Vector();
2 26 Feb 07 jari 853         Vector classVector = new Vector();
2 26 Feb 07 jari 854         Vector[] vectArray = new Vector[2];
2 26 Feb 07 jari 855         
2 26 Feb 07 jari 856         for (int i = 0; i < kModel.getRowCount(); i++) {
2 26 Feb 07 jari 857             if (((Boolean)(kModel.getValueAt(i, numClasses + 1))).booleanValue()) {
2 26 Feb 07 jari 858                 continue;
2 26 Feb 07 jari 859             } else {
2 26 Feb 07 jari 860                 indicesVector.add((Integer)(kModel.getValueAt(i, 0)));
2 26 Feb 07 jari 861                 classVector.add(new Integer(getClass(i)));
2 26 Feb 07 jari 862             }
2 26 Feb 07 jari 863         }
2 26 Feb 07 jari 864         
2 26 Feb 07 jari 865         vectArray[0] = indicesVector;
2 26 Feb 07 jari 866         vectArray[1] = classVector;
2 26 Feb 07 jari 867         return vectArray;
2 26 Feb 07 jari 868     }
2 26 Feb 07 jari 869     
2 26 Feb 07 jari 870     public boolean isNextPressed() {
2 26 Feb 07 jari 871         return nextPressed;
2 26 Feb 07 jari 872     }
2 26 Feb 07 jari 873     
2 26 Feb 07 jari 874     private int getClass(int row) {
2 26 Feb 07 jari 875         int i;
2 26 Feb 07 jari 876         for (i = 1; i <= numClasses + 1; i++) {
2 26 Feb 07 jari 877             if (((Boolean)(kModel.getValueAt(row, i))).booleanValue()) {
2 26 Feb 07 jari 878                 break;
2 26 Feb 07 jari 879             }
2 26 Feb 07 jari 880         }
2 26 Feb 07 jari 881         
2 26 Feb 07 jari 882         return i;
2 26 Feb 07 jari 883     }
2 26 Feb 07 jari 884     
2 26 Feb 07 jari 885     public boolean proceed() {
2 26 Feb 07 jari 886         return !(stopHere);
2 26 Feb 07 jari 887     }
2 26 Feb 07 jari 888     
2 26 Feb 07 jari 889     public boolean fileIsIncompatible() {
2 26 Feb 07 jari 890         return incompatible;
2 26 Feb 07 jari 891     }
2 26 Feb 07 jari 892     
2 26 Feb 07 jari 893     public void showWarningMessage() {
2 26 Feb 07 jari 894         JTextArea area = new JTextArea();
2 26 Feb 07 jari 895         area.append("The editor displays all genes or expts in the data set loaded into MeV,");
2 26 Feb 07 jari 896         area.append("\nincluding those that have been removed from analysis by variance filtering"); 
2 26 Feb 07 jari 897         area.append("\nin the previous stage, or by applying cutoffs under the Adjust Data"); 
2 26 Feb 07 jari 898         area.append("\nmenu. If you designate such genes  or samples as classifiers,");  
2 26 Feb 07 jari 899         area.append("\nthey will not be used for classification");
2 26 Feb 07 jari 900         area.setEditable(false);
2 26 Feb 07 jari 901         area.setBackground(Color.gray.brighter());
2 26 Feb 07 jari 902         JOptionPane.showMessageDialog(KNNClassificationEditor.this, area, "Warning", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 903     }
2 26 Feb 07 jari 904     
2 26 Feb 07 jari 905     private class SortableField implements Comparable {
2 26 Feb 07 jari 906         private String field;
2 26 Feb 07 jari 907         private int index;
2 26 Feb 07 jari 908         
2 26 Feb 07 jari 909         SortableField(int index, int column) {
2 26 Feb 07 jari 910             this.index = index;
2 26 Feb 07 jari 911             this.field = (String)(origData[index][column]);
2 26 Feb 07 jari 912             //System.out.println("SortableField[" + index + "][" + column + "]: index = " + index + ", field = " + field);
2 26 Feb 07 jari 913         }
2 26 Feb 07 jari 914         
2 26 Feb 07 jari 915         public int compareTo(Object other) {
2 26 Feb 07 jari 916             SortableField otherField = (SortableField)other;
2 26 Feb 07 jari 917             return this.field.compareTo(otherField.getField());
2 26 Feb 07 jari 918         }
2 26 Feb 07 jari 919         
2 26 Feb 07 jari 920         public int getIndex() {
2 26 Feb 07 jari 921             return this.index;
2 26 Feb 07 jari 922         }
2 26 Feb 07 jari 923         public String getField() {
2 26 Feb 07 jari 924             return this.field;
2 26 Feb 07 jari 925         }
2 26 Feb 07 jari 926     }
2 26 Feb 07 jari 927     
2 26 Feb 07 jari 928     public class AssignListener implements ActionListener {
2 26 Feb 07 jari 929         
2 26 Feb 07 jari 930         public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 931             Object source = evt.getSource();
2 26 Feb 07 jari 932             
2 26 Feb 07 jari 933             if (source instanceof JMenuItem) {
2 26 Feb 07 jari 934                 String key = ((JMenuItem)source).getText();
2 26 Feb 07 jari 935                 int classCol = kModel.getColumnIndex(key);
2 26 Feb 07 jari 936                 int[] selectedRows = knnClassTable.getSelectedRows();
2 26 Feb 07 jari 937                 int[] selectedIndices = new int[selectedRows.length];
2 26 Feb 07 jari 938                 
2 26 Feb 07 jari 939                 for (int i = 0; i < selectedRows.length; i++) {
2 26 Feb 07 jari 940                     kModel.setValueAt(new Boolean(true), selectedRows[i], classCol);
2 26 Feb 07 jari 941                     //int currIndex = ((Integer)(kModel.getValueAt(selectedRows[i], 0))).intValue();
2 26 Feb 07 jari 942                     //origData[currIndex][classCol] = new Boolean(true);
2 26 Feb 07 jari 943                 }
2 26 Feb 07 jari 944             }
2 26 Feb 07 jari 945         }
2 26 Feb 07 jari 946         
2 26 Feb 07 jari 947     }
2 26 Feb 07 jari 948     
2 26 Feb 07 jari 949     public class SortListener implements ActionListener {
2 26 Feb 07 jari 950         boolean asc, origOrd;
2 26 Feb 07 jari 951         public SortListener(boolean asc, boolean origOrd) {
2 26 Feb 07 jari 952             this.asc = asc;
2 26 Feb 07 jari 953             this.origOrd = origOrd;
2 26 Feb 07 jari 954         }
2 26 Feb 07 jari 955         
2 26 Feb 07 jari 956         public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 957             Object source = evt.getSource();
2 26 Feb 07 jari 958             
2 26 Feb 07 jari 959             if (source instanceof JMenuItem) {
2 26 Feb 07 jari 960                 String key = ((JMenuItem)source).getText();
2 26 Feb 07 jari 961                 int colToSort = kModel.getColumnIndex(key);
2 26 Feb 07 jari 962                 sortByColumn(colToSort, asc, origOrd);
2 26 Feb 07 jari 963             }
2 26 Feb 07 jari 964         }
2 26 Feb 07 jari 965     }
2 26 Feb 07 jari 966     
2 26 Feb 07 jari 967 }