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

📄 buffer.java

📁 开源的java 编辑器源代码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			contentInserted(offset,len,integerArray);		}		finally		{			writeUnlock();		}	} //}}}	//{{{ insert() method	/**	 * Inserts a string into the buffer.	 * @param offset The offset	 * @param seg The segment	 * @since jEdit 4.0pre1	 */	public void insert(int offset, Segment seg)	{		if(seg.count == 0)			return;		if(isReadOnly())			throw new RuntimeException("buffer read-only");		try		{			writeLock();			if(offset < 0 || offset > contentMgr.getLength())				throw new ArrayIndexOutOfBoundsException(offset);			contentMgr.insert(offset,seg);			integerArray.clear();			for(int i = 0; i < seg.count; i++)			{				if(seg.array[seg.offset + i] == '\n')					integerArray.add(i + 1);			}			if(!getFlag(UNDO_IN_PROGRESS))			{				undoMgr.contentInserted(offset,seg.count,					seg.toString(),!getFlag(DIRTY));			}			contentInserted(offset,seg.count,integerArray);		}		finally		{			writeUnlock();		}	} //}}}	//{{{ remove() method	/**	 * Removes the specified rang efrom the buffer.	 * @param offset The start offset	 * @param length The number of characters to remove	 */	public void remove(int offset, int length)	{		if(length == 0)			return;		if(isReadOnly())			throw new RuntimeException("buffer read-only");		try		{			setFlag(TRANSACTION,true);			writeLock();			if(offset < 0 || length < 0				|| offset + length > contentMgr.getLength())				throw new ArrayIndexOutOfBoundsException(offset + ":" + length);			int startLine = lineMgr.getLineOfOffset(offset);			int endLine = lineMgr.getLineOfOffset(offset + length);			int numLines = endLine - startLine;			if(!getFlag(UNDO_IN_PROGRESS) && !getFlag(LOADING))			{				undoMgr.contentRemoved(offset,length,					getText(offset,length),					!getFlag(DIRTY));			}			firePreContentRemoved(startLine,offset,numLines,length);			contentMgr.remove(offset,length);			lineMgr.contentRemoved(startLine,offset,numLines,length);			positionMgr.contentRemoved(offset,length);			fireContentRemoved(startLine,offset,numLines,length);			/* otherwise it will be delivered later */			if(!getFlag(UNDO_IN_PROGRESS) && !insideCompoundEdit())				fireTransactionComplete();			setDirty(true);		}		finally		{			setFlag(TRANSACTION,false);			writeUnlock();		}	} //}}}	//}}}	//{{{ Undo	//{{{ undo() method	/**	 * Undoes the most recent edit.	 *	 * @since jEdit 4.0pre1	 */	public void undo(JEditTextArea textArea)	{		if(undoMgr == null)			return;		if(!isEditable())		{			textArea.getToolkit().beep();			return;		}		try		{			writeLock();			setFlag(UNDO_IN_PROGRESS,true);			int caret = undoMgr.undo();			if(caret == -1)				textArea.getToolkit().beep();			else				textArea.setCaretPosition(caret);			fireTransactionComplete();		}		finally		{			setFlag(UNDO_IN_PROGRESS,false);			writeUnlock();		}	} //}}}	//{{{ redo() method	/**	 * Redoes the most recently undone edit.	 *	 * @since jEdit 2.7pre2	 */	public void redo(JEditTextArea textArea)	{		if(undoMgr == null)			return;		if(!isEditable())		{			Toolkit.getDefaultToolkit().beep();			return;		}		try		{			writeLock();			setFlag(UNDO_IN_PROGRESS,true);			int caret = undoMgr.redo();			if(caret == -1)				textArea.getToolkit().beep();			else				textArea.setCaretPosition(caret);			fireTransactionComplete();		}		finally		{			setFlag(UNDO_IN_PROGRESS,false);			writeUnlock();		}	} //}}}	//{{{ isTransactionInProgress() method	/**	 * Returns if an undo or compound edit is currently in progress. If this	 * method returns true, then eventually a	 * {@link org.gjt.sp.jedit.buffer.BufferChangeListener#transactionComplete(Buffer)}	 * buffer event will get fired.	 * @since jEdit 4.0pre6	 */	public boolean isTransactionInProgress()	{		return getFlag(TRANSACTION)			|| getFlag(UNDO_IN_PROGRESS)			|| insideCompoundEdit();	} //}}}	//{{{ beginCompoundEdit() method	/**	 * Starts a compound edit. All edits from now on until	 * {@link #endCompoundEdit()} are called will be merged	 * into one. This can be used to make a complex operation	 * undoable in one step. Nested calls to	 * {@link #beginCompoundEdit()} behave as expected,	 * requiring the same number of {@link #endCompoundEdit()}	 * calls to end the edit.	 * @see #endCompoundEdit()	 */	public void beginCompoundEdit()	{		// Why?		//if(getFlag(TEMPORARY))		//	return;		try		{			writeLock();			undoMgr.beginCompoundEdit();		}		finally		{			writeUnlock();		}	} //}}}	//{{{ endCompoundEdit() method	/**	 * Ends a compound edit. All edits performed since	 * {@link #beginCompoundEdit()} was called can now	 * be undone in one step by calling {@link #undo(JEditTextArea)}.	 * @see #beginCompoundEdit()	 */	public void endCompoundEdit()	{		// Why?		//if(getFlag(TEMPORARY))		//	return;		try		{			writeLock();			undoMgr.endCompoundEdit();			if(!insideCompoundEdit())				fireTransactionComplete();		}		finally		{			writeUnlock();		}	}//}}}	//{{{ insideCompoundEdit() method	/**	 * Returns if a compound edit is currently active.	 * @since jEdit 3.1pre1	 */	public boolean insideCompoundEdit()	{		return undoMgr.insideCompoundEdit();	} //}}}	//}}}	//{{{ Buffer events	public static final int NORMAL_PRIORITY = 0;	public static final int HIGH_PRIORITY = 1;	static class Listener	{		BufferChangeListener listener;		int priority;		Listener(BufferChangeListener listener, int priority)		{			this.listener = listener;			this.priority = priority;		}	}	//{{{ addBufferChangeListener() method	/**	 * Adds a buffer change listener.	 * @param listener The listener	 * @param priority Listeners with HIGH_PRIORITY get the event before	 * listeners with NORMAL_PRIORITY	 * @since jEdit 4.2pre2	 */	public void addBufferChangeListener(BufferChangeListener listener,		int priority)	{		Listener l = new Listener(listener,priority);		for(int i = 0; i < bufferListeners.size(); i++)		{			Listener _l = (Listener)bufferListeners.get(i);			if(_l.priority < priority)			{				bufferListeners.insertElementAt(l,i);				return;			}		}		bufferListeners.addElement(l);	} //}}}	//{{{ addBufferChangeListener() method	/**	 * Adds a buffer change listener.	 * @param listener The listener	 * @since jEdit 4.0pre1	 */	public void addBufferChangeListener(BufferChangeListener listener)	{		addBufferChangeListener(listener,NORMAL_PRIORITY);	} //}}}	//{{{ removeBufferChangeListener() method	/**	 * Removes a buffer change listener.	 * @param listener The listener	 * @since jEdit 4.0pre1	 */	public void removeBufferChangeListener(BufferChangeListener listener)	{		for(int i = 0; i < bufferListeners.size(); i++)		{			if(((Listener)bufferListeners.get(i)).listener == listener)			{				bufferListeners.removeElementAt(i);				return;			}		}	} //}}}	//{{{ getBufferChangeListeners() method	/**	 * Returns an array of registered buffer change listeners.	 * @param listener The listener	 * @since jEdit 4.1pre3	 */	public BufferChangeListener[] getBufferChangeListeners()	{		BufferChangeListener[] returnValue			= new BufferChangeListener[			bufferListeners.size()];		for(int i = 0; i < returnValue.length; i++)		{			returnValue[i] = ((Listener)bufferListeners.get(i))				.listener;		}		return returnValue;	} //}}}	//}}}	//{{{ Property methods	//{{{ propertiesChanged() method	/**	 * Reloads settings from the properties. This should be called	 * after the <code>syntax</code> or <code>folding</code>	 * buffer-local properties are changed.	 */	public void propertiesChanged()	{		String folding = getStringProperty("folding");		FoldHandler handler = FoldHandler.getFoldHandler(folding);		if(handler != null)		{			setFoldHandler(handler);		}		else		{			if (folding != null)				Log.log(Log.WARNING, this, path + ": invalid 'folding' property: " + folding);			setFoldHandler(new DummyFoldHandler());		}		EditBus.send(new BufferUpdate(this,null,BufferUpdate.PROPERTIES_CHANGED));	} //}}}	//{{{ getTabSize() method	/**	 * Returns the tab size used in this buffer. This is equivalent	 * to calling <code>getProperty("tabSize")</code>.	 * This method is thread-safe.	 */	public int getTabSize()	{		int tabSize = getIntegerProperty("tabSize",8);		if(tabSize <= 0)			return 8;		else			return tabSize;	} //}}}	//{{{ getIndentSize() method	/**	 * Returns the indent size used in this buffer. This is equivalent	 * to calling <code>getProperty("indentSize")</code>.	 * This method is thread-safe.	 * @since jEdit 2.7pre1	 */	public int getIndentSize()	{		int indentSize = getIntegerProperty("indentSize",8);		if(indentSize <= 0)			return 8;		else			return indentSize;	} //}}}	//{{{ getProperty() method	/**	 * Returns the value of a buffer-local property.<p>	 *	 * Using this method is generally discouraged, because it returns an	 * <code>Object</code> which must be cast to another type	 * in order to be useful, and this can cause problems if the object	 * is of a different type than what the caller expects.<p>	 *	 * The following methods should be used instead:	 * <ul>	 * <li>{@link #getStringProperty(String)}</li>	 * <li>{@link #getBooleanProperty(String)}</li>	 * <li>{@link #getIntegerProperty(String,int)}</li>	 * <li>{@link #getRegexpProperty(String,int,gnu.regexp.RESyntax)}</li>	 * </ul>	 *	 * This method is thread-safe.	 *	 * @param name The property name. For backwards compatibility, this	 * is an <code>Object</code>, not a <code>String</code>.	 */	public Object getProperty(Object name)	{		synchronized(propertyLock)		{			// First try the buffer-local properties			PropValue o = (PropValue)properties.get(name);			if(o != null)				return o.value;			// For backwards compatibility			if(!(name instanceof String))				return null;			// Now try mode.<mode>.<property>			if(mode != null)			{				Object retVal = mode.getProperty((String)name);				if(retVal == null)					return null;				properties.put(name,new PropValue(retVal,true));				return retVal;			}			else			{				// Now try buffer.<property>				String value = jEdit.getProperty("buffer." + name);				if(value == null)					return null;				// Try returning it as an integer first				Object retVal;				try				{					retVal = new Integer(value);				}				catch(NumberFormatException nf)				{					retVal = value;				}				properties.put(name,new PropValue(retVal,true));				return retVal;			}		}	} //}}}	//{{{ setProperty() method	/**	 * Sets the value of a buffer-local property.	 * @param name The property name	 * @param value The property value	 * @since jEdit 4.0pre1	 */	public void setProperty(String name, Object value)	{		if(value == null)			properties.remove(name);		else		{			PropValue test = (PropValue)properties.get(name);			if(test == null)				properties.put(name,new PropValue(value,false));			else if(test.value.equals(value))			{				// do nothing			}			else			{				test.value = value;				test.defaultValue = false;			}		}	} //}}}	//{{{ unsetProperty() method	/**	 * Clears the value of a buffer-local property.	 * @param name The property name	 * @since jEdit 4.0pre1	 */	public void unsetProperty(String name)	{		properties.remove(name);	} //}}}	//{{{ getStringProperty() method	/**	 * Returns the value of a string property. This method is thread-safe.	 * @param name The property name	 * @since jEdit 4.0pre1	 */	public String getStringProperty(String name)	{		Object obj = getProperty(name);		if(obj != null)			return obj.toString();		else			return null;	} //}}}	//{{{ setStringProperty() method	/**	 * Sets a string property.	 * @param name The property name	 * @param value The value	 * @since jEdit 4.0pre1	 */	public void setStringProperty(String name, String value)	{		setProperty(name,value);	} //}}}	//{{{ getBooleanProperty() method	/**	 * Returns the value of a boolean property. This method is thread-safe.	 * @param name The property name	 * @since jEdit 4.0pre1	 */	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;

⌨️ 快捷键说明

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