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

📄 buffer.java

📁 Java写的文本编辑器
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
				if (seg.count == 0) continue;				lineStart = seg.offset;				lineEnd = seg.offset + seg.count - 1;				for (pos = lineEnd; pos >= lineStart; pos--)				{					if (!Character.isWhitespace(seg.array[pos]))						break;				}				tail = lineEnd - pos;				// no whitespace				if (tail == 0) continue;				remove(lineElement.getEndOffset() - 1 - tail,tail);			}		}		catch (BadLocationException ble)		{			Log.log(Log.ERROR, this, ble);		}		finally		{			endCompoundEdit();		}	}	/**	 * Shifts the indent of each line in the specified list to the left.	 * @param lines The line numbers	 * @since jEdit 3.2pre1	 */	public void shiftIndentLeft(int[] lines)	{		int tabSize = getTabSize();		int indentSize = getIndentSize();		boolean noTabs = getBooleanProperty("noTabs");		Element map = getDefaultRootElement();		try		{			beginCompoundEdit();			for(int i = 0; i < lines.length; i++)			{				Element lineElement = map.getElement(lines[i]);				int lineStart = lineElement.getStartOffset();				String line = getText(lineStart,					lineElement.getEndOffset() - lineStart - 1);				int whiteSpace = MiscUtilities					.getLeadingWhiteSpace(line);				if(whiteSpace == 0)					continue;				int whiteSpaceWidth = Math.max(0,MiscUtilities					.getLeadingWhiteSpaceWidth(line,tabSize)					- indentSize);				remove(lineStart,whiteSpace);				insertString(lineStart,MiscUtilities					.createWhiteSpace(whiteSpaceWidth,					(noTabs ? 0 : tabSize)),null);			}		}		catch (BadLocationException ble)		{			Log.log(Log.ERROR, this, ble);		}		finally		{			endCompoundEdit();		}	}	/**	 * Shifts the indent of each line in the specified list to the right.	 * @param lines The line numbers	 * @since jEdit 3.2pre1	 */	public void shiftIndentRight(int[] lines)	{		try		{			beginCompoundEdit();			int tabSize = getTabSize();			int indentSize = getIndentSize();			boolean noTabs = getBooleanProperty("noTabs");			Element map = getDefaultRootElement();			for(int i = 0; i < lines.length; i++)			{				Element lineElement = map.getElement(lines[i]);				int lineStart = lineElement.getStartOffset();				String line = getText(lineStart,					lineElement.getEndOffset() - lineStart - 1);				int whiteSpace = MiscUtilities					.getLeadingWhiteSpace(line);				int whiteSpaceWidth = MiscUtilities					.getLeadingWhiteSpaceWidth(					line,tabSize) + indentSize;				remove(lineStart,whiteSpace);				insertString(lineStart,MiscUtilities					.createWhiteSpace(whiteSpaceWidth,					(noTabs ? 0 : tabSize)),null);			}		}		catch(BadLocationException bl)		{			Log.log(Log.ERROR,this,bl);		}		finally		{			endCompoundEdit();		}	}	/**	 * Returns the tab size used in this buffer. This is equivalent	 * to calling getProperty("tabSize").	 */	public int getTabSize()	{		return ((Integer)getProperty("tabSize")).intValue();	}	/**	 * Returns the indent size used in this buffer. This is equivalent	 * to calling getProperty("indentSize").	 * @since jEdit 2.7pre1	 */	public int getIndentSize()	{		return ((Integer)getProperty("indentSize")).intValue();	}	/**	 * Returns the value of a boolean property.	 * @param name The property name	 */	public boolean getBooleanProperty(String name)	{		Object obj = getProperty(name);		if(obj instanceof Boolean)			return ((Boolean)obj).booleanValue();		else if("true".equals(obj) || "on".equals(obj) || "yes".equals(obj))			return true;		else			return false;	}	/**	 * Sets a boolean property.	 * @param name The property name	 * @param value The value	 */	public void putBooleanProperty(String name, boolean value)	{		putProperty(name,value ? Boolean.TRUE : Boolean.FALSE);	}	/**	 * Returns this buffer's edit mode.	 */	public final Mode getMode()	{		return mode;	}	/**	 * Sets this buffer's edit mode. Note that calling this before a buffer	 * is loaded will have no effect; in that case, set the "mode" property	 * to the name of the mode. A bit inelegant, I know...	 * @param mode The mode	 */	public void setMode(Mode mode)	{		/* This protects against stupid people (like me)		 * doing stuff like buffer.setMode(jEdit.getMode(...)); */		if(mode == null)			throw new NullPointerException("Mode must be non-null");		if(this.mode == mode)			return;		Mode oldMode = this.mode;		this.mode = mode;		propertiesChanged(); // sets up token marker		// don't fire it for initial mode set		if(oldMode != null)		{			EditBus.send(new BufferUpdate(this,null,				BufferUpdate.MODE_CHANGED));		}	}	/**	 * Sets this buffer's edit mode by calling the accept() method	 * of each registered edit mode.	 */	public void setMode()	{		// don't do this while loading, otherwise we will		// blow away caret location properties		if(!getFlag(LOADING))			clearProperties();		parseBufferLocalProperties();		String userMode = (String)getProperty("mode");		if(userMode != null)		{			Mode m = jEdit.getMode(userMode);			if(m != null)			{				setMode(m);				return;			}		}		String nogzName = name.substring(0,name.length() -			(name.endsWith(".gz") ? 3 : 0));		Element lineElement = getDefaultRootElement().getElement(0);		try		{			String line = getText(0,(lineElement == null				? 0 : lineElement.getEndOffset()-1));			Mode[] modes = jEdit.getModes();			for(int i = 0; i < modes.length; i++)			{				if(modes[i].accept(nogzName,line))				{					setMode(modes[i]);					return;				}			}		}		catch(BadLocationException bl)		{			Log.log(Log.ERROR,this,bl);		}		Mode defaultMode = jEdit.getMode(jEdit.getProperty("buffer.defaultMode"));		if(defaultMode == null)			defaultMode = jEdit.getMode("text");		setMode(defaultMode);	}	/**	 * If auto indent is enabled, this method is called when the `Tab'	 * or `Enter' key is pressed to perform mode-specific indentation	 * and return true, or return false if a normal tab is to be inserted.	 * @param line The line number to indent	 * @param canIncreaseIndent If false, nothing will be done if the	 * calculated indent is greater than the current	 * @param canDecreaseIndent If false, nothing will be done if the	 * calculated indent is less than the current	 * @return true if the tab key event should be swallowed (ignored)	 * false if a real tab should be inserted	 */	public boolean indentLine(int lineIndex, boolean canIncreaseIndent,		boolean canDecreaseIndent)	{		if(lineIndex == 0)			return false;		// Get properties		String openBrackets = (String)getProperty("indentOpenBrackets");		String closeBrackets = (String)getProperty("indentCloseBrackets");		String _indentPrevLine = (String)getProperty("indentPrevLine");		boolean doubleBracketIndent = getBooleanProperty("doubleBracketIndent");		RE indentPrevLineRE = null;		if(openBrackets == null)			openBrackets = "";		if(closeBrackets == null)			closeBrackets = "";		if(_indentPrevLine != null)		{			try			{				indentPrevLineRE = new RE(_indentPrevLine,					RE.REG_ICASE,RESearchMatcher.RE_SYNTAX_JEDIT);			}			catch(REException re)			{				Log.log(Log.ERROR,this,"Invalid 'indentPrevLine'"					+ " regexp: " + _indentPrevLine);				Log.log(Log.ERROR,this,re);			}		}		int tabSize = getTabSize();		int indentSize = getIndentSize();		boolean noTabs = getBooleanProperty("noTabs");		Element map = getDefaultRootElement();		String prevLine = null;		String line = null;		Element lineElement = map.getElement(lineIndex);		int start = lineElement.getStartOffset();		// Get line text		try		{			line = getText(start,lineElement.getEndOffset() - start - 1);			for(int i = lineIndex - 1; i >= 0; i--)			{				lineElement = map.getElement(i);				int lineStart = lineElement.getStartOffset();				int len = lineElement.getEndOffset() - lineStart - 1;				if(len != 0)				{					prevLine = getText(lineStart,len);					break;				}			}			if(prevLine == null)				return false;		}		catch(BadLocationException e)		{			Log.log(Log.ERROR,this,e);			return false;		}		/*		 * If 'prevLineIndent' matches a line --> +1		 */		boolean prevLineMatches = (indentPrevLineRE == null ? false			: indentPrevLineRE.isMatch(prevLine));		/*		 * On the previous line,		 * if(bob) { --> +1		 * if(bob) { } --> 0		 * } else if(bob) { --> +1		 */		boolean prevLineStart = true; // False after initial indent		int prevLineIndent = 0; // Indent width (tab expanded)		int prevLineBrackets = 0; // Additional bracket indent		for(int i = 0; i < prevLine.length(); i++)		{			char c = prevLine.charAt(i);			switch(c)			{			case ' ':				if(prevLineStart)					prevLineIndent++;				break;			case '\t':				if(prevLineStart)				{					prevLineIndent += (tabSize						- (prevLineIndent						% tabSize));				}				break;			default:				prevLineStart = false;				if(closeBrackets.indexOf(c) != -1)					prevLineBrackets = Math.max(						prevLineBrackets-1,0);				else if(openBrackets.indexOf(c) != -1)				{					/*					 * If supressBracketAfterIndent is true					 * and we have something that looks like:					 * if(bob)					 * {					 * then the 'if' will not shift the indent,					 * because of the {.					 *					 * If supressBracketAfterIndent is false,					 * the above would be indented like:					 * if(bob)					 *         {					 */					if(!doubleBracketIndent)						prevLineMatches = false;					prevLineBrackets++;				}				break;			}		}		/*		 * On the current line,		 * } --> -1		 * } else if(bob) { --> -1		 * if(bob) { } --> 0		 */		boolean lineStart = true; // False after initial indent		int lineIndent = 0; // Indent width (tab expanded)		int lineWidth = 0; // White space count		int lineBrackets = 0; // Additional bracket indent		int closeBracketIndex = -1; // For lining up closing			// and opening brackets		for(int i = 0; i < line.length(); i++)		{			char c = line.charAt(i);			switch(c)			{			case ' ':				if(lineStart)				{					lineIndent++;					lineWidth++;				}				break;			case '\t':				if(lineStart)				{					lineIndent += (tabSize						- (lineIndent						% tabSize));					lineWidth++;				}				break;			default:				lineStart = false;				if(closeBrackets.indexOf(c) != -1)				{					if(lineBrackets == 0)						closeBracketIndex = i;					else						lineBrackets--;				}				else if(openBrackets.indexOf(c) != -1)				{					if(!doubleBracketIndent)						prevLineMatches = false;					lineBrackets++;				}				break;			}		}		try		{			if(closeBracketIndex != -1)			{				int offset = TextUtilities.findMatchingBracket(					this,lineIndex,closeBracketIndex);				if(offset != -1)				{					lineElement = map.getElement(map.getElementIndex(						offset));					int startOffset = lineElement.getStartOffset();					String closeLine = getText(startOffset,						lineElement.getEndOffset() - startOffset - 1);					prevLineIndent = MiscUtilities						.getLeadingWhiteSpaceWidth(						closeLine,tabSize);				}				else					return false;			}			else			{				prevLineIndent += (prevLineBrackets * indentSize);			}			if(prevLineMatches)				prevLineIndent += indentSize;			if(!canDecreaseIndent && prevLineIndent <= lineIndent)				return false;			if(!canIncreaseIndent && prevLineIndent >= lineIndent)				return false;			// Do it			remove(start,lineWidth);			insertString(start,MiscUtilities.createWhiteSpace(				prevLineIndent,(noTabs ? 0 : tabSize)),null);			return true;		}		catch(BadLocationException bl)		{			Log.log(Log.ERROR,this,bl);		}		return false;	}	/**	 * Indents all specified lines.	 * @param start The first line to indent	 * @param end The last line to indent	 * @since jEdit 3.1pre3	 */	public void indentLines(int start, int end)	{		beginCompoundEdit();		for(int i = start; i <= end; i++)			indentLine(i,true,true);		endCompoundEdit();	}	/**	 * Indents all specified lines.	 * @param lines The line numbers	 * @since jEdit 3.2pre1	 */	public void indentLines(int[] lines)	{		beginCompoundEdit();		for(int i = 0; i < lines.length; i++)			indentLine(lines[i],true,true);		endCompoundEdit();	}	/**	 * @deprecated Don't call this method.	 */	public void tokenizeLines() {}	/**	 * Reparses the document, by passing the specified lines to the	 * token marker. This should be called after a large quantity of	 * text is first inserted.	 * @param start The first line to parse	 * @param len The number of lines, after the first one to parse	 */	public void tokenizeLines(int start, int len)	{		linesChanged(start,len);		for(int i = 0; i < len; i++)			markTokens(start + i);	}	/**	 * Paints the specified line onto the graphics context.	 * @since jEdit 3.2pre6	 */	public int paintSyntaxLine(int lineIndex, Graphics gfx, int _x, int _y,		TabExpander expander, boolean style, boolean color,		Font defaultFont, Color foreground, Color background,		SyntaxStyle[] styles, TextRenderer renderer)	{		float x = (float)_x;		float y = (float)_y;		LineInfo info = lineInfo[lineIndex];		if(info.tokensValid)		{			// have to do this 'manually'			Element lineElement = getDefaultRootElement()				.getElement(lineIndex);			int lineStart = lineElement.getStartOffset();			try			{				getText(lineStart,lineElement.getEndOffset()					- lineStart - 1,seg);			}			catch(BadLocationException e)			{				Log.log(Log.ERROR,this,e);			}		}		else			markTokens(lineIndex);		Token tokens = info.firstToken;		// the above should leave the text in the 'seg' segment		char[] text = seg.array;		int off = seg.offset;		for(;;)		{			byte id = tokens.id;			if(id == Token.END)				break;			Color tokenForeground;			Color tokenBackground = null;			if(id == Token.NULL)			{				gfx.setFont(defaultFont);				tokenForeground = foreground;			}

⌨️ 快捷键说明

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