com.intellij.tools.FilterDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.tools.FilterDialog.java

Source

/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @author Yura Cangea
 */
package com.intellij.tools;

import com.intellij.execution.filters.InvalidExpressionException;
import com.intellij.execution.filters.RegexpFilter;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.JBPopupMenu;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.PopupHandler;
import com.intellij.CommonBundle;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class FilterDialog extends DialogWrapper {
    private final JTextField myRegexpField = new JTextField();
    private final JTextField myNameField = new JTextField();
    private final JTextField myDescriptionField = new JTextField();

    private JPopupMenu myPopup;

    private FilterDialog(Component component) {
        super(component, true);
        init();
        setOKActionEnabled(true);
        myRegexpField.setToolTipText(ToolsBundle.message("tools.filters.add.macro.tooltip"));
    }

    public static boolean editFilter(FilterInfo filterInfo, JComponent parentComponent, String title)
            throws InvalidExpressionException {
        FilterDialog dialog = new FilterDialog(parentComponent);
        dialog.setTitle(title);
        dialog.myNameField.setText(filterInfo.getName());
        dialog.myDescriptionField.setText(filterInfo.getDescription());
        dialog.myRegexpField.setText(filterInfo.getRegExp());
        dialog.show();
        if (!dialog.isOK())
            return false;
        filterInfo.setName(dialog.myNameField.getText());
        filterInfo.setDescription(dialog.myDescriptionField.getText());
        filterInfo.setRegExp(dialog.myRegexpField.getText());
        return true;
    }

    @Override
    public JComponent getPreferredFocusedComponent() {
        return myRegexpField;
    }

    @Override
    protected JComponent createCenterPanel() {
        JPanel mainPanel = new JPanel(new BorderLayout());

        JPanel panel = new JPanel(new GridBagLayout());

        GridBagConstraints constr;

        constr = new GridBagConstraints();
        constr.gridx = 0;
        constr.gridy = 0;
        constr.anchor = GridBagConstraints.WEST;
        constr.weighty = 0;
        constr.gridwidth = 1;
        constr.insets = new Insets(5, 0, 0, 0);
        panel.add(new JLabel(ToolsBundle.message("tools.filters.add.name.label")), constr);

        constr.gridx = 0;
        constr.gridy = 1;
        constr.weightx = 1;
        constr.gridwidth = 3;
        constr.fill = GridBagConstraints.HORIZONTAL;
        panel.add(myNameField, constr);

        constr.gridx = 0;
        constr.gridy = 2;
        constr.weightx = 0;
        panel.add(new JLabel(ToolsBundle.message("tools.filters.add.description.label")), constr);

        constr.gridx = 0;
        constr.gridy = 3;
        constr.gridwidth = 2;
        constr.weightx = 1;
        panel.add(myDescriptionField, constr);

        constr.gridy = 4;
        constr.gridx = 0;
        constr.gridwidth = 2;
        constr.weightx = 0;
        panel.add(new JLabel(ToolsBundle.message("tools.filters.add.regex.label")), constr);

        constr.gridx = 0;
        constr.gridy = 5;
        constr.gridwidth = 3;
        panel.add(myRegexpField, constr);

        makePopup();

        panel.setPreferredSize(new Dimension(335, 160));

        mainPanel.add(panel, BorderLayout.NORTH);

        return mainPanel;
    }

    private void makePopup() {
        myPopup = new JBPopupMenu();
        String[] macrosName = RegexpFilter.getMacrosName();
        JMenuItem[] items = new JMenuItem[macrosName.length];
        for (int i = 0; i < macrosName.length; i++) {
            items[i] = myPopup.add(macrosName[i]);
            items[i].addActionListener(new MenuItemListener(macrosName[i]));
        }
        myRegexpField.addMouseListener(new PopupListener());
    }

    @Override
    protected void doOKAction() {
        String errorMessage = null;
        if (noText(myNameField.getText())) {
            errorMessage = ToolsBundle.message("tools.filters.add.name.required.error");
        } else if (noText(myRegexpField.getText())) {
            errorMessage = ToolsBundle.message("tools.filters.add.regex.required.error");
        }

        if (errorMessage != null) {
            Messages.showMessageDialog(getContentPane(), errorMessage, CommonBundle.getErrorTitle(),
                    Messages.getErrorIcon());
            return;
        }

        try {
            checkRegexp(myRegexpField.getText());
        } catch (InvalidExpressionException e) {
            Messages.showMessageDialog(getContentPane(), e.getMessage(),
                    ToolsBundle.message("tools.filters.add.regex.invalid.title"), Messages.getErrorIcon());
            return;
        }
        super.doOKAction();
    }

    private void checkRegexp(String regexpText) {
        RegexpFilter.validate(regexpText);
    }

    private boolean noText(String text) {
        return "".equals(text);
    }

    @Override
    protected String getDimensionServiceKey() {
        return "#com.intellij.tools.FilterDialog";
    }

    @Override
    protected String getHelpId() {
        return "reference.settings.ide.settings.external.tools.output.filters.add.filter";
    }

    private class MenuItemListener implements ActionListener {
        private final String myMacrosName;

        private MenuItemListener(String macrosName) {
            myMacrosName = macrosName;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int position = myRegexpField.getCaretPosition();
            try {
                if (myRegexpField.getText().indexOf(myMacrosName) == -1) {
                    myRegexpField.getDocument().insertString(position, myMacrosName, null);
                    myRegexpField.setCaretPosition(position + myMacrosName.length());
                }
            } catch (BadLocationException ex) {
            }
            myRegexpField.requestFocus();
        }
    }

    private class PopupListener extends PopupHandler {
        @Override
        public void invokePopup(Component comp, int x, int y) {
            myPopup.show(comp, x, y);
        }
    }
}