idlviewfactory.java

来自「UCS (Ultra Corba Simulator) is one more 」· Java 代码 · 共 437 行 · 第 1/2 页

JAVA
437
字号
/**
 * (c) 2007 UCS_2008
 *
 * Project    UCS (Ultra Corba Simulator)
 * Subproject CorbaMNQ
 * File       IdlViewFactory.java
 * Created on Sep 13, 2007 by ucs_2008
 *
 * History:
 * Date(Y.M.D) User           Reason (plus CR, LM, Fault number)
 *
 */

package com.corba.mnq.ui.text.idl;

import com.corba.mnq.ui.text.SegmentCache;
import com.corba.mnq.ui.text.SegmentExt;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainView;
import javax.swing.text.Segment;
import javax.swing.text.Utilities;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;

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

/**
 * name: "IdlViewFactory"
 * 
 * @author ucs_2008
 */
public class IdlViewFactory implements ViewFactory {

    public static final String KEYWORD = "keyword";

    public static final String OPERATOR = "operator";

    public static final String TYPE = "type";

    // public static final String CLASS = "class"; not used anymore
    // since
    // version 1.7.3

    public static final String RESERVED_WORD = "reserved_word";

    private static Map idlSpecialWordsMap;

    public IdlViewFactory() {
        super();
        getIdlSpecialWordsMap();
    }

    public static Map getIdlSpecialWordsMap() {
        idlSpecialWordsMap = new HashMap();
        // keywrods for idl file
        idlSpecialWordsMap.put("abstract", KEYWORD);
        idlSpecialWordsMap.put("exception", KEYWORD);
        idlSpecialWordsMap.put("inout", KEYWORD);
        idlSpecialWordsMap.put("provides", KEYWORD);
        idlSpecialWordsMap.put("truncatable", KEYWORD);
        idlSpecialWordsMap.put("attribute", KEYWORD);
        idlSpecialWordsMap.put("emits", KEYWORD);
        idlSpecialWordsMap.put("interface", KEYWORD);
        idlSpecialWordsMap.put("public", KEYWORD);
        idlSpecialWordsMap.put("typedef", KEYWORD);
        idlSpecialWordsMap.put("enum", KEYWORD);
        idlSpecialWordsMap.put("local", KEYWORD);
        idlSpecialWordsMap.put("publishes", KEYWORD);
        idlSpecialWordsMap.put("typeid", KEYWORD);
        idlSpecialWordsMap.put("eventtype", KEYWORD);
        idlSpecialWordsMap.put("raises", KEYWORD);
        idlSpecialWordsMap.put("typeprefix", KEYWORD);
        idlSpecialWordsMap.put("case", KEYWORD);
        idlSpecialWordsMap.put("factory", KEYWORD);
        idlSpecialWordsMap.put("module", KEYWORD);
        idlSpecialWordsMap.put("readonly", KEYWORD);
        idlSpecialWordsMap.put("FALSE", KEYWORD);
        idlSpecialWordsMap.put("multiple", KEYWORD);
        idlSpecialWordsMap.put("setraises", KEYWORD);
        idlSpecialWordsMap.put("union", KEYWORD);
        idlSpecialWordsMap.put("component", KEYWORD);
        idlSpecialWordsMap.put("finder", KEYWORD);
        idlSpecialWordsMap.put("native", KEYWORD);
        idlSpecialWordsMap.put("sequence", KEYWORD);
        idlSpecialWordsMap.put("uses", KEYWORD);
        idlSpecialWordsMap.put("const", KEYWORD);
        idlSpecialWordsMap.put("fixed", KEYWORD);
        idlSpecialWordsMap.put("Object", KEYWORD);
        idlSpecialWordsMap.put("ValueBase", KEYWORD);
        idlSpecialWordsMap.put("consumes", KEYWORD);
        idlSpecialWordsMap.put("valuetype", KEYWORD);
        idlSpecialWordsMap.put("context", KEYWORD);
        idlSpecialWordsMap.put("getraises", KEYWORD);
        idlSpecialWordsMap.put("oneway", KEYWORD);
        idlSpecialWordsMap.put("struct", KEYWORD);
        idlSpecialWordsMap.put("custom", KEYWORD);
        idlSpecialWordsMap.put("home", KEYWORD);
        idlSpecialWordsMap.put("out", KEYWORD);
        idlSpecialWordsMap.put("supports", KEYWORD);
        idlSpecialWordsMap.put("default", KEYWORD);
        idlSpecialWordsMap.put("import", KEYWORD);
        idlSpecialWordsMap.put("primarykey", KEYWORD);
        idlSpecialWordsMap.put("switch", KEYWORD);
        idlSpecialWordsMap.put("in", KEYWORD);
        idlSpecialWordsMap.put("private", KEYWORD);
        idlSpecialWordsMap.put("TRUE", KEYWORD);
        idlSpecialWordsMap.put("void", KEYWORD);

        // type words for idl
        idlSpecialWordsMap.put("any", TYPE);
        idlSpecialWordsMap.put("boolean", TYPE);
        idlSpecialWordsMap.put("long", TYPE);
        idlSpecialWordsMap.put("unsigned", TYPE);
        idlSpecialWordsMap.put("char", TYPE);
        idlSpecialWordsMap.put("short", TYPE);
        idlSpecialWordsMap.put("float", TYPE);
        idlSpecialWordsMap.put("octet", TYPE);
        idlSpecialWordsMap.put("string", TYPE);
        idlSpecialWordsMap.put("void", TYPE);
        idlSpecialWordsMap.put("wchar", TYPE);
        idlSpecialWordsMap.put("wstring", TYPE);
        idlSpecialWordsMap.put("double", TYPE);

        return idlSpecialWordsMap;
    }

    public View create(Element elem) {
        return new JavaView(elem);
    }

    class JavaView extends PlainView {

        public JavaView(Element elem) {
            super(elem);
        }

        protected int drawUnselectedText(Graphics g, int x, int y, int startOffset, int endOffset)
                throws BadLocationException {
            int length = (endOffset < getDocument().getLength() ? endOffset : getDocument()
                    .getLength())
                    - startOffset;
            return scanParagraph(g, x, y, startOffset, length);
        }

        private boolean isParagraphInComment(int startOffset) {
            if (startOffset > 0) {
                Element root = getDocument().getDefaultRootElement();
                Element previousElement = root.getElement(root.getElementIndex(startOffset - 1));
                if (previousElement.getAttributes().containsAttribute(
                        IdlDocument.MULTILINE_COMMENT, IdlDocument.MULTILINE_COMMENT))
                    return true;
            }
            return false;
        }

        private int scanParagraph(Graphics g, int x, int y, int startPosition, int length)
                throws BadLocationException {
            SegmentExt content = SegmentCache.getSharedSegment();
            // content.a
            JTextComponent host = (JTextComponent) getContainer();

            getDocument().getText(startPosition, length, content);
            boolean inComment = isParagraphInComment(startPosition);
            boolean inSingleComment = false;
            for (int wordIndex = 0; wordIndex < content.count;) {
                char indexedChar = content.array[content.offset + wordIndex];

                if (Character.isJavaIdentifierStart(indexedChar) && !inComment && !inSingleComment) {
                    String scannedIdentifier = scanIdentifier(content, wordIndex);
                    String tokenType = (String) idlSpecialWordsMap.get(scannedIdentifier);
                    int scannedIdentifierLength = scannedIdentifier.length();

                    Color color = getColorForTokenType(tokenType);

                    Segment text = getLineBuffer();
                    getDocument().getText(startPosition + wordIndex, scannedIdentifierLength, text);
                    g.setColor(color);
                    x = Utilities.drawTabbedText(text, x, y, g, this, startPosition + wordIndex);

                    wordIndex = wordIndex + scannedIdentifierLength;
                } else if (Character.isDigit(indexedChar)) {
                    String scannedNumericLiteral = scanNumericLiteral(content, wordIndex);

                    int scannedNumericLiteralLength = scannedNumericLiteral.length();

                    Color color = (Color) host
                            .getClientProperty(IdlTextEditor.NUMERIC_LITERAL_COLOR);

                    Segment text = getLineBuffer();
                    getDocument().getText(startPosition + wordIndex, scannedNumericLiteralLength,
                            text);
                    g.setColor(color);
                    x = Utilities.drawTabbedText(text, x, y, g, this, startPosition + wordIndex);

                    wordIndex = wordIndex + scannedNumericLiteralLength;
                } else if (indexedChar == '\"') {
                    int scannedStringLength = scanStringLiteral(content, wordIndex);

                    Segment text = getLineBuffer();
                    getDocument().getText(startPosition + wordIndex, scannedStringLength, text);
                    g.setColor((Color) host.getClientProperty(IdlTextEditor.STRING_LITERAL_COLOR));
                    x = Utilities.drawTabbedText(text, x, y, g, this, startPosition + wordIndex);

                    wordIndex = wordIndex + scannedStringLength;
                } else if (indexedChar == '\'') {
                    int scannedCharLength = scanCharLiteral(content, wordIndex);

                    Segment text = getLineBuffer();
                    getDocument().getText(startPosition + wordIndex, scannedCharLength, text);
                    g.setColor((Color) host.getClientProperty(IdlTextEditor.CHAR_LITERAL_COLOR));
                    x = Utilities.drawTabbedText(text, x, y, g, this, startPosition + wordIndex);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?