package org.signalml.app.view.preferences; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.BoxLayout; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner.NumberEditor; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import org.signalml.app.config.ApplicationConfiguration; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.view.common.components.panels.AbstractPanel; import org.signalml.app.view.common.components.spinners.FloatSpinner; import org.signalml.app.view.common.components.spinners.IntegerSpinner; /** * Allows to configurate signal recording options. * * @author Tomasz Sawicki */ public class MonitorConfigPanel extends AbstractPanel { /** * The frequency text field. */ private FloatSpinner backupFrequencySpinner; private JTextField openbciIpAddressTextField; private IntegerSpinner openbciPortSpinner; /** * Default constructor. */ public MonitorConfigPanel() { super(); initialize(); } /** * Initializes this panel. */ private void initialize() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(createSignalRecordingPanel()); add(createOpenbciAddressPanel()); } protected JPanel createSignalRecordingPanel() { JPanel signalRecordingPanel = new JPanel(); JLabel backupFrequencyLabel = new JLabel(_("Backup frequency [s]")); signalRecordingPanel.setLayout(new GridBagLayout()); setTitledBorder(signalRecordingPanel, _("Signal recording")); GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.CENTER; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.insets = new Insets(3, 3, 3, 3); constraints.weighty = 0; constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.weightx = 0; signalRecordingPanel.add(backupFrequencyLabel, constraints); constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 2; constraints.weightx = 1; signalRecordingPanel.add(getBackupFrequencySpinner(), constraints); return signalRecordingPanel; } protected JPanel createOpenbciAddressPanel() { JPanel openbciAddressPanel = new JPanel(); setTitledBorder(openbciAddressPanel, _("OpenBCI Address")); JLabel openbciIpAddressLabel = new JLabel(_("OpenBCI IP Address")); JLabel openbciPortLabel = new JLabel(_("OpenBCI port")); GroupLayout layout = new GroupLayout(openbciAddressPanel); openbciAddressPanel.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); hGroup.addGroup(layout.createParallelGroup().addComponent(openbciIpAddressLabel).addComponent(openbciPortLabel)); hGroup.addGroup(layout.createParallelGroup().addComponent(getOpenbciIpAddressTextField()).addComponent(getOpenbciPortSpinner())); layout.setHorizontalGroup(hGroup); GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(openbciIpAddressLabel).addComponent(getOpenbciIpAddressTextField())); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(openbciPortLabel).addComponent(getOpenbciPortSpinner())); layout.setVerticalGroup(vGroup); return openbciAddressPanel; } /** * Returns the frequency text field. * * @return the frequency text field */ protected FloatSpinner getBackupFrequencySpinner() { if (backupFrequencySpinner == null) { backupFrequencySpinner = new FloatSpinner(new SpinnerNumberModel(10.0, 0.1, 100000.0, 0.1)); } return backupFrequencySpinner; } protected JTextField getOpenbciIpAddressTextField() { if (openbciIpAddressTextField == null) openbciIpAddressTextField = new JTextField(); return openbciIpAddressTextField; } protected IntegerSpinner getOpenbciPortSpinner() { if (openbciPortSpinner == null) { openbciPortSpinner = new IntegerSpinner(new SpinnerNumberModel(1, 1, 99999, 1)); NumberEditor editor = (NumberEditor) openbciPortSpinner.getEditor(); editor.getFormat().setGroupingUsed(false); } return openbciPortSpinner; } /** * Fills all the fields of this panel from the given * {@link ApplicationConfiguration configuration} of Svarog. * * @param applicationConfig * the configuration of Svarog */ public void fillPanelFromModel(ApplicationConfiguration applicationConfig) { getBackupFrequencySpinner().setValue(applicationConfig.getBackupFrequency()); getOpenbciIpAddressTextField().setText(applicationConfig.getOpenbciIPAddress()); getOpenbciPortSpinner().setValue(applicationConfig.getOpenbciPort()); } /** * Writes the values of the fields from this panel to the * {@link ApplicationConfiguration configuration} of Svarog. * * @param applicationConfig * the configuration of Svarog */ public void fillModelFromPanel(ApplicationConfiguration applicationConfig) { applicationConfig.setBackupFrequency(getBackupFrequencySpinner().getValue()); applicationConfig.setOpenbciIPAddress(getOpenbciIpAddressTextField().getText()); applicationConfig.setOpenbciPort(openbciPortSpinner.getValue()); } /** * Validates this panel. * * @param errors * the object in which the errors should be stored */ public void validate(ValidationErrors errors) { String ipAddressPattern = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; Pattern pattern = Pattern.compile(ipAddressPattern); Matcher matcher = pattern.matcher(getOpenbciIpAddressTextField().getText()); if (!matcher.matches()) errors.addError(_("Bad IP address value!")); } }