/* ArtifactMethodDialog.java created 2007-10-28
*
*/
package org.signalml.plugin.newartifact.ui;
import static org.signalml.plugin.i18n.PluginI18n._;
import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JPanel;
import org.signalml.app.config.preset.Preset;
import org.signalml.app.config.preset.PresetManager;
import org.signalml.app.document.FileBackedDocument;
import org.signalml.app.method.InputSignalPanel;
import org.signalml.app.model.components.validation.ValidationErrors;
import org.signalml.app.model.montage.SourceMontageDescriptor;
import org.signalml.app.util.IconUtils;
import org.signalml.app.view.common.dialogs.AbstractPresetDialog;
import org.signalml.app.view.montage.SourceMontageDialog;
import org.signalml.domain.montage.Montage;
import org.signalml.domain.montage.SourceChannel;
import org.signalml.domain.montage.SourceMontage;
import org.signalml.domain.montage.system.ChannelFunction;
import org.signalml.plugin.export.SignalMLException;
import org.signalml.plugin.export.signal.ExportedSignalDocument;
import org.signalml.plugin.method.helper.PluginPresetManagerFilter;
import org.signalml.plugin.newartifact.NewArtifactPlugin;
import org.signalml.plugin.newartifact.data.NewArtifactApplicationData;
import org.signalml.plugin.newartifact.data.NewArtifactExclusionDescriptor;
import org.signalml.plugin.newartifact.data.NewArtifactParameters;
import org.signalml.plugin.newartifact.data.NewArtifactPowerGridFrequency;
import org.signalml.plugin.newartifact.data.NewArtifactType;
import org.springframework.core.io.ClassPathResource;
/**
* ArtifactMethodDialog
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe
* Sp. z o.o. (dialog design based on work by Hubert Klekowicz)
*/
public class NewArtifactMethodDialog extends AbstractPresetDialog {
private static final long serialVersionUID = 1L;
private URL contextHelpURL = null;
private InputSignalPanel signalPanel;
private NewArtifactTypesPanel typesPanel;
private NewArtifactOptionsPanel optionsPanel;
private SourceMontageDialog montageDialog;
private NewArtifactExclusionDialog exclusionDialog;
private NewArtifactType[] artifactTypes = NewArtifactType.values();
private SourceMontage currentMontage;
private int[][] currentExclusion;
public NewArtifactMethodDialog(PresetManager presetManager, Window w) {
super(new PluginPresetManagerFilter(presetManager,
NewArtifactMethodDialog.GetPresetClasses()), w, true);
}
@Override
protected void initialize() {
setTitle(_("Artifact detection configuration"));
setIconImage(IconUtils.loadClassPathImage(NewArtifactPlugin.iconPath));
setResizable(false);
super.initialize();
}
@Override
protected URL getContextHelpURL() {
if (contextHelpURL == null) {
try {
contextHelpURL = (new ClassPathResource(
"org/signalml/help/artifact.html")).getURL();
} catch (IOException ex) {
logger.error("Failed to get help URL", ex);
}
}
return contextHelpURL;
}
@Override
public JComponent createInterface() {
JPanel interfacePanel = new JPanel(new BorderLayout());
signalPanel = new InputSignalPanel();
typesPanel = new NewArtifactTypesPanel();
optionsPanel = new NewArtifactOptionsPanel();
optionsPanel.getExclusionButton().setAction(new EditExclusionAction());
optionsPanel.getExclusionButton().setEnabled(false);
signalPanel.getMontageButton().setAction(new EditMontageAction());
interfacePanel.add(signalPanel, BorderLayout.NORTH);
interfacePanel.add(typesPanel, BorderLayout.CENTER);
interfacePanel.add(optionsPanel, BorderLayout.SOUTH);
return interfacePanel;
}
@Override
public void fillDialogFromModel(Object model) throws SignalMLException {
NewArtifactApplicationData data = (NewArtifactApplicationData) model;
ExportedSignalDocument signalDocument = data.getSignalDocument();
String path = "?";
if (signalDocument instanceof FileBackedDocument) {
path = ((FileBackedDocument) signalDocument).getBackingFile()
.getAbsolutePath();
}
signalPanel.getSignalTextField().setText(path);
if (data.isExistingProject()) {
fillDialogFromParameters(data.getParameters());
} else {
Preset preset = getPresetManager().getDefaultPreset();
if (preset != null) {
try {
setPreset(preset);
} catch (SignalMLException ex) {
logger.error("Failed to set default preset", ex);
}
} else {
fillDialogFromParameters(data.getParameters());
}
}
if (data.isProcessedProject()) {
currentMontage = data.getMontage();
signalPanel.getMontageButton().setEnabled(false);
} else {
currentMontage = new Montage(data.getMontage());
signalPanel.getMontageButton().setEnabled(true);
}
int channelCount = signalDocument.getSourceChannelLabels().size(); // TODO
// sourceChannelCount
currentExclusion = new int[artifactTypes.length][channelCount];
int[][] exclusion = data.getExcludedChannels();
if (exclusion != null) {
int i, e;
for (i = 0; i < Math.min(artifactTypes.length, exclusion.length); i++) {
for (e = 0; e < Math.min(channelCount, exclusion[i].length); e++) {
currentExclusion[i][e] = exclusion[i][e];
}
}
}
configureAvailableTypes();
}
private void fillDialogFromParameters(NewArtifactParameters parameters) {
typesPanel.fillPanelFromParameters(parameters);
NewArtifactPowerGridFrequency powerGridFrequency = NewArtifactPowerGridFrequency
.forFloat(parameters.getPowerGridFrequency());
if (powerGridFrequency == null) {
powerGridFrequency = NewArtifactPowerGridFrequency.EUROPE;
}
optionsPanel.getPowerComboBox().setSelectedItem(powerGridFrequency);
}
@Override
public void fillModelFromDialog(Object model) throws SignalMLException {
NewArtifactApplicationData data = (NewArtifactApplicationData) model;
if (!data.isExistingProject()) {
data.setMontage(currentMontage);
}
data.setExcludedChannels(currentExclusion);
fillParametersFromDialog(data.getParameters());
data.calculate();
}
private void fillParametersFromDialog(NewArtifactParameters parameters) {
typesPanel.fillParametersFromPanel(parameters);
NewArtifactPowerGridFrequency powerGridFrequency = (NewArtifactPowerGridFrequency) optionsPanel
.getPowerComboBox().getSelectedItem();
parameters.setPowerGridFrequency(powerGridFrequency.getFrequency());
}
@Override
public Preset getPreset() throws SignalMLException {
NewArtifactParameters parameters = new NewArtifactParameters();
fillParametersFromDialog(parameters);
return parameters;
}
@Override
public void setPreset(Preset preset) throws SignalMLException {
NewArtifactParameters parameters;
try {
parameters = (NewArtifactParameters) preset;
} catch (ClassCastException e) {
return;
}
fillDialogFromParameters(parameters);
}
@Override
public void validateDialog(Object model, ValidationErrors errors)
throws SignalMLException {
// dialog doesn't need any additional validation
}
private void configureAvailableTypes() {
SourceChannel f3 = currentMontage.getSourceChannelByLabel("F3");
SourceChannel f4 = currentMontage.getSourceChannelByLabel("F4");
SourceChannel c3 = currentMontage.getSourceChannelByLabel("C3");
SourceChannel c4 = currentMontage.getSourceChannelByLabel("C4");
SourceChannel fp1 = currentMontage.getSourceChannelByLabel("Fp1");
SourceChannel fp2 = currentMontage.getSourceChannelByLabel("Fp2");
SourceChannel f7 = currentMontage.getSourceChannelByLabel("F7");
SourceChannel f8 = currentMontage.getSourceChannelByLabel("F8");
SourceChannel t3 = currentMontage.getSourceChannelByLabel("T3");
SourceChannel t4 = currentMontage.getSourceChannelByLabel("T4");
SourceChannel eogl = currentMontage.getSourceChannelByLabel("EOGL");
SourceChannel eogp = currentMontage.getSourceChannelByLabel("EOGP");
int[] ecg = currentMontage
.getSourceChannelsByFunction(ChannelFunction.ECG);
boolean noECG = (ecg == null) || (ecg.length == 0);
typesPanel.setLockOnType(NewArtifactType.ECG, noECG);
if ((f3 == null) || (f4 == null) || (c3 == null) || (c4 == null)
|| (fp1 == null) || (fp2 == null)) {
typesPanel.setLockOnType(NewArtifactType.EYEBLINKS, true);
} else {
typesPanel.setLockOnType(NewArtifactType.EYEBLINKS, false);
}
if (((f7 == null) || (f8 == null)) && ((t3 == null) || (t4 == null))
&& ((eogl == null) || (eogp == null))) {
typesPanel.setLockOnType(NewArtifactType.EYE_MOVEMENT, true);
} else {
typesPanel.setLockOnType(NewArtifactType.EYE_MOVEMENT, false);
}
}
@Override
protected void onDialogClose() {
try {
Preset preset = getPreset();
getPresetManager().setDefaultPreset(preset);
} catch (SignalMLException ex) {
logger.debug("Failed to get preset", ex);
}
}
@Override
public boolean supportsModelClass(Class<?> clazz) {
return NewArtifactApplicationData.class.isAssignableFrom(clazz);
}
protected class EditMontageAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public EditMontageAction() {
super(_("Edit montage"));
putValue(
AbstractAction.SMALL_ICON,
IconUtils
.loadClassPathIcon("org/signalml/app/icon/montage.png"));
putValue(AbstractAction.SHORT_DESCRIPTION,
_("Edit channel labels and functions"));
}
@Override
public void actionPerformed(ActionEvent ev) {
if (montageDialog == null) {
montageDialog = new SourceMontageDialog(
NewArtifactMethodDialog.this, true);
}
SourceMontageDescriptor descriptor = new SourceMontageDescriptor(
currentMontage);
boolean ok = montageDialog.showDialog(descriptor, true);
if (!ok) {
return;
}
currentMontage = descriptor.getMontage();
configureAvailableTypes();
}
}
protected class EditExclusionAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public EditExclusionAction() {
super(_("Select excluded derivations"));
putValue(
AbstractAction.SMALL_ICON,
IconUtils
.loadClassPathIcon("org/signalml/app/icon/editexclusion.png"));
putValue(AbstractAction.SHORT_DESCRIPTION,
_("Select excluded derivations"));
}
@Override
public void actionPerformed(ActionEvent ev) {
if (exclusionDialog == null) {
exclusionDialog = new NewArtifactExclusionDialog(
NewArtifactMethodDialog.this, true);
}
NewArtifactExclusionDescriptor descriptor = new NewArtifactExclusionDescriptor(
currentMontage, currentExclusion);
exclusionDialog.showDialog(descriptor, true);
}
}
private static Collection<Class<? extends Preset>> GetPresetClasses() {
Collection<Class<? extends Preset>> l = new ArrayList<Class<? extends Preset>>();
l.add(NewArtifactParameters.class);
return l;
}
}