package javacodebook.regex.checker;

import java.util.regex.*;

/**
 * Ein GUI zum Überprüfen von regulären Ausdrücken.
 * @author Mark Donnermeyer
 */
public class RegexChecker extends javax.swing.JFrame {

    public RegexChecker() {
        initComponents();
    }

    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel1 = new javax.swing.JPanel();
        buttonClose = new javax.swing.JButton();
        jSplitPane1 = new javax.swing.JSplitPane();
        Conent = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        textResult = new javax.swing.JTextArea();
        buttonCheck = new javax.swing.JButton();
        textRegex = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        textSource = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();

        setTitle("Regex-Checker");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));

        buttonClose.setText("Schlie\u00dfen");
        buttonClose.setName("");
        buttonClose.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonCloseActionPerformed(evt);
            }
        });

        jPanel1.add(buttonClose);

        getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);

        jSplitPane1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1)));
        jSplitPane1.setResizeWeight(0.5);
        Conent.setLayout(new java.awt.GridBagLayout());

        textResult.setColumns(20);
        textResult.setEditable(false);
        textResult.setRows(10);
        jScrollPane2.setViewportView(textResult);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 5);
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 0.5;
        gridBagConstraints.weighty = 1.0;
        Conent.add(jScrollPane2, gridBagConstraints);

        buttonCheck.setText("Test");
        buttonCheck.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonCheckActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        Conent.add(buttonCheck, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
        gridBagConstraints.weightx = 0.5;
        Conent.add(textRegex, gridBagConstraints);

        jLabel1.setText("Regul\u00e4rer Ausdruck");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.insets = new java.awt.Insets(5, 8, 0, 0);
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        Conent.add(jLabel1, gridBagConstraints);

        jLabel3.setText("Suchergebnis");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.insets = new java.awt.Insets(3, 8, 0, 0);
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        Conent.add(jLabel3, gridBagConstraints);

        jSplitPane1.setRightComponent(Conent);

        jPanel2.setLayout(new java.awt.GridBagLayout());

        textSource.setColumns(20);
        textSource.setTabSize(10);
        jScrollPane1.setViewportView(textSource);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        jPanel2.add(jScrollPane1, gridBagConstraints);

        jLabel2.setText("Text");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(5, 8, 5, 5);
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.weightx = 1.0;
        jPanel2.add(jLabel2, gridBagConstraints);

        jSplitPane1.setLeftComponent(jPanel2);

        getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);

        pack();
    }

    // Durchführung des Überprüfung des regulären Ausdruckes.
    private void buttonCheckActionPerformed(java.awt.event.ActionEvent evt) {
        // Erst einmal den regulären Ausdruck und den Beispieltext auslesen
        String regex = textRegex.getText();
        String source = textSource.getText();

        try {
            // Den regulären Ausdruck kompilieren und auf den Text anwenden.
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(source);
            boolean found = false;
            // Die gefundenen Textstellen auflisten
            StringBuffer result = new StringBuffer("Ergebnis der Suche:\n");
            while(matcher.find())
            {
                found = true;
                result.append("\nGefundene Stelle (Zeichen ");
                result.append(matcher.start() + " - " + matcher.end());
                result.append("): " + matcher.group(0) + "\n");
                for (int i=1; i<=matcher.groupCount(); i++) {
                    result.append("Gruppe " + i + ": " + matcher.group(i) + "\n");
                }
            }
            if (found)
                textResult.setText(result.toString());
            else
                textResult.setText("Es wurde keine Stelle im Text gefunden!");
        }
        catch (Exception e) {
            textResult.setText("FEHLER: " + e.getMessage());
        }
    }

    private void buttonCloseActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        RegexChecker checker = new RegexChecker();
        checker.setSize(600, 400);
        checker.show();
    }

    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel Conent;
    private javax.swing.JButton buttonClose;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JSplitPane jSplitPane1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextField textRegex;
    private javax.swing.JButton buttonCheck;
    private javax.swing.JTextArea textSource;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextArea textResult;
}
