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

📄 selection.java

📁 用java 编写的源码开放的文本编辑器。有很多有用的特性
💻 JAVA
字号:
/* * Selection.java - Selected text * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2001, 2002 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.textarea;//{{{ Importsimport java.util.ArrayList;import org.gjt.sp.jedit.Buffer;import org.gjt.sp.jedit.MiscUtilities;//}}}/** * An abstract class that holds data on a region of selected text. * As an abstract class, it cannot be used * directly, but instead serves as a parent class for two specific types * of selection structures: * <ul> * <li>{@link Selection.Range} - represents an ordinary range of selected text.</li> * <li>{@link Selection.Rect} - represents a rectangular selection.</li> * </ul> * * @author Slava Pestov * @author John Gellene (API documentation) * @version $Id: Selection.java,v 1.12 2003/02/07 23:23:41 spestov Exp $ * @since jEdit 3.2pre1 */public abstract class Selection implements Cloneable{	//{{{ getStart() method	/**	 * Returns the start offset of this selection.	 */	public int getStart()	{		return start;	} //}}}	//{{{ getEnd() method	/**	 * Returns the end offset of this selection.	 */	public int getEnd()	{		return end;	} //}}}	//{{{ getStart() method	/**	 * Returns the beginning of the portion of the selection	 * falling on the specified line. Used to manipulate         * selection text on a line-by-line basis.	 * @param buffer The buffer	 * @param line The line number	 * @since jEdit 4.1pre1	 */	public abstract int getStart(Buffer buffer, int line);	//}}}	//{{{ getEnd() method	/**	 * Returns the end of the portion of the selection	 * falling on the specified line. Used to manipulate         * selection text on a line-by-line basis.	 * @param buffer The buffer	 * @param line The line number	 * @since jEdit 4.1pre1	 */	public abstract int getEnd(Buffer buffer, int line);	//}}}	//{{{ getStartLine() method	/**	 * Returns the starting line number of this selection.	 */	public int getStartLine()	{		return startLine;	} //}}}	//{{{ getEndLine() method	/**	 * Returns the ending line number of this selection.	 */	public int getEndLine()	{		return endLine;	} //}}}	//{{{ overlaps() method	/**	 * Returns if this selection and the specified selection overlap.	 * @param s The other selection	 * @since jEdit 4.1pre1	 */	public boolean overlaps(Selection s)	{		if((start >= s.start && start <= s.end)			|| (end >= s.start && end <= s.end))			return true;		else			return false;	} //}}}	//{{{ toString() method	public String toString()	{		return getClass().getName() + "[start=" + start			+ ",end=" + end + ",startLine=" + startLine			+ ",endLine=" + endLine + "]";	} //}}}	//{{{ clone() method	public Object clone()	{		try		{			return super.clone();		}		catch(CloneNotSupportedException e)		{			throw new InternalError("I just drank a whole "				+ "bottle of cough syrup and I feel "				+ "funny!");		}	} //}}}	//{{{ Package-private members	int start, end;	int startLine, endLine;	//{{{ Selection constructor	Selection()	{	} //}}}	//{{{ Range constructor	Selection(Selection sel)	{		this.start = sel.start;		this.end = sel.end;	} //}}}	//{{{ Selection constructor	Selection(int start, int end)	{		this.start = start;		this.end = end;	} //}}}	// should the next two be public, maybe?	abstract void getText(Buffer buffer, StringBuffer buf);	abstract int setText(Buffer buffer, String text);	//}}}	//{{{ Range class	/**	 * An ordinary range selection.	 * @since jEdit 3.2pre1	 */	public static class Range extends Selection	{		//{{{ Range constructor		public Range()		{		} //}}}		//{{{ Range constructor		public Range(Selection sel)		{			super(sel);		} //}}}		//{{{ Range constructor		public Range(int start, int end)		{			super(start,end);		} //}}}		//{{{ getStart() method		public int getStart(Buffer buffer, int line)		{			if(line == startLine)				return start;			else				return buffer.getLineStartOffset(line);		} //}}}		//{{{ getEnd() method		public int getEnd(Buffer buffer, int line)		{			if(line == endLine)				return end;			else				return buffer.getLineEndOffset(line) - 1;		} //}}}		//{{{ getText() method		void getText(Buffer buffer, StringBuffer buf)		{			buf.append(buffer.getText(start,end - start));		} //}}}		//{{{ setText() method		int setText(Buffer buffer, String text)		{			buffer.remove(start,end - start);			if(text != null && text.length() != 0)			{				buffer.insert(start,text);				return start + text.length();			}			else				return start;		} //}}}	} //}}}	//{{{ Rect class	/**	 * A rectangular selection.	 * @since jEdit 3.2pre1	 */	// this class is not very fast...	public static class Rect extends Selection	{		//{{{ Rect constructor		public Rect()		{			super();		} //}}}		//{{{ Rect constructor		public Rect(Selection sel)		{			super(sel);		} //}}}		//{{{ Rect constructor		public Rect(int start, int end)		{			super(start,end);		} //}}}		//{{{ Rect constructor		public Rect(int startLine, int start, int endLine, int end)		{			this.startLine = startLine;			this.start = start;			this.endLine = endLine;			this.end = end;		} //}}}		//{{{ Rect constructor		public Rect(Buffer buffer, int startLine, int startColumn,			int endLine, int endColumn)		{			this.startLine = startLine;			this.endLine = endLine;			int[] width = new int[1];			int startOffset = buffer.getOffsetOfVirtualColumn(startLine,				startColumn,width);			if(startOffset == -1)			{				extraStartVirt = startColumn - width[0];				startOffset = buffer.getLineEndOffset(startLine) - 1;			}			else				startOffset += buffer.getLineStartOffset(startLine);			int endOffset = buffer.getOffsetOfVirtualColumn(endLine,				endColumn,width);			if(endOffset == -1)			{				extraEndVirt = endColumn - width[0];				endOffset = buffer.getLineEndOffset(endLine) - 1;			}			else				endOffset += buffer.getLineStartOffset(endLine);		} //}}}		//{{{ getStartColumn() method		public int getStartColumn(Buffer buffer)		{			int virtColStart = buffer.getVirtualWidth(startLine,				start - buffer.getLineStartOffset(startLine)) + extraStartVirt;			int virtColEnd = buffer.getVirtualWidth(endLine,				end - buffer.getLineStartOffset(endLine)) + extraEndVirt;			return Math.min(virtColStart,virtColEnd);		} //}}}		//{{{ getEndColumn() method		public int getEndColumn(Buffer buffer)		{			int virtColStart = buffer.getVirtualWidth(startLine,				start - buffer.getLineStartOffset(startLine)) + extraStartVirt;			int virtColEnd = buffer.getVirtualWidth(endLine,				end - buffer.getLineStartOffset(endLine)) + extraEndVirt;			return Math.max(virtColStart,virtColEnd);		} //}}}		//{{{ getStart() method		public int getStart(Buffer buffer, int line)		{			return getColumnOnOtherLine(buffer,startLine,line,				getStartColumn(buffer));		} //}}}		//{{{ getEnd() method		public int getEnd(Buffer buffer, int line)		{			return getColumnOnOtherLine(buffer,startLine,line,				getEndColumn(buffer));		} //}}}		//{{{ Package-private members		int extraStartVirt;		int extraEndVirt;		//{{{ getText() method		void getText(Buffer buffer, StringBuffer buf)		{			int start = getStartColumn(buffer);			int end = getEndColumn(buffer);			for(int i = startLine; i <= endLine; i++)			{				int lineStart = buffer.getLineStartOffset(i);				int lineLen = buffer.getLineLength(i);				int rectStart = buffer.getOffsetOfVirtualColumn(					i,start,null);				if(rectStart == -1)					rectStart = lineLen;				int rectEnd = buffer.getOffsetOfVirtualColumn(					i,end,null);				if(rectEnd == -1)					rectEnd = lineLen;				if(rectEnd < rectStart)					System.err.println(i + ":::" + start + ":" + end						+ " ==> " + rectStart + ":" + rectEnd);				buf.append(buffer.getText(lineStart + rectStart,					rectEnd - rectStart));				if(i != endLine)					buf.append('\n');			}		} //}}}		//{{{ setText() method		int setText(Buffer buffer, String text)		{			int startColumn = getStartColumn(buffer);			int endColumn = getEndColumn(buffer);			int[] total = new int[1];			int tabSize = buffer.getTabSize();			int maxWidth = 0;			int totalLines = 0;			ArrayList lines = new ArrayList();			//{{{ Split the text into lines			if(text != null)			{				int lastNewline = 0;				int currentWidth = startColumn;				for(int i = 0; i < text.length(); i++)				{					char ch = text.charAt(i);					if(ch == '\n')					{						totalLines++;						lines.add(text.substring(							lastNewline,i));						lastNewline = i + 1;						maxWidth = Math.max(maxWidth,currentWidth);						lines.add(new Integer(currentWidth));						currentWidth = startColumn;					}					else if(ch == '\t')						currentWidth += tabSize - (currentWidth % tabSize);					else						currentWidth++;				}				if(lastNewline != text.length())				{					totalLines++;					lines.add(text.substring(lastNewline));					lines.add(new Integer(currentWidth));					maxWidth = Math.max(maxWidth,currentWidth);				}			} //}}}			//{{{ Insert the lines into the buffer			int endOffset = 0;			int lastLine = Math.max(startLine + totalLines - 1,endLine);			for(int i = startLine; i <= lastLine; i++)			{				if(i == buffer.getLineCount())					buffer.insert(buffer.getLength(),"\n");				int lineStart = buffer.getLineStartOffset(i);				int lineLen = buffer.getLineLength(i);				int rectStart = buffer.getOffsetOfVirtualColumn(					i,startColumn,total);				int startWhitespace;				if(rectStart == -1)				{					startWhitespace = (startColumn - total[0]);					rectStart = lineLen;				}				else					startWhitespace = 0;				int rectEnd = buffer.getOffsetOfVirtualColumn(					i,endColumn,null);				if(rectEnd == -1)					rectEnd = lineLen;				buffer.remove(rectStart + lineStart,rectEnd - rectStart);				int index = 2 * (i - startLine);				int endWhitespace;				if(rectEnd == lineLen)					endWhitespace = 0;				else if(i - startLine >= totalLines)					endWhitespace = maxWidth - startColumn;				else				{					endWhitespace = maxWidth						- ((Integer)lines.get(index+1))						.intValue();				}				String str = (i - startLine >= totalLines					? "" : (String)lines.get(index));				if(startWhitespace != 0)				{					buffer.insert(rectStart + lineStart,						MiscUtilities.createWhiteSpace(startWhitespace,0));				}				buffer.insert(rectStart + lineStart + startWhitespace,str);				if(endWhitespace != 0)				{					buffer.insert(rectStart + lineStart						+ startWhitespace + str.length(),						MiscUtilities.createWhiteSpace(endWhitespace,0));				}				endOffset = rectStart + lineStart					+ startWhitespace					+ endWhitespace					+ str.length();			} //}}}			//{{{ Move the caret down a line			if(text == null || text.length() == 0)				return end;			if(lastLine != buffer.getLineCount() - 1)			{				int offset = buffer.getOffsetOfVirtualColumn(					lastLine + 1,startColumn,null);				if(offset == -1)				{					buffer.insertAtColumn(lastLine + 1,startColumn,"");					return buffer.getLineEndOffset(lastLine + 1) - 1;				}				else					return buffer.getLineStartOffset(lastLine + 1) + offset;			}			else				return endOffset;			//}}}		} //}}}		//}}}		//{{{ Private members		//{{{ getColumnOnOtherLine() method		private int getColumnOnOtherLine(Buffer buffer, int line1,			int line2, int col)		{			int returnValue = buffer.getOffsetOfVirtualColumn(				line2,col,null);			if(returnValue == -1)				return buffer.getLineEndOffset(line2) - 1;			else				return buffer.getLineStartOffset(line2) + returnValue;		} //}}}		//}}}	} //}}}}

⌨️ 快捷键说明

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