package org.signalml.app.view.document.monitor; import static org.signalml.app.util.i18n.SvarogI18n._; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.AbstractTableModel; /** * Table for channel definitions. * * @author Tomasz Sawicki */ public class ChannelDefinitionsTable extends JTable { /** * Wheter this table is used in edit g&o dialog (true), or in edit * amp def dialog (false). */ private boolean dialog; /** * Default constructor. */ public ChannelDefinitionsTable(boolean dialog) { super(); setModel(new ChannelDefinitionTableModel(dialog, new ArrayList<ChannelDefinition>())); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.dialog = dialog; } /** * Adds a definition to the table. * * @param definition definition to be added */ public void add(ChannelDefinition definition) { List<ChannelDefinition> definitions = getDefinitionTableModel().getDefinitions(); definitions.add(definition); setModel(new ChannelDefinitionTableModel(dialog, definitions)); } /** * Removes selected definition from the table. */ public void removeSelected() { int selectedRow = getSelectedRow(); if (selectedRow < 0) { return; } List<ChannelDefinition> definitions = getDefinitionTableModel().getDefinitions(); definitions.remove(selectedRow); setModel(new ChannelDefinitionTableModel(dialog, definitions)); } /** * Sets data. * * @param definitions definitions list */ public void setData(List<ChannelDefinition> definitions) { setModel(new ChannelDefinitionTableModel(dialog, definitions)); } /** * Gets data. * * @return data */ public List<ChannelDefinition> getData() { return getDefinitionTableModel().getDefinitions(); } /** * Gets the definition table model. * * @return the definition table model */ private ChannelDefinitionTableModel getDefinitionTableModel() { return (ChannelDefinitionTableModel) getModel(); } /** * Gets the channel number * * @return list of channel numbers */ public List<Integer> getChannelNumbers() { List<Integer> numbers = new ArrayList<Integer>(); for (ChannelDefinition definition : getData()) { numbers.add(definition.getNumber()); } return numbers; } /** * Gets the gain values * * @return list of gain values */ public List<Float> getGainValues() { List<Float> gain = new ArrayList<Float>(); for (ChannelDefinition definition : getData()) { gain.add(definition.getGain()); } return gain; } /** * Gets the offset values * * @return list of channel numbers */ public List<Float> getOffsetValues() { List<Float> offset = new ArrayList<Float>(); for (ChannelDefinition definition : getData()) { offset.add(definition.getOffset()); } return offset; } /** * Gets the the default names. * * @return list of default names */ public List<String> getDefaultNames() { List<String> names = new ArrayList<String>(); for (ChannelDefinition definition : getData()) { names.add(definition.getDefaultName()); } return names; } /** * Wheter all gain and offset are presented, or only one. * All are default. * * @param all all */ public void setAllEditable(boolean allEditable) { ChannelDefinitionTableModel newModel = new ChannelDefinitionTableModel(dialog, getData()); newModel.setAllGainAndOffset(allEditable); setModel(newModel); } } /** * Table model for channel definition table * * @author Tomasz Sawicki */ class ChannelDefinitionTableModel extends AbstractTableModel { private final int CHANNEL_NUMBER = 0; private final int CHANNEL_GAIN = 1; private final int CHANNEL_OFFSET = 2; private final int CHANNEL_NAME = 3; /** * Wheter this table is used in edit g&o dialog (true), or in edit * amp def dialog (false). */ private boolean dialog; /** * Definitions. */ private List<ChannelDefinition> definitions; /** * Wheter all gain and offset are presented, or only one. */ private boolean allGainAndOffset; /** * Default constructor. * * @param dialog {@link #dialog} * @param definitions {@link #definitions} */ public ChannelDefinitionTableModel(boolean dialog, List<ChannelDefinition> definitions) { this.dialog = dialog; this.definitions = definitions; this.allGainAndOffset = true; } /** * The row count. * * @return the row count */ @Override public int getRowCount() { return definitions.size(); } /** * 3 or 4 columns, depending on {@link #dialog}. * * @return the column count */ @Override public int getColumnCount() { return (dialog) ? 3 : 4; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == CHANNEL_NUMBER) { if (allGainAndOffset) { return definitions.get(rowIndex).getNumber(); } else { return _("All channels"); } } else if (columnIndex == CHANNEL_GAIN) { return definitions.get(rowIndex).getGain(); } else if (columnIndex == CHANNEL_OFFSET) { return definitions.get(rowIndex).getOffset(); } else if (columnIndex == CHANNEL_NAME) { return definitions.get(rowIndex).getDefaultName(); } return null; } /** * Column names. * * @param column column number * @return column name */ @Override public String getColumnName(int column) { if (column == CHANNEL_NUMBER) { return _("Channel no.: "); } else if (column == CHANNEL_GAIN) { return _("Gain: "); } else if (column == CHANNEL_OFFSET) { return _("Offset: "); } else if (column == CHANNEL_NAME) { return _("Default name: "); } return null; } /** * Gets the definitions list. * * @return definitions list */ public List<ChannelDefinition> getDefinitions() { return definitions; } /** * Depending on {@link #editable}. */ @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (!dialog) { return true; } else if (dialog && (columnIndex == CHANNEL_GAIN || columnIndex == CHANNEL_OFFSET)) { return true; } else { return false; } } /** * Sets the value. * * @param aValue new value * @param rowIndex row no * @param columnIndex col no */ @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (columnIndex == CHANNEL_NUMBER) { int newValue; try { newValue = Integer.parseInt((String) aValue); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, _("Please insert an integer value")); return; } definitions.get(rowIndex).setNumber(newValue); } else if (columnIndex == CHANNEL_GAIN || columnIndex == CHANNEL_OFFSET) { float newValue; try { newValue = Float.parseFloat((String) aValue); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, _("Please insert a rational value")); return; } if (columnIndex == CHANNEL_GAIN) { definitions.get(rowIndex).setGain(newValue); } else if (columnIndex == CHANNEL_OFFSET) { definitions.get(rowIndex).setOffset(newValue); } } else if (columnIndex == CHANNEL_NAME) { definitions.get(rowIndex).setDefaultName((String) aValue); } } /** * Sets {@link #allGainAndOffset}. * * @param allGainAndOffset {@link #allGainAndOffset} */ public void setAllGainAndOffset(boolean allGainAndOffset) { this.allGainAndOffset = allGainAndOffset; } }