package org.yamcs.ui.packetviewer; import java.util.ArrayList; import java.util.List; import java.util.Vector; import javax.swing.table.DefaultTableModel; import org.yamcs.parameter.ParameterValue; import org.yamcs.parameter.Value; import org.yamcs.utils.TimeEncoding; import org.yamcs.utils.ValueUtility; import org.yamcs.xtce.Parameter; public class PacketsTableModel extends DefaultTableModel { private static final long serialVersionUID = 1L; private static final String[] FIXED_COLUMNS = {"#", "Generation Time", "Packet Name"}; private int continuousRowCount = 0; // Always increases, even when rows were removed private List<Parameter> shownColumnParameters = new ArrayList<>(); public PacketsTableModel() { super(FIXED_COLUMNS, 0); } @Override public Class<?> getColumnClass(int column) { if (column == 0) // # return Integer.class; else if (column == 1) // Generation Time return Long.class; else if (column == 2) // Name return ListPacket.class; else // Transposed Parameter return Object.class; } @Override public String getColumnName(int column) { if(column<FIXED_COLUMNS.length) { return FIXED_COLUMNS[column]; } else { return shownColumnParameters.get(column-FIXED_COLUMNS.length).getName(); } } public int getFixedColumnsSize() { return FIXED_COLUMNS.length; } public void addParameterColumn(Parameter p) { shownColumnParameters.add(p); addColumn(p.getName()); } public Parameter getParameter(int column) { if (column < FIXED_COLUMNS.length) { return null; } else { return shownColumnParameters.get(column - FIXED_COLUMNS.length); } } public void resetParameterColumns() { shownColumnParameters = new ArrayList<>(); setColumnCount(FIXED_COLUMNS.length); fireTableStructureChanged(); } public void addPacket(ListPacket packet) { List<Object> row = new ArrayList<>(); row.add(++continuousRowCount); row.add(TimeEncoding.toCombinedFormat(packet.getGenerationTime())); row.add(packet); for(Parameter p:shownColumnParameters) { ParameterValue pv = packet.getParameterColumn(p); if(pv!=null) { row.add(getValue(pv)); } else { row.add(null); } } addRow(row.toArray()); } private Object getValue(ParameterValue pv) { Value v = pv.getEngValue(); if(v==null) { return getValue(pv.getRawValue()); } else { return getValue(v); } } private Object getValue(Value v) { return ValueUtility.getYarchValue(v); } public void clear() { setRowCount(0); continuousRowCount = 0; } public void removeColumn(int column) { if (column < FIXED_COLUMNS.length) { // FIXME, shouldn't have the concept of fixed columns other than # throw new IllegalArgumentException("Can't remove fixed columns"); } shownColumnParameters.remove(column - FIXED_COLUMNS.length); for (Object o : getDataVector()) { Vector<?> row = (Vector<?>) o; if (row.size() > column) { row.removeElementAt(column); } } columnIdentifiers.removeElementAt(column); fireTableStructureChanged(); } }