/* NewStagerBasicParametersPanel.java created 2008-02-14 * */ package org.signalml.plugin.newstager.ui; import static org.signalml.plugin.i18n.PluginI18n._; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.util.Observable; import java.util.Observer; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.util.SwingUtils; import org.signalml.app.view.common.components.CompactButton; import org.signalml.app.view.common.dialogs.AbstractDialog; import org.signalml.plugin.newstager.data.NewStagerConstants; import org.signalml.plugin.newstager.data.NewStagerFASPThreshold; import org.signalml.plugin.newstager.data.NewStagerParameterThresholds; import org.signalml.plugin.newstager.data.NewStagerParameters; import org.signalml.plugin.newstager.data.NewStagerParametersPreset; import org.signalml.plugin.newstager.data.NewStagerRules; import org.signalml.plugin.newstager.helper.NewStagerAutoParametersHelper; import org.signalml.plugin.newstager.ui.components.NewStagerAutoSpinnerPanel; /** * NewStagerBasicParametersPanel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe * Sp. z o.o. */ public class NewStagerBasicParametersPanel extends JPanel { private static final long serialVersionUID = 1L; private AbstractDialog owner; private JComboBox rulesComboBox; private NewStagerAutoSpinnerPanel deltaMinAmplitudePanel; private NewStagerAutoSpinnerPanel alphaMinAmplitudePanel; private NewStagerAutoSpinnerPanel spindleMinAmplitudePanel; private JCheckBox primaryHypnogramCheckBox; public NewStagerBasicParametersPanel(AbstractDialog owner, NewStagerAdvancedConfigObservable advancedConfigObservable) { super(); this.owner = owner; initialize(); final NewStagerAdvancedConfigObservable observable = advancedConfigObservable; advancedConfigObservable.addObserver(new Observer() { @Override public void update(Observable o, Object arg) { boolean flag = !observable.getEnabled(); getDeltaMinAmplitudePanel().setEnabled(flag); getAlphaMinAmplitudePanel().setEnabled(flag); getSpindleMinAmplitudePanel().setEnabled(flag); } }); } private void initialize() { setLayout(new BorderLayout()); CompoundBorder border = new CompoundBorder(new TitledBorder( _("Key parameters")), new EmptyBorder(3, 3, 3, 3)); setBorder(border); GroupLayout layout = new GroupLayout(this); this.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); JLabel rulesLabel = new JLabel(_("Scoring criteria")); JLabel deltaMinAmplitudeLabel = new JLabel( _("Amplitude threshold for delta waves [uV]")); JLabel alphaMinAmplitudeLabel = new JLabel( _("Amplitude threshold for alpha waves [uV]")); JLabel spindleMinAmplitudeLabel = new JLabel( _("Amplitude threshold for sleep spindles [uV]")); JLabel primaryHypnogramLabel = new JLabel( _("Show primary hypnogram and markers of waveforms in result")); primaryHypnogramLabel.setMinimumSize(new Dimension(25, 35)); primaryHypnogramLabel.setVerticalAlignment(JLabel.CENTER); Component glue1 = Box.createHorizontalGlue(); Component glue2 = Box.createHorizontalGlue(); Component glue3 = Box.createHorizontalGlue(); Component glue4 = Box.createHorizontalGlue(); Component glue5 = Box.createHorizontalGlue(); CompactButton rulesHelpButton = SwingUtils.createFieldHelpButton(owner, NewStagerMethodDialog.HELP_RULES); CompactButton deltaMinAmplitudeHelpButton = SwingUtils .createFieldHelpButton(owner, NewStagerMethodDialog.HELP_DELTA_MIN_AMPLITUDE); CompactButton alphaMinAmplitudeHelpButton = SwingUtils .createFieldHelpButton(owner, NewStagerMethodDialog.HELP_ALPHA_MIN_AMPLITUDE); CompactButton spindleMinAmplitudeHelpButton = SwingUtils .createFieldHelpButton(owner, NewStagerMethodDialog.HELP_SPINDLE_MIN_AMPLITUDE); CompactButton primaryHypnogramHelpButton = SwingUtils .createFieldHelpButton(owner, NewStagerMethodDialog.HELP_PRIMARY_HYPNOGRAM); GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); hGroup.addGroup(layout.createParallelGroup().addComponent(rulesLabel) .addComponent(deltaMinAmplitudeLabel) .addComponent(alphaMinAmplitudeLabel) .addComponent(spindleMinAmplitudeLabel) .addComponent(primaryHypnogramLabel)); hGroup.addGroup(layout.createParallelGroup().addComponent(glue1) .addComponent(glue2).addComponent(glue3).addComponent(glue4) .addComponent(glue5)); hGroup.addGroup(layout.createParallelGroup(Alignment.TRAILING) .addComponent(getRulesComboBox()) .addComponent(getDeltaMinAmplitudePanel()) .addComponent(getAlphaMinAmplitudePanel()) .addComponent(getSpindleMinAmplitudePanel()) .addComponent(getPrimaryHypnogramCheckBox())); hGroup.addGroup(layout.createParallelGroup() .addComponent(rulesHelpButton) .addComponent(deltaMinAmplitudeHelpButton) .addComponent(alphaMinAmplitudeHelpButton) .addComponent(spindleMinAmplitudeHelpButton) .addComponent(primaryHypnogramHelpButton)); layout.setHorizontalGroup(hGroup); GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); vGroup.addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(rulesLabel).addComponent(glue1) .addComponent(getRulesComboBox()).addComponent(rulesHelpButton)); vGroup.addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(deltaMinAmplitudeLabel).addComponent(glue2) .addComponent(getDeltaMinAmplitudePanel()) .addComponent(deltaMinAmplitudeHelpButton)); vGroup.addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(alphaMinAmplitudeLabel).addComponent(glue3) .addComponent(getAlphaMinAmplitudePanel()) .addComponent(alphaMinAmplitudeHelpButton)); vGroup.addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(spindleMinAmplitudeLabel).addComponent(glue4) .addComponent(getSpindleMinAmplitudePanel()) .addComponent(spindleMinAmplitudeHelpButton)); vGroup.addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(primaryHypnogramLabel).addComponent(glue5) .addComponent(getPrimaryHypnogramCheckBox()) .addComponent(primaryHypnogramHelpButton)); layout.setVerticalGroup(vGroup); } public JComboBox getRulesComboBox() { if (rulesComboBox == null) { rulesComboBox = new JComboBox(); rulesComboBox.setRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { try { NewStagerRules rulesValue = (NewStagerRules) value; switch (rulesValue) { case RK: value = _("Rechtshaffen and Kales (R&K 1967) rules"); break; case AASM: value = _("AASM (2007) rules"); break; default: ; } } catch (ClassCastException e) { // do nothing } return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } }); rulesComboBox.setModel(new DefaultComboBoxModel(NewStagerRules .values())); } return rulesComboBox; } public NewStagerAutoSpinnerPanel getDeltaMinAmplitudePanel() { if (deltaMinAmplitudePanel == null) { deltaMinAmplitudePanel = new NewStagerAutoSpinnerPanel( NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MAX_AMPLITUDE, NewStagerConstants.INCR_AMPLITUDE, false); } return deltaMinAmplitudePanel; } public NewStagerAutoSpinnerPanel getAlphaMinAmplitudePanel() { if (alphaMinAmplitudePanel == null) { alphaMinAmplitudePanel = new NewStagerAutoSpinnerPanel( NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MAX_AMPLITUDE, NewStagerConstants.INCR_AMPLITUDE, false); } return alphaMinAmplitudePanel; } public NewStagerAutoSpinnerPanel getSpindleMinAmplitudePanel() { if (spindleMinAmplitudePanel == null) { spindleMinAmplitudePanel = new NewStagerAutoSpinnerPanel( NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MIN_AMPLITUDE, NewStagerConstants.MAX_AMPLITUDE, NewStagerConstants.INCR_AMPLITUDE, false); } return spindleMinAmplitudePanel; } public JCheckBox getPrimaryHypnogramCheckBox() { if (primaryHypnogramCheckBox == null) { primaryHypnogramCheckBox = new JCheckBox(); primaryHypnogramCheckBox.setPreferredSize(new Dimension(25, 25)); } return primaryHypnogramCheckBox; } public void fillPanelFromParameters( NewStagerParametersPreset parametersPreset) { NewStagerParameters parameters = parametersPreset.parameters; getRulesComboBox().setSelectedItem(parameters.rules); NewStagerParameterThresholds thresholds = parameters.thresholds; this.setPanelAmplitude( getDeltaMinAmplitudePanel(), thresholds.deltaThreshold, parametersPreset.isAutoDeltaAmplitude ? NewStagerAutoParametersHelper .GetAutoDeltaAmplitude() : null); this.setPanelAmplitude( getAlphaMinAmplitudePanel(), thresholds.alphaThreshold, parametersPreset.isAutoAlphaAmplitude ? NewStagerAutoParametersHelper .GetAutoAlphaAmplitude() : null); this.setPanelAmplitude( getSpindleMinAmplitudePanel(), thresholds.spindleThreshold, parametersPreset.isAutoSpindleAmplitude ? NewStagerAutoParametersHelper .GetAutoSpindleAmplitude() : null); getPrimaryHypnogramCheckBox().setSelected( parameters.primaryHypnogramFlag); } public void fillParametersFromPanel( NewStagerParametersPreset parametersPreset) { NewStagerParameters parameters = parametersPreset.parameters; parameters.rules = (NewStagerRules) getRulesComboBox() .getSelectedItem(); NewStagerParameterThresholds thresholds = parameters.thresholds; parametersPreset.isAutoDeltaAmplitude = this.setAmplitude( getDeltaMinAmplitudePanel(), thresholds.deltaThreshold); parametersPreset.isAutoAlphaAmplitude = this.setAmplitude( getAlphaMinAmplitudePanel(), thresholds.alphaThreshold); parametersPreset.isAutoSpindleAmplitude = this.setAmplitude( getSpindleMinAmplitudePanel(), thresholds.spindleThreshold); if (parametersPreset.isAutoDeltaAmplitude) { thresholds.deltaThreshold.amplitude .setMinWithUnlimited(NewStagerAutoParametersHelper .GetAutoDeltaAmplitude()); } if (parametersPreset.isAutoAlphaAmplitude) { thresholds.alphaThreshold.amplitude .setMinWithUnlimited(NewStagerAutoParametersHelper .GetAutoAlphaAmplitude()); } if (parametersPreset.isAutoSpindleAmplitude) { thresholds.spindleThreshold.amplitude .setMinWithUnlimited(NewStagerAutoParametersHelper .GetAutoSpindleAmplitude()); } parameters.primaryHypnogramFlag = getPrimaryHypnogramCheckBox() .isSelected(); } public void validatePanel(ValidationErrors errors) { // nothing to do } private boolean setAmplitude(NewStagerAutoSpinnerPanel amplitudePanel, NewStagerFASPThreshold threshold) { threshold.amplitude.setMinWithUnlimited(amplitudePanel .getValueWithAuto()); return amplitudePanel.isUnlimited(); } private void setPanelAmplitude(NewStagerAutoSpinnerPanel amplitudePanel, NewStagerFASPThreshold threshold, Double autoValue) { if (autoValue == null) { amplitudePanel.setValueWithAuto(threshold.amplitude .getMinWithUnlimited()); } else { amplitudePanel.setValueWithAuto(autoValue); amplitudePanel.setAuto(true); } } }