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