Main Page | Packages | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MeasurementDetailsPanel.java

Go to the documentation of this file.
00001 /*
00002  * MeasurementDetailsPanel.java
00003  *
00004  * Copyright (C) 2005 Project SQUID, http://www.cs.helsinki.fi/group/squid/
00005  *
00006  * This file is part of Ikayaki.
00007  *
00008  * Ikayaki is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * Ikayaki is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with Ikayaki; if not, write to the Free Software
00020  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
00021  */
00022 
00023 package ikayaki.gui;
00024 
00025 import ikayaki.*;
00026 
00027 import javax.swing.*;
00028 import javax.swing.table.AbstractTableModel;
00029 import java.awt.*;
00030 import java.text.DecimalFormat;
00031 import java.text.NumberFormat;
00032 
00038 public class MeasurementDetailsPanel extends ProjectComponent {
00039 
00040     private JTable detailsTable;
00041     private DetailsTableModel detailsTableModel;
00042 
00043     private JTable errorsTable;
00044     private ErrorsTableModel errorsTableModel;
00045 
00049     private MeasurementStep step;
00050 
00051     public MeasurementDetailsPanel() {
00052 
00053         // build the tables
00054         detailsTableModel = new DetailsTableModel();
00055         detailsTable = new JTable(detailsTableModel);
00056         detailsTable.setFocusable(false);
00057         detailsTable.setEnabled(false);
00058         detailsTable.setDefaultRenderer(StyledWrapper.class, new StyledTableCellRenderer());
00059 
00060         errorsTableModel = new ErrorsTableModel();
00061         errorsTable = new JTable(errorsTableModel);
00062         errorsTable.setFocusable(false);
00063         errorsTable.setEnabled(false);
00064         errorsTable.setDefaultRenderer(StyledWrapper.class, new StyledTableCellRenderer());
00065 
00066         detailsTable.getColumnModel().getColumn(0).setPreferredWidth(50);
00067         detailsTable.getColumnModel().getColumn(1).setPreferredWidth(100);
00068         detailsTable.getColumnModel().getColumn(2).setPreferredWidth(100);
00069         detailsTable.getColumnModel().getColumn(3).setPreferredWidth(100);
00070         detailsTable.getTableHeader().setReorderingAllowed(false);
00071         detailsTable.getTableHeader().setResizingAllowed(false);
00072 
00073         errorsTable.getColumnModel().getColumn(0).setPreferredWidth(50);
00074         errorsTable.getColumnModel().getColumn(1).setPreferredWidth(100);
00075         errorsTable.getColumnModel().getColumn(2).setPreferredWidth(100);
00076         errorsTable.getColumnModel().getColumn(3).setPreferredWidth(100);
00077         errorsTable.getTableHeader().setReorderingAllowed(false);
00078         errorsTable.getTableHeader().setResizingAllowed(false);
00079 
00080         // emulate the looks of a JScrollPane
00081         JPanel detailsTablePanel = new JPanel(new BorderLayout());
00082         detailsTablePanel.add(detailsTable.getTableHeader(), BorderLayout.NORTH);
00083         detailsTablePanel.add(detailsTable, BorderLayout.CENTER);
00084         detailsTablePanel.setBorder(new JScrollPane().getBorder());
00085 
00086         JPanel errorsTablePanel = new JPanel(new BorderLayout());
00087         errorsTablePanel.add(errorsTable.getTableHeader(), BorderLayout.NORTH);
00088         errorsTablePanel.add(errorsTable, BorderLayout.CENTER);
00089         errorsTablePanel.setBorder(new JScrollPane().getBorder());
00090 
00091         // lay out the components
00092         JPanel tablePanel = new JPanel(new BorderLayout(10, 10));
00093         tablePanel.add(detailsTablePanel, "Center");
00094         tablePanel.add(errorsTablePanel, "South");
00095 
00096         JPanel contentPane = new JPanel(new FlowLayout(FlowLayout.CENTER));
00097         contentPane.add(tablePanel);
00098 
00099         JScrollPane scrollPane = new JScrollPane(contentPane,
00100                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
00101                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
00102         scrollPane.setBorder(null);
00103         this.setLayout(new BorderLayout());
00104         this.add(scrollPane);
00105         this.setMinimumSize(new Dimension(0, 225));
00106         this.setPreferredSize(new Dimension(400, 225));
00107     }
00108 
00109     @Override public void setProject(Project project) {
00110         super.setProject(project);
00111         setStep(null);
00112     }
00113 
00114     public MeasurementStep getStep() {
00115         return step;
00116     }
00117 
00118     public void setStep(MeasurementStep step) {
00119         this.step = step;
00120         this.detailsTableModel.setStep(step);
00121         this.errorsTableModel.setStep(step);
00122     }
00123 
00124     @Override public void measurementUpdated(MeasurementEvent event) {
00125         if (event.getStep() == step) {
00126             detailsTableModel.fireTableDataChanged();
00127             errorsTableModel.fireTableDataChanged();
00128         }
00129     }
00130 
00136     private class DetailsTableModel extends AbstractTableModel {
00137 
00138         private MeasurementStep step;
00139 
00140         private final String[] COLUMNS = new String[]{" ", "X", "Y", "Z"};
00141         private final int HEADER_COLUMN = 0;
00142         private final int X_COLUMN = 1;
00143         private final int Y_COLUMN = 2;
00144         private final int Z_COLUMN = 3;
00145 
00146         private NumberFormat numberFormat = new DecimalFormat("0.000000E0");
00147 
00148         private StyledWrapper defaultWrapper = new StyledWrapper();
00149         private StyledWrapper headerWrapper = new StyledWrapper();
00150 
00151         public DetailsTableModel() {
00152             defaultWrapper.horizontalAlignment = SwingConstants.TRAILING;
00153             headerWrapper.horizontalAlignment = SwingConstants.TRAILING;
00154             headerWrapper.font = new JLabel("").getFont().deriveFont(Font.BOLD);
00155         }
00156 
00157         public MeasurementStep getStep() {
00158             return step;
00159         }
00160 
00161         public void setStep(MeasurementStep step) {
00162             this.step = step;
00163             fireTableDataChanged();
00164         }
00165 
00166         public int getRowCount() {
00167 
00168             // calculate the expected number of results based on measurement rotations and project type
00169             int nonSample = 3;
00170             if (Settings.getHolderCalibration() == null
00171                     || (step != null && step.getProject().isHolderCalibration())) {
00172                 nonSample--;
00173             }
00174             int expected = Math.max(1, 4 * Settings.getMeasurementRotations()) + nonSample;
00175 
00176             if (step == null) {
00177                 return expected;
00178 
00179             } else if (step.getState() == MeasurementStep.State.DONE
00180                     || step.getState() == MeasurementStep.State.DONE_RECENTLY) {
00181                 return step.getResults();
00182 
00183             } else {
00184                 // try to estimate the number of steps
00185                 int count = step.getResults();
00186 
00187                 // if the last step is not BG, there are more steps coming
00188                 if (count >= nonSample && step.getResult(count - 1).getType() != MeasurementResult.Type.NOISE) {
00189                     count++;
00190                 }
00191                 return Math.max(expected, count);
00192             }
00193         }
00194 
00195         public int getColumnCount() {
00196             return COLUMNS.length;
00197         }
00198 
00199         @Override public String getColumnName(int column) {
00200             return COLUMNS[column];
00201         }
00202 
00203         @Override public Class<?> getColumnClass(int columnIndex) {
00204             return StyledWrapper.class;
00205         }
00206 
00207         public Object getValueAt(int rowIndex, int columnIndex) {
00208             Object value;
00209             if (step != null && rowIndex < step.getResults()) {
00210 
00211                 // get the values from the step
00212                 switch (columnIndex) {
00213                 case HEADER_COLUMN:
00214                     switch (step.getResult(rowIndex).getType()) {
00215                     case HOLDER:
00216                         value = "Holder";
00217                         break;
00218                     case NOISE:
00219                         value = "BG";
00220                         break;
00221                     case SAMPLE:
00222                         value = Integer.toString(step.getResult(rowIndex).getRotation());
00223                         break;
00224                     default:
00225                         assert false;
00226                         value = null;
00227                         break;
00228                     }
00229                     break;
00230                 case X_COLUMN:
00231                     value = numberFormat.format(step.getResult(rowIndex).getRawX());
00232                     break;
00233                 case Y_COLUMN:
00234                     value = numberFormat.format(step.getResult(rowIndex).getRawY());
00235                     break;
00236                 case Z_COLUMN:
00237                     value = numberFormat.format(step.getResult(rowIndex).getRawZ());
00238                     break;
00239                 default:
00240                     assert false;
00241                     value = null;
00242                     break;
00243                 }
00244 
00245             } else {
00246 
00247                 // try to guess the values
00248                 if (columnIndex == HEADER_COLUMN) {
00249                     int i = (Settings.getHolderCalibration() == null
00250                             || (step != null && step.getProject().isHolderCalibration()))
00251                             ? rowIndex + 1
00252                             : rowIndex;
00253 
00254                     if (i == 0) {
00255                         value = "Holder";
00256                     } else if (i == 1 || rowIndex == getRowCount() - 1) {
00257                         value = "BG";
00258                     } else {
00259                         switch ((i - 2) % 4) {
00260                         case 0:
00261                             value = "0";
00262                             break;
00263                         case 1:
00264                             value = "90";
00265                             break;
00266                         case 2:
00267                             value = "180";
00268                             break;
00269                         case 3:
00270                             value = "270";
00271                             break;
00272                         default:
00273                             assert false;
00274                             value = null;
00275                             break;
00276                         }
00277                     }
00278                 } else {
00279                     value = null;
00280                 }
00281             }
00282             return wrap(value, rowIndex, columnIndex);
00283         }
00284 
00285         public StyledWrapper wrap(Object value, int rowIndex, int columnIndex) {
00286             StyledWrapper wrapper;
00287 
00288             // choose the style according to the column
00289             if (columnIndex == HEADER_COLUMN) {
00290                 wrapper = headerWrapper;
00291             } else {
00292                 wrapper = defaultWrapper;
00293             }
00294 
00295             // wrap the cell's value and return it
00296             wrapper.value = value;
00297             return wrapper;
00298         }
00299     }
00300 
00306     private class ErrorsTableModel extends AbstractTableModel {
00307 
00308         private MeasurementStep step;
00309 
00310         private final String[] COLUMNS = new String[]{" ", "Signal/Noise", "Signal/Drift", "Signal/Holder"};
00311         private final int HEADER_COLUMN = 0;
00312         private final int SIGNAL_NOISE_COLUMN = 1;
00313         private final int SIGNAL_DRIFT_COLUMN = 2;
00314         private final int SIGNAL_HOLDER_COLUMN = 3;
00315 
00316         private StyledWrapper defaultWrapper = new StyledWrapper();
00317         private StyledWrapper headerWrapper = new StyledWrapper();
00318         private DecimalFormat numberFormat = new DecimalFormat();
00319 
00320         public ErrorsTableModel() {
00321             defaultWrapper.horizontalAlignment = SwingConstants.TRAILING;
00322             headerWrapper.horizontalAlignment = SwingConstants.TRAILING;
00323             headerWrapper.font = new JLabel("").getFont().deriveFont(Font.BOLD);
00324             numberFormat.setMinimumFractionDigits(3);
00325             numberFormat.setMaximumFractionDigits(3);
00326         }
00327 
00328         public MeasurementStep getStep() {
00329             return step;
00330         }
00331 
00332         public void setStep(MeasurementStep step) {
00333             this.step = step;
00334             fireTableDataChanged();
00335         }
00336 
00337         public int getRowCount() {
00338             return 1;
00339         }
00340 
00341         public int getColumnCount() {
00342             return COLUMNS.length;
00343         }
00344 
00345         @Override public String getColumnName(int column) {
00346             return COLUMNS[column];
00347         }
00348 
00349         @Override public Class<?> getColumnClass(int columnIndex) {
00350             return StyledWrapper.class;
00351         }
00352 
00353         public Object getValueAt(int rowIndex, int columnIndex) {
00354             Object value;
00355             switch (columnIndex) {
00356             case HEADER_COLUMN:
00357                 value = "Error";
00358                 break;
00359             case SIGNAL_NOISE_COLUMN:
00360                 value = MeasurementValue.SIGNAL_TO_NOISE.getValue(step);
00361                 break;
00362             case SIGNAL_DRIFT_COLUMN:
00363                 value = MeasurementValue.SIGNAL_TO_DRIFT.getValue(step);
00364                 break;
00365             case SIGNAL_HOLDER_COLUMN:
00366                 value = MeasurementValue.SIGNAL_TO_HOLDER.getValue(step);
00367                 break;
00368             default:
00369                 value = null;
00370                 break;
00371             }
00372 
00373             if (value != null && value instanceof Number) {
00374                 value = numberFormat.format(((Number) value).doubleValue());
00375             }
00376             return wrap(value, rowIndex, columnIndex);
00377         }
00378 
00379         public StyledWrapper wrap(Object value, int rowIndex, int columnIndex) {
00380             StyledWrapper wrapper;
00381 
00382             // choose the style according to the column
00383             if (columnIndex == HEADER_COLUMN) {
00384                 wrapper = headerWrapper;
00385             } else {
00386                 wrapper = defaultWrapper;
00387             }
00388 
00389             // wrap the cell's value and return it
00390             wrapper.value = value;
00391             return wrapper;
00392         }
00393     }
00394 }

Generated on Fri May 6 16:00:31 2005 for Squid by  doxygen 1.4.1