ro.nextreports.designer.ui.sqleditor.syntax.SyntaxView.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.ui.sqleditor.syntax.SyntaxView.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ro.nextreports.designer.ui.sqleditor.syntax;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Shape;
import java.util.Iterator;

import javax.swing.event.DocumentEvent;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.PlainView;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;
import javax.swing.text.ViewFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Decebal Suiu
 */
public class SyntaxView extends PlainView {

    private static final Log LOG = LogFactory.getLog(SyntaxView.class.getName());

    public SyntaxView(Element element) {
        super(element);
    }

    @Override
    protected int drawUnselectedText(Graphics graphics, int x, int y, int p0, int p1) {
        Font saveFont = graphics.getFont();
        Color saveColor = graphics.getColor();
        SyntaxDocument doc = (SyntaxDocument) getDocument();
        Segment segment = getLineBuffer();
        try {
            // Colour the parts
            Iterator<Token> tokens = doc.getTokens(p0, p1);
            int start = p0;
            while (tokens.hasNext()) {
                Token t = tokens.next();
                // if there is a gap between the next token start and where we
                // should be starting (spaces not returned in tokens), then draw
                // it in the default type
                if (start < t.start) {
                    SyntaxStyles.getInstance().setGraphicsStyle(graphics, TokenType.DEFAULT);
                    doc.getText(start, t.start - start, segment);
                    x = Utilities.drawTabbedText(segment, x, y, graphics, this, start);
                }
                // t and s are the actual start and length of what we should
                // put on the screen.  assume these are the whole token....
                int l = t.length;
                int s = t.start;
                // ... unless the token starts before p0:
                if (s < p0) {
                    // token is before what is requested. adgust the length and s
                    l -= (p0 - s);
                    s = p0;
                }
                // if token end (s + l is still the token end pos) is greater 
                // than p1, then just put up to p1
                if (s + l > p1) {
                    l = p1 - s;
                }
                doc.getText(s, l, segment);
                x = SyntaxStyles.getInstance().drawText(segment, x, y, graphics, this, t);
                start = t.start + t.length;
            }
            // now for any remaining text not tokenized:
            if (start < p1) {
                SyntaxStyles.getInstance().setGraphicsStyle(graphics, TokenType.DEFAULT);
                doc.getText(start, p1 - start, segment);
                x = Utilities.drawTabbedText(segment, x, y, graphics, this, start);
            }
        } catch (BadLocationException e) {
            System.err.println("Requested: " + e.offsetRequested());
            LOG.error(e.getMessage(), e);
        } finally {
            graphics.setFont(saveFont);
            graphics.setColor(saveColor);
        }

        return x;
    }

    @Override
    protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) {
        super.updateDamage(changes, a, f);
        getContainer().repaint();
    }

}