package org.signalml.app.view.document.opensignal.elements; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JPanel; import org.signalml.app.model.document.opensignal.AbstractOpenSignalDescriptor; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.model.document.opensignal.SignalMLDescriptor; import org.signalml.app.model.document.opensignal.elements.AmplifierChannel; import org.signalml.domain.signal.raw.RawSignalDescriptor; /** * A {@link ChannelSelectPanel} with additional button for editing * the gain and offset for channels. * * @author Piotr Szachewicz */ public class ChannelSelectWithGainEditionPanel extends ChannelSelectPanel { protected AbstractOpenSignalDescriptor openSignalDescriptor; private JButton editGainAndOffsetButton; private EditGainAndOffsetDialog editGainAndOffsetDialog; @Override protected JPanel createButtonsPanel() { JPanel buttonsPanel = new JPanel(new BorderLayout()); JPanel selectAndClearButtonsPanel = super.createButtonsPanel(); buttonsPanel.add(selectAndClearButtonsPanel, BorderLayout.WEST); buttonsPanel.add(createEditGainAndOffsetPanel(), BorderLayout.EAST); return buttonsPanel; } protected JPanel createEditGainAndOffsetPanel() { JPanel panel = new JPanel(); panel.add(getEditGainAndOffsetButton()); return panel; } /** * Returns the edit gain and offset button. * * @return the edit gain and offset button */ protected JButton getEditGainAndOffsetButton() { if (editGainAndOffsetButton == null) { editGainAndOffsetButton = new JButton(new AbstractAction() { @Override public void actionPerformed(ActionEvent arg0) { fillSignalParametersGainAndOffset(openSignalDescriptor); getEditGainAndOffsetDialog().showDialog(openSignalDescriptor, true); } }); editGainAndOffsetButton.setText(_("Edit gain and offset")); editGainAndOffsetButton.setEnabled(false); } return editGainAndOffsetButton; } /** * Returns the edit gain and offset dialog * * @return the edit gain and offset dialog */ protected EditGainAndOffsetDialog getEditGainAndOffsetDialog() { if (editGainAndOffsetDialog == null) { editGainAndOffsetDialog = new EditGainAndOffsetDialog(null, true); } return editGainAndOffsetDialog; } public void fillPanelFromModel(AbstractOpenSignalDescriptor openSignalDescriptor) { this.openSignalDescriptor = openSignalDescriptor; super.fillPanelFromModel(openSignalDescriptor); setEnabledAsNeeded(openSignalDescriptor); } @Override public void fillModelFromPanel(AbstractOpenSignalDescriptor openSignalDescriptor) { super.fillModelFromPanel(openSignalDescriptor); fillSignalParametersGainAndOffset(openSignalDescriptor); } protected void setEnabledAsNeeded(AbstractOpenSignalDescriptor openSignalDescriptor) { if (openSignalDescriptor == null) { getEditGainAndOffsetButton().setEnabled(false); return; } if (openSignalDescriptor instanceof RawSignalDescriptor) { getEditGainAndOffsetButton().setEnabled(true); } else { if (openSignalDescriptor instanceof SignalMLDescriptor) getEditGainAndOffsetButton().setEnabled(false); else getEditGainAndOffsetButton().setEnabled(true); } } protected void fillSignalParametersGainAndOffset(AbstractOpenSignalDescriptor openSignalDescriptor) { if (openSignalDescriptor instanceof ExperimentDescriptor) { ExperimentDescriptor experimentDescriptor = (ExperimentDescriptor) openSignalDescriptor; List<AmplifierChannel> channels = experimentDescriptor .getAmplifier().getSelectedChannels(); float[] gain = new float[channels.size()]; float[] offset = new float[channels.size()]; int i = 0; for (AmplifierChannel channel : channels) { gain[i] = channel.getCalibrationGain(); offset[i] = channel.getCalibrationOffset(); i++; } experimentDescriptor.getSignalParameters().setCalibrationGain(gain); experimentDescriptor.getSignalParameters().setCalibrationOffset(offset); } } }