import javax.swing.text.PlainView;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Shape;
import java.awt.Rectangle;
import java.awt.FontMetrics;
import java.awt.Font;
import javax.swing.text.Position;
import javax.swing.text.Element;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
public class SyntaxView extends PlainView {
Element element;
SyntaxTextPaneUI stpui;
JTextComponent comp;
SyntaxDocument doc;
public SyntaxView(Element element) {
super(element);
element = getElement();
stpui = (SyntaxTextPaneUI)getViewFactory();
doc = (SyntaxDocument)element.getDocument();
}
public Rectangle getRectangle(int offset, int length, Shape a) throws BadLocationException {
FontMetrics fm = comp.getFontMetrics(comp.getFont());
JTextComponent.AccessibleJTextComponent access = (JTextComponent.AccessibleJTextComponent) comp.getAccessibleContext();
Rectangle rect = (Rectangle) modelToView(offset, a, Position.Bias.Forward);
int charWidth = 0;
while(offset < length) {
charWidth = charWidth + fm.charWidth(comp.getText().charAt(offset));
offset++;
}
int baseline = rect.y + rect.height - fm.getDescent();
return new Rectangle(rect.x, rect.y, charWidth, baseline);
}
public void paint(Graphics g, Shape a) {
super.paint(g, a);
try {
comp = (JTextComponent)getContainer();
ScannerResult[] scannerResults = doc.getScannerResults();
for(ScannerResult sr :scannerResults) {
SyntaxStyle style = sr.getSyntaxStyle();
Rectangle rect = getRectangle(sr.getOffset(), sr.getLength(), a);
g.setColor(Color.WHITE);
g.fillRect(rect.x, rect.y, rect.width, rect.height);
g.setColor(style.getColor());
g.setFont(style.getFont(comp.getFont()));
g.drawString(doc.getText().substring(sr.getOffset(), sr.getOffset() + sr.getLength()), rect.x, rect.height);
}
} catch(BadLocationException ex) {
}
}
}