package org.signalml.app.view.document.opensignal;
import static org.signalml.app.util.i18n.SvarogI18n._;
import java.awt.Dimension;
import java.awt.Window;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingWorker.StateValue;
import org.apache.log4j.Logger;
import org.signalml.app.SvarogApplication;
import org.signalml.app.config.preset.managers.PredefinedTimeDomainFiltersPresetManager;
import org.signalml.app.document.ManagedDocumentType;
import org.signalml.app.model.document.OpenDocumentDescriptor;
import org.signalml.app.model.document.opensignal.AbstractOpenSignalDescriptor;
import org.signalml.app.model.document.opensignal.ExperimentDescriptor;
import org.signalml.app.model.document.opensignal.elements.SignalParameters;
import org.signalml.app.view.common.dialogs.AbstractWizardDialog;
import org.signalml.app.view.common.dialogs.errors.Dialogs;
import org.signalml.app.view.montage.SignalMontagePanel;
import org.signalml.app.view.workspace.ViewerElementManager;
import org.signalml.app.worker.monitor.ConnectToExperimentWorker;
import org.signalml.domain.montage.Montage;
import org.signalml.domain.montage.SignalConfigurer;
import org.signalml.domain.montage.filter.TimeDomainSampleFilter;
import org.signalml.domain.montage.system.EegSystem;
import org.signalml.math.iirdesigner.FilterType;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.util.SvarogConstants;
public class OpenSignalWizardDialog extends AbstractWizardDialog implements PropertyChangeListener {
protected static final Logger log = Logger.getLogger(OpenSignalWizardDialog.class);
private static final long serialVersionUID = -6697344610944631342L;
private ExperimentDescriptor experimentDescriptor;
private ViewerElementManager viewerElementManager;
private ConnectToExperimentWorker worker;
private OpenSignalWizardStepOnePanel stepOnePanel;
private SignalMontagePanel stepTwoPanel;
public OpenSignalWizardDialog(ViewerElementManager viewerElementManager, Window f, boolean isModal) {
super(f, isModal);
this.viewerElementManager = viewerElementManager;
this.setTitle(_("Open signal"));
}
@Override
protected void initialize() {
setPreferredSize(SvarogConstants.MIN_ASSUMED_DESKTOP_SIZE);
super.initialize();
setMinimumSize(new Dimension(800, 600));
}
@Override
public int getStepCount() {
return 2;
}
@Override
protected boolean onStepChange(int toStep, int fromStep, Object model)
throws SignalMLException {
if (toStep == 1 && fromStep == 0) {
AbstractOpenSignalDescriptor openSignalDescriptor = getStepOnePanel().getOpenSignalDescriptor();
if (openSignalDescriptor == null) {
Dialogs.showError(_("Please select a proper file or monitor signal source!"));
return false;
}
if (openSignalDescriptor.getChannelLabels().length == 0) {
Dialogs.showError(_("Please select some channels!"));
return false;
}
SignalParameters signalParameters = openSignalDescriptor.getSignalParameters();
Montage createdMontage = SignalConfigurer.createMontage(signalParameters.getChannelCount());
PredefinedTimeDomainFiltersPresetManager predefinedTimeDomainSampleFilterPresetManager = SvarogApplication.getManagerOfPresetsManagers().getPredefinedTimeDomainSampleFilterPresetManager();
if (SvarogApplication.getApplicationConfiguration().isAutoAddHighpassFilter()) {
float samplingFrequency = openSignalDescriptor.getSignalParameters().getSamplingFrequency();
TimeDomainSampleFilter filter = predefinedTimeDomainSampleFilterPresetManager.getPredefinedFilter(samplingFrequency, FilterType.HIGHPASS, 1.0, 0.0);
if (filter != null)
createdMontage.addSampleFilter(filter);
}
EegSystem selectedEegSystem = getStepOnePanel().getOtherSettingsPanel().getSelectedEegSystem();
createdMontage.setEegSystem(selectedEegSystem);
String[] channelLabels = openSignalDescriptor.getChannelLabels();
for (int i = 0; i < channelLabels.length; i++) {
createdMontage.setSourceChannelLabelAt(i, channelLabels[i]);
}
createdMontage.getMontageGenerator().createMontage(createdMontage);
getSignalMontagePanel().fillPanelFromModel(createdMontage);
getSignalMontagePanel().setSamplingFrequency(signalParameters.getSamplingFrequency());
getSignalMontagePanel().resetPreset();
}
return super.onStepChange(toStep, fromStep, model);
}
@Override
protected JComponent createInterfaceForStep(int step) {
switch (step) {
case 0:
return getStepOnePanel();
case 1:
return getSignalMontagePanel();
default:
return new JPanel();
}
}
protected OpenSignalWizardStepOnePanel getStepOnePanel() {
if (stepOnePanel == null) {
stepOnePanel = new OpenSignalWizardStepOnePanel(viewerElementManager);
}
return stepOnePanel;
}
protected SignalMontagePanel getSignalMontagePanel() {
if (stepTwoPanel == null) {
stepTwoPanel = new SignalMontagePanel(viewerElementManager.getFileChooser());
}
return stepTwoPanel;
}
@Override
public boolean supportsModelClass(Class<?> clazz) {
return OpenDocumentDescriptor.class.isAssignableFrom(clazz);
}
@Override
protected void fillDialogFromModel(Object model) throws SignalMLException {
}
@Override
public void fillModelFromDialog(Object model) throws SignalMLException {
OpenDocumentDescriptor openDocumentDescriptor = (OpenDocumentDescriptor) model;
AbstractOpenSignalDescriptor openSignalDescriptor = getStepOnePanel().getOpenSignalDescriptor();
if (openSignalDescriptor instanceof ExperimentDescriptor) {
openDocumentDescriptor.setType(ManagedDocumentType.MONITOR);
}
else {
openDocumentDescriptor.setType(ManagedDocumentType.SIGNAL);
File file = getStepOnePanel().getSignalSourceTabbedPane().getFileChooserPanel().getSelectedFile();
openDocumentDescriptor.setFile(file);
}
openSignalDescriptor.setMontage(getSignalMontagePanel().getCurrentMontage());
openDocumentDescriptor.setOpenSignalDescriptor(openSignalDescriptor);
}
@Override
public boolean isFinishAllowedOnStep(int step) {
return step == 1;
}
@Override
protected void onDialogCloseWithOK() {
super.onDialogCloseWithOK();
this.getStepOnePanel().onDialogCloseWithOK();
}
@Override
protected void onOkPressed() {
if (getStepOnePanel().getOpenSignalDescriptor() instanceof ExperimentDescriptor) {
experimentDescriptor = (ExperimentDescriptor) getStepOnePanel().getOpenSignalDescriptor();
worker = new ConnectToExperimentWorker(this, experimentDescriptor);
worker.addPropertyChangeListener(this);
worker.execute();
}
else {
super.onOkPressed();
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (((StateValue) evt.getNewValue()) == StateValue.DONE) {
try {
worker.get();
if (experimentDescriptor.getJmxClient() != null) {
super.onOkPressed();
}
} catch (CancellationException ex) {
logger.debug(_("Connecting to experiment cancelled."));
} catch (InterruptedException e) {
logger.error("", e);
} catch (ExecutionException e) {
logger.error("", e);
}
}
}
@Override
protected void onDialogClose() {
super.onDialogClose();
getStepOnePanel().getSignalSourceTabbedPane().getChooseExperimentPanel().clearExperiments();
}
}