package pl.edu.fuw.fid.signalanalysis.waveform; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Window; import javax.swing.JComponent; import javax.swing.JPanel; import org.signalml.app.method.bookaverage.BookAverageMethodPanel; import org.signalml.app.method.ep.view.tags.TagSelectionPanel; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.view.common.dialogs.AbstractDialog; import org.signalml.app.view.signal.SignalView; import org.signalml.app.view.signal.signalselection.ChannelSpacePanel; import org.signalml.domain.signal.space.SignalSpaceConstraints; import org.signalml.plugin.export.SignalMLException; /** * Base class for dialogs allowing to select options * for averaged time-frequency map. * * @author ptr@mimuw.edu.pl */ public abstract class AveragedBaseDialog<P> extends AbstractDialog { private TagSelectionPanel tagPanel; private ChannelSpacePanel channelPanel; private BookAverageMethodPanel averagePanel; public AveragedBaseDialog(Window w, Boolean isModal) { super(w, isModal); } protected abstract JPanel createCustomPanel(); @Override protected JComponent createInterface() { JPanel panel = new JPanel(new GridLayout(1, 2)); tagPanel = new TagSelectionPanel("Tags"); averagePanel = new BookAverageMethodPanel(); averagePanel.setPageSelectionEnabled(false); JPanel fftPanel = createCustomPanel(); JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.add(fftPanel, BorderLayout.NORTH); leftPanel.add(tagPanel, BorderLayout.CENTER); leftPanel.add(averagePanel, BorderLayout.SOUTH); channelPanel = new ChannelSpacePanel(); panel.add(leftPanel); panel.add(channelPanel); return panel; } @Override protected void fillDialogFromModel(Object model) throws SignalMLException { AveragedBaseModel m = (AveragedBaseModel) model; SignalView signalView = (SignalView) m.signalDocument.getDocumentView(); SignalSpaceConstraints signalSpaceConstraints = signalView.createSignalSpaceConstraints(); tagPanel.setTagDocument(m.signalDocument.getActiveTag()); averagePanel.setFrequencyEnd(signalSpaceConstraints.getSamplingFrequency() / 2); channelPanel.setConstraints(signalSpaceConstraints); } @Override public void fillModelFromDialog(Object model) throws SignalMLException { AveragedBaseModel m = (AveragedBaseModel) model; m.preferences = getPreferences(); m.selectedChannels = channelPanel.getChannelList().getSelectedIndices(); m.selectedTags = tagPanel.getSelectedTagStyles(); } protected abstract P getCustomPreferences(); protected PreferencesWithAxes<P> getPreferences() { P prefs = getCustomPreferences(); int width = averagePanel.getSelectedWidth(); int height = averagePanel.getSelectedHeight(); double tMin = averagePanel.getTimeStart(); double tMax = averagePanel.getTimeEnd(); double fMin = averagePanel.getFrequencyStart(); double fMax = averagePanel.getFrequencyEnd(); return new PreferencesWithAxes<P>(prefs, width, height, tMin, tMax, fMin, fMax); } @Override public boolean supportsModelClass(Class<?> clazz) { return clazz == AveragedBaseModel.class; } @Override public void validateDialog(Object model, ValidationErrors errors) throws SignalMLException { channelPanel.validatePanel(errors); tagPanel.validatePanel(errors); if (tagPanel.getSelectedTagStyles().isEmpty()) { errors.addError("At least one tag style must be selected"); } } }