package pl.edu.fuw.fid.signalanalysis.stft;
import java.awt.GridLayout;
import java.awt.Window;
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.signalml.app.model.components.validation.ValidationErrors;
import org.signalml.math.fft.WindowType;
import org.signalml.plugin.export.SignalMLException;
import pl.edu.fuw.fid.signalanalysis.SignalAnalysisTools;
import pl.edu.fuw.fid.signalanalysis.waveform.AveragedBaseDialog;
/**
* Dialog for selecting settings for averaged Short-Time Fourier Transform.
* Inherits some options from AveragedBaseDialog, and adds some new as well.
*
* @author ptr@mimuw.edu.pl
*/
public class AveragedStftDialog extends AveragedBaseDialog<PreferencesForSTFT> {
private JComboBox windowTypeComboBox;
private JComboBox windowLengthComboBox;
public AveragedStftDialog(Window w, Boolean isModal) {
super(w, isModal);
setTitle("Averaged Short-Time Fourier Transform");
}
@Override
protected JPanel createCustomPanel() {
WindowType[] windowTypes = WindowType.values();
Arrays.sort(windowTypes, new Comparator<WindowType>() {
@Override
public int compare(WindowType o1, WindowType o2) {
return o1.toString().compareTo(o2.toString());
}
});
windowTypeComboBox = new JComboBox(windowTypes);
windowLengthComboBox = new JComboBox(new Integer[] { 32, 64, 128, 256, 512, 1024 });
windowLengthComboBox.setEditable(true);
JPanel fftPanel = new JPanel(new GridLayout(0, 2));
fftPanel.add(new JLabel("window type:"));
fftPanel.add(windowTypeComboBox);
fftPanel.add(new JLabel("window size:"));
fftPanel.add(windowLengthComboBox);
return fftPanel;
}
@Override
protected PreferencesForSTFT getCustomPreferences() {
PreferencesForSTFT prefs = new PreferencesForSTFT();
prefs.padToHeight = true;
prefs.windowLength = SignalAnalysisTools.parsePositiveInteger(windowLengthComboBox.getSelectedItem());
prefs.windowType = (WindowType) windowTypeComboBox.getSelectedItem();
return prefs;
}
@Override
public void validateDialog(Object model, ValidationErrors errors) throws SignalMLException {
super.validateDialog(model, errors);
Integer windowLength = SignalAnalysisTools.parsePositiveInteger(windowLengthComboBox.getSelectedItem());
if (windowLength == null) {
errors.addError("Window length is invalid");
}
}
}