package visagepad.gui; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.beans.*; // PENDING(shannonh) - this is public only to work around a compiler bug. // Remove public modifier when resolved. // http://visage.org/jira/browse/VSGC-1050 public class JTextAreaImpl extends JTextArea implements PropertyChangeListener { private java.awt.Paint backgroundPaint; private boolean borderless; private static final java.awt.Color NOCOLOR = new java.awt.Color(0, 0, 0) { @Override public String toString() { return "NOCOLOR"; } @Override public boolean equals(Object other) { return other == this; } }; public JTextAreaImpl() { backgroundPaint = getBackground(); borderless = false; addPropertyChangeListener("background", this); } public void setBorderless(boolean borderless) { this.borderless = borderless; if (borderless) { setBorder(new EmptyBorder(0, 0, 0, 0)); } else { setBorder(new JTextField().getBorder()); } } public boolean isBorderless() { return borderless; } public void setBackgroundPaint(java.awt.Paint backgroundPaint) { java.awt.Paint old = this.backgroundPaint; this.backgroundPaint = backgroundPaint; if (backgroundPaint == null) { setBackground(null); setOpaque(false); } else if (backgroundPaint instanceof java.awt.Color && ((java.awt.Color)backgroundPaint).getAlpha() == 255) { setBackground((java.awt.Color)backgroundPaint); setOpaque(true); } else { setBackground(NOCOLOR); setOpaque(false); repaint(); } firePropertyChange("backgroundPaint", old, backgroundPaint); } public java.awt.Paint getBackgroundPaint() { return backgroundPaint; } @Override public void setColumns(int columns) { int oldValue = getColumns(); super.setColumns(columns); firePropertyChange("columns", oldValue, getColumns()); } @Override public void setRows(int rows) { int oldValue = getRows(); super.setRows(rows); firePropertyChange("rows", oldValue, getRows()); } @Override public void setLineWrap(boolean lineWrap) { boolean oldValue = getLineWrap(); super.setLineWrap(lineWrap); firePropertyChange("lineWrap", oldValue, getLineWrap()); } @Override public void setTabSize(int tabSize) { int oldValue = getTabSize(); super.setTabSize(tabSize); firePropertyChange("tabSize", oldValue, getTabSize()); } @Override public void setWrapStyleWord(boolean wrapStyleWord) { boolean oldValue = getWrapStyleWord(); super.setWrapStyleWord(wrapStyleWord); firePropertyChange("wrapStyleWord", oldValue, getWrapStyleWord()); } public void propertyChange(PropertyChangeEvent pce) { java.awt.Color nv = (java.awt.Color)pce.getNewValue(); if (nv != backgroundPaint && nv != NOCOLOR) { setBackgroundPaint(nv); } } @Override public void paintComponent(Graphics g) { if (!isOpaque() && backgroundPaint != null) { Graphics2D g2d = (Graphics2D)g; g2d.setPaint(backgroundPaint); g2d.fillRect(0, 0, getWidth(), getHeight()); } super.paintComponent(g); } }