REDemo.java Source code

Java tutorial

Introduction

Here is the source code for REDemo.java

Source

/*
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.
 * All rights reserved. Software written by Ian F. Darwin and others.
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee
 * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
 * pioneering role in inventing and promulgating (and standardizing) the Java 
 * language and environment is gratefully acknowledged.
 * 
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
 * inventing predecessor languages C and C++ is also gratefully acknowledged.
 */

import java.awt.GridLayout;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

/**
 * Standalone Swing GUI application for demonstrating REs. <br/>TODO: Show the
 * entire match, and $1 and up as captures that matched.
 * 
 * @author Ian Darwin, http://www.darwinsys.com/
 * @version #Id$
 */
public class REDemo extends JPanel {
    protected Pattern pattern;

    protected Matcher matcher;

    protected JTextField patternTF, stringTF;

    protected JCheckBox compiledOK;

    protected JRadioButton match, find, findAll;

    protected JTextField matchesTF;

    /** "main program" method - construct and show */
    public static void main(String[] av) {
        JFrame f = new JFrame("REDemo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        REDemo comp = new REDemo();
        f.setContentPane(comp);
        f.pack();
        f.setLocation(200, 200);
        f.setVisible(true);
    }

    /** Construct the REDemo object including its GUI */
    public REDemo() {
        super();

        JPanel top = new JPanel();
        top.add(new JLabel("Pattern:", JLabel.RIGHT));
        patternTF = new JTextField(20);
        patternTF.getDocument().addDocumentListener(new PatternListener());
        top.add(patternTF);
        top.add(new JLabel("Syntax OK?"));
        compiledOK = new JCheckBox();
        top.add(compiledOK);

        ChangeListener cl = new ChangeListener() {
            public void stateChanged(ChangeEvent ce) {
                tryMatch();
            }
        };
        JPanel switchPane = new JPanel();
        ButtonGroup bg = new ButtonGroup();
        match = new JRadioButton("Match");
        match.setSelected(true);
        match.addChangeListener(cl);
        bg.add(match);
        switchPane.add(match);
        find = new JRadioButton("Find");
        find.addChangeListener(cl);
        bg.add(find);
        switchPane.add(find);
        findAll = new JRadioButton("Find All");
        findAll.addChangeListener(cl);
        bg.add(findAll);
        switchPane.add(findAll);

        JPanel strPane = new JPanel();
        strPane.add(new JLabel("String:", JLabel.RIGHT));
        stringTF = new JTextField(20);
        stringTF.getDocument().addDocumentListener(new StringListener());
        strPane.add(stringTF);
        strPane.add(new JLabel("Matches:"));
        matchesTF = new JTextField(3);
        strPane.add(matchesTF);

        setLayout(new GridLayout(0, 1, 5, 5));
        add(top);
        add(strPane);
        add(switchPane);
    }

    protected void setMatches(boolean b) {
        if (b)
            matchesTF.setText("Yes");
        else
            matchesTF.setText("No");
    }

    protected void setMatches(int n) {
        matchesTF.setText(Integer.toString(n));
    }

    protected void tryCompile() {
        pattern = null;
        try {
            pattern = Pattern.compile(patternTF.getText());
            matcher = pattern.matcher("");
            compiledOK.setSelected(true);
        } catch (PatternSyntaxException ex) {
            compiledOK.setSelected(false);
        }
    }

    protected boolean tryMatch() {
        if (pattern == null)
            return false;
        matcher.reset(stringTF.getText());
        if (match.isSelected() && matcher.matches()) {
            setMatches(true);
            return true;
        }
        if (find.isSelected() && matcher.find()) {
            setMatches(true);
            return true;
        }
        if (findAll.isSelected()) {
            int i = 0;
            while (matcher.find()) {
                ++i;
            }
            if (i > 0) {
                setMatches(i);
                return true;
            }
        }
        setMatches(false);
        return false;
    }

    /** Any change to the pattern tries to compile the result. */
    class PatternListener implements DocumentListener {

        public void changedUpdate(DocumentEvent ev) {
            tryCompile();
        }

        public void insertUpdate(DocumentEvent ev) {
            tryCompile();
        }

        public void removeUpdate(DocumentEvent ev) {
            tryCompile();
        }
    }

    /** Any change to the input string tries to match the result */
    class StringListener implements DocumentListener {

        public void changedUpdate(DocumentEvent ev) {
            tryMatch();
        }

        public void insertUpdate(DocumentEvent ev) {
            tryMatch();
        }

        public void removeUpdate(DocumentEvent ev) {
            tryMatch();
        }
    }
}