org.syntax.jedit.SyntaxDocument Maven / Gradle / Ivy
The newest version!
/*
* soapUI, copyright (C) 2004-2011 smartbear.com
*
* soapUI is free software; you can redistribute it and/or modify it under the
* terms of version 2.1 of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* soapUI 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 Lesser General Public License for more details at gnu.org.
*/
package org.syntax.jedit;
import javax.swing.event.DocumentEvent;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.PlainDocument;
import javax.swing.text.Segment;
import javax.swing.undo.UndoableEdit;
import org.syntax.jedit.tokenmarker.TokenMarker;
import com.eviware.soapui.SoapUI;
/**
* A document implementation that can be tokenized by the syntax highlighting
* system.
*
* @author Slava Pestov
* @version $Id$
*/
public class SyntaxDocument extends PlainDocument
{
/**
* Returns the token marker that is to be used to split lines of this
* document up into tokens. May return null if this document is not to be
* colorized.
*/
public TokenMarker getTokenMarker()
{
return tokenMarker;
}
/**
* Sets the token marker that is to be used to split lines of this document
* up into tokens. May throw an exception if this is not supported for this
* type of document.
*
* @param tm
* The new token marker
*/
public void setTokenMarker( TokenMarker tm )
{
tokenMarker = tm;
if( tm == null )
return;
tokenMarker.insertLines( 0, getDefaultRootElement().getElementCount() );
tokenizeLines();
}
/**
* Reparses the document, by passing all lines to the token marker. This
* should be called after the document is first loaded.
*/
public void tokenizeLines()
{
tokenizeLines( 0, getDefaultRootElement().getElementCount() );
}
/**
* 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 )
{
if( tokenMarker == null || !tokenMarker.supportsMultilineTokens() )
return;
Segment lineSegment = new Segment();
Element map = getDefaultRootElement();
len += start;
try
{
for( int i = start; i < len; i++ )
{
Element lineElement = map.getElement( i );
int lineStart = lineElement.getStartOffset();
getText( lineStart, lineElement.getEndOffset() - lineStart - 1, lineSegment );
tokenMarker.markTokens( lineSegment, i );
}
}
catch( BadLocationException bl )
{
SoapUI.logError( bl );
}
}
/**
* Starts a compound edit that can be undone in one operation. Subclasses
* that implement undo should override this method; this class has no undo
* functionality so this method is empty.
*/
public void beginCompoundEdit()
{
}
/**
* Ends a compound edit that can be undone in one operation. Subclasses that
* implement undo should override this method; this class has no undo
* functionality so this method is empty.
*/
public void endCompoundEdit()
{
}
/**
* Adds an undoable edit to this document's undo list. The edit should be
* ignored if something is currently being undone.
*
* @param edit
* The undoable edit
*
* @since jEdit 2.2pre1
*/
public void addUndoableEdit( UndoableEdit edit )
{
}
// protected members
protected TokenMarker tokenMarker;
/**
* We overwrite this method to update the token marker state immediately so
* that any event listeners get a consistent token marker.
*/
protected void fireInsertUpdate( DocumentEvent evt )
{
if( tokenMarker != null )
{
DocumentEvent.ElementChange ch = evt.getChange( getDefaultRootElement() );
if( ch != null )
{
tokenMarker.insertLines( ch.getIndex() + 1, ch.getChildrenAdded().length - ch.getChildrenRemoved().length );
}
}
super.fireInsertUpdate( evt );
}
/**
* We overwrite this method to update the token marker state immediately so
* that any event listeners get a consistent token marker.
*/
protected void fireRemoveUpdate( DocumentEvent evt )
{
if( tokenMarker != null )
{
DocumentEvent.ElementChange ch = evt.getChange( getDefaultRootElement() );
if( ch != null )
{
tokenMarker.deleteLines( ch.getIndex() + 1, ch.getChildrenRemoved().length - ch.getChildrenAdded().length );
}
}
super.fireRemoveUpdate( evt );
}
}