package org.signalml.plugin.bookreporter.ui; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Box; 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.IconUtils; 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.bookreporter.chart.preset.BookReporterChartPreset; import org.signalml.plugin.bookreporter.data.BookReporterParameters; import org.signalml.plugin.bookreporter.ui.components.BookReporterChartRow; import org.signalml.plugin.bookreporter.ui.components.BookReporterTitleLabel; import static org.signalml.plugin.i18n.PluginI18n._; /** * @author piotr@develancer.pl * (based on Michal Dobaczewski's NewStagerAdvancedConfigPanel) */ public class BookReporterConfigPanel extends JPanel { private final AbstractDialog owner; private final List<BookReporterChartRow> chartRows; private JPanel parametersPanel; protected class AddChartAction extends AbstractAction { private final Dialog dialogParent; public AddChartAction(Dialog dialogParent) { super("Add new chart"); this.dialogParent = dialogParent; putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/add.png")); } @Override public void actionPerformed(ActionEvent e) { BookReporterNewChartDialog dialog = new BookReporterNewChartDialog( this.dialogParent, true ); dialog.setLocationRelativeTo(this.dialogParent); // showing modal dialog dialog.setVisible(true); // modal dialog closed BookReporterChartPreset preset = dialog.getChartPreset(); dialog.dispose(); if (preset != null) { addPanelForNewChartPreset(preset); } } } public BookReporterConfigPanel(AbstractDialog owner) { super(); this.owner = owner; this.chartRows = new ArrayList<BookReporterChartRow>(); initialize(); } private void initialize() { setLayout(new BorderLayout()); CompoundBorder border = new CompoundBorder(new TitledBorder( _("Parameters")), new EmptyBorder(3, 3, 3, 3)); setBorder(border); add(getParametersPanel(), BorderLayout.NORTH); add(Box.createVerticalGlue(), BorderLayout.CENTER); } private void addPanelForNewChartPreset(BookReporterChartPreset chartPreset) { final BookReporterChartRow newRow = new BookReporterChartRow(chartPreset); final JPanel parent = getParametersPanel(); final AbstractAction removeAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { chartRows.remove(newRow); newRow.removeFromPanel(parent); owner.pack(); } }; removeAction.putValue( AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/remove.png") ); newRow.setRemoveAction(removeAction); chartRows.add(newRow); newRow.addToPanel(parent); owner.pack(); } public JPanel getParametersPanel() { if (parametersPanel == null) { parametersPanel = new JPanel(new GridLayout(1, 6, 6, 10)); BookReporterTitleLabel deltaLabel = new BookReporterTitleLabel(_("Delta waves")); BookReporterTitleLabel thetaLabel = new BookReporterTitleLabel(_("Theta waves")); BookReporterTitleLabel alphaLabel = new BookReporterTitleLabel(_("Alpha waves")); BookReporterTitleLabel spindleLabel = new BookReporterTitleLabel(_("Sleep spindles")); BookReporterTitleLabel kComplexLabel = new BookReporterTitleLabel(_("K-Complex")); BookReporterTitleLabel amplitudeLabel = new BookReporterTitleLabel( "<html><body><div align=\"center\">" + _("Amplitude [µV]") + "<br />" + _("min/max") + "</div></body></html>"); BookReporterTitleLabel frequencyLabel = new BookReporterTitleLabel( "<html><body><div align=\"center\">" + _("Frequency [Hz]") + "<br />" + _("min/max") + "</div></body></html>"); BookReporterTitleLabel scaleLabel = new BookReporterTitleLabel( "<html><body><div align=\"center\">" + _("Time width [s]") + "<br />" + _("min/max") + "</div></body></html>"); BookReporterTitleLabel phaseLabel = new BookReporterTitleLabel( "<html><body><div align=\"center\">" + _("Phase [rad]") + "<br />" + _("min/max") + "</div></body></html>"); CompactButton parametersHelpButton = SwingUtils .createFieldHelpButton(owner, BookReporterMethodDialog.HELP_PARAMETERS); CompactButton addChartButton = new CompactButton( new AddChartAction(this.owner) ); parametersPanel.add(addChartButton); parametersPanel.add(parametersHelpButton); parametersPanel.add(amplitudeLabel); parametersPanel.add(frequencyLabel); parametersPanel.add(scaleLabel); parametersPanel.add(phaseLabel); } return parametersPanel; } public void fillPanelFromParameters(BookReporterParameters parameters) { for (BookReporterChartRow chartRow : chartRows) { chartRow.removeFromPanel(parametersPanel); } chartRows.clear(); owner.pack(); for (BookReporterChartPreset chartPreset : parameters.chartPresets) { addPanelForNewChartPreset(chartPreset); } } public void fillParametersFromPanel(BookReporterParameters parameters) { int presetCount = chartRows.size(); BookReporterChartPreset[] chartPresets = new BookReporterChartPreset[presetCount]; for (int i=0; i<presetCount; i++) { chartPresets[i] = chartRows.get(i).getPreset(); } parameters.chartPresets = chartPresets; } // private void normalize(BookReporterFASPThreshold threshold) { // threshold.amplitude.normalize(); // threshold.frequency.normalize(); // threshold.scale.normalize(); // } public void validatePanel(ValidationErrors errors) { // nothing to do } }