diff options
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.java | 542 |
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; - } - } } |