All pastes #282923 Raw Edit

Anonymous

public text v1 · immutable
#282923 ·published 2006-12-17 23:31 UTC
rendered paste body
/*
 * SyntaxView.java
 *
 * Created on December 17, 2006, 1:03 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package xmllexerapplication;

import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.Lexer;
import org.antlr.runtime.Token;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;

import java.util.HashMap;
import java.util.Map;

import javax.swing.text.Element;
import javax.swing.text.PlainView;
import javax.swing.text.Segment;
import javax.swing.text.StyleContext;
import javax.swing.text.Utilities;


/**
 *
 * @author Yves Zoundi
 */
public class SyntaxView extends PlainView {
    private Segment line;
    private Segment seg = new Segment();
    private final Lexer lexer;
    private Color defaultColor = Color.BLACK;
    private Map styleMap = new HashMap();

    //    private SwingDocumentStream is;
    public SyntaxView(Element elem) {
        super(elem);
        lexer = new JavaLexer();
        line = new Segment();

        this.styleMap = new ColorProvider().getStyles();
    }

    protected void drawLine(int lineIndex, Graphics g, int x, int y) {
        Graphics2D g2d = (Graphics2D) g;

        try {
            Element lineElement = getElement()
                                      .getElement(lineIndex);
            int start = lineElement.getStartOffset();
            int end = lineElement.getEndOffset();
            getDocument().getText(start, end - (start + 1), line);
            lexer.setCharStream(new ANTLRStringStream(line.toString()));

            int last = start;
            int realStart;
            int thisStart;
            boolean gotMatch = false;

            Token token = null;

            while ((token = lexer.nextToken()) != Token.EOF_TOKEN) {
                int val = token.getType();

                gotMatch = true;
                realStart = token.getCharPositionInLine() + start;

                /* color any text after last and before realStart with default color */
                if (last < realStart) {
                    g2d.setColor(defaultColor);
                    g2d.setFont(g2d.getFont().deriveFont(Font.PLAIN));
                    getDocument().getText(last, Math.abs(realStart - last), seg);
                    x = Utilities.drawTabbedText(seg, x, y, g2d, this, 0);
                }

                setFont(g2d, val);

                /* get segement of text for lexer match */
                getDocument().getText(realStart, token.getText().length(), seg);

                thisStart = x;

                x = Utilities.drawTabbedText(seg, x, y, g2d, this, 0);

                last = realStart + token.getText().length();
            }

            g2d.setColor(defaultColor);
            g2d.setFont(g2d.getFont().deriveFont(Font.PLAIN));

            if ((last < end) && gotMatch) {
                // draw text from end of last match to end of segment
                getDocument().getText(last, end - last, seg);
                x = Utilities.drawTabbedText(seg, x, y, g2d, this, 0);
            } else if (!gotMatch) {
                //no match - draw whole segment
                Utilities.drawTabbedText(line, x, y, g2d, this, 0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void setFont(Graphics2D g2d, int val) {
        g2d.setFont(g2d.getFont().deriveFont(Font.PLAIN));

        if (styleMap.containsKey(new Integer(val))) {
            StyleInfo style = (StyleInfo) styleMap.get(new Integer(val));
            g2d.setColor(style.color);

            if (style.bold && style.italic) {
                g2d.setFont(g2d.getFont().deriveFont(Font.BOLD | Font.ITALIC));
            } else if (style.bold) {
                g2d.setFont(g2d.getFont().deriveFont(Font.BOLD));
            } else if (style.italic) {
                g2d.setFont(g2d.getFont().deriveFont(Font.ITALIC));
            }
        } else {
            //            System.err.println("KEY NOT IN MAP " + val);
            g2d.setColor(defaultColor);
        }
    }
}