package ql.gui.widget.input;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.text.ParseException;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import net.miginfocom.swing.MigLayout;
import ql.Value;
import ql.gui.DefaultComponent;
import ql.gui.widget.InputWidget;
public abstract class Field<T extends Value> extends DefaultComponent implements InputWidget<T>, CaretListener {
private JPanel panel;
private JTextField textField;
private JLabel errorLabel;
private T value;
public Field(T initialValue) {
textField = new JTextField(50);
textField.setMaximumSize(new Dimension(textField.getPreferredSize().width, textField.getPreferredSize().height * 2));
textField.setFont(new Font("Serif", Font.BOLD, 20));
setValue(initialValue);
textField.addCaretListener(this);
textField.setFocusable(true);
errorLabel = new JLabel();
errorLabel.setFont(new Font("Serif", Font.BOLD, 20));
errorLabel.setVisible(true);
panel = new JPanel(new MigLayout());
panel.add(textField);
panel.add(errorLabel, "wrap");
}
protected final T value() {
return value;
}
protected final void value(T value) {
this.value = value;
}
protected void setError(String text) {
textField.setBorder(BorderFactory.createLineBorder(Color.RED));
errorLabel.setText(text);
}
/**
* Exposes the internal JPanel for adjustements
* by extending classes. It cannot be overriden
* and is marked 'final'.
*
* @return The internal panel.
*/
protected final JPanel panel() {
return panel;
}
/**
* Exposes the internal JTextField for adjustements
* by extending classes. It cannot be overriden
* and is marked 'final'.
*
* @return The internal textfield.
*/
protected final JTextField textField() {
return textField;
}
/**
* Exposes the internal JLabel for adjustements
* by extending classes. It cannot be overriden
* and is marked 'final'.
*
* The label is used to present errors by default.
*
* @return The internal label.
*/
protected final JLabel label() {
return errorLabel;
}
protected abstract T getFieldValue() throws ParseException;
protected void removeError() {
textField.setBorder(BorderFactory.createLineBorder(Color.BLACK));
errorLabel.setText("");
}
@Override
public void disable() {
textField.setEnabled(false);
}
@Override
public void updateComponent() {
textField.repaint();
}
@Override
public JComponent getComponent() {
return this.panel;
}
@Override
public T getValue() {
return value;
}
@Override
public void setValue(T value) {
this.value = value;
textField.setText(value.getPrimitive().toString());
}
@Override
public abstract void caretUpdate(CaretEvent e);
}