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); } }