package org.signalml.app.view.document.opensignal.elements;
import static org.signalml.app.util.i18n.SvarogI18n._;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.signalml.app.model.document.opensignal.AbstractOpenSignalDescriptor;
import org.signalml.app.model.document.opensignal.ExperimentDescriptor;
import org.signalml.app.model.document.opensignal.elements.ExperimentStatus;
import org.signalml.app.model.document.opensignal.elements.SignalParameters;
import org.signalml.app.view.common.components.ResolvableComboBox;
import org.signalml.app.view.common.components.spinners.FloatSpinner;
import org.signalml.app.view.common.components.spinners.IntegerSpinner;
import org.signalml.domain.signal.raw.RawSignalByteOrder;
import org.signalml.domain.signal.raw.RawSignalDescriptor;
import org.signalml.domain.signal.raw.RawSignalSampleType;
/**
* Panel allowing to present and edit signal parameters.
*
* @author Tomasz Sawicki
* @author Piotr Szachewicz
*/
public class SignalParametersPanel extends JPanel {
public static final String NUMBER_OF_CHANNELS_PROPERTY = "numberOfChannelsChangedProperty";
public static final int CHANNEL_COUNT_MAX = 1024;
protected AbstractOpenSignalDescriptor openSignalDescriptor;
private JComboBox samplingFrequencyComboBox;
private IntegerSpinner channelCountSpinner;
private ResolvableComboBox byteOrderComboBox;
private ResolvableComboBox sampleTypeComboBox;
private FloatSpinner pageSizeSpinner;
private IntegerSpinner blocksPerPageSpinner;
/**
* Default constructor. Creates the interface.
*
*/
public SignalParametersPanel() {
super();
createInterface();
}
/**
* Creates the interface.
*/
private void createInterface() {
setBorder(new CompoundBorder(new TitledBorder(_("Signal parameters")),
new EmptyBorder(3, 3, 3, 3)));
setLayout(new BorderLayout(0, 10));
JPanel fieldsPanel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.CENTER;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.insets = new Insets(8, 8, 8, 8);
this.createFieldsPanelElements(fieldsPanel, constraints, 0);
add(fieldsPanel);
setEnabledToAll(false);
}
/**
* Fills a {@link JPanel} object with component, regarding
* {@link GridBagConstraints} object.
*
* @param fieldsPanel
* an object to be filled with components
* @param constraints
* an object regarding to which components should be placed in
* fieldsPanel
* @param startingRow
* a row to start from
*
* @return a number of rows that fieldsPanel contains after performing all
* operations
*/
protected int createFieldsPanelElements(JPanel fieldsPanel,
GridBagConstraints constraints, int startingRow) {
JLabel samplingFrequencyLabel = new JLabel(_("Sampling frequency: "));
JLabel channelCountLabel = new JLabel(_("Channel count: "));
JLabel byteOrderLabel = new JLabel(_("Byte order: "));
JLabel sampleTypeLabel = new JLabel(_("Sample type: "));
JLabel pageSizeLabel = new JLabel(_("Page size: "));
JLabel blocksPerPageLabel = new JLabel(_("Number of blocks per page: "));
int row = startingRow;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(samplingFrequencyLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getSamplingFrequencyComboBox(), constraints);
row++;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(channelCountLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getChannelCountSpinner(), constraints);
row++;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(byteOrderLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getByteOrderComboBox(), constraints);
row++;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(sampleTypeLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getSampleTypeComboBox(), constraints);
row++;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(pageSizeLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getPageSizeSpinner(), constraints);
row++;
fillConstraints(constraints, 0, row, 0, 0, 1);
fieldsPanel.add(blocksPerPageLabel, constraints);
fillConstraints(constraints, 1, row, 1, 0, 1);
fieldsPanel.add(getBlocksPerPageSpinner(), constraints);
row++;
return row;
}
/**
* Method fills a {@link GridBagConstraints} object with data.
*
* @param constraints
* a {@link GridBagConstraints}
* @param gridx
* {@link GridBagConstraints#gridx}
* @param gridy
* {@link GridBagConstraints#gridy}
* @param weightx
* {@link GridBagConstraints#weightx}
* @param weighty
* {@link GridBagConstraints#weighty}
* @param gridwidth
* {@link GridBagConstraints#gridwidth}
*/
protected void fillConstraints(GridBagConstraints constraints, int gridx,
int gridy, int weightx, int weighty, int gridwidth) {
constraints.gridx = gridx;
constraints.gridy = gridy;
constraints.weightx = weightx;
constraints.weighty = weighty;
constraints.gridwidth = gridwidth;
}
/**
* Returns the sampling frequency combo box.
*
* @return the sampling frequency combo box
*/
public JComboBox getSamplingFrequencyComboBox() {
if (samplingFrequencyComboBox == null) {
samplingFrequencyComboBox = new JComboBox();
samplingFrequencyComboBox.setEditable(true);
}
return samplingFrequencyComboBox;
}
/**
* Returns the channel count field
*
* @return the channel count field
*/
protected IntegerSpinner getChannelCountSpinner() {
if (channelCountSpinner == null) {
channelCountSpinner = new IntegerSpinner(new SpinnerNumberModel(4,
1, CHANNEL_COUNT_MAX, 1));
channelCountSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int numberOfChannels = getChannelCountSpinner().getValue();
fireNumberOfChannelsChanged(numberOfChannels);
}
});
}
return channelCountSpinner;
}
/**
* Notifies all listeners that the number of channels has changed.
*
* @param numberOfChannels
* the new number of channels
*/
protected void fireNumberOfChannelsChanged(int numberOfChannels) {
firePropertyChange(NUMBER_OF_CHANNELS_PROPERTY, 0, numberOfChannels);
}
/**
* Returns the byte order combo box.
*
* @return the byte order combo box
*/
protected ResolvableComboBox getByteOrderComboBox() {
if (byteOrderComboBox == null) {
byteOrderComboBox = new ResolvableComboBox();
byteOrderComboBox.setModel(new DefaultComboBoxModel(
RawSignalByteOrder.values()));
}
return byteOrderComboBox;
}
/**
* Returns the sample type combo box.
*
* @return the sample type combo box
*/
protected ResolvableComboBox getSampleTypeComboBox() {
if (sampleTypeComboBox == null) {
sampleTypeComboBox = new ResolvableComboBox();
sampleTypeComboBox.setModel(new DefaultComboBoxModel(
RawSignalSampleType.values()));
}
return sampleTypeComboBox;
}
/**
* Returns the page size spinner.
*
* @return the page size spinner
*/
protected FloatSpinner getPageSizeSpinner() {
if (pageSizeSpinner == null) {
pageSizeSpinner = new FloatSpinner(new SpinnerNumberModel(20.0F,
0.1F, 100000.0F, 0.1F));
}
return pageSizeSpinner;
}
/**
* Returns the blocks per page field.
*
* @return the blocks per page field
*/
protected IntegerSpinner getBlocksPerPageSpinner() {
if (blocksPerPageSpinner == null) {
blocksPerPageSpinner = new IntegerSpinner(new SpinnerNumberModel(4,
1, 200, 1));
}
return blocksPerPageSpinner;
}
public int getChannelCount() {
return getChannelCountSpinner().getValue();
}
public float getSamplingFrequency() {
return Float.parseFloat(getSamplingFrequencyComboBox()
.getSelectedItem().toString());
}
protected void setEnabledAsNeeded(AbstractOpenSignalDescriptor openSignalDescriptor) {
if (openSignalDescriptor == null) {
getSamplingFrequencyComboBox().setSelectedIndex(-1);
getChannelCountSpinner().setValue(0);
setEnabledToAll(false);
return;
}
if (openSignalDescriptor instanceof RawSignalDescriptor) {
setEnabledToAll(true);
getSamplingFrequencyComboBox().setEditable(true);
}
else if (openSignalDescriptor instanceof ExperimentDescriptor) {
ExperimentDescriptor experiment = (ExperimentDescriptor) openSignalDescriptor;
if (experiment.getStatus() == ExperimentStatus.NEW) {
getSamplingFrequencyComboBox().setEnabled(true);
getSamplingFrequencyComboBox().setEditable(false);
} else {
setEnabledToAll(false);
}
}
}
protected void setEnabledToAll(boolean enabled) {
getSamplingFrequencyComboBox().setEnabled(enabled);
getChannelCountSpinner().setEnabled(enabled);
getByteOrderComboBox().setEnabled(enabled);
getSampleTypeComboBox().setEnabled(enabled);
}
public void fillPanelFromModel(AbstractOpenSignalDescriptor openSignalDescriptor) {
this.openSignalDescriptor = openSignalDescriptor;
setEnabledAsNeeded(openSignalDescriptor);
if (openSignalDescriptor == null)
return;
if (openSignalDescriptor instanceof RawSignalDescriptor) {
RawSignalDescriptor rawSignalDescriptor = (RawSignalDescriptor) openSignalDescriptor;
if (rawSignalDescriptor.getByteOrder() != null)
getByteOrderComboBox().setSelectedItem(rawSignalDescriptor.getByteOrder());
if (rawSignalDescriptor.getSampleType() != null)
getSampleTypeComboBox().setSelectedItem(rawSignalDescriptor.getSampleType());
} else if (openSignalDescriptor instanceof ExperimentDescriptor) {
ExperimentDescriptor experimentDescriptor = (ExperimentDescriptor) openSignalDescriptor;
List<Float> samplingFrequencies = experimentDescriptor.getAmplifier().getSamplingFrequencies();
getSamplingFrequencyComboBox().setModel(new DefaultComboBoxModel(samplingFrequencies.toArray()));
float samplingFrequency = experimentDescriptor.getSignalParameters().getSamplingFrequency();
getSampleTypeComboBox().setSelectedItem(samplingFrequency);
}
SignalParameters signalParameters = openSignalDescriptor.getSignalParameters();
getSamplingFrequencyComboBox().setSelectedItem(signalParameters.getSamplingFrequency());
getChannelCountSpinner().setValue(signalParameters.getChannelCount());
getPageSizeSpinner().setValue(signalParameters.getPageSize());
getBlocksPerPageSpinner().setValue(signalParameters.getBlocksPerPage());
fireNumberOfChannelsChanged(signalParameters.getChannelCount());
}
public void fillModelFromPanel(AbstractOpenSignalDescriptor openSignalDescriptor) {
if (openSignalDescriptor instanceof RawSignalDescriptor) {
RawSignalDescriptor rawSignalDescriptor = (RawSignalDescriptor) openSignalDescriptor;
rawSignalDescriptor.setByteOrder((RawSignalByteOrder) getByteOrderComboBox().getSelectedItem());
rawSignalDescriptor.setSampleType((RawSignalSampleType) getSampleTypeComboBox().getSelectedItem());
}
SignalParameters signalParameters = openSignalDescriptor.getSignalParameters();
signalParameters.setSamplingFrequency(getSamplingFrequency());
signalParameters.setChannelCount(getChannelCount());
signalParameters.setPageSize(getPageSizeSpinner().getValue());
signalParameters.setBlocksPerPage(getBlocksPerPageSpinner().getValue());
if (openSignalDescriptor instanceof ExperimentDescriptor) {
ExperimentDescriptor experimentDescriptor = (ExperimentDescriptor) openSignalDescriptor;
signalParameters.setChannelCount(experimentDescriptor
.getAmplifier().getSelectedChannels().size());
}
}
}