⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miscutilities.java

📁 用java 编写的源码开放的文本编辑器。有很多有用的特性
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * MiscUtilities.java - Various miscallaneous utility functions * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 1999, 2000, 2001 Slava Pestov * Portions copyright (C) 2000 Richard S. Hall * Portions copyright (C) 2001 Dirk Moebius * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */package org.gjt.sp.jedit;//{{{ Importsimport javax.swing.text.Segment;import javax.swing.JMenuItem;import java.io.*;import java.util.*;import org.gjt.sp.jedit.io.*;import org.gjt.sp.util.Log;//}}}/** * Path name manipulation, string manipulation, and more.<p> * * The most frequently used members of this class are:<p> * * <b>Some path name methods:</b><p> * <ul> * <li>{@link #getFileName(String)}</li> * <li>{@link #getParentOfPath(String)}</li> * <li>{@link #constructPath(String,String)}</li> * </ul> * <b>String comparison:</b><p>  * A {@link #compareStrings(String,String,boolean)} method that unlike * <function>String.compareTo()</function>, correctly recognizes and handles * embedded numbers.<p> * * This class also defines several inner classes for use with the * sorting features of the Java collections API: * * <ul> * <li>{@link MiscUtilities.StringCompare}</li> * <li>{@link MiscUtilities.StringICaseCompare}</li> * <li>{@link MiscUtilities.MenuItemCompare}</li> * </ul> * * For example, you might call:<p> * * <code>Arrays.sort(myListOfStrings, *     new MiscUtilities.StringICaseCompare());</code> * * @author Slava Pestov * @author John Gellene (API documentation) * @version $Id: MiscUtilities.java,v 1.35 2003/02/20 01:55:12 spestov Exp $ */public class MiscUtilities{	//{{{ Path name methods	//{{{ canonPath() method	/**	 * Returns the canonical form of the specified path name. Currently	 * only expands a leading <code>~</code>. <b>For local path names	 * only.</b>	 * @param path The path name	 * @since jEdit 4.0pre2	 */	public static String canonPath(String path)	{		if(File.separatorChar == '\\')		{			// get rid of mixed paths on Windows			path = path.replace('/','\\');		}		if(path.startsWith("~" + File.separator))		{			path = path.substring(2);			String home = System.getProperty("user.home");			if(home.endsWith(File.separator))				return home + path;			else				return home + File.separator + path;		}		else if(path.equals("~"))			return System.getProperty("user.home");		else			return path;	} //}}}	//{{{ isPathAbsolute() method	/**	 * Returns if the specified path name is an absolute path or URL.	 * @since jEdit 4.1pre11	 */	public static boolean isAbsolutePath(String path)	{		if(isURL(path))			return true;		else if(OperatingSystem.isDOSDerived())		{			if(path.length() >= 2 && path.charAt(1) == ':')				return true;			if(path.startsWith("\\\\"))				return true;		}		else if(OperatingSystem.isUnix())		{			// nice and simple			if(path.length() > 0 && path.charAt(0) == '/')				return true;		}		return false;	} //}}}	//{{{ constructPath() method	/**	 * Constructs an absolute path name from a directory and another	 * path name. This method is VFS-aware.	 * @param parent The directory	 * @param path The path name	 */	public static String constructPath(String parent, String path)	{		if(MiscUtilities.isURL(path))			return path;		else if(path.startsWith("~"))			return path;		else		{			// have to handle these cases specially on windows.			if(OperatingSystem.isDOSDerived())			{				if(path.length() == 2 && path.charAt(1) == ':')					return path;				else if(path.length() > 2 && path.charAt(1) == ':')				{					if(path.charAt(2) != '\\')					{						path = path.substring(0,2) + '\\'							+ path.substring(2);					}					return resolveSymlinks(path);				}				else if(path.startsWith("\\\\"))					return resolveSymlinks(path);			}			else if(OperatingSystem.isUnix())			{				// nice and simple				if(path.length() > 0 && path.charAt(0) == '/')					return resolveSymlinks(path);			}		}		if(parent == null)			parent = System.getProperty("user.dir");		if(OperatingSystem.isDOSDerived() && path.startsWith("\\"))			parent = parent.substring(0,2);		VFS vfs = VFSManager.getVFSForPath(parent);		return vfs.constructPath(parent,path);	} //}}}	//{{{ constructPath() method	/**	 * Constructs an absolute path name from three path components.	 * This method is VFS-aware.	 * @param parent The parent directory	 * @param path1 The first path	 * @param path2 The second path	 */	public static String constructPath(String parent,		String path1, String path2)	{		return constructPath(constructPath(parent,path1),path2);	} //}}}	//{{{ concatPath() method	/**	 * Like {@link #constructPath}, except <code>path</code> will be	 * appended to <code>parent</code> even if it is absolute.	 * @param path	 * @param parent	 */	public static String concatPath(String parent, String path)	{		parent = canonPath(parent);		path = canonPath(path);		// Make all child paths relative.		if (path.startsWith(File.separator))			path = path.substring(1);		else if ((path.length() >= 3) && (path.charAt(1) == ':'))			path = path.replace(':', File.separatorChar);		if (parent == null)			parent = System.getProperty("user.dir");		if (parent.endsWith(File.separator))			return parent + path;		else			return parent + File.separator + path;	} //}}}	//{{{ getFileExtension() method	/**	 * Returns the extension of the specified filename, or an empty	 * string if there is none.	 * @param name The file name	 */	public static String getFileExtension(String name)	{		int index = name.indexOf('.');		if(index == -1)			return "";		else			return name.substring(index);	} //}}}	//{{{ getFileName() method	/**	 * Returns the last component of the specified path.	 * This method is VFS-aware.	 * @param path The path name	 */	public static String getFileName(String path)	{		return VFSManager.getVFSForPath(path).getFileName(path);	} //}}}	//{{{ getFileNameNoExtension() method	/**	 * Returns the last component of the specified path name without the	 * trailing extension (if there is one).	 * @param path The path name	 * @since jEdit 4.0pre8	 */	public static String getFileNameNoExtension(String path)	{		String name = getFileName(path);		int index = name.lastIndexOf('.');		if(index == -1)			return name;		else			return name.substring(0,index);	} //}}}	//{{{ getFileParent() method	/**	 * @deprecated Call getParentOfPath() instead	 */	public static String getFileParent(String path)	{		return getParentOfPath(path);	} //}}}	//{{{ getParentOfPath() method	/**	 * Returns the parent of the specified path. This method is VFS-aware.	 * @param path The path name	 * @since jEdit 2.6pre5	 */	public static String getParentOfPath(String path)	{		return VFSManager.getVFSForPath(path).getParentOfPath(path);	} //}}}	//{{{ getFileProtocol() method	/**	 * @deprecated Call getProtocolOfURL() instead	 */	public static String getFileProtocol(String url)	{		return getProtocolOfURL(url);	} //}}}	//{{{ getProtocolOfURL() method	/**	 * Returns the protocol specified by a URL.	 * @param url The URL	 * @since jEdit 2.6pre5	 */	public static String getProtocolOfURL(String url)	{		return url.substring(0,url.indexOf(':'));	} //}}}	//{{{ isURL() method	/**	 * Checks if the specified string is a URL.	 * @param str The string to check	 * @return True if the string is a URL, false otherwise	 */	public static boolean isURL(String str)	{		int fsIndex = Math.max(str.indexOf(File.separatorChar),			str.indexOf('/'));		if(fsIndex == 0) // /etc/passwd			return false;		else if(fsIndex == 2) // C:\AUTOEXEC.BAT			return false;		int cIndex = str.indexOf(':');		if(cIndex <= 1) // D:\WINDOWS			return false;		else if(fsIndex != -1 && cIndex > fsIndex) // /tmp/RTF::read.pm			return false;		return true;	} //}}}	//{{{ saveBackup() method	/**	 * Saves a backup (optionally numbered) of a file.	 * @param file A local file	 * @param backups The number of backups. Must be >= 1. If > 1, backup	 * files will be numbered.	 * @param backupPrefix The backup file name prefix	 * @param backupSuffix The backup file name suffix	 * @param backupDirectory The directory where to save backups; if null,	 * they will be saved in the same directory as the file itself.	 * @since jEdit 4.0pre1	 */	public static void saveBackup(File file, int backups,		String backupPrefix, String backupSuffix,		String backupDirectory)	{		if(backupPrefix == null)			backupPrefix = "";		if(backupSuffix == null)			backupSuffix = "";		String name = file.getName();		// If backups is 1, create ~ file		if(backups == 1)		{			File backupFile = new File(backupDirectory,				backupPrefix + name + backupSuffix);			backupFile.delete();			file.renameTo(backupFile);		}		// If backups > 1, move old ~n~ files, create ~1~ file		else		{			new File(backupDirectory,				backupPrefix + name + backupSuffix				+ backups + backupSuffix).delete();			for(int i = backups - 1; i > 0; i--)			{				File backup = new File(backupDirectory,					backupPrefix + name + backupSuffix					+ i + backupSuffix);				backup.renameTo(new File(backupDirectory,					backupPrefix + name + backupSuffix					+ (i+1) + backupSuffix));			}			file.renameTo(new File(backupDirectory,				backupPrefix + name + backupSuffix				+ "1" + backupSuffix));		}	} //}}}	//{{{ fileToClass() method	/**	 * Converts a file name to a class name. All slash characters are	 * replaced with periods and the trailing '.class' is removed.	 * @param name The file name	 */	public static String fileToClass(String name)	{		char[] clsName = name.toCharArray();		for(int i = clsName.length - 6; i >= 0; i--)			if(clsName[i] == '/')				clsName[i] = '.';		return new String(clsName,0,clsName.length - 6);	} //}}}	//{{{ classToFile() method	/**	 * Converts a class name to a file name. All periods are replaced	 * with slashes and the '.class' extension is added.	 * @param name The class name	 */	public static String classToFile(String name)	{		return name.replace('.','/').concat(".class");	} //}}}	//}}}	//{{{ Text methods	//{{{ getLeadingWhiteSpace() method	/**	 * Returns the number of leading white space characters in the	 * specified string.	 * @param str The string	 */	public static int getLeadingWhiteSpace(String str)	{		int whitespace = 0;loop:		for(;whitespace < str.length();)		{			switch(str.charAt(whitespace))			{			case ' ': case '\t':				whitespace++;				break;			default:				break loop;			}		}		return whitespace;	} //}}}	//{{{ getTrailingWhiteSpace() method	/**	 * Returns the number of trailing whitespace characters in the	 * specified string.	 * @param str The string	 * @since jEdit 2.5pre5	 */	public static int getTrailingWhiteSpace(String str)	{		int whitespace = 0;loop:		for(int i = str.length() - 1; i >= 0; i--)		{			switch(str.charAt(i))			{			case ' ': case '\t':				whitespace++;				break;			default:				break loop;			}		}		return whitespace;	} //}}}	//{{{ getLeadingWhiteSpaceWidth() method	/**	 * Returns the width of the leading white space in the specified	 * string.	 * @param str The string	 * @param tabSize The tab size	 */	public static int getLeadingWhiteSpaceWidth(String str, int tabSize)	{		int whitespace = 0;loop:		for(int i = 0; i < str.length(); i++)		{			switch(str.charAt(i))			{			case ' ':				whitespace++;				break;			case '\t':				whitespace += (tabSize - whitespace % tabSize);				break;			default:				break loop;			}		}		return whitespace;	} //}}}	//{{{ getVirtualWidth() method	/**	 * Returns the virtual column number (taking tabs into account) of the	 * specified offset in the segment.	 *	 * @param seg The segment	 * @param tabSize The tab size	 * @since jEdit 4.1pre1	 */	public static int getVirtualWidth(Segment seg, int tabSize)	{		int virtualPosition = 0;		for (int i = 0; i < seg.count; i++)		{			char ch = seg.array[seg.offset + i];			if (ch == '\t')			{				virtualPosition += tabSize					- (virtualPosition % tabSize);			}			else			{				++virtualPosition;			}		}		return virtualPosition;	} //}}}	//{{{ getOffsetOfVirtualColumn() method	/**	 * Returns the array offset of a virtual column number (taking tabs	 * into account) in the segment.	 *	 * @param seg The segment	 * @param tabSize The tab size	 * @param column The virtual column number	 * @param totalVirtualWidth If this array is non-null, the total	 * virtual width will be stored in its first location if this method	 * returns -1.	 *	 * @return -1 if the column is out of bounds	 *	 * @since jEdit 4.1pre1	 */	public static int getOffsetOfVirtualColumn(Segment seg, int tabSize,		int column, int[] totalVirtualWidth)	{		int virtualPosition = 0;		for (int i = 0; i < seg.count; i++)		{			char ch = seg.array[seg.offset + i];			if (ch == '\t')			{				int tabWidth = tabSize					- (virtualPosition % tabSize);				if(virtualPosition >= column)					return i;				else					virtualPosition += tabWidth;			}			else			{				if(virtualPosition >= column)					return i;				else					++virtualPosition;			}		}		if(totalVirtualWidth != null)			totalVirtualWidth[0] = virtualPosition;		return -1;	} //}}}	//{{{ createWhiteSpace() method	/**	 * Creates a string of white space with the specified length.<p>	 *	 * To get a whitespace string tuned to the current buffer's	 * settings, call this method as follows:	 *	 * <pre>myWhitespace = MiscUtilities.createWhiteSpace(myLength,	 *     (buffer.getBooleanProperty("noTabs") ? 0	 *     : buffer.getTabSize()));</pre>	 *	 * @param len The length	 * @param tabSize The tab size, or 0 if tabs are not to be used	 */	public static String createWhiteSpace(int len, int tabSize)	{		StringBuffer buf = new StringBuffer();		if(tabSize == 0)		{			while(len-- > 0)				buf.append(' ');		}		else		{			int count = len / tabSize;			while(count-- > 0)				buf.append('\t');			count = len % tabSize;			while(count-- > 0)				buf.append(' ');		}		return buf.toString();	} //}}}	//{{{ globToRE() method	/**	 * Converts a Unix-style glob to a regular expression.<p>	 *	 * ? becomes ., * becomes .*, {aa,bb} becomes (aa|bb).	 * @param glob The glob pattern	 */	public static String globToRE(String glob)	{		StringBuffer buf = new StringBuffer();

⌨️ 快捷键说明

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