/* StagerMethodDialog.java created 2008-02-08 * */ package org.signalml.plugin.newstager.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 java.util.Observable; import java.util.Observer; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; 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.errors.Dialogs; import org.signalml.app.view.montage.SourceMontageDialog; import org.signalml.domain.montage.Montage; import org.signalml.domain.montage.SourceMontage; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.export.signal.ExportedSignalDocument; import org.signalml.plugin.export.view.AbstractPluginPresetDialog; import org.signalml.plugin.method.helper.PluginPresetManagerFilter; import org.signalml.plugin.newstager.NewStagerPlugin; import org.signalml.plugin.newstager.data.NewStagerApplicationData; import org.signalml.plugin.newstager.data.NewStagerParametersPreset; import org.signalml.plugin.newstager.helper.NewStagerConfigurationDefaultsHelper; import org.springframework.core.io.ClassPathResource; /** * StagerMethodDialog * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe * Sp. z o.o. (dialog design based on work by Hubert Klekowicz) */ public class NewStagerMethodDialog extends AbstractPluginPresetDialog { private static final long serialVersionUID = 1L; public static final String HELP_RULES = "org/signalml/help/stager.html#rules"; public static final String HELP_DELTA_MIN_AMPLITUDE = "org/signalml/help/stager.html#deltaMinAmplitude"; public static final String HELP_ALPHA_MIN_AMPLITUDE = "org/signalml/help/stager.html#alphaMinAmplitude"; public static final String HELP_SPINDLE_MIN_AMPLITUDE = "org/signalml/help/stager.html#spindleMinAmplitude"; public static final String HELP_PRIMARY_HYPNOGRAM = "org/signalml/help/stager.html#primaryHypnogram"; public static final String HELP_PARAMETERS = "org/signalml/help/stager.html#parameters"; public static final String HELP_EMG_TONE_THRESHOLD = "org/signalml/help/stager.html#emgToneThreshold"; public static final String HELP_MT_EEG_THRESHOLD = "org/signalml/help/stager.html#mtEegThreshold"; public static final String HELP_MT_EMG_THRESHOLD = "org/signalml/help/stager.html#mtEmgThreshold"; public static final String HELP_MT_TONE_EMG_THRESHOLD = "org/signalml/help/stager.html#mtToneEmgThreshold"; public static final String HELP_REM_EOG_DEFLECTION_THRESHOLD = "org/signalml/help/stager.html#remEogDeflectionThreshold"; public static final String HELP_SEM_EOG_DEFLECTION_THRESHOLD = "org/signalml/help/stager.html#semEogDeflectionThreshold"; private static final int BASIC_PARAMETERS_TAB = 0; private static final int ADVANCED_PARAMETERS_TAB = 1; private static final int THRESHOLD_TAB = 2; private URL contextHelpURL = null; private InputSignalPanel signalPanel; private JTabbedPane tabbedPane; private int currentPane; private NewStagerBasicConfigPanel basicConfigPanel; private NewStagerAdvancedConfigPanel advancedConfigPanel; private NewStagerThresholdConfigPanel thresholdConfigPanel; SourceMontageDialog montageDialog; SourceMontage currentMontage; private NewStagerParametersPreset currentParametersPreset; private NewStagerAdvancedConfigObservable advancedConfigObservable; private boolean isUpdatingPreset; protected boolean advancedParametersEnabled; public NewStagerMethodDialog(PresetManager presetManager, Window w) { super(new PluginPresetManagerFilter(presetManager, NewStagerMethodDialog.GetPresetClasses()), w, true); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.isUpdatingPreset = false; } @Override protected JPanel createButtonPane() { JPanel buttonPane = super.createButtonPane(); buttonPane.add(Box.createHorizontalStrut(10), 1); buttonPane.add(new JButton(new RestoreDefaultsAction()), 1); return buttonPane; } @Override protected void initialize() { setTitle(_("Stager configuration")); setIconImage(IconUtils.loadClassPathImage(NewStagerPlugin.iconPath)); setResizable(false); super.initialize(); } @Override protected URL getContextHelpURL() { if (contextHelpURL == null) { try { contextHelpURL = (new ClassPathResource( "org/signalml/help/stager.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(); signalPanel.getMontageButton().setAction(new EditMontageAction()); this.advancedConfigObservable = new NewStagerAdvancedConfigObservable(); interfacePanel.add(signalPanel, BorderLayout.NORTH); interfacePanel.add(getTabbedPane(), BorderLayout.CENTER); this.advancedConfigObservable.addObserver(new Observer() { @Override public void update(Observable observable, Object arg) { boolean enabled = advancedConfigObservable.getEnabled(); JTabbedPane pane = getTabbedPane(); if (!enabled) { if (pane.getSelectedIndex() != BASIC_PARAMETERS_TAB) { pane.setSelectedIndex(BASIC_PARAMETERS_TAB); } } pane.setEnabledAt(ADVANCED_PARAMETERS_TAB, enabled); pane.setEnabledAt(THRESHOLD_TAB, enabled); advancedParametersEnabled = enabled; } }); return interfacePanel; } public NewStagerBasicConfigPanel getBasicConfigPanel() { if (basicConfigPanel == null) { basicConfigPanel = new NewStagerBasicConfigPanel(getFileChooser(), this, this.advancedConfigObservable); } return basicConfigPanel; } public NewStagerAdvancedConfigPanel getAdvancedConfigPanel() { if (advancedConfigPanel == null) { advancedConfigPanel = new NewStagerAdvancedConfigPanel(this); } return advancedConfigPanel; } public NewStagerThresholdConfigPanel getThresholdConfigPanel() { if (thresholdConfigPanel == null) { thresholdConfigPanel = new NewStagerThresholdConfigPanel(this); } return thresholdConfigPanel; } public JTabbedPane getTabbedPane() { if (tabbedPane == null) { tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT); tabbedPane.addTab(_("Basic config"), getBasicConfigPanel()); tabbedPane.addTab(_("Advanced config"), getAdvancedConfigPanel()); tabbedPane.addTab(_("Threshold config"), getThresholdConfigPanel()); tabbedPane.setEnabledAt(ADVANCED_PARAMETERS_TAB, false); tabbedPane.setEnabledAt(THRESHOLD_TAB, false); this.currentPane = tabbedPane.getModel().getSelectedIndex(); this.advancedParametersEnabled = false; tabbedPane.getModel().addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { updateCurrentPreset(); currentPane = tabbedPane.getModel().getSelectedIndex(); } }); } return tabbedPane; } @Override public void fillDialogFromModel(Object model) throws SignalMLException { NewStagerApplicationData data = (NewStagerApplicationData) model; ExportedSignalDocument signalDocument = data.getSignalDocument(); String path = "?"; if (signalDocument instanceof FileBackedDocument) { path = ((FileBackedDocument) signalDocument).getBackingFile() .getAbsolutePath(); } signalPanel.getSignalTextField().setText(path); // XXX FIXME if (path == null || path.compareTo("?") == 0) { Dialogs.showExceptionDialog(this, new SignalMLException( _("No active signal. Choose a signal tab first."))); return; } else { // XXX FIXME bad place to setting this up here // TODO! // data.getParameters().setSignalPath(path); } Preset preset = getPresetManager().getDefaultPreset(); if (preset != null) { setPreset(preset); } else { fillDialogFromParameters(new NewStagerParametersPreset( data.getParameters(), false, true, true, true)); } currentMontage = new Montage(data.getMontage()); } private void fillDialogFromParameters( NewStagerParametersPreset parametersPreset) { this.advancedParametersEnabled = parametersPreset.enableAdvancedParameters; getBasicConfigPanel().fillPanelFromParameters(parametersPreset); getAdvancedConfigPanel().fillPanelFromParameters(parametersPreset); getThresholdConfigPanel().fillPanelFromParameters(parametersPreset); } @Override public void fillModelFromDialog(Object model) throws SignalMLException { NewStagerApplicationData data = (NewStagerApplicationData) model; data.setMontage(currentMontage); fillParametersFromDialog(new NewStagerParametersPreset( data.getParameters(), false, true, true, true)); data.calculate(); } private void fillParametersFromDialog( NewStagerParametersPreset parametersPreset) { NewStagerBasicConfigPanel basicPanel = getBasicConfigPanel(); NewStagerAdvancedConfigPanel advancedPanel = getAdvancedConfigPanel(); if (this.advancedParametersEnabled) { /* if (this.currentParametersPreset != null) { this.fillDialogFromParameters(this.getParametersPreset()); }*/ switch (this.getTabbedPane().getSelectedIndex()) { case BASIC_PARAMETERS_TAB: advancedPanel.fillParametersFromPanel(parametersPreset); basicPanel.fillParametersFromPanel(parametersPreset); default: basicPanel.fillParametersFromPanel(parametersPreset); advancedPanel.fillParametersFromPanel(parametersPreset); } } else { basicPanel.fillParametersFromPanel(parametersPreset); } getThresholdConfigPanel().fillParametersFromPanel(parametersPreset); } @Override public Preset getPreset() { this.updateCurrentPreset(); NewStagerParametersPreset parametersPreset = new NewStagerParametersPreset(); fillParametersFromDialog(parametersPreset); return parametersPreset; } @Override public void setPreset(Preset preset) { NewStagerParametersPreset parametersPreset; try { parametersPreset = (NewStagerParametersPreset) preset; } catch (ClassCastException e) { return; } this.isUpdatingPreset = true; try { fillDialogFromParameters(parametersPreset); this.currentParametersPreset = parametersPreset; } finally { this.isUpdatingPreset = false; } } @Override public void validateDialog(Object model, ValidationErrors errors) { // errors.pushNestedPath("parameters"); //TODO getBasicConfigPanel().validatePanel(errors); getAdvancedConfigPanel().validatePanel(errors); getThresholdConfigPanel().validatePanel(errors); // errors.popNestedPath(); } @Override protected void onDialogClose() { Preset preset = getPreset(); getPresetManager().setDefaultPreset(preset); } @Override public boolean supportsModelClass(Class<?> clazz) { return NewStagerApplicationData.class.isAssignableFrom(clazz); } protected class EditMontageAction extends AbstractAction { private static final long serialVersionUID = 1L; public EditMontageAction() { super(_("Edit montage")); this.setEnabled(false); 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( NewStagerMethodDialog.this, true); } SourceMontageDescriptor descriptor = new SourceMontageDescriptor( currentMontage); boolean ok = montageDialog.showDialog(descriptor, true); if (!ok) { return; } currentMontage = descriptor.getMontage(); } } protected class RestoreDefaultsAction extends AbstractAction { private static final long serialVersionUID = 1L; public RestoreDefaultsAction() { super(_("Restore defaults")); putValue( AbstractAction.SMALL_ICON, IconUtils .loadClassPathIcon("org/signalml/app/icon/restoredefaults.png")); putValue(AbstractAction.SHORT_DESCRIPTION, _("Restore default method configuration")); } @Override public void actionPerformed(ActionEvent ev) { NewStagerParametersPreset parametersPreset = new NewStagerParametersPreset(); NewStagerConfigurationDefaultsHelper.GetSharedInstance() .setDefaults(parametersPreset.parameters); parametersPreset.enableAdvancedParameters = false; parametersPreset.isAutoAlphaAmplitude = false; parametersPreset.isAutoDeltaAmplitude = false; parametersPreset.isAutoSpindleAmplitude = false; setPreset(parametersPreset); } } protected void updateCurrentPreset() { if (isUpdatingPreset) { return; } this.isUpdatingPreset = true; try { NewStagerParametersPreset parametersPreset = this.getParametersPreset(); switch (this.currentPane) { case BASIC_PARAMETERS_TAB: getBasicConfigPanel().fillParametersFromPanel(parametersPreset); break; case ADVANCED_PARAMETERS_TAB: getAdvancedConfigPanel().fillParametersFromPanel(parametersPreset); break; case THRESHOLD_TAB: getThresholdConfigPanel().fillParametersFromPanel(parametersPreset); break; default: return; } switch (this.tabbedPane.getModel().getSelectedIndex()) { case BASIC_PARAMETERS_TAB: getBasicConfigPanel().fillPanelFromParameters(parametersPreset); break; case ADVANCED_PARAMETERS_TAB: getAdvancedConfigPanel().fillPanelFromParameters(parametersPreset); break; case THRESHOLD_TAB: getThresholdConfigPanel().fillPanelFromParameters(parametersPreset); break; default: return; } } finally { this.isUpdatingPreset = false; } } private NewStagerParametersPreset getParametersPreset() { if (this.currentParametersPreset != null) { return this.currentParametersPreset; } NewStagerParametersPreset parametersPreset = null; Preset preset = getPresetManager().getDefaultPreset(); try { parametersPreset = (NewStagerParametersPreset) preset; } catch (ClassCastException e) { //do nothing } if (parametersPreset == null) { parametersPreset = new NewStagerParametersPreset(); } return parametersPreset; } private static Collection<Class<? extends Preset>> GetPresetClasses() { Collection<Class<? extends Preset>> l = new ArrayList<Class<? extends Preset>>(); l.add(NewStagerParametersPreset.class); return l; } }