package com.revolsys.swing.field;
import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JTextArea;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.swing.listener.WeakFocusListener;
import com.revolsys.swing.menu.MenuFactory;
import com.revolsys.util.Exceptions;
public class TextArea extends JTextArea implements Field, FocusListener {
private static final long serialVersionUID = 1L;
private final FieldSupport fieldSupport;
public TextArea() {
this("fieldValue");
}
public TextArea(final int rows, final int columns) {
this("text", rows, columns);
}
public TextArea(final String fieldName) {
this(fieldName, "");
}
public TextArea(final String fieldName, final int rows, final int columns) {
this(fieldName, "", rows, columns);
}
public TextArea(final String fieldName, final Object fieldValue) {
this(fieldName, fieldValue, 0, 0);
}
public TextArea(final String fieldName, final Object fieldValue, final int rows,
final int columns) {
final String text = DataTypes.toString(fieldValue);
this.fieldSupport = new FieldSupport(this, fieldName, text, true);
setRows(rows);
setColumns(columns);
setDocument(new PropertyChangeDocument(this));
setText(text);
addFocusListener(new WeakFocusListener(this));
MenuFactory.getPopupMenuFactory(this);
setRows(rows);
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) {
final String text = getText();
setFieldValue(text);
}
@Override
public Color getFieldSelectedTextColor() {
return getSelectedTextColor();
}
@Override
public FieldSupport getFieldSupport() {
return this.fieldSupport;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getFieldValue() {
return (T)getText();
}
@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 boolean setFieldValue(final Object value) {
final String newValue = DataTypes.toString(value);
if (!DataType.equal(getText(), newValue)) {
setText(newValue);
}
return this.fieldSupport.setValue(newValue);
}
@Override
public void setToolTipText(final String text) {
if (this.fieldSupport == null || this.fieldSupport.setOriginalTooltipText(text)) {
super.setToolTipText(text);
}
}
@Override
public String toString() {
return getFieldName() + "=" + getFieldValue();
}
@Override
public void updateFieldValue() {
setFieldValue(getText());
}
}