package timeflow.app.ui; import timeflow.format.field.*; import javax.swing.*; import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.event.*; public class EditValuePanel extends JPanel { FieldFormat parser; boolean longField; JLabel feedback = new JLabel() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); return new Dimension(200, d.height); } }; static final String space = " "; JTextComponent input; public EditValuePanel(String name, Object startValue, Class type, boolean longField) { parser = FieldFormatCatalog.getFormat(type); if (longField) { setLayout(new BorderLayout()); JPanel top = new JPanel(); top.setLayout(new GridLayout(2, 2)); top.add(new JPanel()); top.add(new JPanel()); JLabel fieldLabel = new JLabel(space + name + " (long)"); top.add(fieldLabel); top.add(feedback); add(top, BorderLayout.NORTH); input = new JTextArea(5, 60); ((JTextArea) input).setLineWrap(true); ((JTextArea) input).setWrapStyleWord(true); JScrollPane scroller = new JScrollPane(input); scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); add(scroller, BorderLayout.CENTER); add(new JPanel(), BorderLayout.WEST); add(new JPanel(), BorderLayout.SOUTH); } else { setLayout(new GridLayout(1, 4)); JLabel fieldLabel = new JLabel(space + name); add(fieldLabel); JLabel typeLabel = new JLabel(FieldFormatCatalog.humanName(type)); add(typeLabel); typeLabel.setForeground(Color.gray); input = new JTextField(8); add(input); // enough room for "couldn't understand" add(feedback); } input.setText(startValue == null ? "" : parser.format(startValue)); input.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { parse(); } }); parse(); } void parse() { try { parser.parse(input.getText()); } catch (Exception e) { } feedback.setText(" " + parser.feedback()); feedback.setForeground(parser.isUnderstood() ? Color.gray : Color.red); } public Object getInputValue() { try { return parser.parse(input.getText()); } catch (Exception e) { return null; } } public boolean isOK() { return parser.isUnderstood(); } public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); int w = Math.max(300, d.width); return new Dimension(w, d.height); } }