All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jsoar.debugger.syntax.ui.SyntaxPatternComponent Maven / Gradle / Ivy

package org.jsoar.debugger.syntax.ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.util.Set;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

import org.jdesktop.swingx.JXTable;
import org.jsoar.debugger.JSoarDebugger;
import org.jsoar.debugger.syntax.SyntaxPattern;

import com.google.re2j.Pattern;
import com.google.re2j.PatternSyntaxException;

@SuppressWarnings("serial")
public class SyntaxPatternComponent extends JPanel {
    @SuppressWarnings("unused")
    private Set styleNames;
    private final SyntaxPattern pattern;
    private JSoarDebugger debugger;
    private final CaptureGroupTableModel tableModel = new CaptureGroupTableModel();
    private final JXTable tblCaptureGroups;

    private static final Color goodBackground = new Color(102, 242, 96);
    private static final Color badBackground = new Color(242, 102, 96);
    private final JButton btnDelete = new JButton("Delete");

    public SyntaxPatternComponent(final SyntaxPattern pattern, Set styleNames, final JSoarDebugger debugger) {
        this.styleNames = styleNames;
        this.pattern = pattern;
        this.debugger = debugger;
        GridBagLayout mgr = new GridBagLayout();
        this.setLayout(mgr);

        this.setBorder(new EmptyBorder(5, 5, 5, 5));
        GridBagConstraints constraints;


        //regex label
        constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LINE_START;
        this.add(new JLabel("Regex"), constraints);

        //regex
        final JTextField txtRegex = new JTextField(pattern.getRegex());
        constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth=3;
        constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        txtRegex.setColumns(45);
        this.add(txtRegex, constraints);

        //controls
        constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        JButton btnUpdate = new JButton("Test & Update");
        this.add(btnUpdate, constraints);

        final JCheckBox chkEnabled = new JCheckBox("Enabled?");
        constraints.gridx = 1;
        constraints.gridy = 2;
        constraints.anchor = GridBagConstraints.LINE_START;
        chkEnabled.setSelected(pattern.isEnabled());
        this.add(chkEnabled, constraints);

        final JCheckBox chkImportant = new JCheckBox("Always Instant?");
        constraints.gridx = 2;
        constraints.gridy = 2;
        constraints.anchor = GridBagConstraints.LINE_START;
        chkEnabled.setSelected(pattern.isImportant());
        this.add(chkImportant, constraints);

        constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        this.add(btnDelete, constraints);

        //comment
        constraints = new GridBagConstraints();
        constraints.gridx = 3;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LINE_START;
        this.add(new JLabel("Comment"), constraints);

        //syntax pattern comment
        final JTextArea txtComment = new JTextArea(pattern.getComment());
        constraints = new GridBagConstraints();
        constraints.gridx = 3;
        constraints.gridy = 1;
        constraints.gridheight = 3;
        constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        txtComment.setColumns(20);
        txtComment.setRows(6);
        txtComment.setLineWrap(true);
        this.add(txtComment, constraints);


        //capture groups
        constraints = new GridBagConstraints();
        constraints.gridx = 4;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LINE_START;
        this.add(new JLabel("Capture Groups"), constraints);

        tblCaptureGroups = new JXTable(tableModel);
        //combo box column
        resetStyleNames(styleNames);
        constraints = new GridBagConstraints();
        constraints.gridx = 4;
        constraints.gridy = 1;
        constraints.gridheight = 3;
        constraints.fill = GridBagConstraints.BOTH;
//        tblCaptureGroups.packAll();
        JPanel jPanel = new JPanel(new BorderLayout());
        jPanel.add(tblCaptureGroups, BorderLayout.CENTER);
        jPanel.add(tblCaptureGroups.getTableHeader(), BorderLayout.NORTH);
        this.add(jPanel, constraints);

        //handlers
        btnUpdate.addActionListener(e ->
        {
            SyntaxPattern testSyntax = new SyntaxPattern();
            testSyntax.setRegex(txtRegex.getText());
            testSyntax.expandMacros(SyntaxPatternComponent.this.debugger);
            String text = testSyntax.getExpandedRegex();
            try {
                Pattern p = Pattern.compile(text);
                int groupCount = p.groupCount();
                while (groupCount > pattern.getComponents().size()) {
                    pattern.getComponents().add("");
                }
                while (groupCount < pattern.getComponents().size()) {
                    pattern.getComponents().remove(pattern.getComponents().size() - 1);
                }
                pattern.setRegex(txtRegex.getText());
                tableModel.fireTableDataChanged();
                txtRegex.setBackground(goodBackground);
                txtRegex.setToolTipText("Detected "+groupCount+" groups in pattern:
"+text+""); } catch (PatternSyntaxException ex) { txtRegex.setBackground(badBackground); txtRegex.setToolTipText(""+ex.getDescription()+"
"+text+""); } }); chkEnabled.addActionListener(e -> pattern.setEnabled(chkEnabled.isSelected())); chkImportant.addActionListener(e -> pattern.setImportant(chkImportant.isSelected())); txtComment.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { pattern.setComment(txtComment.getText()); } @Override public void removeUpdate(DocumentEvent e) { pattern.setComment(txtComment.getText()); } @Override public void changedUpdate(DocumentEvent e) { pattern.setComment(txtComment.getText()); } }); } public void resetStyleNames(Set styleNames) { TableColumn styleColumn = tblCaptureGroups.getColumnModel().getColumn(1); JComboBox comboBox = new JComboBox<>(); comboBox.addPopupMenuListener(new ExpandingWidthComboBoxListener(true,false)); // comboBox.setPrototypeDisplayValue("Use this for width because we need a fixed width");//will use this string to set max width of the combo box comboBox.setMaximumSize( comboBox.getPreferredSize() ); for (String name : styleNames) { comboBox.addItem(name); } styleColumn.setCellEditor(new DefaultCellEditor(comboBox)); } public void addDeleteButtonListener(ActionListener actionListener) { btnDelete.addActionListener(actionListener); } private class CaptureGroupTableModel extends AbstractTableModel { private String[] columnNames = { "Capture Group", "Style Name"}; @Override public int getRowCount() { return pattern.getComponents().size(); } @Override public int getColumnCount() { return 2; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) { return "Group " + rowIndex; } else { return pattern.getComponents().get(rowIndex); } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex != 0; } @Override public void setValueAt(Object newValue, int rowIndex, int columnIndex) { if (columnIndex == 1) { pattern.getComponents().set(rowIndex, newValue.toString()); } } public String getColumnName(int col) { return columnNames[col]; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy