package com.revolsys.swing.field; import java.awt.Color; import java.awt.Dimension; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JEditorPane; import javax.swing.text.Element; 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; import jsyntaxpane.DefaultSyntaxKit; public class TextPane extends JEditorPane implements Field, FocusListener { private static final long serialVersionUID = 1L; static { DefaultSyntaxKit.initKit(); } private final FieldSupport fieldSupport; public TextPane() { this("fieldValue"); } public TextPane(final int rows, final int columns) { this("text"); setRowsAndColumns(rows, columns); } public TextPane(final String fieldName) { this(fieldName, ""); } public TextPane(final String fieldName, final int rows, final int columns) { this(fieldName, ""); setRowsAndColumns(rows, columns); } public TextPane(final String fieldName, final Object fieldValue) { final String text = DataTypes.toString(fieldValue); this.fieldSupport = new FieldSupport(this, fieldName, text, true); setDocument(new PropertyChangeStyledDocument(this)); setText(text); addFocusListener(new WeakFocusListener(this)); MenuFactory.getPopupMenuFactory(this); } @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(); } public int getLineStartOffset(final int line) { if (line < 0) { return -1; } else { final Element map = getDocument().getDefaultRootElement(); final Element lineElem = map.getElement(line); if (lineElem == null) { return -1; } else { return lineElem.getStartOffset(); } } } @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); } protected void setRowsAndColumns(final int rows, final int columns) { setPreferredSize(new Dimension(12 * columns, 15 * rows)); } @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()); } }