mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/ptm/PTMGeneStatsTableViewer.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, 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  * PTMStatsTableViewer.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on November 24, 2003, 3:59 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.ptm;
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.event.ActionEvent;
2 26 Feb 07 jari 18 import java.awt.event.ActionListener;
2 26 Feb 07 jari 19 import java.awt.event.InputEvent;
2 26 Feb 07 jari 20 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 21 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 22 import java.io.File;
2 26 Feb 07 jari 23 import java.io.FileOutputStream;
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
2 26 Feb 07 jari 27 import javax.swing.JComponent;
2 26 Feb 07 jari 28 import javax.swing.JFileChooser;
2 26 Feb 07 jari 29 import javax.swing.JMenuItem;
2 26 Feb 07 jari 30 import javax.swing.JPanel;
2 26 Feb 07 jari 31 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 32 import javax.swing.JTable;
2 26 Feb 07 jari 33 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 34 import javax.swing.table.JTableHeader;
2 26 Feb 07 jari 35 import javax.swing.table.TableColumn;
2 26 Feb 07 jari 36 import javax.swing.table.TableColumnModel;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.impl.ViewerAdapter;
2 26 Feb 07 jari 42 import org.tigr.util.QSort;
2 26 Feb 07 jari 43
2 26 Feb 07 jari 44 /**
2 26 Feb 07 jari 45  *
2 26 Feb 07 jari 46  * @author  nbhagaba
2 26 Feb 07 jari 47  */
2 26 Feb 07 jari 48 public class PTMGeneStatsTableViewer extends ViewerAdapter {
2 26 Feb 07 jari 49     
2 26 Feb 07 jari 50     private JComponent header;
2 26 Feb 07 jari 51     private JComponent content;
2 26 Feb 07 jari 52     private Experiment experiment;
2 26 Feb 07 jari 53     private int[][] clusters;
2 26 Feb 07 jari 54     private boolean sig;
2 26 Feb 07 jari 55     private int[] rows;
2 26 Feb 07 jari 56     private String[] fieldNames;    
2 26 Feb 07 jari 57     
2 26 Feb 07 jari 58     private JTable pAndRValuesTable;
2 26 Feb 07 jari 59     private PAndRValuesTableModel pAndRModel;   
2 26 Feb 07 jari 60     private String[] auxTitles;
2 26 Feb 07 jari 61     private Object[][] auxData;
2 26 Feb 07 jari 62     
2 26 Feb 07 jari 63     private IData data;
2 26 Feb 07 jari 64     private JPopupMenu popup;    
2 26 Feb 07 jari 65     private Object[][] origData;
2 26 Feb 07 jari 66     private boolean sortedAscending[];//, sortedDescending;    
2 26 Feb 07 jari 67    
2 26 Feb 07 jari 68     /** Creates a new instance of PTMStatsTableViewer */
2 26 Feb 07 jari 69     public PTMGeneStatsTableViewer(Experiment experiment, int[][] clusters, IData data,  String[] auxTitles, Object[][] auxData, boolean sig) {
2 26 Feb 07 jari 70         this.experiment = experiment;
2 26 Feb 07 jari 71         this.clusters = clusters;
2 26 Feb 07 jari 72         this.data = data;
2 26 Feb 07 jari 73         this.fieldNames = data.getFieldNames();     
2 26 Feb 07 jari 74         this.auxTitles = auxTitles;
2 26 Feb 07 jari 75         this.auxData = auxData;
2 26 Feb 07 jari 76         this.sig = sig;
2 26 Feb 07 jari 77         if (sig) {
2 26 Feb 07 jari 78             rows = clusters[0];
2 26 Feb 07 jari 79         } else {
2 26 Feb 07 jari 80             rows =clusters[1];
2 26 Feb 07 jari 81         } 
2 26 Feb 07 jari 82         pAndRModel = new PAndRValuesTableModel();
2 26 Feb 07 jari 83         pAndRValuesTable = new JTable(pAndRModel);
2 26 Feb 07 jari 84         origData = new Object[pAndRModel.getRowCount()][pAndRModel.getColumnCount()];
2 26 Feb 07 jari 85         for (int i = 0; i < origData.length; i++) {
2 26 Feb 07 jari 86             for (int j = 0; j < origData[i].length; j++) {
2 26 Feb 07 jari 87                 origData[i][j] = pAndRModel.getValueAt(i, j);
2 26 Feb 07 jari 88             }
2 26 Feb 07 jari 89         }
2 26 Feb 07 jari 90         this.sortedAscending = new boolean[pAndRModel.getColumnCount()];
2 26 Feb 07 jari 91         for (int i = 0; i < sortedAscending.length; i++) {
2 26 Feb 07 jari 92             sortedAscending[i] = false;
2 26 Feb 07 jari 93         }
2 26 Feb 07 jari 94         //tValuesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2 26 Feb 07 jari 95         //tValuesTable.setBackground(Color.white);
2 26 Feb 07 jari 96         //tValuesTable.setMinimumSize(new Dimension(500, tModel.getRowCount()*tValuesTable.getRowHeight()));
2 26 Feb 07 jari 97         //tValuesTable.setPreferredScrollableViewportSize(new Dimension(500, 600));
2 26 Feb 07 jari 98         //tValuesTable.setM
2 26 Feb 07 jari 99         TableColumn column = null;
2 26 Feb 07 jari 100         for (int i = 0; i < pAndRModel.getColumnCount(); i++) {
2 26 Feb 07 jari 101             column = pAndRValuesTable.getColumnModel().getColumn(i);
2 26 Feb 07 jari 102             column.setMinWidth(30);
2 26 Feb 07 jari 103         }
2 26 Feb 07 jari 104         addMouseListenerToHeaderInTable(pAndRValuesTable);
2 26 Feb 07 jari 105         header  = pAndRValuesTable.getTableHeader();
2 26 Feb 07 jari 106         //header.setBackground(Color.white);
2 26 Feb 07 jari 107         //content = createContent();
2 26 Feb 07 jari 108         setMaxWidth(getContentComponent(), getHeaderComponent());        
2 26 Feb 07 jari 109     }
2 26 Feb 07 jari 110     
2 26 Feb 07 jari 111     public PTMGeneStatsTableViewer(JComponent content, JComponent header){
2 26 Feb 07 jari 112       this.content = content;
2 26 Feb 07 jari 113       this.header = header;
2 26 Feb 07 jari 114         setMaxWidth(getContentComponent(), getHeaderComponent());         
2 26 Feb 07 jari 115     }
2 26 Feb 07 jari 116     
2 26 Feb 07 jari 117         
2 26 Feb 07 jari 118     
2 26 Feb 07 jari 119     /**
2 26 Feb 07 jari 120      * Returns component to be inserted into the framework scroll pane.
2 26 Feb 07 jari 121      */
2 26 Feb 07 jari 122     public JComponent getContentComponent() {
2 26 Feb 07 jari 123         JPanel panel = new JPanel();
2 26 Feb 07 jari 124         panel.setBackground(Color.white);
2 26 Feb 07 jari 125         GridBagConstraints constraints = new GridBagConstraints();
2 26 Feb 07 jari 126         GridBagLayout gridbag = new GridBagLayout();
2 26 Feb 07 jari 127         panel.setLayout(gridbag);
2 26 Feb 07 jari 128         constraints.fill = GridBagConstraints.HORIZONTAL;
2 26 Feb 07 jari 129         constraints.anchor = GridBagConstraints.NORTH;
2 26 Feb 07 jari 130         buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
2 26 Feb 07 jari 131         gridbag.setConstraints(pAndRValuesTable, constraints);
2 26 Feb 07 jari 132         panel.add(pAndRValuesTable);
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134         final JFileChooser fc = new JFileChooser();
2 26 Feb 07 jari 135         fc.setCurrentDirectory(new File("Data"));
2 26 Feb 07 jari 136         fc.setDialogTitle("Save p and R values");
2 26 Feb 07 jari 137         
2 26 Feb 07 jari 138         popup = new JPopupMenu();
2 26 Feb 07 jari 139         JMenuItem menuItem = new JMenuItem("Save p and R values", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 140         menuItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 141             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 142                 int returnVal = fc.showSaveDialog(PTMGeneStatsTableViewer.this.getHeaderComponent());
2 26 Feb 07 jari 143                 if (returnVal == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 144                     File file = fc.getSelectedFile();
2 26 Feb 07 jari 145                     try {
2 26 Feb 07 jari 146                         PrintWriter out = new PrintWriter(new FileOutputStream(file));
2 26 Feb 07 jari 147                         for (int i = 0; i < fieldNames.length; i++) {
2 26 Feb 07 jari 148                             out.print(fieldNames[i]);
2 26 Feb 07 jari 149                             if (i < fieldNames.length - 1) {
2 26 Feb 07 jari 150                                 
2 26 Feb 07 jari 151                                 out.print("\t");
2 26 Feb 07 jari 152                             }
2 26 Feb 07 jari 153                         }
2 26 Feb 07 jari 154                         //System.out.println("auxTitles.length = " + auxTitles.length);
2 26 Feb 07 jari 155                         for (int i = 0; i < auxTitles.length; i++) {
2 26 Feb 07 jari 156                             out.print("\t" + auxTitles[i]);
2 26 Feb 07 jari 157                             //System.out.println(auxTitles[i]);
2 26 Feb 07 jari 158                             /*
2 26 Feb 07 jari 159                             if (i < auxTitles.length - 1) {
2 26 Feb 07 jari 160                                 out.print("\t");
2 26 Feb 07 jari 161                             }
2 26 Feb 07 jari 162                              */
2 26 Feb 07 jari 163                         }
2 26 Feb 07 jari 164                         out.print("\n");
2 26 Feb 07 jari 165                         
2 26 Feb 07 jari 166                         //if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 167                             //out.print("\tGroupA mean\tGroupA std.dev.\tGroupB mean\tGroupB std.dev.\tt-ratio\tdf\tp-value\n");
2 26 Feb 07 jari 168                         //} else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 169                             //out.print("\tGene mean\tGene std.dev.\tt-ratio\tdf\tp-value\n");
2 26 Feb 07 jari 170                         //}
2 26 Feb 07 jari 171                         for (int i = 0; i < rows.length; i++) {
2 26 Feb 07 jari 172                             for (int k = 0; k < fieldNames.length; k++) {
2 26 Feb 07 jari 173                                 out.print(data.getElementAttribute(experiment.getGeneIndexMappedToData(rows[i]), k));
2 26 Feb 07 jari 174                                 if (k < fieldNames.length - 1) {
2 26 Feb 07 jari 175                                     out.print("\t");
2 26 Feb 07 jari 176                                 }
2 26 Feb 07 jari 177                             }
2 26 Feb 07 jari 178                             for (int j = 0; j < auxData[rows[i]].length; j++) {
2 26 Feb 07 jari 179                                 out.print("\t" + ((Float)(auxData[rows[i]][j])).floatValue());
2 26 Feb 07 jari 180                             }
2 26 Feb 07 jari 181                             /*
2 26 Feb 07 jari 182                             if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 183                                 out.print("\t" + ((Float)(meansA.get(rows[i]))).floatValue());
2 26 Feb 07 jari 184                                 out.print("\t" + ((Float)(sdA.get(rows[i]))).floatValue());
2 26 Feb 07 jari 185                                 out.print("\t" + ((Float)(meansB.get(rows[i]))).floatValue());
2 26 Feb 07 jari 186                                 out.print("\t" + ((Float)(sdB.get(rows[i]))).floatValue());
2 26 Feb 07 jari 187                             } else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 188                                 out.print("\t" + ((Float)(oneClassMeans.get(rows[i]))).floatValue());
2 26 Feb 07 jari 189                                 out.print("\t" + ((Float)(oneClassSDs.get(rows[i]))).floatValue());                                
2 26 Feb 07 jari 190                             }
2 26 Feb 07 jari 191                             out.print("\t" + ((Float)(tValues.get(rows[i]))).floatValue());
2 26 Feb 07 jari 192                             out.print("\t" + ((Float)(dfValues.get(rows[i]))).intValue());
2 26 Feb 07 jari 193                             out.print("\t" + ((Float)(pValues.get(rows[i]))).floatValue());
2 26 Feb 07 jari 194                             */
2 26 Feb 07 jari 195                             out.print("\n");
2 26 Feb 07 jari 196                             
2 26 Feb 07 jari 197                         }
2 26 Feb 07 jari 198                         out.println();
2 26 Feb 07 jari 199                         out.flush();
2 26 Feb 07 jari 200                         out.close();
2 26 Feb 07 jari 201                     } catch (Exception e) {
2 26 Feb 07 jari 202                         e.printStackTrace();
2 26 Feb 07 jari 203                     }
2 26 Feb 07 jari 204                     //this is where a real application would save the file.
2 26 Feb 07 jari 205                     //log.append("Saving: " + file.getName() + "." + newline);
2 26 Feb 07 jari 206                 } else {
2 26 Feb 07 jari 207                     //log.append("Save command cancelled by user." + newline);
2 26 Feb 07 jari 208                 }
2 26 Feb 07 jari 209             }
2 26 Feb 07 jari 210         });
2 26 Feb 07 jari 211         
2 26 Feb 07 jari 212         popup.add(menuItem);
2 26 Feb 07 jari 213         
2 26 Feb 07 jari 214         pAndRValuesTable.addMouseListener(new MouseAdapter() {
2 26 Feb 07 jari 215             public void mousePressed(MouseEvent e) {
2 26 Feb 07 jari 216                 maybeShowPopup(e);
2 26 Feb 07 jari 217             }
2 26 Feb 07 jari 218             
2 26 Feb 07 jari 219             public void mouseReleased(MouseEvent e) {
2 26 Feb 07 jari 220                 maybeShowPopup(e);
2 26 Feb 07 jari 221             }
2 26 Feb 07 jari 222             
2 26 Feb 07 jari 223             private void maybeShowPopup(MouseEvent e) {
2 26 Feb 07 jari 224                 if (e.isPopupTrigger()) {
2 26 Feb 07 jari 225                     popup.show(e.getComponent(),
2 26 Feb 07 jari 226                     e.getX(), e.getY());
2 26 Feb 07 jari 227                 }
2 26 Feb 07 jari 228             }
2 26 Feb 07 jari 229             
2 26 Feb 07 jari 230         });
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         return panel;
2 26 Feb 07 jari 233         //return tValuesTable;
2 26 Feb 07 jari 234         //return content;
2 26 Feb 07 jari 235     }  
2 26 Feb 07 jari 236     
2 26 Feb 07 jari 237     /**
2 26 Feb 07 jari 238      * Returns the viewer header.
2 26 Feb 07 jari 239      */
2 26 Feb 07 jari 240     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 241         JPanel panel = new JPanel();
2 26 Feb 07 jari 242         panel.setBackground(Color.white);
2 26 Feb 07 jari 243         GridBagConstraints constraints = new GridBagConstraints();
2 26 Feb 07 jari 244         GridBagLayout gridbag = new GridBagLayout();
2 26 Feb 07 jari 245         panel.setLayout(gridbag);
2 26 Feb 07 jari 246         constraints.fill = GridBagConstraints.HORIZONTAL;
2 26 Feb 07 jari 247         buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
2 26 Feb 07 jari 248         gridbag.setConstraints(header, constraints);
2 26 Feb 07 jari 249         panel.add(header);
2 26 Feb 07 jari 250         return panel;
2 26 Feb 07 jari 251         //return header;
2 26 Feb 07 jari 252     }  
2 26 Feb 07 jari 253     
2 26 Feb 07 jari 254     void buildConstraints(GridBagConstraints gbc, int gx, int gy,
2 26 Feb 07 jari 255     int gw, int gh, int wx, int wy) {
2 26 Feb 07 jari 256         
2 26 Feb 07 jari 257         gbc.gridx = gx;
2 26 Feb 07 jari 258         gbc.gridy = gy;
2 26 Feb 07 jari 259         gbc.gridwidth = gw;
2 26 Feb 07 jari 260         gbc.gridheight = gh;
2 26 Feb 07 jari 261         gbc.weightx = wx;
2 26 Feb 07 jari 262         gbc.weighty = wy;
2 26 Feb 07 jari 263     }    
2 26 Feb 07 jari 264     
2 26 Feb 07 jari 265     class PAndRValuesTableModel extends AbstractTableModel {
2 26 Feb 07 jari 266         String[] columnNames;
2 26 Feb 07 jari 267         Object[][] tableData;
2 26 Feb 07 jari 268         
2 26 Feb 07 jari 269         public PAndRValuesTableModel() {
2 26 Feb 07 jari 270             //else if (design == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 271             columnNames = new String[fieldNames.length + auxTitles.length];
2 26 Feb 07 jari 272             int counter;
2 26 Feb 07 jari 273             for (counter = 0; counter < fieldNames.length; counter++) {
2 26 Feb 07 jari 274                 columnNames[counter] = fieldNames[counter];
2 26 Feb 07 jari 275             }
2 26 Feb 07 jari 276             for (int i = counter; i < columnNames.length; i++) {
2 26 Feb 07 jari 277                 columnNames[i] = auxTitles[i - counter];
2 26 Feb 07 jari 278             }
2 26 Feb 07 jari 279                 /*
2 26 Feb 07 jari 280                 columnNames[counter] = "Gene mean";
2 26 Feb 07 jari 281                 columnNames[counter + 1] = "Gene std.dev";
2 26 Feb 07 jari 282                 columnNames[counter + 2] = "t-ratio";
2 26 Feb 07 jari 283                 columnNames[counter + 3] = "df";
2 26 Feb 07 jari 284                 columnNames[counter + 4] = "p-value";
2 26 Feb 07 jari 285                  */
2 26 Feb 07 jari 286             tableData = new Object[rows.length][columnNames.length];
2 26 Feb 07 jari 287             
2 26 Feb 07 jari 288             int j;
2 26 Feb 07 jari 289             for(int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 290                 for (j = 0; j < fieldNames.length; j++) {
2 26 Feb 07 jari 291                     
2 26 Feb 07 jari 292                     tableData[i][j] = data.getElementAttribute(experiment.getGeneIndexMappedToData(rows[i]), j);
2 26 Feb 07 jari 293                 }
2 26 Feb 07 jari 294                 
2 26 Feb 07 jari 295                 for (int k = j; k < tableData[i].length; k++) {
2 26 Feb 07 jari 296                     float f = ((Float)(auxData[rows[i]][k - j])).floatValue();
2 26 Feb 07 jari 297                     if (Float.isNaN(f)) {
2 26 Feb 07 jari 298                         tableData[i][k] = "N/A";
2 26 Feb 07 jari 299                     } else {
2 26 Feb 07 jari 300                         tableData[i][k] = new Float(f);
2 26 Feb 07 jari 301                     }
2 26 Feb 07 jari 302                 }                
2 26 Feb 07 jari 303             }            
2 26 Feb 07 jari 304             
2 26 Feb 07 jari 305         }
2 26 Feb 07 jari 306         
2 26 Feb 07 jari 307         
2 26 Feb 07 jari 308         public int getColumnCount() {
2 26 Feb 07 jari 309             return columnNames.length;
2 26 Feb 07 jari 310         }
2 26 Feb 07 jari 311         
2 26 Feb 07 jari 312         public int getRowCount() {
2 26 Feb 07 jari 313             return tableData.length;
2 26 Feb 07 jari 314         }
2 26 Feb 07 jari 315         
2 26 Feb 07 jari 316         public String getColumnName(int col) {
2 26 Feb 07 jari 317             return columnNames[col];
2 26 Feb 07 jari 318         }
2 26 Feb 07 jari 319         
2 26 Feb 07 jari 320         public Object getValueAt(int row, int col) {
2 26 Feb 07 jari 321             return tableData[row][col];
2 26 Feb 07 jari 322         }
2 26 Feb 07 jari 323         
2 26 Feb 07 jari 324         public void setValueAt(Object value, int row, int col) {
2 26 Feb 07 jari 325             tableData[row][col] = value;
2 26 Feb 07 jari 326             fireTableCellUpdated(row, col);
2 26 Feb 07 jari 327         }
2 26 Feb 07 jari 328         
2 26 Feb 07 jari 329         /*
2 26 Feb 07 jari 330         public Class getColumnClass(int c) {
2 26 Feb 07 jari 331             if (c < fieldNames.length) {
2 26 Feb 07 jari 332                 return (new String()).getClass();
2 26 Feb 07 jari 333             } else {
2 26 Feb 07 jari 334                 return (new Float(1.0f)).getClass();
2 26 Feb 07 jari 335             }
2 26 Feb 07 jari 336             //return getValueAt(0, c).getClass();
2 26 Feb 07 jari 337         }
2 26 Feb 07 jari 338          */        
2 26 Feb 07 jari 339         
2 26 Feb 07 jari 340     }   
2 26 Feb 07 jari 341     
2 26 Feb 07 jari 342     /**
2 26 Feb 07 jari 343      * Synchronize content and header sizes.
2 26 Feb 07 jari 344      */
2 26 Feb 07 jari 345     private void setMaxWidth(JComponent content, JComponent header) {
2 26 Feb 07 jari 346         int c_width = content.getPreferredSize().width;
2 26 Feb 07 jari 347         int h_width = header.getPreferredSize().width;
2 26 Feb 07 jari 348         if (c_width > h_width) {
2 26 Feb 07 jari 349             header.setPreferredSize(new Dimension(c_width, header.getPreferredSize().height));
2 26 Feb 07 jari 350         } else {
2 26 Feb 07 jari 351             content.setPreferredSize(new Dimension(h_width, content.getPreferredSize().height));
2 26 Feb 07 jari 352         }
2 26 Feb 07 jari 353     }   
2 26 Feb 07 jari 354     
2 26 Feb 07 jari 355     
2 26 Feb 07 jari 356     public void addMouseListenerToHeaderInTable(JTable table) {
2 26 Feb 07 jari 357         //final TableSorter sorter = this;
2 26 Feb 07 jari 358         final JTable tableView = table;
2 26 Feb 07 jari 359         tableView.setColumnSelectionAllowed(false);
2 26 Feb 07 jari 360         MouseAdapter listMouseListener = new MouseAdapter() {
2 26 Feb 07 jari 361             public void mouseClicked(MouseEvent e) {
2 26 Feb 07 jari 362                 TableColumnModel columnModel = tableView.getColumnModel();
2 26 Feb 07 jari 363                 int viewColumn = columnModel.getColumnIndexAtX(e.getX());
2 26 Feb 07 jari 364                 int column = tableView.convertColumnIndexToModel(viewColumn);
2 26 Feb 07 jari 365                 if (e.getClickCount() == 1 && column != -1) {
2 26 Feb 07 jari 366                     //System.out.println("Sorting ...");
2 26 Feb 07 jari 367                     int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;
2 26 Feb 07 jari 368                     int controlPressed = e.getModifiers()&InputEvent.CTRL_MASK;
2 26 Feb 07 jari 369                     //boolean ascending = (shiftPressed == 0);
2 26 Feb 07 jari 370                     boolean originalOrder = (controlPressed != 0);
2 26 Feb 07 jari 371                     //sortedAscending[column] = !(sortedAscending[column]);
2 26 Feb 07 jari 372                     //sortByColumn(column, ascending, originalOrder);
2 26 Feb 07 jari 373                     sortByColumn(column, !(sortedAscending[column]), originalOrder);
2 26 Feb 07 jari 374                     sortedAscending[column] = !(sortedAscending[column]);
2 26 Feb 07 jari 375                     //System.out.println("sortedAscending[" + column + "] = " + sortedAscending[column]);
2 26 Feb 07 jari 376                     if (originalOrder) {
2 26 Feb 07 jari 377                         for (int i = 0; i < pAndRModel.getColumnCount(); i++)
2 26 Feb 07 jari 378                         sortedAscending[i] = false;
2 26 Feb 07 jari 379                     } 
2 26 Feb 07 jari 380                     //System.out.println("sortedAscending[" + column + "] = " + sortedAscending[column]);                    
2 26 Feb 07 jari 381                 }
2 26 Feb 07 jari 382             }
2 26 Feb 07 jari 383         };
2 26 Feb 07 jari 384         JTableHeader th = tableView.getTableHeader();
2 26 Feb 07 jari 385         th.addMouseListener(listMouseListener);
2 26 Feb 07 jari 386     }
2 26 Feb 07 jari 387     
2 26 Feb 07 jari 388     public void sortByColumn(int column, boolean ascending, boolean originalOrder) {
2 26 Feb 07 jari 389         if (originalOrder) {
2 26 Feb 07 jari 390             for (int i = 0; i < pAndRModel.getRowCount(); i++) {
2 26 Feb 07 jari 391                 for (int j = 0; j < pAndRModel.getColumnCount(); j++) {
2 26 Feb 07 jari 392                     pAndRModel.setValueAt(origData[i][j], i, j);
2 26 Feb 07 jari 393                 }
2 26 Feb 07 jari 394             }
2 26 Feb 07 jari 395             //sortedAscending = false;
2 26 Feb 07 jari 396             return;
2 26 Feb 07 jari 397         } /*else {
2 26 Feb 07 jari 398             sortedAscending = !(sortedAscending);
2 26 Feb 07 jari 399         }*/
2 26 Feb 07 jari 400         //int[] sortedIndices;
2 26 Feb 07 jari 401         Object[][] sortedData = new Object[pAndRValuesTable.getRowCount()][pAndRValuesTable.getColumnCount()];
2 26 Feb 07 jari 402         float[] origArray = new float[rows.length];
2 26 Feb 07 jari 403         SortableField[] sortFields = new SortableField[rows.length];
2 26 Feb 07 jari 404         if (column < fieldNames.length) {
2 26 Feb 07 jari 405             //SortableField[] sortFields = new SortableField[rows.length];
2 26 Feb 07 jari 406             for (int i = 0; i < sortFields.length; i++) {
2 26 Feb 07 jari 407                 sortFields[i] = new SortableField(i, column);
2 26 Feb 07 jari 408                 //Arrays.sort(sortFields);
2 26 Feb 07 jari 409             }
2 26 Feb 07 jari 410             Arrays.sort(sortFields);
2 26 Feb 07 jari 411             //return;
2 26 Feb 07 jari 412         } else {
2 26 Feb 07 jari 413             for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 414                 origArray[i] = ((Float)(auxData[rows[i]][column - fieldNames.length])).floatValue();
2 26 Feb 07 jari 415             }
2 26 Feb 07 jari 416         }
2 26 Feb 07 jari 417         /*
2 26 Feb 07 jari 418         else if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 419             if (column == fieldNames.length) {
2 26 Feb 07 jari 420                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 421                     origArray[i] = ((Float)(meansA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 422                 }
2 26 Feb 07 jari 423             } else if (column == fieldNames.length + 1) {
2 26 Feb 07 jari 424                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 425                     origArray[i] = ((Float)(sdA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 426                 }
2 26 Feb 07 jari 427             } else if (column == fieldNames.length + 2) {
2 26 Feb 07 jari 428                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 429                     origArray[i] = ((Float)(meansB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 430                 }
2 26 Feb 07 jari 431             } else if (column == fieldNames.length + 3) {
2 26 Feb 07 jari 432                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 433                     origArray[i] = ((Float)(sdB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 434                 }
2 26 Feb 07 jari 435             } else if (column == fieldNames.length + 4) {
2 26 Feb 07 jari 436                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 437                     origArray[i] = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 438                 }
2 26 Feb 07 jari 439             } else if (column == fieldNames.length + 5) {
2 26 Feb 07 jari 440                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 441                     origArray[i] = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 442                 }
2 26 Feb 07 jari 443             } else if (column == fieldNames.length + 6) {
2 26 Feb 07 jari 444                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 445                     origArray[i] = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 446                 }
2 26 Feb 07 jari 447             }
2 26 Feb 07 jari 448         } else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 449             if (column == fieldNames.length) {
2 26 Feb 07 jari 450                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 451                     origArray[i] = ((Float)(oneClassMeans.get(rows[i]))).floatValue();
2 26 Feb 07 jari 452                 }
2 26 Feb 07 jari 453             } else if (column == fieldNames.length + 1) {
2 26 Feb 07 jari 454                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 455                     origArray[i] = ((Float)(oneClassSDs.get(rows[i]))).floatValue();
2 26 Feb 07 jari 456                 }
2 26 Feb 07 jari 457             } else if (column == fieldNames.length + 2) {
2 26 Feb 07 jari 458                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 459                     origArray[i] = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 460                 }
2 26 Feb 07 jari 461             } else if (column == fieldNames.length + 3) {
2 26 Feb 07 jari 462                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 463                     origArray[i] = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 464                 }
2 26 Feb 07 jari 465             } else if (column == fieldNames.length + 4) {
2 26 Feb 07 jari 466                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 467                     origArray[i] = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 468                 }
2 26 Feb 07 jari 469             }            
2 26 Feb 07 jari 470         }
2 26 Feb 07 jari 471         */
2 26 Feb 07 jari 472         //if ( ((ascending) && (!meansASortedAsc)) || ((!ascending) && (!meansASortedDesc)) ) {
2 26 Feb 07 jari 473         int[] sortedIndices = new int[rows.length];
2 26 Feb 07 jari 474         if (column >= fieldNames.length) {
2 26 Feb 07 jari 475             QSort sortArray = new QSort(origArray);
2 26 Feb 07 jari 476             sortedIndices = sortArray.getOrigIndx();
2 26 Feb 07 jari 477         } else {
2 26 Feb 07 jari 478             for (int i = 0; i < sortedIndices.length; i++) {
2 26 Feb 07 jari 479                 sortedIndices[i] = sortFields[i].getIndex();
2 26 Feb 07 jari 480             }
2 26 Feb 07 jari 481         }
2 26 Feb 07 jari 482         if (!ascending) {
2 26 Feb 07 jari 483             sortedIndices = reverse(sortedIndices);
2 26 Feb 07 jari 484         }
2 26 Feb 07 jari 485         //sortedIndices = sortNaNs(sortedIndices); //QSort does not appear to handle NaN's well, they show up in the middle of the sorted array
2 26 Feb 07 jari 486         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 487             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 488                 //sortedData[i][j] = tModel.getValueAt(sortedMeansAIndices[i], j);
2 26 Feb 07 jari 489                 sortedData[i][j] = origData[sortedIndices[i]][j];
2 26 Feb 07 jari 490             }
2 26 Feb 07 jari 491         }
2 26 Feb 07 jari 492         
2 26 Feb 07 jari 493         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 494             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 495                 pAndRModel.setValueAt(sortedData[i][j], i, j);
2 26 Feb 07 jari 496             }
2 26 Feb 07 jari 497         }
2 26 Feb 07 jari 498
2 26 Feb 07 jari 499     }    
2 26 Feb 07 jari 500     
2 26 Feb 07 jari 501     private int[] reverse(int[] arr) {
2 26 Feb 07 jari 502         int[] revArr = new int[arr.length];
2 26 Feb 07 jari 503         int  revCount = 0;
2 26 Feb 07 jari 504         int count = arr.length - 1;
2 26 Feb 07 jari 505         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 506             revArr[revCount] = arr[count];
2 26 Feb 07 jari 507             revCount++;
2 26 Feb 07 jari 508             count--;
2 26 Feb 07 jari 509         }
2 26 Feb 07 jari 510         return revArr;
2 26 Feb 07 jari 511     }
2 26 Feb 07 jari 512     
2 26 Feb 07 jari 513     private class SortableField implements Comparable {
2 26 Feb 07 jari 514         private String field;
2 26 Feb 07 jari 515         private int index;
2 26 Feb 07 jari 516         
2 26 Feb 07 jari 517         SortableField(int index, int column) {
2 26 Feb 07 jari 518             this.index = index;
2 26 Feb 07 jari 519             this.field = (String)(origData[index][column]);
2 26 Feb 07 jari 520             //System.out.println("SortableField[" + index + "][" + column + "]: index = " + index + ", field = " + field);
2 26 Feb 07 jari 521         }
2 26 Feb 07 jari 522         
2 26 Feb 07 jari 523         public int compareTo(Object other) {
2 26 Feb 07 jari 524             SortableField otherField = (SortableField)other;
2 26 Feb 07 jari 525             return this.field.compareTo(otherField.getField());
2 26 Feb 07 jari 526         }
2 26 Feb 07 jari 527         
2 26 Feb 07 jari 528         public int getIndex() {
2 26 Feb 07 jari 529             return this.index;
2 26 Feb 07 jari 530         }
2 26 Feb 07 jari 531         public String getField() {
2 26 Feb 07 jari 532             return this.field;
2 26 Feb 07 jari 533         }
2 26 Feb 07 jari 534     }    
2 26 Feb 07 jari 535         
2 26 Feb 07 jari 536     
2 26 Feb 07 jari 537     public static void main (String[] args) {
2 26 Feb 07 jari 538         double p = 0.00000001d;
2 26 Feb 07 jari 539         
2 26 Feb 07 jari 540         Double doub = new Double(p);
2 26 Feb 07 jari 541         String dClass = doub.getClass().getName();
2 26 Feb 07 jari 542         
2 26 Feb 07 jari 543         //System.out.println("Class = " + dClass);
2 26 Feb 07 jari 544         /*
2 26 Feb 07 jari 545         if (dClass.equals("java.lang.Double")) {
2 26 Feb 07 jari 546             System.out.println("This is a double");
2 26 Feb 07 jari 547         }
2 26 Feb 07 jari 548          */
2 26 Feb 07 jari 549         if (doub instanceof Double) {
2 26 Feb 07 jari 550             System.out.println("This is a double");
2 26 Feb 07 jari 551         }
2 26 Feb 07 jari 552         //System.out.println(" p = " + p + ", Double.toString(p) = " + Double.toString(p));
2 26 Feb 07 jari 553     }
2 26 Feb 07 jari 554 }