gtkparser.java

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

JAVA
1,844
字号
        }                File parent = file.getParentFile();        if (parent == null) {            parent = new File(CWD);        }                dirStack.add(parent);        try {            BufferedReader reader = new BufferedReader(new FileReader(file));            parseReader(reader, name);        } finally {            dirStack.remove(dirStack.size() - 1);        }        // PENDING(shannonh) - This is where we should look up and parse        //                     the locale-specific version of the file.    }    private void parseReader(Reader reader, String name) throws IOException {        int len = freeScanners.size();                if (len == 0) {            scanner = createScanner();        } else {            scanner = (GTKScanner)freeScanners.remove(len - 1);        }                scanner.scanReader(reader, name);                try {            parseCurrent();        } finally {            scanner.clearScanner();            freeScanners.add(scanner);        }    }        private static GTKScanner createScanner() {        GTKScanner scanner = new GTKScanner();        // configure scanner for GTK rc files        scanner.caseSensitive = true;        scanner.scanBinary = true;        scanner.scanHexDollar = true;        scanner.symbol2Token = true;                for (int i = 0; i < symbols.length; i++) {            scanner.addSymbol(symbols[i].name, symbols[i].val);        }                return scanner;    }        public void loadStylesInto(GTKStyleFactory factory) {        Assignment[] assigns = new Assignment[assignments.size()];        assigns = (Assignment[])assignments.toArray(assigns);                for (int i = 0; i < assigns.length; i++) {            Assignment assign = assigns[i];            GTKStyle style = assign.info.toGTKStyle();                        if (style != StyleInfo.EMPTY_STYLE) {                try {                    factory.addStyle(style, assign.pattern, assign.type);                } catch (PatternSyntaxException pse) {                    // should not happen                }            }        }    }    public HashMap getGTKSettings() {        return settings;    }    public void clearParser() {        namedStyles.clear();        settings.clear();        assignments.clear();        dirStack.clear();        pixmapPaths = null;    }//------------------------- Parsing Methods ------------------------------//    private void parseCurrent() throws IOException {        while (true) {            if (scanner.peekNextToken() == GTKScanner.TOKEN_EOF) {                break;            }            int expected = parseStatement();            if (expected != GTKScanner.TOKEN_NONE) {                String symbolName = null;                String msg = null;                if (scanner.currScope == 0) {                    Symbol lookup;                    lookup = getSymbol(expected);                    if (lookup != null) {                        msg = "e.g. `" + lookup.name + "'";                    }                    lookup = getSymbol(scanner.currToken);                    if (lookup != null) {                        symbolName = lookup.name;                    }                }                scanner.unexpectedToken(expected, symbolName, msg, true);                break;            }        }    }        private int parseStatement() throws IOException {        int token;                token = scanner.peekNextToken();        if (token == SYMBOL_INCLUDE.val) {            return parseInclude();        } else if (token == SYMBOL_STYLE.val) {            return parseStyle();        } else if (token == SYMBOL_BINDING.val) {            return parseBinding();        } else if (token == SYMBOL_PIXMAP_PATH.val) {            return parsePixmapPath();        } else if (token == SYMBOL_WIDGET.val                       || token == SYMBOL_WIDGET_CLASS.val                       || token == SYMBOL_CLASS.val) {            return parseAssignment(token);        } else if (token == SYMBOL_MODULE_PATH.val) {            return parseModulePath();        } else if (token == SYMBOL_IM_MODULE_FILE.val) {            return parseIMModuleFile();        } else if (token == GTKScanner.TOKEN_IDENTIFIER) {            return parseIdentifier();        }        scanner.getToken();        return SYMBOL_STYLE.val;    }        private int parseInclude() throws IOException {        int token;                token = scanner.getToken();        if (token != SYMBOL_INCLUDE.val) {            return SYMBOL_INCLUDE.val;        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_STRING) {            return GTKScanner.TOKEN_STRING;        }                File parseFile = null;                String name = scanner.currValue.stringVal;        File file = new File(name);        if (file.isAbsolute()) {            parseFile = file;        } else {            File[] dirs = new File[dirStack.size()];            dirs = (File[])dirStack.toArray(dirs);                        for (int i = dirs.length - 1; i >= 0; i--) {                file = new File(dirs[i], name);                if (file.exists()) {                    parseFile = file;                    break;                }            }        }                if (parseFile == null) {            scanner.printMessage("Unable to find include file: \"" + name + "\"", false);        } else {            // save the current scanner and recurse            GTKScanner savedScanner = scanner;            try {                parseFile(file, name);            } catch (IOException ioe) {                savedScanner.printMessage("(" + ioe.toString()                                              + ") while parsing include file: \""                                              + name                                              + "\"", false);            }            // restore the scanner            scanner = savedScanner;        }                return GTKScanner.TOKEN_NONE;    }        private int parseStyle() throws IOException {        int token;                token = scanner.getToken();        if (token != SYMBOL_STYLE.val) {            return SYMBOL_STYLE.val;        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_STRING) {            return GTKScanner.TOKEN_STRING;        }                StyleInfo info = (StyleInfo)namedStyles.get(scanner.currValue.stringVal);                if (info == null) {            info = new StyleInfo(scanner.currValue.stringVal);        }                token = scanner.peekNextToken();        if (token == GTKScanner.TOKEN_EQUAL_SIGN) {            token = scanner.getToken();            token = scanner.getToken();                        if (token != GTKScanner.TOKEN_STRING) {                return GTKScanner.TOKEN_STRING;            }                        StyleInfo parent = (StyleInfo)namedStyles.get(scanner.currValue.stringVal);            if (parent != null) {                info.copyDataFrom(parent);            }        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_LEFT_CURLY) {            return GTKScanner.TOKEN_LEFT_CURLY;        }        token = scanner.peekNextToken();        while (token != GTKScanner.TOKEN_RIGHT_CURLY) {            if (token == SYMBOL_FG.val                    || token == SYMBOL_BG.val                    || token == SYMBOL_TEXT.val                    || token == SYMBOL_BASE.val) {                token = parseColorSetting(token, info);            } else if (token == SYMBOL_XTHICKNESS.val                           || token == SYMBOL_YTHICKNESS.val) {                token = parseThickness(token, info);            } else if (token == SYMBOL_BG_PIXMAP.val) {                token = parseBGPixmap(info);            } else if (token == SYMBOL_FONT.val                           || token == SYMBOL_FONTSET.val                           || token == SYMBOL_FONT_NAME.val) {                token = parseFont(token, info);            } else if (token == SYMBOL_ENGINE.val) {                token = parseEngine(info);            } else if (token == SYMBOL_STOCK.val) {                token = parseStock(info);            } else if (token == GTKScanner.TOKEN_IDENTIFIER) {                token = parseIdentifierInStyle(info);            } else {                scanner.getToken();                token = GTKScanner.TOKEN_RIGHT_CURLY;            }                        if (token != GTKScanner.TOKEN_NONE) {                return token;            }                        token = scanner.peekNextToken();        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_RIGHT_CURLY) {            return GTKScanner.TOKEN_RIGHT_CURLY;        }                namedStyles.put(info.name, info);                return GTKScanner.TOKEN_NONE;    }        private int parseBinding() throws IOException {        int token;                token = scanner.getToken();        if (token != SYMBOL_BINDING.val) {            return SYMBOL_BINDING.val;        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_STRING) {            return GTKScanner.TOKEN_STRING;        }                token = ignoreBlock();        if (token != GTKScanner.TOKEN_NONE) {            return token;        }                scanner.printMessage("Binding specification is unsupported, ignoring", false);                return GTKScanner.TOKEN_NONE;    }        private int parsePixmapPath() throws IOException {        int token;                token = scanner.getToken();        if (token != SYMBOL_PIXMAP_PATH.val) {            return SYMBOL_PIXMAP_PATH.val;        }                token = scanner.getToken();        if (token != GTKScanner.TOKEN_STRING) {            return GTKScanner.TOKEN_STRING;        }                pixmapPaths = null;                ArrayList tempPaths = new ArrayList();                StringTokenizer tok = new StringTokenizer(scanner.currValue.stringVal, File.pathSeparator);        while (tok.hasMoreTokens()) {            String path = tok.nextToken();            File file = new File(path);            if (file.isAbsolute()) {                tempPaths.add(file);            } else {                scanner.printMessage("Pixmap path element: \"" + path + "\" must be absolute", false);            }        }                if (tempPaths.size() > 0) {            pixmapPaths = new File[tempPaths.size()];            pixmapPaths = (File[])tempPaths.toArray(pixmapPaths);        }                return GTKScanner.TOKEN_NONE;    }        private int parseAssignment(int expVal) throws IOException {        int token;                token = scanner.getToken();        if (token != expVal) {            return expVal;        }                int type;        String pattern;        StyleInfo info;                boolean isBinding;                if (token == SYMBOL_WIDGET.val) {            type = GTKStyleFactory.WIDGET;        } else if (token == SYMBOL_WIDGET_CLASS.val) {            type = GTKStyleFactory.WIDGET_CLASS;        } else if (token == SYMBOL_CLASS.val) {            type = GTKStyleFactory.CLASS;        } else {            return SYMBOL_WIDGET_CLASS.val;        }

⌨️ 快捷键说明

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