001    package nl.cwi.sen1.gui.plugin.editor;
002    
003    /*
004     * TextUtilities.java - Utility functions used by the text area classes
005     * Copyright (C) 1999 Slava Pestov
006     *
007     * You may use and modify this package for any purpose. Redistribution is
008     * permitted, in both source and binary form, provided that this notice
009     * remains intact in all source distributions of this package.
010     */
011    
012    import javax.swing.text.Document;
013    import javax.swing.text.BadLocationException;
014    
015    public class TextUtilities {
016        public static int findMatchingBracket(Document doc, int offset)
017                throws BadLocationException {
018            if (doc.getLength() == 0) {
019                return -1;
020            }
021    
022            char c = doc.getText(offset, 1).charAt(0);
023            char cprime; // c' - corresponding character
024            boolean direction; // true = back, false = forward
025    
026            switch (c) {
027            case '(':
028                cprime = ')';
029                direction = false;
030                break;
031            case ')':
032                cprime = '(';
033                direction = true;
034                break;
035            case '[':
036                cprime = ']';
037                direction = false;
038                break;
039            case ']':
040                cprime = '[';
041                direction = true;
042                break;
043            case '{':
044                cprime = '}';
045                direction = false;
046                break;
047            case '}':
048                cprime = '{';
049                direction = true;
050                break;
051            default:
052                return -1;
053            }
054    
055            int count = 0;
056    
057            if (direction) {
058                String text = doc.getText(0, offset);
059    
060                for (int i = offset - 1; i >= 0; i--) {
061                    char x = text.charAt(i);
062    
063                    if (x == c) {
064                        count++;
065                    } else if (x == cprime) {
066                        if (count == 0) {
067                            return i;
068                        }
069                        count--;
070                    }
071                }
072            } else {
073                offset++;
074    
075                int len = doc.getLength() - offset;
076                String text = doc.getText(offset, len);
077    
078                for (int i = 0; i < len; i++) {
079                    char x = text.charAt(i);
080    
081                    if (x == c) {
082                        count++;
083                    } else if (x == cprime) {
084                        if (count == 0) {
085                            return i + offset;
086                        }
087                        count--;
088                    }
089                }
090            }
091    
092            return -1;
093        }
094    }