FileDocCategorySizeDatePackage
ParenMatcher.javaAPI DocExample3769Thu Oct 24 20:14:26 BST 2002None

ParenMatcher

public class ParenMatcher extends JTextPane implements Runnable

Fields Summary
public static Color[]
matchColor
public static Color
badColor
private AttributeSet[]
matchAttrSet
private AttributeSet
badAttrSet
Constructors Summary
public ParenMatcher()


    
    // create an array of AttributeSets from the array of Colors
    StyleContext sc = StyleContext.getDefaultStyleContext();
    badAttrSet = sc.addAttribute(SimpleAttributeSet.EMPTY,
                          StyleConstants.Foreground, badColor);
    matchAttrSet = new AttributeSet[matchColor.length];
    for (int j=0; j < matchColor.length; j+=1)
      matchAttrSet[j] = sc.addAttribute(SimpleAttributeSet.EMPTY,
                                 StyleConstants.Foreground, matchColor[j]);
  
Methods Summary
public static voidmain(java.lang.String[] args)

    JFrame frame = new JFrame("ParenMatcher");

    final ParenMatcher matcher = new ParenMatcher();
    matcher.setText("int fact(int n) {\n"
                   +"  if (n <= 1) return 1;\n"
                   +"  return(n * fact(n-1));\n"
                   +"}\n");
    frame.getContentPane().add(new JScrollPane(matcher), BorderLayout.CENTER);

    JButton matchButton = new JButton("match parens");
    matchButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) { matcher.run(); }
    });
    frame.getContentPane().add(matchButton, BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 150);
    frame.setVisible(true);
  
public static booleanmatches(char left, char right)

    if (left == '(") return (right == ')");
    if (left == '[") return (right == ']");
    if (left == '{") return (right == '}");
    return false;
  
public voidreplaceSelection(java.lang.String content)

    getInputAttributes().removeAttribute(StyleConstants.Foreground);
    super.replaceSelection(content);
  
public voidrun()

    StyledDocument doc = getStyledDocument();
    String text = "";
    int len = doc.getLength();
    try {
      text = doc.getText(0, len);
    } catch (BadLocationException ble) { }
    java.util.Stack stack = new java.util.Stack();
    for (int j=0; j < text.length(); j+=1) {
      char ch = text.charAt(j);
      if (ch == '(" || ch == '[" || ch == '{") {
        int depth = stack.size();
        stack.push(""+ch+j); // push a String containg the char and the offset
        AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
        doc.setCharacterAttributes(j, 1, aset, false);
      }
      if (ch == ')" || ch == ']" || ch == '}") {
        String peek = stack.empty() ? "." : (String)stack.peek();
        if (matches(peek.charAt(0), ch)) { // does it match?
          stack.pop();
          int depth = stack.size();
          AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
          doc.setCharacterAttributes(j, 1, aset, false);
        }
        else { // mismatch
          doc.setCharacterAttributes(j, 1, badAttrSet, false);
        }
      }
     }
     
     while (! stack.empty()) { // anything left in the stack is a mismatch
       String pop = (String)stack.pop();
       int offset = Integer.parseInt(pop.substring(1));
       doc.setCharacterAttributes(offset, 1, badAttrSet, false);
     }