00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
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
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
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
00185 int count = step.getResults();
00186
00187
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
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
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
00289 if (columnIndex == HEADER_COLUMN) {
00290 wrapper = headerWrapper;
00291 } else {
00292 wrapper = defaultWrapper;
00293 }
00294
00295
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
00383 if (columnIndex == HEADER_COLUMN) {
00384 wrapper = headerWrapper;
00385 } else {
00386 wrapper = defaultWrapper;
00387 }
00388
00389
00390 wrapper.value = value;
00391 return wrapper;
00392 }
00393 }
00394 }