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 + -
显示快捷键?