summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java')
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java542
1 files changed, 284 insertions, 258 deletions
diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java
index 62993f5cf9c8..ce5f308c1305 100644
--- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java
+++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java
@@ -52,19 +52,25 @@ import com.intellij.profile.codeInspection.InspectionProfileManager;
import com.intellij.profile.codeInspection.InspectionProfileManagerImpl;
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.profile.codeInspection.SeverityProvider;
-import com.intellij.profile.codeInspection.ui.actions.AddScopeAction;
-import com.intellij.profile.codeInspection.ui.actions.DeleteScopeAction;
-import com.intellij.profile.codeInspection.ui.actions.MoveScopeAction;
+import com.intellij.profile.codeInspection.ui.filter.InspectionFilterAction;
+import com.intellij.profile.codeInspection.ui.filter.InspectionsFilter;
+import com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionConfigTreeNode;
+import com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeComparator;
+import com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeRenderer;
+import com.intellij.profile.codeInspection.ui.inspectionsTree.InspectionsConfigTreeTable;
+import com.intellij.profile.codeInspection.ui.table.ScopesAndSeveritiesTable;
import com.intellij.psi.search.scope.packageSet.NamedScope;
import com.intellij.ui.*;
+import com.intellij.ui.components.JBLabel;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.Alarm;
-import com.intellij.util.IconUtil;
+import com.intellij.util.Function;
import com.intellij.util.config.StorageAccessors;
-import com.intellij.util.containers.Convertor;
+import com.intellij.util.containers.*;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.tree.TreeUtil;
import com.intellij.xml.util.XmlStringUtil;
+import gnu.trove.THashSet;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -76,7 +82,6 @@ import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;
@@ -85,6 +90,7 @@ import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.StringReader;
import java.util.*;
+import java.util.HashSet;
import java.util.List;
/**
@@ -95,17 +101,23 @@ public class SingleInspectionProfilePanel extends JPanel {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ex.InspectionToolsPanel");
@NonNls private static final String INSPECTION_FILTER_HISTORY = "INSPECTION_FILTER_HISTORY";
private static final String UNDER_CONSTRUCTION = InspectionsBundle.message("inspection.tool.description.under.construction.text");
- private final Map<Descriptor, List<Descriptor>> myDescriptors = new HashMap<Descriptor, List<Descriptor>>();
+ private final List<ToolDescriptors> myInitialToolDescriptors = new ArrayList<ToolDescriptors>();
private InspectionProfileImpl mySelectedProfile;
private JEditorPane myBrowser;
private JPanel myOptionsPanel;
private JPanel myInspectionProfilePanel = null;
private FilterComponent myProfileFilter;
+ private final InspectionsFilter myInspectionsFilter = new InspectionsFilter() {
+ @Override
+ protected void filterChanged() {
+ filterTree(myProfileFilter.getFilter());
+ }
+ };
private final InspectionConfigTreeNode myRoot =
- new InspectionConfigTreeNode(InspectionsBundle.message("inspection.root.node.title"), null, false, false);
+ new InspectionConfigTreeNode(InspectionsBundle.message("inspection.root.node.title"));
private final Alarm myAlarm = new Alarm();
private boolean myModified = false;
- private Tree myTree;
+ private InspectionsConfigTreeTable myTreeTable;
private TreeExpander myTreeExpander;
@NotNull
private String myInitialProfile;
@@ -171,21 +183,21 @@ public class SingleInspectionProfilePanel extends JPanel {
}
public void updateSelection() {
- if (myTree != null) {
- final TreePath selectionPath = myTree.getSelectionPath();
+ if (myTreeTable != null) {
+ final TreePath selectionPath = myTreeTable.getTree().getSelectionPath();
if (selectionPath != null) {
- TreeUtil.selectNode(myTree, (TreeNode)selectionPath.getLastPathComponent());
- TreeUtil.showRowCentered(myTree, myTree.getRowForPath(selectionPath), false);
+ TreeUtil.selectNode(myTreeTable.getTree(), (TreeNode)selectionPath.getLastPathComponent());
+ TreeUtil.showRowCentered(myTreeTable.getTree(), myTreeTable.getTree().getRowForPath(selectionPath), false);
}
}
}
private void wereToolSettingsModified() {
- for (Map.Entry<Descriptor, List<Descriptor>> entry : myDescriptors.entrySet()) {
- Descriptor desc = entry.getKey();
+ for (final ToolDescriptors toolDescriptor : myInitialToolDescriptors) {
+ Descriptor desc = toolDescriptor.getDefaultDescriptor();
if (wereToolSettingsModified(desc)) return;
- List<Descriptor> descriptors = entry.getValue();
+ List<Descriptor> descriptors = toolDescriptor.getNonDefaultDescriptors();
for (Descriptor descriptor : descriptors) {
if (wereToolSettingsModified(descriptor)) return;
}
@@ -206,7 +218,7 @@ public class SingleInspectionProfilePanel extends JPanel {
myAlarm.addRequest(new Runnable() {
@Override
public void run() {
- myTree.repaint();
+ myTreeTable.repaint();
}
}, 300);
myModified = true;
@@ -216,10 +228,10 @@ public class SingleInspectionProfilePanel extends JPanel {
}
private void updateProperSettingsForSelection() {
- final TreePath selectionPath = myTree.getSelectionPath();
+ final TreePath selectionPath = myTreeTable.getTree().getSelectionPath();
if (selectionPath != null) {
InspectionConfigTreeNode node = (InspectionConfigTreeNode)selectionPath.getLastPathComponent();
- final Descriptor descriptor = node.getDescriptor();
+ final Descriptor descriptor = node.getDefaultDescriptor();
if (descriptor != null) {
final boolean properSetting = mySelectedProfile.isProperSetting(descriptor.getKey().toString());
if (node.isProperSetting() != properSetting) {
@@ -227,7 +239,7 @@ public class SingleInspectionProfilePanel extends JPanel {
myAlarm.addRequest(new Runnable() {
@Override
public void run() {
- myTree.repaint();
+ myTreeTable.repaint();
}
}, 300);
node.dropCache();
@@ -237,21 +249,14 @@ public class SingleInspectionProfilePanel extends JPanel {
}
}
- private void initDescriptors() {
+ private void initToolStates() {
final InspectionProfileImpl profile = mySelectedProfile;
if (profile == null) return;
- myDescriptors.clear();
- List<ScopeToolState> tools = profile.getDefaultStates(myProjectProfileManager.getProject());
- for (ScopeToolState state : tools) {
- final ArrayList<Descriptor> descriptors = new ArrayList<Descriptor>();
+ myInitialToolDescriptors.clear();
+ final Project project = myProjectProfileManager.getProject();
+ for (final ScopeToolState state : profile.getDefaultStates(myProjectProfileManager.getProject())) {
if (!accept(state.getTool())) continue;
- Project project = myProjectProfileManager.getProject();
- myDescriptors.put(new Descriptor(state, profile, project), descriptors);
- InspectionToolWrapper toolWrapper = state.getTool();
- final List<ScopeToolState> nonDefaultTools = profile.getNonDefaultTools(toolWrapper.getShortName(), project);
- for (ScopeToolState nonDefaultToolState : nonDefaultTools) {
- descriptors.add(new Descriptor(nonDefaultToolState, profile, project));
- }
+ myInitialToolDescriptors.add(ToolDescriptors.fromScopeToolState(state, profile, project));
}
}
@@ -267,7 +272,7 @@ public class SingleInspectionProfilePanel extends JPanel {
}
fillTreeData(myProfileFilter.getFilter(), true);
repaintTableData();
- updateOptionsAndDescriptionPanel(myTree.getSelectionPath());
+ updateOptionsAndDescriptionPanel(myTreeTable.getTree().getSelectionPaths());
}
@Nullable
@@ -311,22 +316,26 @@ public class SingleInspectionProfilePanel extends JPanel {
myProfileFilter.setFilter(filter);
}
- public void filterTree(String filter) {
- if (myTree != null) {
- getExpandedNodes(mySelectedProfile).saveVisibleState(myTree);
+ private void filterTree(@Nullable String filter) {
+ if (myTreeTable != null) {
+ getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
fillTreeData(filter, true);
reloadModel();
restoreTreeState();
- if (myTree.getSelectionPath() == null) {
- TreeUtil.selectFirstNode(myTree);
+ if (myTreeTable.getTree().getSelectionPath() == null) {
+ TreeUtil.selectFirstNode(myTreeTable.getTree());
}
}
}
+ private void filterTree() {
+ filterTree(myProfileFilter != null ? myProfileFilter.getFilter() : null);
+ }
+
private void reloadModel() {
try {
myIsInRestore = true;
- ((DefaultTreeModel)myTree.getModel()).reload();
+ ((DefaultTreeModel)myTreeTable.getTree().getModel()).reload();
}
finally {
myIsInRestore = false;
@@ -338,7 +347,7 @@ public class SingleInspectionProfilePanel extends JPanel {
try {
myIsInRestore = true;
- getExpandedNodes(mySelectedProfile).restoreVisibleState(myTree);
+ getExpandedNodes(mySelectedProfile).restoreVisibleState(myTreeTable.getTree());
}
finally {
myIsInRestore = false;
@@ -349,13 +358,17 @@ public class SingleInspectionProfilePanel extends JPanel {
final CommonActionsManager actionManager = CommonActionsManager.getInstance();
DefaultActionGroup actions = new DefaultActionGroup();
- actions.add(actionManager.createExpandAllAction(myTreeExpander, myTree));
- actions.add(actionManager.createCollapseAllAction(myTreeExpander, myTree));
+
+ actions.add(new InspectionFilterAction(mySelectedProfile, myInspectionsFilter));
+ actions.addSeparator();
+
+ actions.add(actionManager.createExpandAllAction(myTreeExpander, myTreeTable));
+ actions.add(actionManager.createCollapseAllAction(myTreeExpander, myTreeTable));
actions.add(new AnAction(CommonBundle.message("button.reset.to.default"), CommonBundle.message("button.reset.to.default"),
AllIcons.General.Reset) {
{
- registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK)), myTree);
+ registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK)), myTreeTable);
}
@Override
public void update(AnActionEvent e) {
@@ -395,41 +408,14 @@ public class SingleInspectionProfilePanel extends JPanel {
}
});
- actions.addSeparator();
- actions.add(new MyAddScopeAction());
- actions.add(new MyDeleteScopeAction());
- actions.add(new MoveScopeAction(myTree, "Move Scope Up", IconUtil.getMoveUpIcon(), -1) {
- @Override
- protected boolean isEnabledFor(int idx, InspectionConfigTreeNode parent) {
- return idx > 0;
- }
-
- @Override
- protected InspectionProfileImpl getSelectedProfile() {
- return mySelectedProfile;
- }
- });
- actions.add(new MoveScopeAction(myTree, "Move Scope Down", IconUtil.getMoveDownIcon(), 1) {
- @Override
- protected boolean isEnabledFor(int idx, InspectionConfigTreeNode parent) {
- return idx < parent.getChildCount() - 2;
- }
-
- @Override
- protected InspectionProfileImpl getSelectedProfile() {
- return mySelectedProfile;
- }
- });
- actions.addSeparator();
-
final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actions, true);
actionToolbar.setTargetComponent(this);
return actionToolbar;
}
private void repaintTableData() {
- if (myTree != null) {
- getExpandedNodes(mySelectedProfile).saveVisibleState(myTree);
+ if (myTreeTable != null) {
+ getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
reloadModel();
restoreTreeState();
}
@@ -438,8 +424,8 @@ public class SingleInspectionProfilePanel extends JPanel {
public void selectInspectionTool(String name) {
final InspectionConfigTreeNode node = findNodeByKey(name, myRoot);
if (node != null) {
- TreeUtil.showRowCentered(myTree, myTree.getRowForPath(new TreePath(node.getPath())) - 1, true);//myTree.isRootVisible ? 0 : 1;
- TreeUtil.selectNode(myTree, node);
+ TreeUtil.showRowCentered(myTreeTable.getTree(), myTreeTable.getTree().getRowForPath(new TreePath(node.getPath())) - 1, true);//myTree.isRootVisible ? 0 : 1;
+ TreeUtil.selectNode(myTreeTable.getTree(), node);
}
}
@@ -447,7 +433,7 @@ public class SingleInspectionProfilePanel extends JPanel {
private static InspectionConfigTreeNode findNodeByKey(String name, InspectionConfigTreeNode root) {
for (int i = 0; i < root.getChildCount(); i++) {
final InspectionConfigTreeNode child = (InspectionConfigTreeNode)root.getChildAt(i);
- final Descriptor descriptor = child.getDescriptor();
+ final Descriptor descriptor = child.getDefaultDescriptor();
if (descriptor != null) {
if (descriptor.getKey().toString().equals(name)) {
return child;
@@ -462,42 +448,37 @@ public class SingleInspectionProfilePanel extends JPanel {
}
private JScrollPane initTreeScrollPane() {
-
fillTreeData(null, true);
- final InspectionsConfigTreeRenderer renderer = new InspectionsConfigTreeRenderer(myProjectProfileManager.getProject()){
+ final InspectionsConfigTreeRenderer renderer = new InspectionsConfigTreeRenderer(){
@Override
protected String getFilter() {
return myProfileFilter != null ? myProfileFilter.getFilter() : null;
}
};
- myTree = new CheckboxTree(renderer, myRoot) {
+ myTreeTable = new InspectionsConfigTreeTable(new InspectionsConfigTreeTable.InspectionsConfigTreeTableSettings(myRoot, myProjectProfileManager.getProject()) {
@Override
- public Dimension getPreferredScrollableViewportSize() {
- Dimension size = super.getPreferredScrollableViewportSize();
- size = new Dimension(size.width + 10, size.height);
- return size;
+ protected void onChanged(final InspectionConfigTreeNode node) {
+ updateOptionsAndDescriptionPanel();
+ updateUpHierarchy(node, (InspectionConfigTreeNode)node.getParent());
}
@Override
- protected void onNodeStateChanged(final CheckedTreeNode node) {
- toggleToolNode((InspectionConfigTreeNode)node);
+ public InspectionProfileImpl getInspectionProfile() {
+ return mySelectedProfile;
}
- };
-
-
- myTree.setCellRenderer(renderer);
- myTree.setRootVisible(false);
- myTree.setShowsRootHandles(true);
- UIUtil.setLineStyleAngled(myTree);
- TreeUtil.installActions(myTree);
+ });
+ myTreeTable.setTreeCellRenderer(renderer);
+ myTreeTable.setRootVisible(false);
+ UIUtil.setLineStyleAngled(myTreeTable.getTree());
+ TreeUtil.installActions(myTreeTable.getTree());
- myTree.addTreeSelectionListener(new TreeSelectionListener() {
+ myTreeTable.getTree().addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
- if (myTree.getSelectionPaths() != null && myTree.getSelectionPaths().length == 1) {
- updateOptionsAndDescriptionPanel(myTree.getSelectionPaths()[0]);
+ if (myTreeTable.getTree().getSelectionPaths() != null) {
+ updateOptionsAndDescriptionPanel(myTreeTable.getTree().getSelectionPaths());
}
else {
initOptionsAndDescriptionPanel();
@@ -508,9 +489,9 @@ public class SingleInspectionProfilePanel extends JPanel {
if (selected != null) {
InspectionProfileImpl baseProfile = (InspectionProfileImpl)selected.getParentProfile();
if (baseProfile != null) {
- getExpandedNodes(baseProfile).setSelectionPaths(myTree.getSelectionPaths());
+ getExpandedNodes(baseProfile).setSelectionPaths(myTreeTable.getTree().getSelectionPaths());
}
- getExpandedNodes(selected).setSelectionPaths(myTree.getSelectionPaths());
+ getExpandedNodes(selected).setSelectionPaths(myTreeTable.getTree().getSelectionPaths());
}
}
@@ -518,36 +499,35 @@ public class SingleInspectionProfilePanel extends JPanel {
});
- myTree.addMouseListener(new PopupHandler() {
+ myTreeTable.addMouseListener(new PopupHandler() {
@Override
public void invokePopup(Component comp, int x, int y) {
- final int[] selectionRows = myTree.getSelectionRows();
- if (selectionRows != null && myTree.getPathForLocation(x, y) != null && Arrays.binarySearch(selectionRows, myTree.getRowForLocation(x, y)) > -1)
- {
+ final int[] selectionRows = myTreeTable.getTree().getSelectionRows();
+ if (selectionRows != null &&
+ myTreeTable.getTree().getPathForLocation(x, y) != null &&
+ Arrays.binarySearch(selectionRows, myTreeTable.getTree().getRowForLocation(x, y)) > -1) {
compoundPopup().show(comp, x, y);
}
}
});
- new TreeSpeedSearch(myTree, new Convertor<TreePath, String>() {
+ new TreeSpeedSearch(myTreeTable.getTree(), new Convertor<TreePath, String>() {
@Override
public String convert(TreePath o) {
final InspectionConfigTreeNode node = (InspectionConfigTreeNode)o.getLastPathComponent();
- final Descriptor descriptor = node.getDescriptor();
+ final Descriptor descriptor = node.getDefaultDescriptor();
return descriptor != null ? InspectionsConfigTreeComparator.getDisplayTextToSort(descriptor.getText()) : InspectionsConfigTreeComparator
.getDisplayTextToSort(node.getGroupName());
}
});
- myTree.setSelectionModel(new DefaultTreeSelectionModel());
-
- final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTree);
+ final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTreeTable);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- TreeUtil.collapseAll(myTree, 1);
+ TreeUtil.collapseAll(myTreeTable.getTree(), 1);
- myTree.addTreeExpansionListener(new TreeExpansionListener() {
+ myTreeTable.getTree().addTreeExpansionListener(new TreeExpansionListener() {
@Override
@@ -556,9 +536,9 @@ public class SingleInspectionProfilePanel extends JPanel {
final InspectionConfigTreeNode node = (InspectionConfigTreeNode)event.getPath().getLastPathComponent();
final InspectionProfileImpl parentProfile = (InspectionProfileImpl)selected.getParentProfile();
if (parentProfile != null) {
- getExpandedNodes(parentProfile).saveVisibleState(myTree);
+ getExpandedNodes(parentProfile).saveVisibleState(myTreeTable.getTree());
}
- getExpandedNodes(selected).saveVisibleState(myTree);
+ getExpandedNodes(selected).saveVisibleState(myTreeTable.getTree());
}
@Override
@@ -575,7 +555,17 @@ public class SingleInspectionProfilePanel extends JPanel {
}
});
- myTreeExpander = new DefaultTreeExpander(myTree);
+ myTreeExpander = new DefaultTreeExpander(myTreeTable.getTree()) {
+ @Override
+ public boolean canExpand() {
+ return myTreeTable.isShowing();
+ }
+
+ @Override
+ public boolean canCollapse() {
+ return myTreeTable.isShowing();
+ }
+ };
myProfileFilter = new MyFilterComponent();
return scrollPane;
@@ -603,54 +593,14 @@ public class SingleInspectionProfilePanel extends JPanel {
});
}
group.add(Separator.getInstance());
- group.add(new MyAddScopeAction());
- group.add(new MyDeleteScopeAction());
ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, group);
return menu.getComponent();
}
- static String renderSeverity(HighlightSeverity severity) {
+ public static String renderSeverity(HighlightSeverity severity) {
return StringUtil.capitalizeWords(severity.getName().toLowerCase(), true);
}
- private void toggleToolNode(final InspectionConfigTreeNode toolNode) {
- final Descriptor descriptor = toolNode.getDescriptor();
- Project project = myProjectProfileManager.getProject();
- if (descriptor!= null) {
- final HighlightDisplayKey key = descriptor.getKey();
- final String toolShortName = key.toString();
- if (toolNode.isChecked()) {
- if (toolNode.getScope(project) != null){
- if (toolNode.isByDefault()) {
- mySelectedProfile.enableToolByDefault(toolShortName, project);
- }
- else {
- mySelectedProfile.enableTool(toolShortName, toolNode.getScope(project), project);
- }
- } else {
- mySelectedProfile.enableTool(toolShortName, project);
- }
- }
- else {
- if (toolNode.getScope(project) != null) {
- if (toolNode.isByDefault()) {
- mySelectedProfile.disableToolByDefault(toolShortName, project);
- } else {
- mySelectedProfile.disableTool(toolShortName, toolNode.getScope(project), project);
- }
- } else if (toolNode.getChildCount() == 0){ //default node and no scopes configured
- mySelectedProfile.disableTool(toolShortName, project);
- }
- }
- toolNode.dropCache();
- updateUpHierarchy(toolNode, (InspectionConfigTreeNode)toolNode.getParent());
- }
- final TreePath path = new TreePath(toolNode.getPath());
- if (Comparing.equal(myTree.getSelectionPath(), path)) {
- updateOptionsAndDescriptionPanel(path);
- }
- }
-
private static void updateUpHierarchy(final InspectionConfigTreeNode node, final InspectionConfigTreeNode parent) {
if (parent != null) {
parent.dropCache();
@@ -701,10 +651,9 @@ public class SingleInspectionProfilePanel extends JPanel {
return forceInclude;
}
- private void fillTreeData(String filter, boolean forceInclude) {
+ private void fillTreeData(@Nullable String filter, boolean forceInclude) {
if (mySelectedProfile == null) return;
myRoot.removeAllChildren();
- myRoot.setChecked(false);
myRoot.dropCache();
List<Set<String>> keySetList = new ArrayList<Set<String>>();
final Set<String> quoted = new HashSet<String>();
@@ -712,23 +661,17 @@ public class SingleInspectionProfilePanel extends JPanel {
keySetList.addAll(SearchUtil.findKeys(filter, quoted));
}
Project project = myProjectProfileManager.getProject();
- for (Descriptor descriptor : myDescriptors.keySet()) {
+ final boolean emptyFilter = myInspectionsFilter.isEmptyFilter();
+ for (ToolDescriptors toolDescriptors : myInitialToolDescriptors) {
+ final Descriptor descriptor = toolDescriptors.getDefaultDescriptor();
if (filter != null && !filter.isEmpty() && !isDescriptorAccepted(descriptor, filter, forceInclude, keySetList, quoted)) {
continue;
}
- final List<ScopeToolState> nonDefaultTools = mySelectedProfile.getNonDefaultTools(descriptor.getKey().toString(), project);
- final HighlightDisplayKey key = descriptor.getKey();
- final boolean enabled = mySelectedProfile.isToolEnabled(key);
- boolean hasNonDefaultScope = !nonDefaultTools.isEmpty();
- final InspectionConfigTreeNode node = new InspectionConfigTreeNode(descriptor, null, !hasNonDefaultScope, enabled, !hasNonDefaultScope);
- getGroupNode(myRoot, descriptor.getGroup()).add(node);
- if (hasNonDefaultScope) {
- for (Descriptor desc : myDescriptors.get(descriptor)) {
- node.add(new InspectionConfigTreeNode(desc, desc.getState(), false, false));
- }
- node.add(new InspectionConfigTreeNode(descriptor, descriptor.getState(), true, false));
+ if (!emptyFilter && !myInspectionsFilter.matches(mySelectedProfile.getTools(toolDescriptors.getDefaultDescriptor().getKey().toString(), project))) {
+ continue;
}
- myRoot.setEnabled(myRoot.isEnabled() || enabled);
+ final InspectionConfigTreeNode node = new InspectionConfigTreeNode(toolDescriptors);
+ getGroupNode(myRoot, toolDescriptors.getDefaultDescriptor().getGroup()).add(node);
myRoot.dropCache();
}
if (filter != null && forceInclude && myRoot.getChildCount() == 0) {
@@ -740,19 +683,24 @@ public class SingleInspectionProfilePanel extends JPanel {
TreeUtil.sort(myRoot, new InspectionsConfigTreeComparator());
}
- private void updateOptionsAndDescriptionPanel(TreePath path) {
+ private void updateOptionsAndDescriptionPanel(final TreePath... paths) {
+ if (paths == null || paths.length == 0) {
+ return;
+ }
+ final TreePath path = paths[0];
if (path == null) return;
- final InspectionConfigTreeNode node = (InspectionConfigTreeNode)path.getLastPathComponent();
- final Descriptor descriptor = node.getDescriptor();
- if (descriptor != null) {
- final String description = descriptor.loadDescription();
-
- if (description != null) {
+ final List<InspectionConfigTreeNode> nodes = InspectionsAggregationUtil.getInspectionsNodes(paths);
+ if (!nodes.isEmpty()) {
+ final InspectionConfigTreeNode singleNode = nodes.size() == 1 ? ContainerUtil.getFirstItem(nodes) : null;
+ if (singleNode != null && singleNode.getDefaultDescriptor().loadDescription() != null) {
// need this in order to correctly load plugin-supplied descriptions
+ final Descriptor defaultDescriptor = singleNode.getDefaultDescriptor();
+ final String description = defaultDescriptor.loadDescription();
try {
final HintHint hintHint = new HintHint(myBrowser, new Point(0, 0));
hintHint.setFont(myBrowser.getFont());
- myBrowser.read(new StringReader(SearchUtil.markup(HintUtil.prepareHintText(description, hintHint), myProfileFilter.getFilter())), null);
+ myBrowser
+ .read(new StringReader(SearchUtil.markup(HintUtil.prepareHintText(description, hintHint), myProfileFilter.getFilter())), null);
}
catch (IOException e2) {
try {
@@ -764,7 +712,10 @@ public class SingleInspectionProfilePanel extends JPanel {
}
}
catch (Throwable t) {
- LOG.error("Failed to load description for: " + descriptor.getToolWrapper().getTool().getClass() + "; description: " + description, t);
+ LOG.error("Failed to load description for: " +
+ defaultDescriptor.getToolWrapper().getTool().getClass() +
+ "; description: " +
+ description, t);
}
}
@@ -778,41 +729,123 @@ public class SingleInspectionProfilePanel extends JPanel {
}
myOptionsPanel.removeAll();
+ final Project project = myProjectProfileManager.getProject();
+ final JPanel severityPanel = new JPanel(new GridBagLayout());
+ final double severityPanelWeightY;
+ final JPanel configPanelAnchor = new JPanel(new GridLayout());
+ configPanelAnchor.setBorder(IdeBorderFactory.createTitledBorder("Options", false, new Insets(0, 0, 0, 0)));
+
+ final Set<String> scopesNames = new THashSet<String>();
+ for (final InspectionConfigTreeNode node : nodes) {
+ final List<ScopeToolState> nonDefaultTools = mySelectedProfile.getNonDefaultTools(node.getDefaultDescriptor().getKey().toString(), project);
+ for (final ScopeToolState tool : nonDefaultTools) {
+ scopesNames.add(tool.getScopeName());
+ }
+ }
+
+ if (scopesNames.isEmpty()) {
- final NamedScope scope = node.getScope(myProjectProfileManager.getProject());
- if (scope != null || node.isInspectionNode()) {
- final HighlightDisplayKey key = descriptor.getKey();
- final LevelChooserAction chooser =
- new LevelChooserAction(((SeverityProvider)mySelectedProfile.getProfileManager()).getOwnSeverityRegistrar()) {
+ final LevelChooserAction severityLevelChooser =
+ new LevelChooserAction(mySelectedProfile) {
@Override
protected void onChosen(final HighlightSeverity severity) {
final HighlightDisplayLevel level = HighlightDisplayLevel.find(severity);
- final Project project = myProjectProfileManager.getProject();
- final boolean toUpdate = mySelectedProfile.getErrorLevel(key, scope, project) != level;
- mySelectedProfile.setErrorLevel(key, level,
- node.isInspectionNode() || node.isByDefault() ? -1 : node.getParent().getIndex(node),
- project);
- if (toUpdate) node.dropCache();
+ for (final InspectionConfigTreeNode node : nodes) {
+ final HighlightDisplayKey key = node.getDefaultDescriptor().getKey();
+ final NamedScope scope = node.getDefaultDescriptor().getScope();
+ final boolean toUpdate = mySelectedProfile.getErrorLevel(key, scope, project) != level;
+ mySelectedProfile.setErrorLevel(key, level, -1, project);
+ if (toUpdate) node.dropCache();
+ }
+
}
};
- chooser.setChosen(mySelectedProfile.getErrorLevel(key, scope, myProjectProfileManager.getProject()).getSeverity());
+ final HighlightSeverity severity =
+ ScopesAndSeveritiesTable.getSeverity(ContainerUtil.map(nodes, new Function<InspectionConfigTreeNode, ScopeToolState>() {
+ @Override
+ public ScopeToolState fun(InspectionConfigTreeNode node) {
+ return node.getDefaultDescriptor().getState();
+ }
+ }));
+ severityLevelChooser.setChosen(severity);
- final JPanel withSeverity = new JPanel(new GridBagLayout());
- withSeverity.add(new JLabel(InspectionsBundle.message("inspection.severity")),
- new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST,
- GridBagConstraints.NONE, new Insets(0, 0, 10, 10), 0, 0));
- withSeverity.add(chooser.createCustomComponent(chooser.getTemplatePresentation()), new GridBagConstraints(1, 0, 1, 1, 1.0, 0, GridBagConstraints.WEST,
- GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0));
+ final ScopesChooser scopesChooser = new ScopesChooser(ContainerUtil.map(nodes, new Function<InspectionConfigTreeNode, Descriptor>() {
+ @Override
+ public Descriptor fun(final InspectionConfigTreeNode node) {
+ return node.getDefaultDescriptor();
+ }
+ }), mySelectedProfile, project) {
+ @Override
+ protected void onScopeAdded() {
+ updateOptionsAndDescriptionPanel();
+ }
+ };
+
+ severityPanel.add(new JLabel(InspectionsBundle.message("inspection.severity")),
+ new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL,
+ new Insets(10, 0, 10, 10), 0, 0));
+ severityPanel.add(severityLevelChooser.createCustomComponent(severityLevelChooser.getTemplatePresentation()),
+ new GridBagConstraints(1, 0, 1, 1, 1.0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL,
+ new Insets(10, 0, 10, 0), 0, 0));
+ severityPanel.add(scopesChooser.createCustomComponent(scopesChooser.getTemplatePresentation()),
+ new GridBagConstraints(2, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL,
+ new Insets(10, 0, 10, 0), 0, 0));
+ severityPanelWeightY = 0.0;
+ if (singleNode != null) {
+ setConfigPanel(configPanelAnchor, mySelectedProfile.getToolDefaultState(singleNode.getDefaultDescriptor().getKey().toString(),
+ project));
+ }
+ }
+ else {
+ if (singleNode != null) {
+ for (final Descriptor descriptor : singleNode.getDescriptors().getNonDefaultDescriptors()) {
+ descriptor.loadConfig();
+ }
+ }
+ final JTable scopesAndScopesAndSeveritiesTable =
+ new ScopesAndSeveritiesTable(new ScopesAndSeveritiesTable.TableSettings(nodes, mySelectedProfile, myTreeTable, project) {
+ @Override
+ protected void onScopeChosen(@NotNull final ScopeToolState state) {
+ setConfigPanel(configPanelAnchor, state);
+ configPanelAnchor.revalidate();
+ configPanelAnchor.repaint();
+ }
- final JComponent comp = descriptor.getState().getAdditionalConfigPanel();
- withSeverity.add(comp,
- new GridBagConstraints(0, 1, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST,
- GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
+ @Override
+ protected void onChange() {
+ myTreeTable.getTree().updateUI();
+ }
+
+ @Override
+ protected void onScopeAdded() {
+ }
- myOptionsPanel.add(withSeverity, BorderLayout.CENTER);
+ @Override
+ protected void onScopeRemoved(final int scopesCount) {
+ if (scopesCount == 1) {
+ updateOptionsAndDescriptionPanel();
+ }
+ }
+ });
+
+
+ final ToolbarDecorator wrappedTable = ToolbarDecorator.createDecorator(scopesAndScopesAndSeveritiesTable);
+ final JPanel panel = wrappedTable.createPanel();
+ severityPanel.add(new JBLabel("Scopes & Severities"),
+ new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
+ new Insets(5, 0, 2, 10), 0, 0));
+ severityPanel.add(new JBLabel("Add scope to change its settings", UIUtil.ComponentStyle.SMALL),
+ new GridBagConstraints(1, 0, 1, 1, 1.0, 0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE,
+ new Insets(5, 0, 2, 0), 0, 0));
+ severityPanel.add(panel, new GridBagConstraints(0, 1, 2, 1, 0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
+ new Insets(0, 0, 0, 0), 0, 0));
+ severityPanelWeightY = 0.3;
}
+ myOptionsPanel.add(severityPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, severityPanelWeightY, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
+ myOptionsPanel.add(configPanelAnchor, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH,
+ new Insets(0, 0, 0, 0), 0, 0));
myOptionsPanel.revalidate();
- GuiUtils.enableChildren(myOptionsPanel, node.isChecked());
+ GuiUtils.enableChildren(myOptionsPanel, isThoughOneNodeEnabled(nodes));
}
else {
initOptionsAndDescriptionPanel();
@@ -820,6 +853,26 @@ public class SingleInspectionProfilePanel extends JPanel {
myOptionsPanel.repaint();
}
+ private boolean isThoughOneNodeEnabled(final List<InspectionConfigTreeNode> nodes) {
+ final Project project = myProjectProfileManager.getProject();
+ for (final InspectionConfigTreeNode node : nodes) {
+ final String toolId = node.getDefaultDescriptor().getKey().toString();
+ if (mySelectedProfile.getTools(toolId, project).isEnabled()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void updateOptionsAndDescriptionPanel() {
+ final TreePath[] paths = myTreeTable.getTree().getSelectionPaths();
+ if (paths != null) {
+ updateOptionsAndDescriptionPanel(paths);
+ } else {
+ initOptionsAndDescriptionPanel();
+ }
+ }
+
private void initOptionsAndDescriptionPanel() {
myOptionsPanel.removeAll();
try {
@@ -832,6 +885,11 @@ public class SingleInspectionProfilePanel extends JPanel {
myOptionsPanel.repaint();
}
+ private static void setConfigPanel(final JPanel configPanelAnchor, final ScopeToolState state) {
+ configPanelAnchor.removeAll();
+ configPanelAnchor.add(state.getAdditionalConfigPanel());
+ }
+
private static InspectionConfigTreeNode getGroupNode(InspectionConfigTreeNode root, String[] groupPath) {
InspectionConfigTreeNode currentRoot = root;
for (final String group : groupPath) {
@@ -848,7 +906,7 @@ public class SingleInspectionProfilePanel extends JPanel {
return child;
}
}
- InspectionConfigTreeNode child = new InspectionConfigTreeNode(group, null, false, false);
+ InspectionConfigTreeNode child = new InspectionConfigTreeNode(group);
root.add(child);
return child;
}
@@ -868,8 +926,8 @@ public class SingleInspectionProfilePanel extends JPanel {
if (mySelectedProfile != null) {
myInitialProfile = mySelectedProfile.getName();
}
- initDescriptors();
- filterTree(myProfileFilter != null ? myProfileFilter.getFilter() : null);
+ initToolStates();
+ filterTree();
}
@Override
@@ -900,7 +958,7 @@ public class SingleInspectionProfilePanel extends JPanel {
myBrowser.setBorder(IdeBorderFactory.createEmptyBorder(5, 5, 5, 5));
myBrowser.addHyperlinkListener(new BrowserHyperlinkListener());
- initDescriptors();
+ initToolStates();
fillTreeData(myProfileFilter != null ? myProfileFilter.getFilter() : null, true);
JPanel descriptionPanel = new JPanel(new BorderLayout());
@@ -912,9 +970,7 @@ public class SingleInspectionProfilePanel extends JPanel {
myRightSplitter.setFirstComponent(descriptionPanel);
myRightSplitter.setProportion(myProperties.getFloat(HORIZONTAL_DIVIDER_PROPORTION, 0.5f));
- myOptionsPanel = new JPanel(new BorderLayout());
- myOptionsPanel.setBorder(IdeBorderFactory.createTitledBorder("Options", false,
- new Insets(0, 0, 0, 0)));
+ myOptionsPanel = new JPanel(new GridBagLayout());
initOptionsAndDescriptionPanel();
myRightSplitter.setSecondComponent(myOptionsPanel);
myRightSplitter.setHonorComponentsMinimumSize(true);
@@ -925,8 +981,8 @@ public class SingleInspectionProfilePanel extends JPanel {
final JPanel northPanel = new JPanel(new GridBagLayout());
northPanel.setBorder(IdeBorderFactory.createEmptyBorder(2, 0, 2, 0));
- northPanel.add(createTreeToolbarPanel().getComponent(), new GridBagConstraints(0, 0, 1, 1, 0.5, 1, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
- northPanel.add(myProfileFilter, new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.BASELINE_TRAILING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+ northPanel.add(myProfileFilter, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.BASELINE_TRAILING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
+ northPanel.add(createTreeToolbarPanel().getComponent(), new GridBagConstraints(1, 0, 1, 1, 0.5, 1, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
treePanel.add(northPanel, BorderLayout.NORTH);
myMainSplitter = new Splitter(false);
@@ -1020,8 +1076,8 @@ public class SingleInspectionProfilePanel extends JPanel {
}
private boolean descriptorsAreChanged() {
- for (Map.Entry<Descriptor, List<Descriptor>> entry : myDescriptors.entrySet()) {
- Descriptor desc = entry.getKey();
+ for (ToolDescriptors toolDescriptors : myInitialToolDescriptors) {
+ Descriptor desc = toolDescriptors.getDefaultDescriptor();
Project project = myProjectProfileManager.getProject();
if (mySelectedProfile.isToolEnabled(desc.getKey(), null, project) != desc.isEnabled()){
return true;
@@ -1029,7 +1085,7 @@ public class SingleInspectionProfilePanel extends JPanel {
if (mySelectedProfile.getErrorLevel(desc.getKey(), desc.getScope(), project) != desc.getLevel()) {
return true;
}
- final List<Descriptor> descriptors = entry.getValue();
+ final List<Descriptor> descriptors = toolDescriptors.getNonDefaultDescriptors();
for (Descriptor descriptor : descriptors) {
if (mySelectedProfile.isToolEnabled(descriptor.getKey(), descriptor.getScope(), project) != descriptor.isEnabled()) {
return true;
@@ -1055,8 +1111,8 @@ public class SingleInspectionProfilePanel extends JPanel {
return false;
}
- public Tree getTree() {
- return myTree;
+ public Tree getTreeTable() {
+ return myTreeTable.getTree();
}
public boolean isProfileShared() {
@@ -1076,13 +1132,13 @@ public class SingleInspectionProfilePanel extends JPanel {
}
private void setNewHighlightingLevel(@NotNull HighlightDisplayLevel level) {
- final int[] rows = myTree.getSelectionRows();
+ final int[] rows = myTreeTable.getTree().getSelectionRows();
final boolean showOptionsAndDescriptorPanels = rows != null && rows.length == 1;
for (int i = 0; rows != null && i < rows.length; i++) {
- final InspectionConfigTreeNode node = (InspectionConfigTreeNode)myTree.getPathForRow(rows[i]).getLastPathComponent();
+ final InspectionConfigTreeNode node = (InspectionConfigTreeNode)myTreeTable.getTree().getPathForRow(rows[i]).getLastPathComponent();
final InspectionConfigTreeNode parent = (InspectionConfigTreeNode)node.getParent();
final Object userObject = node.getUserObject();
- if (userObject instanceof Descriptor && (node.getScopeName() != null || node.isLeaf())) {
+ if (userObject instanceof ToolDescriptors && (node.getScopeName() != null || node.isLeaf())) {
updateErrorLevel(node, showOptionsAndDescriptorPanels, level);
updateUpHierarchy(node, parent);
}
@@ -1091,8 +1147,8 @@ public class SingleInspectionProfilePanel extends JPanel {
updateUpHierarchy(node, parent);
}
}
- if (rows != null && rows.length == 1) {
- updateOptionsAndDescriptionPanel(myTree.getPathForRow(rows[0]));
+ if (rows != null) {
+ updateOptionsAndDescriptionPanel(myTreeTable.getTree().getSelectionPaths());
}
else {
initOptionsAndDescriptionPanel();
@@ -1107,7 +1163,7 @@ public class SingleInspectionProfilePanel extends JPanel {
for (int j = 0; j < node.getChildCount(); j++) {
final InspectionConfigTreeNode child = (InspectionConfigTreeNode)node.getChildAt(j);
final Object userObject = child.getUserObject();
- if (userObject instanceof Descriptor && (child.getScopeName() != null || child.isLeaf())) {
+ if (userObject instanceof ToolDescriptors && (child.getScopeName() != null || child.isLeaf())) {
updateErrorLevel(child, showOptionsAndDescriptorPanels, level);
}
else {
@@ -1119,15 +1175,18 @@ public class SingleInspectionProfilePanel extends JPanel {
private void updateErrorLevel(final InspectionConfigTreeNode child,
final boolean showOptionsAndDescriptorPanels,
@NotNull HighlightDisplayLevel level) {
- final HighlightDisplayKey key = child.getDescriptor().getKey();
- mySelectedProfile.setErrorLevel(key, level, child.isInspectionNode() || child.isByDefault() ? -1 : child.getParent().getIndex(child),
- myProjectProfileManager.getProject());
+ final HighlightDisplayKey key = child.getDefaultDescriptor().getKey();
+ mySelectedProfile.setErrorLevel(key, level, -1, myProjectProfileManager.getProject());
child.dropCache();
if (showOptionsAndDescriptorPanels) {
updateOptionsAndDescriptionPanel(new TreePath(child.getPath()));
}
}
+ public JComponent getTree() {
+ return myTreeTable.getTree();
+ }
+
private class MyFilterComponent extends FilterComponent {
private MyFilterComponent() {
super(INSPECTION_FILTER_HISTORY, 10);
@@ -1143,47 +1202,14 @@ public class SingleInspectionProfilePanel extends JPanel {
protected void onlineFilter() {
if (mySelectedProfile == null) return;
final String filter = getFilter();
- getExpandedNodes(mySelectedProfile).saveVisibleState(myTree);
+ getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
fillTreeData(filter, true);
reloadModel();
if (filter == null || filter.isEmpty()) {
restoreTreeState();
} else {
- TreeUtil.expandAll(myTree);
- }
- }
- }
-
- private class MyAddScopeAction extends AddScopeAction {
- public MyAddScopeAction() {
- super(SingleInspectionProfilePanel.this.myTree);
- }
-
- @Override
- protected InspectionProfileImpl getSelectedProfile() {
- return mySelectedProfile;
- }
-
- @Override
- public void actionPerformed(AnActionEvent e) {
- super.actionPerformed(e);
- final TreePath[] paths = myTree.getSelectionPaths();
- if (paths != null && paths.length == 1) {
- updateOptionsAndDescriptionPanel(myTree.getSelectionPath());
- } else {
- initOptionsAndDescriptionPanel();
+ TreeUtil.expandAll(myTreeTable.getTree());
}
}
}
-
- private class MyDeleteScopeAction extends DeleteScopeAction {
- public MyDeleteScopeAction() {
- super(SingleInspectionProfilePanel.this.myTree);
- }
-
- @Override
- protected InspectionProfileImpl getSelectedProfile() {
- return mySelectedProfile;
- }
- }
}