blob: 1b01c5d48187d8575ab809a8c086e11eaf512497 [file] [log] [blame]
/*
* 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);
}
}
}