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

📄 bufferhistory.java

📁 用java 编写的源码开放的文本编辑器。有很多有用的特性
💻 JAVA
字号:
/* * BufferHistory.java - Remembers caret positions  * Copyright (C) 2000, 2001 Slava Pestov * * 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;import com.microstar.xml.*;import java.io.*;import java.util.*;import org.gjt.sp.jedit.textarea.*;import org.gjt.sp.util.Log;/** * Recent file list. * @author Slava Pestov * @version $Id: BufferHistory.java,v 1.7 2003/02/11 02:31:05 spestov Exp $ */public class BufferHistory{	public static Entry getEntry(String path)	{		Enumeration enum = history.elements();		while(enum.hasMoreElements())		{			Entry entry = (Entry)enum.nextElement();			if(pathsCaseInsensitive)			{				if(entry.path.equalsIgnoreCase(path))					return entry;			}			else			{				if(entry.path.equals(path))					return entry;			}		}		return null;	}	public static void setEntry(String path, int caret, Selection[] selection,		String encoding)	{		removeEntry(path);		addEntry(new Entry(path,caret,selectionToString(selection),encoding));	}	public static Vector getBufferHistory()	{		return history;	}	public static void load(File file)	{		max = jEdit.getIntegerProperty("recentFiles",50);		Log.log(Log.MESSAGE,jEdit.class,"Loading recent file list " + file);		RecentHandler handler = new RecentHandler();		XmlParser parser = new XmlParser();		parser.setHandler(handler);		try		{			BufferedReader in = new BufferedReader(new FileReader(file));			parser.parse(null, null, in);		}		catch(XmlException xe)		{			int line = xe.getLine();			String message = xe.getMessage();			Log.log(Log.ERROR,BufferHistory.class,file + ":" + line				+ ": " + message);		}		catch(FileNotFoundException fnf)		{			Log.log(Log.DEBUG,BufferHistory.class,fnf);		}		catch(Exception e)		{			Log.log(Log.ERROR,BufferHistory.class,e);		}	}	public static void save(File file)	{		String lineSep = System.getProperty("line.separator");		try		{			BufferedWriter out = new BufferedWriter(				new FileWriter(file));			out.write("<?xml version=\"1.0\"?>");			out.write(lineSep);			out.write("<!DOCTYPE RECENT SYSTEM \"recent.dtd\">");			out.write(lineSep);			out.write("<RECENT>");			out.write(lineSep);			Enumeration enum = history.elements();			while(enum.hasMoreElements())			{				out.write("<ENTRY>");				out.write(lineSep);				Entry entry = (Entry)enum.nextElement();				out.write("<PATH><![CDATA[");				out.write(entry.path);				out.write("]]></PATH>");				out.write(lineSep);				out.write("<CARET>");				out.write(String.valueOf(entry.caret));				out.write("</CARET>");				out.write(lineSep);				if(entry.selection != null					&& entry.selection.length() > 0)				{					out.write("<SELECTION>");					out.write(entry.selection);					out.write("</SELECTION>");					out.write(lineSep);				}				if(entry.encoding != null)				{					out.write("<ENCODING>");					out.write(entry.encoding);					out.write("</ENCODING>");					out.write(lineSep);				}				out.write("</ENTRY>");				out.write(lineSep);			}			out.write("</RECENT>");			out.write(lineSep);			out.close();		}		catch(Exception e)		{			Log.log(Log.ERROR,BufferHistory.class,e);		}	}	// private members	private static Vector history;	private static boolean pathsCaseInsensitive;	private static int max;	static	{		history = new Vector();		pathsCaseInsensitive = (File.separatorChar == '\\'			|| File.separatorChar == ':');	}	/* private */ static void addEntry(Entry entry)	{		history.addElement(entry);		while(history.size() > max)			history.removeElementAt(0);	}	/* private */ static void removeEntry(String path)	{		for(int i = 0; i < history.size(); i++)		{			Entry entry = (Entry)history.elementAt(i);			if(entry.path.equals(path))			{				history.removeElementAt(i);				return;			}		}	}	private static String selectionToString(Selection[] s)	{		if(s == null)			return null;		StringBuffer buf = new StringBuffer();		for(int i = 0; i < s.length; i++)		{			if(i != 0)				buf.append(' ');			Selection sel = s[i];			if(sel instanceof Selection.Range)				buf.append("range ");			else //if(sel instanceof Selection.Rect)				buf.append("rect ");			buf.append(sel.getStart());			buf.append(' ');			buf.append(sel.getEnd());		}		return buf.toString();	}	private static Selection[] stringToSelection(String s)	{		if(s == null)			return null;		Vector selection = new Vector();		StringTokenizer st = new StringTokenizer(s);		while(st.hasMoreTokens())		{			String type = st.nextToken();			int start = Integer.parseInt(st.nextToken());			int end = Integer.parseInt(st.nextToken());			if(end < start)			{				// I'm not sure when this can happen,				// but it does sometimes, witness the				// jEdit bug tracker.				continue;			}			Selection sel;			if(type.equals("range"))				sel = new Selection.Range(start,end);			else //if(type.equals("rect"))				sel = new Selection.Rect(start,end);			selection.addElement(sel);		}		Selection[] returnValue = new Selection[selection.size()];		selection.copyInto(returnValue);		return returnValue;	}	/**	 * Recent file list entry.	 */	public static class Entry	{		public String path;		public int caret;		public String selection;		public String encoding;		public Selection[] getSelection()		{			return stringToSelection(selection);		}		public Entry(String path, int caret, String selection, String encoding)		{			this.path = path;			this.caret = caret;			this.selection = selection;			this.encoding = encoding;		}	}	static class RecentHandler extends HandlerBase	{		public Object resolveEntity(String publicId, String systemId)		{			if("recent.dtd".equals(systemId))			{				// this will result in a slight speed up, since we				// don't need to read the DTD anyway, as AElfred is				// non-validating				return new StringReader("<!-- -->");				/* try				{					return new BufferedReader(new InputStreamReader(						getClass().getResourceAsStream("recent.dtd")));				}				catch(Exception e)				{					Log.log(Log.ERROR,this,"Error while opening"						+ " recent.dtd:");					Log.log(Log.ERROR,this,e);				} */			}			return null;		}		public void doctypeDecl(String name, String publicId,			String systemId) throws Exception		{			if("RECENT".equals(name))				return;			Log.log(Log.ERROR,this,"recent.xml: DOCTYPE must be RECENT");		}		public void endElement(String name)		{			if(name.equals("ENTRY"))			{				addEntry(new Entry(path,caret,selection,encoding));				path = null;				caret = 0;				selection = null;				encoding = null;			}			else if(name.equals("PATH"))				path = charData;			else if(name.equals("CARET"))				caret = Integer.parseInt(charData);			else if(name.equals("SELECTION"))				selection = charData;			else if(name.equals("ENCODING"))				encoding = charData;		}		public void charData(char[] ch, int start, int length)		{			charData = new String(ch,start,length);		}		// end HandlerBase implementation		// private members		private String path;		private int caret;		private String selection;		private String encoding;		private String charData;	}}

⌨️ 快捷键说明

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