package org.signalml.app.view.document.opensignal; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.signalml.app.config.preset.Preset; import org.signalml.app.model.document.opensignal.AbstractOpenSignalDescriptor; import org.signalml.app.model.document.opensignal.ExperimentDescriptor; import org.signalml.app.model.document.opensignal.elements.SignalSource; import org.signalml.app.view.common.components.presets.PresetableView; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.app.view.document.opensignal.elements.ChannelSelectWithGainEditionPanel; import org.signalml.app.view.document.opensignal.elements.OtherSettingsPanel; import org.signalml.app.view.document.opensignal.elements.PresetSelectionPanel; import org.signalml.app.view.document.opensignal.elements.SignalParametersPanel; import org.signalml.app.view.document.opensignal.elements.SignalSourceTabbedPane; import org.signalml.app.view.workspace.ViewerElementManager; import org.signalml.plugin.export.SignalMLException; public class OpenSignalWizardStepOnePanel extends JPanel implements ChangeListener, PropertyChangeListener, PresetableView { protected static final Logger log = Logger.getLogger(OpenSignalWizardStepOnePanel.class); private SignalSourceTabbedPane signalSourceTabbedPane; private ViewerElementManager viewerElementManager; private SignalParametersPanel signalParametersPanel; private ChannelSelectWithGainEditionPanel channelSelectPanel; private OtherSettingsPanel otherSettingsPanel; private PresetSelectionPanel presetSelectionPanel; private AbstractOpenSignalDescriptor openSignalDescriptor; public OpenSignalWizardStepOnePanel(ViewerElementManager viewerElementManager) { this.viewerElementManager = viewerElementManager; this.setLayout(new GridLayout(1, 2)); this.add(createLeftPanel()); this.add(createRightPanel()); preparePanelsForSignalSource(); } protected JPanel createLeftPanel() { JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.add(getSignalSourceTabbedPane(), BorderLayout.CENTER); signalParametersPanel = new SignalParametersPanel(); signalParametersPanel.addPropertyChangeListener(this); leftPanel.add(signalParametersPanel, BorderLayout.SOUTH); return leftPanel; } protected JPanel createRightPanel() { JPanel rightPanel = new JPanel(new BorderLayout()); channelSelectPanel = new ChannelSelectWithGainEditionPanel(); rightPanel.add(channelSelectPanel, BorderLayout.CENTER); JPanel southPanel = new JPanel(); southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.Y_AXIS)); southPanel.add(getOtherSettingsPanel()); southPanel.add(getPresetSelectionPanel()); rightPanel.add(southPanel, BorderLayout.SOUTH); return rightPanel; } public OtherSettingsPanel getOtherSettingsPanel() { if (otherSettingsPanel == null) { otherSettingsPanel = new OtherSettingsPanel(viewerElementManager); } return otherSettingsPanel; } protected SignalSourceTabbedPane getSignalSourceTabbedPane() { if (signalSourceTabbedPane == null) { signalSourceTabbedPane = new SignalSourceTabbedPane(viewerElementManager); signalSourceTabbedPane.addChangeListener(this); signalSourceTabbedPane.addPropertyChangeListener(this); getOtherSettingsPanel().getFileTypeComboBox().addItemListener(signalSourceTabbedPane); getOtherSettingsPanel().getRegisterCodecAction().addPropertyChangeListener(signalSourceTabbedPane); } return signalSourceTabbedPane; } public PresetSelectionPanel getPresetSelectionPanel() { if (presetSelectionPanel == null) presetSelectionPanel = new PresetSelectionPanel(this); return presetSelectionPanel; } @Override public void stateChanged(ChangeEvent event) { if (event.getSource() == signalSourceTabbedPane) { preparePanelsForSignalSource(); fillPanelFromModel(signalSourceTabbedPane.getOpenSignalDescriptor()); } } protected void preparePanelsForSignalSource() { SignalSource selectedSignalSource = signalSourceTabbedPane.getSelectedSignalSource(); channelSelectPanel.preparePanelForSignalSource(selectedSignalSource); getOtherSettingsPanel().preparePanelForSignalSource(selectedSignalSource); getPresetSelectionPanel().preparePanelsForSignalSource(selectedSignalSource); } @Override public void propertyChange(PropertyChangeEvent evt) { if (SignalSourceTabbedPane.OPEN_SIGNAL_DESCRIPTOR_PROPERTY.equals(evt.getPropertyName())) { openSignalDescriptor = (AbstractOpenSignalDescriptor) evt.getNewValue(); fillPanelFromModel(openSignalDescriptor); getPresetSelectionPanel().resetSelectedPreset(); } else if (SignalParametersPanel.NUMBER_OF_CHANNELS_PROPERTY.equals(evt.getPropertyName())) { Integer channelCount = (Integer) evt.getNewValue(); if (!openSignalDescriptor.isCorrectlyRead() || channelCount != openSignalDescriptor.getSignalParameters().getChannelCount()) { int i = 0; String[] channelLabels = new String[channelCount]; float[] calibrationGain = new float[channelCount]; float[] calibrationOffset = new float[channelCount]; if (openSignalDescriptor.getChannelLabels() != null) { int min = Math.min(openSignalDescriptor.getChannelLabels().length, channelCount); for (i = 0; i < min; i++) { channelLabels[i] = openSignalDescriptor.getChannelLabels()[i]; calibrationGain[i] = openSignalDescriptor.getSignalParameters().getCalibrationGain()[i]; calibrationOffset[i] = openSignalDescriptor.getSignalParameters().getCalibrationOffset()[i]; } } for (; i < channelCount; i++) { channelLabels[i] = "L" + i; calibrationGain[i] = 1.0F; calibrationOffset[i] = 0.0F; } openSignalDescriptor.setChannelLabels(channelLabels); openSignalDescriptor.getSignalParameters().setCalibrationGain(calibrationGain); openSignalDescriptor.getSignalParameters().setCalibrationOffset(calibrationOffset); openSignalDescriptor.getSignalParameters().setChannelCount(channelCount); channelSelectPanel.fillPanelFromModel(openSignalDescriptor); } } } public void fillPanelFromModel(AbstractOpenSignalDescriptor openSignalDescriptor) { signalParametersPanel.fillPanelFromModel(openSignalDescriptor); channelSelectPanel.fillPanelFromModel(openSignalDescriptor); otherSettingsPanel.fillPanelFromModel(openSignalDescriptor); presetSelectionPanel.fillPanelFromModel(openSignalDescriptor); } public void fillModelFromPanel(AbstractOpenSignalDescriptor openSignalDescriptor) { signalParametersPanel.fillModelFromPanel(openSignalDescriptor); channelSelectPanel.fillModelFromPanel(openSignalDescriptor); otherSettingsPanel.fillModelFromPanel(openSignalDescriptor); } public AbstractOpenSignalDescriptor getOpenSignalDescriptor() { if (openSignalDescriptor != null) { fillModelFromPanel(openSignalDescriptor); } return openSignalDescriptor; } protected void onDialogCloseWithOK() { getSignalSourceTabbedPane().onDialogCloseWithOK(); } @Override public Preset getPreset() throws SignalMLException { ExperimentDescriptor experimentDescriptor = new ExperimentDescriptor((ExperimentDescriptor) getOpenSignalDescriptor()); fillModelFromPanel(experimentDescriptor); return experimentDescriptor; } @Override public void setPreset(Preset preset) throws SignalMLException { ExperimentDescriptor experimentDescriptor = (ExperimentDescriptor) preset; ExperimentDescriptor currentExperiment = ((ExperimentDescriptor) getOpenSignalDescriptor()); currentExperiment.copyFromPreset(experimentDescriptor); fillPanelFromModel(currentExperiment); } @Override public boolean isPresetCompatible(Preset preset) { if (!(preset instanceof ExperimentDescriptor)) return false; ExperimentDescriptor newExperimentDescriptor = (ExperimentDescriptor) preset; ExperimentDescriptor currentExperimentDescriptor = (ExperimentDescriptor) openSignalDescriptor; int newNumberOfChannels = newExperimentDescriptor.getAmplifier().getChannels().size(); int currentNumberOfChannels = currentExperimentDescriptor.getAmplifier().getChannels().size(); if (newNumberOfChannels != currentNumberOfChannels) { Dialogs.showError(_("This preset is not compatible with the current experiment - different number of channels.")); return false; } return true; } }