All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.syntax.jedit.TextUtilities 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.text.BadLocationException;
import javax.swing.text.Document;

/**
 * Class with several utility functions used by the text area component.
 * 
 * @author Slava Pestov
 * @version $Id$
 */
public class TextUtilities
{
	/**
	 * Returns the offset of the bracket matching the one at the specified offset
	 * of the document, or -1 if the bracket is unmatched (or if the character is
	 * not a bracket).
	 * 
	 * @param doc
	 *           The document
	 * @param offset
	 *           The offset
	 * @exception BadLocationException
	 *               If an out-of-bounds access was attempted on the document
	 *               text
	 */
	public static int findMatchingBracket( Document doc, int offset ) throws BadLocationException
	{
		if( doc.getLength() == 0 )
			return -1;
		char c = doc.getText( offset, 1 ).charAt( 0 );
		char cprime; // c` - corresponding character
		boolean direction; // true = back, false = forward

		switch( c )
		{
		case '(' :
			cprime = ')';
			direction = false;
			break;
		case ')' :
			cprime = '(';
			direction = true;
			break;
		case '[' :
			cprime = ']';
			direction = false;
			break;
		case ']' :
			cprime = '[';
			direction = true;
			break;
		case '{' :
			cprime = '}';
			direction = false;
			break;
		case '}' :
			cprime = '{';
			direction = true;
			break;
		default :
			return -1;
		}

		int count;

		// How to merge these two cases is left as an exercise
		// for the reader.

		// Go back or forward
		if( direction )
		{
			// Count is 1 initially because we have already
			// `found' one closing bracket
			count = 1;

			// Get text[0,offset-1];
			String text = doc.getText( 0, offset );

			// Scan backwards
			for( int i = offset - 1; i >= 0; i-- )
			{
				// If text[i] == c, we have found another
				// closing bracket, therefore we will need
				// two opening brackets to complete the
				// match.
				char x = text.charAt( i );
				if( x == c )
					count++ ;

				// If text[i] == cprime, we have found a
				// opening bracket, so we return i if
				// --count == 0
				else if( x == cprime )
				{
					if( --count == 0 )
						return i;
				}
			}
		}
		else
		{
			// Count is 1 initially because we have already
			// `found' one opening bracket
			count = 1;

			// So we don't have to + 1 in every loop
			offset++ ;

			// Number of characters to check
			int len = doc.getLength() - offset;

			// Get text[offset+1,len];
			String text = doc.getText( offset, len );

			// Scan forwards
			for( int i = 0; i < len; i++ )
			{
				// If text[i] == c, we have found another
				// opening bracket, therefore we will need
				// two closing brackets to complete the
				// match.
				char x = text.charAt( i );

				if( x == c )
					count++ ;

				// If text[i] == cprime, we have found an
				// closing bracket, so we return i if
				// --count == 0
				else if( x == cprime )
				{
					if( --count == 0 )
						return i + offset;
				}
			}
		}

		// Nothing found
		return -1;
	}

	/**
	 * Locates the start of the word at the specified position.
	 * 
	 * @param line
	 *           The text
	 * @param pos
	 *           The position
	 */
	public static int findWordStart( String line, int pos, String noWordSep )
	{
		char ch = line.charAt( pos - 1 );

		if( noWordSep == null )
			noWordSep = "";
		boolean selectNoLetter = ( !Character.isLetterOrDigit( ch ) && noWordSep.indexOf( ch ) == -1 );

		int wordStart = 0;
		for( int i = pos - 1; i >= 0; i-- )
		{
			ch = line.charAt( i );
			if( selectNoLetter ^ ( !Character.isLetterOrDigit( ch ) && noWordSep.indexOf( ch ) == -1 ) )
			{
				wordStart = i + 1;
				break;
			}
		}

		return wordStart;
	}

	/**
	 * Locates the end of the word at the specified position.
	 * 
	 * @param line
	 *           The text
	 * @param pos
	 *           The position
	 */
	public static int findWordEnd( String line, int pos, String noWordSep )
	{
		char ch = line.charAt( pos );

		if( noWordSep == null )
			noWordSep = "";
		boolean selectNoLetter = ( !Character.isLetterOrDigit( ch ) && noWordSep.indexOf( ch ) == -1 );

		int wordEnd = line.length();
		for( int i = pos; i < line.length(); i++ )
		{
			ch = line.charAt( i );
			if( selectNoLetter ^ ( !Character.isLetterOrDigit( ch ) && noWordSep.indexOf( ch ) == -1 ) )
			{
				wordEnd = i;
				break;
			}
		}
		return wordEnd;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy