package javax.swing.text;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
public class PlainView extends View
implements TabExpander
{
Color selectedColor;
Color unselectedColor;
Font font;
protected FontMetrics metrics;
public PlainView(Element elem)
{
super(elem);
}
protected void updateMetrics()
{
Component component = getContainer();
Font font = component.getFont();
if (this.font != font)
{
this.font = font;
metrics = component.getFontMetrics(font);
}
}
protected Rectangle lineToRect(Shape a, int line)
{
updateMetrics();
Rectangle rect = a.getBounds();
int fontHeight = metrics.getHeight();
return new Rectangle(rect.x, rect.y + (line * fontHeight),
rect.width, fontHeight);
}
public Shape modelToView(int position, Shape a, Position.Bias b)
throws BadLocationException
{
updateMetrics();
Document document = getDocument();
int lineIndex = getElement().getElementIndex(position);
Rectangle rect = lineToRect(a, lineIndex);
Element line = getElement().getElement(lineIndex);
int lineStart = line.getStartOffset();
Segment segment = new Segment();
document.getText(lineStart, position - lineStart, segment);
int xoffset = Utilities.getTabbedTextWidth(segment, metrics, rect.x,
this, lineStart);
rect.x += xoffset;
rect.width = 1;
rect.height = metrics.getHeight();
return rect;
}
protected void drawLine(int lineIndex, Graphics g, int x, int y)
{
try
{
metrics = g.getFontMetrics();
Element line = getDocument().getDefaultRootElement().getElement(lineIndex);
drawUnselectedText(g, x, y, line.getStartOffset(), line.getEndOffset());
}
catch (BadLocationException e)
{
}
}
protected int drawSelectedText(Graphics g, int x, int y, int p0, int p1)
throws BadLocationException
{
g.setColor(selectedColor);
Segment segment = new Segment();
getDocument().getText(p0, p1 - p0, segment);
return Utilities.drawTabbedText(segment, x, y, g, this, 0);
}
protected int drawUnselectedText(Graphics g, int x, int y, int p0, int p1)
throws BadLocationException
{
g.setColor(unselectedColor);
Segment segment = new Segment();
getDocument().getText(p0, p1 - p0, segment);
return Utilities.drawTabbedText(segment, x, y, g, this, 0);
}
public void paint(Graphics g, Shape s)
{
updateMetrics();
JTextComponent textComponent = (JTextComponent) getContainer();
g.setFont(textComponent.getFont());
selectedColor = textComponent.getSelectedTextColor();
unselectedColor = textComponent.getForeground();
Rectangle rect = s.getBounds();
Document document = textComponent.getDocument();
Element root = document.getDefaultRootElement();
int y = rect.y;
for (int i = 0; i < root.getElementCount(); i++)
{
drawLine(i, g, rect.x, y);
y += metrics.getHeight();
}
}
protected int getTabSize()
{
return 8;
}
public float nextTabStop(float x, int tabStop)
{
float tabSizePixels = getTabSize() + metrics.charWidth('m');
return (float) (Math.floor(x / tabSizePixels) + 1) * tabSizePixels;
}
public float getPreferredSpan(int axis)
{
if (axis != X_AXIS && axis != Y_AXIS)
throw new IllegalArgumentException();
return 10;
}
}