gtkparser.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,844 行 · 第 1/5 页

JAVA
1,844
字号
            if (GTKStyle.getIconSize(size) == null) {                size = null;            }        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_RIGHT_CURLY) {            return GTKScanner.TOKEN_RIGHT_CURLY;        }                retVal[0] = createIconSource(pixmapStr, direction, state, size);                return GTKScanner.TOKEN_NONE;    }    private int parseIdentifierInStyle(StyleInfo info) throws IOException {        int token;                token = scanner.getToken();        if (token != GTKScanner.TOKEN_IDENTIFIER                || scanner.currValue.stringVal.charAt(0) < 'A'                || scanner.currValue.stringVal.charAt(0) > 'Z') {            return GTKScanner.TOKEN_IDENTIFIER;        }                String klass;        String prop;        Object[] value = new Object[1];                klass = scanner.currValue.stringVal.intern();                // check the next two tokens to make sure they're both ':'        if (scanner.getToken() != ':' || scanner.getToken() != ':') {            return ':';        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_IDENTIFIER) {            return GTKScanner.TOKEN_IDENTIFIER;        }                StringBuffer buf = new StringBuffer(scanner.currValue.stringVal);                String validChars = GTKScanner.CHARS_A_2_Z                                + GTKScanner.CHARS_a_2_z                                + GTKScanner.CHARS_DIGITS                                + "-";        // some weird logic that GTK does        int len = buf.length();        for (int i = 0; i < len; i++) {            if (validChars.indexOf(buf.charAt(i)) == -1) {                buf.setCharAt(i, '-');            }        }                prop = buf.toString().intern();                token = parsePropertyAssignment(value);        if (token != GTKScanner.TOKEN_NONE) {            return token;        }        PropertyParser pp = null;        if (value[0] instanceof String && (pp = PropertyParser.getParserFor(prop)) != null) {            Object parsedVal = pp.parse((String)value[0]);            if (parsedVal == null) {                scanner.printMessage("Failed to parse property value \"" + value[0] + "\" for `"                                     + klass + "::" + prop + "'", false);            } else {                info.addProperty(klass, prop, parsedVal);            }        } else {            info.addProperty(klass, prop, value[0]);        }        return GTKScanner.TOKEN_NONE;    }        private int parsePropertyAssignment(Object[] retVal) throws IOException {        int token;                token = scanner.getToken();        if (token != '=') {            return '=';        }        // save the scanner mode        boolean scanIdentifier = scanner.scanIdentifier;        boolean scanSymbols = scanner.scanSymbols;        boolean identifier2String = scanner.identifier2String;        boolean char2Token = scanner.char2Token;        boolean scanIdentifierNULL = scanner.scanIdentifierNULL;        boolean numbers2Int = scanner.numbers2Int;        // modify the scanner mode for our purposes        scanner.scanIdentifier = true;        scanner.scanSymbols = false;        scanner.identifier2String = false;        scanner.char2Token = true;        scanner.scanIdentifierNULL = false;        scanner.numbers2Int = true;        boolean negate = false;                if (scanner.peekNextToken() == '-') {            scanner.getToken();            negate = true;        }                token = scanner.peekNextToken();        switch(token) {            case GTKScanner.TOKEN_INT:                scanner.getToken();                retVal[0] = new Long(negate ? -scanner.currValue.longVal : scanner.currValue.longVal);                token = GTKScanner.TOKEN_NONE;                break;            case GTKScanner.TOKEN_FLOAT:                scanner.getToken();                retVal[0] = new Double(negate ? -scanner.currValue.doubleVal : scanner.currValue.doubleVal);                token = GTKScanner.TOKEN_NONE;                break;            case GTKScanner.TOKEN_STRING:                scanner.getToken();                if (negate) {                    token = GTKScanner.TOKEN_INT;                } else {                    retVal[0] = scanner.currValue.stringVal;                    token = GTKScanner.TOKEN_NONE;                }                break;            case GTKScanner.TOKEN_IDENTIFIER:            case GTKScanner.TOKEN_LEFT_PAREN:            case GTKScanner.TOKEN_LEFT_CURLY:            case GTKScanner.TOKEN_LEFT_BRACE:                if (negate) {                    token = GTKScanner.TOKEN_INT;                } else {                    StringBuffer result = new StringBuffer();                    token = parseComplexPropVal(result, GTKScanner.TOKEN_EOF);                    if (token == GTKScanner.TOKEN_NONE) {                        result.append(' ');                        retVal[0] = result.toString();                    }                }                break;            default:                scanner.getToken();                token = GTKScanner.TOKEN_INT;                break;        }                // restore the scanner mode        scanner.scanIdentifier = scanIdentifier;        scanner.scanSymbols = scanSymbols;        scanner.identifier2String = identifier2String;        scanner.char2Token = char2Token;        scanner.scanIdentifierNULL = scanIdentifierNULL;        scanner.numbers2Int = numbers2Int;                return token;    }        private int parseComplexPropVal(StringBuffer into, int delim) throws IOException {        int token;                token = scanner.getToken();        switch(token) {            case GTKScanner.TOKEN_INT:                into.append(" 0x");                into.append(Long.toHexString(scanner.currValue.longVal));                break;            case GTKScanner.TOKEN_FLOAT:                into.append(' ');                into.append(scanner.currValue.doubleVal);                break;            case GTKScanner.TOKEN_STRING:                into.append(" \"");                into.append(escapeString(scanner.currValue.stringVal));                into.append('"');                break;            case GTKScanner.TOKEN_IDENTIFIER:                into.append(' ');                into.append(scanner.currValue.stringVal);                break;            case GTKScanner.TOKEN_LEFT_PAREN:                into.append(' ');                into.append((char)token);                token = parseComplexPropVal(into, GTKScanner.TOKEN_RIGHT_PAREN);                if (token != GTKScanner.TOKEN_NONE) {                    return token;                }                break;            case GTKScanner.TOKEN_LEFT_CURLY:                into.append(' ');                into.append((char)token);                token = parseComplexPropVal(into, GTKScanner.TOKEN_RIGHT_CURLY);                if (token != GTKScanner.TOKEN_NONE) {                    return token;                }                break;            case GTKScanner.TOKEN_LEFT_BRACE:                into.append(' ');                into.append((char)token);                token = parseComplexPropVal(into, GTKScanner.TOKEN_RIGHT_BRACE);                if (token != GTKScanner.TOKEN_NONE) {                    return token;                }                break;            default:                if (token >= GTKScanner.TOKEN_NONE || token <= GTKScanner.TOKEN_EOF) {                    return delim != GTKScanner.TOKEN_EOF ? delim : GTKScanner.TOKEN_STRING;                }                into.append(' ');                into.append((char)token);                if (token == delim) {                    return GTKScanner.TOKEN_NONE;                }        }                if (delim == GTKScanner.TOKEN_EOF) {            return GTKScanner.TOKEN_NONE;        } else {            return parseComplexPropVal(into, delim);        }    }    private String escapeString(String source) {        int len = source.length();                StringBuffer result = new StringBuffer(len * 4);                for (int i = 0; i < len; i++) {            char ch = source.charAt(i);                        switch(ch) {                case '\b':                    result.append("\\b");                    break;                case '\f':                    result.append("\\f");                    break;                case '\n':                    result.append("\\n");                    break;                case '\r':                    result.append("\\r");                    break;                case '\t':                    result.append("\\t");                    break;                case '\\':                    result.append("\\\\");                    break;                case '"':                    result.append("\\\"");                    break;                default:                    if (ch < ' ' || ch > '~') {                        result.append('\\');                        result.append(Integer.toOctalString(ch));                    } else {                        result.append((char)ch);                    }                    break;            }        }        return result.toString();    }    private int ignoreBlock() throws IOException {        int token;        token = scanner.getToken();        if (token != GTKScanner.TOKEN_LEFT_CURLY) {            return GTKScanner.TOKEN_LEFT_CURLY;        }        int curlys = 1;        while (curlys > 0) {            token = scanner.getToken();            switch(token) {                case GTKScanner.TOKEN_EOF:                    return GTKScanner.TOKEN_RIGHT_CURLY;                case GTKScanner.TOKEN_LEFT_CURLY:                    curlys++;                    break;                case GTKScanner.TOKEN_RIGHT_CURLY:                    curlys--;                    break;                default:                    // ignore            }        }        return GTKScanner.TOKEN_NONE;    }    // for testing    public static void main(String[] args) {        if (args.length == 0) {            System.err.println("Usage: java GTKParser <gtkrc file> <gtkrc file>....");            System.exit(1);        }                GTKParser parser = new GTKParser();                try {            for (int i = 0; i < args.length; i++) {                parser.parseFile(new File(args[i]), args[i]);            }        } catch (IOException ioe) {            ioe.printStackTrace();        }                parser.printNamedStyles();        System.out.println();        parser.printSettings();        System.out.println();        parser.printAssignments();    }    // for testing    private void printNamedStyles() {        System.out.println("===== Named Styles =====");                StyleInfo[] infos = new StyleInfo[namedStyles.size()];        infos = (StyleInfo[])namedStyles.values().toArray(infos);                for (int i = 0; i < infos.length; i++) {            StyleInfo info = infos[i];                        System.out.println("NAME: " + info.name);            GTKStyle style = info.toGTKStyle();            System.out.println(style == StyleInfo.EMPTY_STYLE ? "EMPTY_STYLE" : style.toString());            System.out.println("---------------------------");        }    }    // for testing    private void printSettings() {        System.out.println("===== GTK Settings =====");        Iterator iter = settings.entrySet().iterator();        while (iter.hasNext()) {            Map.Entry entry = (Map.Entry)iter.next();            System.out.println(entry.getKey() + "=" + entry.getValue());        }    }    // for testing        private void printAssignments() {        System.out.println("===== Assignments =====");                Assignment[] assigns = new Assignment[assignments.size()];        assigns = (Assignment[])assignments.toArray(assigns);                for (int i = 0; i < assigns.length; i++) {            System.out.println(assigns[i]);        }    }}

⌨️ 快捷键说明

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