Swing JFC Java

/*
 * TextUtilities.java - Utility functions used by the text area classes
 * Copyright (C) 1999 Slava Pestov
 *
 * You may use and modify this package for any purpose. Redistribution is
 * permitted, in both source and binary form, provided that this notice
 * remains intact in all source distributions of this package.
 */
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;
  }
}