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

📄 bufferhistory.java

📁 开源的java 编辑器源代码
💻 JAVA
字号:
/* * BufferHistory.java - Remembers caret positions * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2000, 2003 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;//{{{ Importsimport com.microstar.xml.*;import java.io.*;import java.util.*;import org.gjt.sp.jedit.msg.DynamicMenuChanged;import org.gjt.sp.jedit.textarea.*;import org.gjt.sp.util.Log;//}}}/** * Recent file list. * @author Slava Pestov * @version $Id: BufferHistory.java,v 1.14 2004/03/19 19:16:35 spestov Exp $ */public class BufferHistory{	//{{{ getEntry() method	public static Entry getEntry(String path)	{		Iterator iter = history.iterator();		while(iter.hasNext())		{			Entry entry = (Entry)iter.next();			if(pathsCaseInsensitive)			{				if(entry.path.equalsIgnoreCase(path))					return entry;			}			else			{				if(entry.path.equals(path))					return entry;			}		}		return null;	} //}}}	//{{{ setEntry() method	public static void setEntry(String path, int caret, Selection[] selection,		String encoding)	{		removeEntry(path);		addEntry(new Entry(path,caret,selectionToString(selection),			encoding));		EditBus.send(new DynamicMenuChanged("recent-files"));	} //}}}	//{{{ getHistory() method	/**	 * @since jEdit 4.2pre2	 */	public static List getHistory()	{		return history;	} //}}}	//{{{ getBufferHistory() method	/**	 * @deprecated Call {@link #getHistory()} instead.	 */	public static Vector getBufferHistory()	{		Vector retVal = new Vector(history.size());		Iterator iter = history.iterator();		while(iter.hasNext())			retVal.add(iter.next());		return retVal;	} //}}}	//{{{ load() method	public static void load()	{		String settingsDirectory = jEdit.getSettingsDirectory();		if(settingsDirectory == null)			return;		File recent = new File(MiscUtilities.constructPath(			settingsDirectory,"recent.xml"));		if(!recent.exists())			return;		recentModTime = recent.lastModified();		Log.log(Log.MESSAGE,BufferHistory.class,"Loading recent.xml");		RecentHandler handler = new RecentHandler();		XmlParser parser = new XmlParser();		Reader in = null;		parser.setHandler(handler);		try		{			in = new BufferedReader(new FileReader(recent));			parser.parse(null, null, in);		}		catch(XmlException xe)		{			int line = xe.getLine();			String message = xe.getMessage();			Log.log(Log.ERROR,BufferHistory.class,recent + ":" + line				+ ": " + message);		}		catch(FileNotFoundException fnf)		{			//Log.log(Log.DEBUG,BufferHistory.class,fnf);		}		catch(Exception e)		{			Log.log(Log.ERROR,BufferHistory.class,e);		}		finally		{			try			{				if(in != null)					in.close();			}			catch(IOException io)			{				Log.log(Log.ERROR,BufferHistory.class,io);			}		}	} //}}}	//{{{ save() method	public static void save()	{		String settingsDirectory = jEdit.getSettingsDirectory();		if(settingsDirectory == null)			return;		File file1 = new File(MiscUtilities.constructPath(			settingsDirectory, "#recent.xml#save#"));		File file2 = new File(MiscUtilities.constructPath(			settingsDirectory, "recent.xml"));		if(file2.exists() && file2.lastModified() != recentModTime)		{			Log.log(Log.WARNING,BufferHistory.class,file2				+ " changed on disk; will not save recent"				+ " files");			return;		}		jEdit.backupSettingsFile(file2);		Log.log(Log.MESSAGE,BufferHistory.class,"Saving " + file1);		String lineSep = System.getProperty("line.separator");		try		{			BufferedWriter out = new BufferedWriter(				new FileWriter(file1));			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);			Iterator iter = history.iterator();			while(iter.hasNext())			{				out.write("<ENTRY>");				out.write(lineSep);				Entry entry = (Entry)iter.next();				out.write("<PATH>");				out.write(MiscUtilities.charsToEntities(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();			/* to avoid data loss, only do this if the above			 * completed successfully */			file2.delete();			file1.renameTo(file2);		}		catch(Exception e)		{			Log.log(Log.ERROR,BufferHistory.class,e);		}		recentModTime = file2.lastModified();	} //}}}	//{{{ Private members	private static LinkedList history;	private static boolean pathsCaseInsensitive;	private static long recentModTime;	//{{{ Class initializer	static	{		history = new LinkedList();		pathsCaseInsensitive = OperatingSystem.isDOSDerived()			|| OperatingSystem.isMacOS();	} //}}}	//{{{ addEntry() method	/* private */ static void addEntry(Entry entry)	{		history.addFirst(entry);		int max = jEdit.getIntegerProperty("recentFiles",50);		while(history.size() > max)			history.removeLast();	} //}}}	//{{{ removeEntry() method	/* private */ static void removeEntry(String path)	{		Iterator iter = history.iterator();		while(iter.hasNext())		{			Entry entry = (Entry)iter.next();			if(pathsCaseInsensitive)			{				if(entry.path.equalsIgnoreCase(path))				{					iter.remove();					return;				}			}			else			{				if(entry.path.equals(path))				{					iter.remove();					return;				}			}		}	} //}}}	//{{{ selectionToString() method	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();	} //}}}	//{{{ stringToSelection() method	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;	} //}}}	//}}}	//{{{ Entry class	/**	 * 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;		}	} //}}}	//{{{ RecentHandler class	static class RecentHandler extends HandlerBase	{		public void endDocument()			throws java.lang.Exception		{			int max = jEdit.getIntegerProperty("recentFiles",50);			while(history.size() > max)				history.removeLast();		}		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"))			{				history.addLast(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 + -