package me.legrange.panstamp.gui;
import java.awt.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.swing.InputVerifier;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import me.legrange.panstamp.NetworkException;
import me.legrange.panstamp.PanStamp;
import me.legrange.panstamp.Parameter;
import me.legrange.panstamp.Register;
import me.legrange.panstamp.gui.model.Model;
/**
*
* @author gideon
*/
public final class PanStampParamDialog extends javax.swing.JDialog {
/**
* Creates new form PanStampParamDialog
*/
public PanStampParamDialog(java.awt.Frame parent, Model model, PanStamp ps) {
super(parent, true);
this.ps = ps;
this.model = model;
initComponents();
setLocationRelativeTo(null);
try {
addParamComponents();
} catch (NetworkException ex) {
Logger.getLogger(PanStampParamDialog.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void addParamComponents() throws NetworkException {
for (Register reg : ps.getRegisters()) {
List<Parameter> pars = reg.getParameters();
if (!pars.isEmpty()) {
paramTabbedPane.add(reg.getName(), registerPanel(reg));
}
}
}
private JPanel registerPanel(Register reg) throws NetworkException {
JPanel panel = new JPanel();
for (Parameter par : reg.getParameters()) {
JLabel label = new JLabel(par.getName(), SwingConstants.LEFT);
panel.add(label);
Component com = null;
switch (par.getType()) {
case NUMBER:
com = makeNumberField(par);
break;
case INTEGER:
com = makeIntegerField(par);
break;
case BINARY: {
com = makeBinaryField(par);
break;
}
case STRING: {
com = makeStringField(par);
break;
}
}
panel.add(com);
paramMap.put(com, par);
}
return panel;
}
private Component makeTextField(final Parameter par) throws NetworkException {
final JTextField field = new JTextField();
if (par.getRegister().hasValue()) {
field.setText(par.getValue().toString());
} else {
field.setText(par.getDefault().toString());
}
field.setInputVerifier(new InputVerifier() {
private final Pattern pattern = Pattern.compile(par.getPattern());
@Override
public boolean verify(JComponent input) {
return (pattern.matcher(field.getText()).matches());
}
});
return field;
}
private Component makeStringField(Parameter<String> par) throws NetworkException {
return makeTextField(par);
}
private Component makeBinaryField(Parameter<Boolean> par) throws NetworkException {
JCheckBox field = new JCheckBox();
if (par.getRegister().hasValue()) {
field.setSelected(par.getValue());
} else {
field.setSelected(false);
}
return field;
}
private Component makeIntegerField(Parameter<Integer> par) throws NetworkException {
return makeTextField(par);
}
private Component makeNumberField(Parameter<Double> par) throws NetworkException {
return makeTextField(par);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
paramTabbedPane = new javax.swing.JTabbedPane();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
okButton.setText("Ok");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(paramTabbedPane)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(okButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 105, Short.MAX_VALUE)
.addComponent(cancelButton)
.addGap(17, 17, 17))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(paramTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 358, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cancelButton)
.addComponent(okButton))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
boolean updated = false;
for (Component com : paramMap.keySet()) {
Parameter par = paramMap.get(com);
updated = updated | updateFromComponent(par, com);
}
if (updated) {
try {
if (ps.getSyncState() != 1) {
JOptionPane.showMessageDialog(null,
String.format("Device %d is in sleep mode. You need to manually put the device into SYNC mode", ps.getAddress()), "Notice", JOptionPane.INFORMATION_MESSAGE);
}
} catch (NetworkException ex) {
Logger.getLogger(PanStampParamDialog.class.getName()).log(Level.SEVERE, null, ex);
}
}
}//GEN-LAST:event_okButtonActionPerformed
private boolean updateFromComponent(Parameter par, Component com) {
boolean updated = false;
try {
switch (par.getType()) {
case NUMBER:
JTextField text = (JTextField) com;
double dVal = Double.parseDouble(text.getText());
Parameter<Double> dPar = par;
if (dVal != dPar.getValue()) {
dPar.setValue(dVal);
updated = true;
}
break;
case INTEGER:
com = makeIntegerField(par);
text = (JTextField) com;
int iVal = Integer.parseInt(text.getText());
Parameter<Integer> iPar = par;
if (iVal != iPar.getValue()) {
iPar.setValue(iVal);
updated = true;
}
break;
case BINARY: {
com = makeBinaryField(par);
JCheckBox check = (JCheckBox) com;
boolean bVal = check.isSelected();
Parameter<Boolean> bPar = par;
if (bVal != bPar.getValue()) {
bPar.setValue(bVal);
updated = true;
}
break;
}
case STRING: {
com = makeStringField(par);
text = (JTextField) com;
String val = text.getText();
Parameter<String> sPar = par;
if (!val.equals(sPar.getValue())) {
sPar.setValue(val);
updated = true;
}
break;
}
}
// Variables declaration - do not modify
} catch (NetworkException ex) {
Logger.getLogger(PanStampParamDialog.class.getName()).log(Level.SEVERE, null, ex);
}
dispose();
return updated;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JButton okButton;
private javax.swing.JTabbedPane paramTabbedPane;
// End of variables declaration//GEN-END:variables
private final PanStamp ps;
private final Model model;
private final Map<Component, Parameter> paramMap = new HashMap<>();
}