Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Returns the offset of the bracket matching the one at the specified offset of the document

/*  * 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;   } }