blob: 3b342800269b1d97b8bf7e056a1bedef867fc75e [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.
*/
package com.intellij.ide.todo.configurable;
import com.intellij.CommonBundle;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.todo.TodoFilter;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.psi.search.TodoPattern;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.TableUtil;
import com.intellij.util.ui.Table;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.util.List;
/**
* @author Vladimir Kondratyev
*/
class FilterDialog extends DialogWrapper {
private final TodoFilter myFilter;
private final int myFilterIndex;
private final List<TodoPattern> myPatterns;
private final List<TodoFilter> myFilters;
private final JTextField myNameField;
private final Table myTable;
/**
* @param parent parent component.
* @param filter filter to be edited.
* @param filterIndex index of <code>filter</code> in the <code>filters</code>. This parameter is
* needed to not compare filter with itself when validating.
* @param filters all already configured filters. This parameter is used to
* @param patterns all patterns available in this filter.
*/
public FilterDialog(Component parent,
TodoFilter filter,
int filterIndex,
List<TodoFilter> filters,
List<TodoPattern> patterns) {
super(parent, true);
myFilter = filter;
myFilterIndex = filterIndex;
myPatterns = patterns;
myFilters = filters;
myNameField = new JTextField(filter.getName());
MyModel model = new MyModel();
myTable = new Table(model);
init();
}
@Override
protected void doOKAction() {
// Validate filter name
myFilter.setName(myNameField.getText().trim());
if (myFilter.getName().length() == 0) {
Messages.showMessageDialog(myTable,
IdeBundle.message("error.filter.name.should.be.specified"),
CommonBundle.getErrorTitle(),
Messages.getErrorIcon());
return;
}
for (int i = 0; i < myFilters.size(); i++) {
TodoFilter filter = myFilters.get(i);
if (myFilterIndex != i && myFilter.getName().equals(filter.getName())) {
Messages.showMessageDialog(myTable,
IdeBundle.message("error.filter.with.the.same.name.already.exists"),
CommonBundle.getErrorTitle(),
Messages.getErrorIcon());
return;
}
}
// Validate that at least one pettern is selected
if (myFilter.isEmpty()) {
Messages.showMessageDialog(myTable,
IdeBundle.message("error.filter.should.contain.at.least.one.pattern"),
CommonBundle.getErrorTitle(),
Messages.getErrorIcon());
return;
}
super.doOKAction();
}
@Override
@NotNull
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp("reference.idesettings.todo.editfilter");
}
@Override
public JComponent getPreferredFocusedComponent() {
return myNameField;
}
@Override
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new GridBagLayout());
JLabel nameLabel = new JLabel(IdeBundle.message("label.todo.filter.name"));
panel.add(nameLabel,
new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 5, 10), 0, 0));
panel.add(myNameField,
new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 5, 0), 0, 0));
JPanel patternsPanel = new JPanel(new GridBagLayout());
Border border = IdeBorderFactory.createTitledBorder(IdeBundle.message("group.todo.filter.patterns"), false);
patternsPanel.setBorder(border);
myTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable);
scrollPane.setPreferredSize(new Dimension(550, myTable.getRowHeight() * 10));
patternsPanel.add(scrollPane,
new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
// Column "Available"
TableUtil.setupCheckboxColumn(myTable, 0);
//
panel.add(patternsPanel,
new GridBagConstraints(0, 1, 2, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
return panel;
}
private final class MyModel extends AbstractTableModel {
private final String[] ourColumnNames = new String[]{" ", IdeBundle.message("column.todo.filter.pattern"), };
private final Class[] ourColumnClasses = new Class[]{Boolean.class, String.class};
@Override
public String getColumnName(int column) {
return ourColumnNames[column];
}
@Override
public Class getColumnClass(int column) {
return ourColumnClasses[column];
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return myPatterns.size();
}
@Override
public Object getValueAt(int row, int column) {
TodoPattern pattern = myPatterns.get(row);
switch (column) {
case 0:
// "Available" column
return myFilter.contains(pattern) ? Boolean.TRUE : Boolean.FALSE;
case 1:
// "Pattern" column
return pattern.getPatternString();
default:
throw new IllegalArgumentException();
}
}
@Override
public void setValueAt(Object value, int row, int column) {
switch (column) {
case 0:
TodoPattern pattern = myPatterns.get(row);
if (((Boolean)value).booleanValue()) {
if (!myFilter.contains(pattern)) {
myFilter.addTodoPattern(pattern);
}
}
else {
myFilter.removeTodoPattern(pattern);
}
break;
default:
throw new IllegalArgumentException();
}
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
}
}