package com.revolsys.swing.field; import java.awt.Color; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JTextField; import com.revolsys.awt.WebColors; import com.revolsys.datatype.DataType; import com.revolsys.datatype.DataTypes; import com.revolsys.swing.EventQueue; import com.revolsys.swing.SwingUtil; import com.revolsys.swing.listener.WeakFocusListener; import com.revolsys.swing.menu.MenuFactory; import com.revolsys.swing.undo.UndoManager; import com.revolsys.util.Exceptions; import com.revolsys.util.Property; public class TextField extends JTextField implements Field, FocusListener { private static final long serialVersionUID = 1L; public static final Color DEFAULT_SELECTED_TEXT_COLOR = new JTextField().getSelectedTextColor(); private final FieldSupport fieldSupport; public TextField(final int columns) { this("text"); setColumns(columns); } public TextField(final String fieldName) { this(fieldName, ""); } public TextField(final String fieldName, final int columns) { this(fieldName); setColumns(columns); } public TextField(String fieldName, final Object fieldValue) { final String text = DataTypes.toString(fieldValue); this.fieldSupport = new FieldSupport(this, fieldName, text, true); setFont(SwingUtil.FONT); setDocument(new PropertyChangeDocument(this)); if (!Property.hasValue(fieldName)) { fieldName = "fieldValue"; } setText(text); addFocusListener(new WeakFocusListener(this)); MenuFactory.getPopupMenuFactory(this); EventQueue.addAction(this, this::updateFieldValue); } public TextField(final String fieldName, final Object fieldValue, final int columns) { this(fieldName, fieldValue); setColumns(columns); } @Override public Field clone() { try { return (Field)super.clone(); } catch (final CloneNotSupportedException e) { return Exceptions.throwUncheckedException(e); } } @Override public void firePropertyChange(final String propertyName, final Object oldValue, final Object newValue) { super.firePropertyChange(propertyName, oldValue, newValue); } @Override public void focusGained(final FocusEvent e) { } @Override public void focusLost(final FocusEvent e) { updateFieldValue(); } protected String getDisplayText(final Object value) { return DataTypes.toString(value); } @Override public String getFieldName() { return this.fieldSupport.getName(); } @Override public Color getFieldSelectedTextColor() { return getSelectedTextColor(); } @Override public FieldSupport getFieldSupport() { return this.fieldSupport; } @Override public String getFieldValidationMessage() { return this.fieldSupport.getErrorMessage(); } @SuppressWarnings("unchecked") @Override public <T> T getFieldValue() { final String text = getText(); return (T)text; } protected <T> T getFieldValueInternal() { return this.fieldSupport.getValue(); } @Override public boolean isFieldValid() { return this.fieldSupport.isFieldValid(); } @Override public void setEditable(final boolean editable) { final boolean oldEditable = isEditable(); if (editable != oldEditable) { super.setEditable(editable); setForeground(getForeground()); } } @Override public void setFieldInvalid(final String message, final Color foregroundColor, final Color backgroundColor) { this.fieldSupport.setFieldInvalid(message, foregroundColor, backgroundColor); } @Override public void setFieldSelectedTextColor(Color color) { if (color == null) { color = Field.DEFAULT_SELECTED_FOREGROUND; } setSelectedTextColor(color); } @Override public void setFieldToolTip(final String toolTip) { setToolTipText(toolTip); } @Override public void setFieldValid() { this.fieldSupport.setFieldValid(); } @Override public boolean setFieldValue(final Object value) { final String newText = getDisplayText(value); final String text = getText(); this.fieldSupport.discardAllEdits(); if (!DataType.equal(text, newText)) { if (newText == null) { if (Property.hasValue(text)) { setText(""); } } else { setText(newText); } this.fieldSupport.discardAllEdits(); } return this.fieldSupport.setValue(value); } @Override public void setForeground(Color color) { if (!isEditable()) { color = WebColors.newAlpha(color, 191); } super.setForeground(color); } @Override public void setToolTipText(final String text) { if (this.fieldSupport.setOriginalTooltipText(text)) { super.setToolTipText(text); } } @Override public void setUndoManager(final UndoManager undoManager) { this.fieldSupport.setUndoManager(undoManager); } @Override public String toString() { return getFieldName() + "=" + getFieldValue(); } @Override public void updateFieldValue() { final String text = getText(); setFieldValue(text); } }