📄 miscutilities.java
字号:
boolean backslash = false; boolean insideGroup = false; boolean insideNegativeLookahead = false; for(int i = 0; i < glob.length(); i++) { char c = glob.charAt(i); if(backslash) { buf.append('\\'); buf.append(c); backslash = false; continue; } switch(c) { case '\\': backslash = true; break; case '?': buf.append('.'); break; case '.': buf.append("\\."); break; case '*': buf.append(".*"); break; case '{': buf.append('('); if(i + 1 != glob.length() && glob.charAt(i + 1) == '!') { buf.append('?'); insideNegativeLookahead = true; } else insideGroup = true; break; case ',': if(insideGroup) { if(insideNegativeLookahead) { buf.append(").*"); insideNegativeLookahead = false; } buf.append('|'); } else buf.append(','); break; case '}': if(insideNegativeLookahead) { buf.append(").*"); insideNegativeLookahead = false; } else if(insideGroup) { buf.append(')'); insideGroup = false; } else buf.append('}'); break; default: buf.append(c); } } return buf.toString(); } //}}} //{{{ escapesToChars() method /** * Converts "\n" and "\t" escapes in the specified string to * newlines and tabs. * @param str The string * @since jEdit 2.3pre1 */ public static String escapesToChars(String str) { StringBuffer buf = new StringBuffer(); for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); switch(c) { case '\\': if(i == str.length() - 1) { buf.append('\\'); break; } c = str.charAt(++i); switch(c) { case 'n': buf.append('\n'); break; case 't': buf.append('\t'); break; default: buf.append(c); break; } break; default: buf.append(c); } } return buf.toString(); } //}}} //{{{ charsToEscapes() method /** * Escapes newlines, tabs, backslashes, and quotes in the specified * string. * @param str The string * @since jEdit 2.3pre1 */ public static String charsToEscapes(String str) { return charsToEscapes(str,"\n\t\\\"'"); } //}}} //{{{ charsToEscapes() method /** * Escapes the specified characters in the specified string. * @param str The string * @param extra Any characters that require escaping * @since jEdit 4.1pre3 */ public static String charsToEscapes(String str, String toEscape) { StringBuffer buf = new StringBuffer(); for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); if(toEscape.indexOf(c) != -1) { if(c == '\n') buf.append("\\n"); else if(c == '\t') buf.append("\\t"); else { buf.append('\\'); buf.append(c); } } else buf.append(c); } return buf.toString(); } //}}} //{{{ compareVersions() method /** * @deprecated Call <code>compareStrings()</code> instead */ public static int compareVersions(String v1, String v2) { return compareStrings(v1,v2,false); } //}}} //{{{ compareStrings() method /** * Compares two strings.<p> * * Unlike <function>String.compareTo()</function>, * this method correctly recognizes and handles embedded numbers. * For example, it places "My file 2" before "My file 10".<p> * * @param str1 The first string * @param str2 The second string * @param ignoreCase If true, case will be ignored * @return negative If str1 < str2, 0 if both are the same, * positive if str1 > str2 * @since jEdit 4.0pre1 */ public static int compareStrings(String str1, String str2, boolean ignoreCase) { char[] char1 = str1.toCharArray(); char[] char2 = str2.toCharArray(); int len = Math.min(char1.length,char2.length); for(int i = 0, j = 0; i < len && j < len; i++, j++) { char ch1 = char1[i]; char ch2 = char2[j]; if(Character.isDigit(ch1) && Character.isDigit(ch2) && ch1 != '0' && ch2 != '0') { int _i = i + 1; int _j = j + 1; for(; _i < char1.length; _i++) { if(!Character.isDigit(char1[_i])) { //_i--; break; } } for(; _j < char2.length; _j++) { if(!Character.isDigit(char2[_j])) { //_j--; break; } } int len1 = _i - i; int len2 = _j - j; if(len1 > len2) return 1; else if(len1 < len2) return -1; else { for(int k = 0; k < len1; k++) { ch1 = char1[i + k]; ch2 = char2[j + k]; if(ch1 != ch2) return ch1 - ch2; } } i = _i - 1; j = _j - 1; } else { if(ignoreCase) { ch1 = Character.toLowerCase(ch1); ch2 = Character.toLowerCase(ch2); } if(ch1 != ch2) return ch1 - ch2; } } return char1.length - char2.length; } //}}} //{{{ stringsEqual() method /** * Returns if two strings are equal. This correctly handles null pointers, * as opposed to calling <code>s1.equals(s2)</code>. * @since jEdit 4.1pre5 */ public static boolean stringsEqual(String s1, String s2) { if(s1 == null) { if(s2 == null) return true; else return false; } else if(s2 == null) return false; else return s1.equals(s2); } //}}} //}}} //{{{ Sorting methods //{{{ quicksort() method /** * Sorts the specified array. Equivalent to calling * <code>Arrays.sort()</code>. * @param obj The array * @param compare Compares the objects * @since jEdit 4.0pre4 */ public static void quicksort(Object[] obj, Comparator compare) { Arrays.sort(obj,compare); } //}}} //{{{ quicksort() method /** * Sorts the specified vector. * @param vector The vector * @param compare Compares the objects * @since jEdit 4.0pre4 */ public static void quicksort(Vector vector, Comparator compare) { Collections.sort(vector,compare); } //}}} //{{{ quicksort() method /** * Sorts the specified list. * @param list The list * @param compare Compares the objects * @since jEdit 4.0pre4 */ public static void quicksort(List list, Comparator compare) { Collections.sort(list,compare); } //}}} //{{{ quicksort() method /** * Sorts the specified array. Equivalent to calling * <code>Arrays.sort()</code>. * @param obj The array * @param compare Compares the objects */ public static void quicksort(Object[] obj, Compare compare) { Arrays.sort(obj,compare); } //}}} //{{{ quicksort() method /** * Sorts the specified vector. * @param vector The vector * @param compare Compares the objects */ public static void quicksort(Vector vector, Compare compare) { Collections.sort(vector,compare); } //}}} //{{{ Compare interface /** * An interface for comparing objects. This is a hold-over from * they days when jEdit had its own sorting API due to JDK 1.1 * compatibility requirements. Use <code>java.util.Comparable</code> * instead. */ public interface Compare extends Comparator { int compare(Object obj1, Object obj2); } //}}} //{{{ StringCompare class /** * Compares strings. */ public static class StringCompare implements Compare { public int compare(Object obj1, Object obj2) { return compareStrings(obj1.toString(), obj2.toString(),false); } } //}}} //{{{ StringICaseCompare class /** * Compares strings ignoring case. */ public static class StringICaseCompare implements Compare { public int compare(Object obj1, Object obj2) { return compareStrings(obj1.toString(), obj2.toString(),true); } } //}}} //{{{ MenuItemCompare class /** * Compares menu item labels. */ public static class MenuItemCompare implements Compare { public int compare(Object obj1, Object obj2) { return compareStrings(((JMenuItem)obj1).getText(), ((JMenuItem)obj2).getText(),true); } } //}}} //}}} //{{{ buildToVersion() method /** * Converts an internal version number (build) into a * `human-readable' form. * @param build The build */ public static String buildToVersion(String build) { if(build.length() != 11) return "<unknown version: " + build + ">"; // First 2 chars are the major version number int major = Integer.parseInt(build.substring(0,2)); // Second 2 are the minor number int minor = Integer.parseInt(build.substring(3,5)); // Then the pre-release status int beta = Integer.parseInt(build.substring(6,8)); // Finally the bug fix release int bugfix = Integer.parseInt(build.substring(9,11)); return "" + major + "." + minor + (beta != 99 ? "pre" + beta : (bugfix != 0 ? "." + bugfix : "final")); } //}}} //{{{ isToolsJarAvailable() method /** * If on JDK 1.2 or higher, make sure that tools.jar is available. * This method should be called by plugins requiring the classes * in this library. * <p> * tools.jar is searched for in the following places: * <ol> * <li>the classpath that was used when jEdit was started, * <li>jEdit's jars folder in the user's home, * <li>jEdit's system jars folder, * <li><i>java.home</i>/lib/. In this case, tools.jar is added to * jEdit's list of known jars using jEdit.addPluginJAR(), * so that it gets loaded through JARClassLoader. * </ol><p> * * On older JDK's this method does not perform any checks, and returns * <code>true</code> (even though there is no tools.jar). * * @return <code>false</code> if and only if on JDK 1.2 and tools.jar * could not be found. In this case it prints some warnings on Log, * too, about the places where it was searched for. * @since jEdit 3.2.2 */ public static boolean isToolsJarAvailable() { Log.log(Log.DEBUG, MiscUtilities.class,"Searching for tools.jar..."); Vector paths = new Vector(); //{{{ 1. Check whether tools.jar is in the system classpath: paths.addElement("System classpath: " + System.getProperty("java.class.path")); try { // Either class sun.tools.javac.Main or // com.sun.tools.javac.Main must be there: try { Class.forName("sun.tools.javac.Main"); } catch(ClassNotFoundException e1) { Class.forName("com.sun.tools.javac.Main"); } Log.log(Log.DEBUG, MiscUtilities.class, "- is in classpath. Fine."); return true; } catch(ClassNotFoundException e) { //Log.log(Log.DEBUG, MiscUtilities.class, // "- is not in system classpath."); } //}}} //{{{ 2. Check whether it is in the jEdit user settings jars folder: String settingsDir = jEdit.getSettingsDirectory(); if(settingsDir != null) { String toolsPath = constructPath(settingsDir, "jars", "tools.jar"); paths.addElement(toolsPath); if(new File(toolsPath).exists()) { Log.log(Log.DEBUG, MiscUtilities.class, "- is in the user's jars folder. Fine."); // jEdit will load it automatically return true; } } //}}} //{{{ 3. Check whether it is in jEdit's system jars folder: String jEditDir = jEdit.getJEditHome(); if(jEditDir != null) { String toolsPath = constructPath(jEditDir, "jars", "tools.jar"); paths.addElement(toolsPath); if(new File(toolsPath).exists()) { Log.log(Log.DEBUG, MiscUtilities.class, "- is in jEdit's system jars folder. Fine."); // jEdit will load it automatically return true; } } //}}} //{{{ 4. Check whether it is in <java.home>/lib: String toolsPath = System.getProperty("java.home"); if(toolsPath.toLowerCase().endsWith(File.separator + "jre")) toolsPath = toolsPath.substring(0, toolsPath.length() - 4); toolsPath = constructPath(toolsPath, "lib", "tools.jar"); paths.addElement(toolsPath); if(!(new File(toolsPath).exists())) { Log.log(Log.WARNING, MiscUtilities.class, "Could not find tools.jar.\n" + "I checked the following locations:\n" + paths.toString()); return false; } //}}} //{{{ Load it, if not yet done: EditPlugin.JAR jar = jEdit.getPluginJAR(toolsPath); if(jar == null) { Log.log(Log.DEBUG, MiscUtilities.class, "- adding " + toolsPath + " to jEdit plugins."); try { jEdit.addPluginJAR(new EditPlugin.JAR(toolsPath, new JARClassLoader(toolsPath))); } catch(IOException ioex) { Log.log(Log.ERROR, MiscUtilities.class, "- I/O error loading " + toolsPath); Log.log(Log.ERROR, MiscUtilities.class, ioex); return false; } } else Log.log(Log.DEBUG, MiscUtilities.class, "- has been loaded before."); //}}} return true; } //}}} //{{{ parsePermissions() method /** * Parse a Unix-style permission string (rwxrwxrwx). * @param str The string (must be 9 characters long). * @since jEdit 4.1pre8 */ public static int parsePermissions(String s) { int permissions = 0; if(s.length() == 9) { if(s.charAt(0) == 'r') permissions += 0400; if(s.charAt(1) == 'w') permissions += 0200; if(s.charAt(2) == 'x') permissions += 0100; else if(s.charAt(2) == 's') permissions += 04100; else if(s.charAt(2) == 'S') permissions += 04000; if(s.charAt(3) == 'r') permissions += 040; if(s.charAt(4) == 'w') permissions += 020; if(s.charAt(5) == 'x') permissions += 010; else if(s.charAt(5) == 's') permissions += 02010; else if(s.charAt(5) == 'S') permissions += 02000; if(s.charAt(6) == 'r') permissions += 04; if(s.charAt(7) == 'w') permissions += 02; if(s.charAt(8) == 'x') permissions += 01; else if(s.charAt(8) == 't') permissions += 01001; else if(s.charAt(8) == 'T') permissions += 01000; } return permissions; } //}}} //{{{ Private members private MiscUtilities() {} //{{{ resolveSymlinks() method private static String resolveSymlinks(String path) { try { return new File(path).getCanonicalPath(); } catch(IOException io) { return path; } } //}}} //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -