inspection settings: do not recreate tree-ui components on apply appcode/163.3559 clion/163.3557
authorDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Tue, 30 Aug 2016 14:52:31 +0000 (17:52 +0300)
committerDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Tue, 30 Aug 2016 14:53:04 +0000 (17:53 +0300)
java/java-tests/testSrc/com/intellij/codeInspection/SingleInspectionProfilePanelTest.kt
platform/lang-impl/src/com/intellij/codeInspection/actions/CodeInspectionAction.java
platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java
platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/InspectionToolsConfigurable.java
platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/ProfilesChooser.java
platform/lang-impl/src/com/intellij/profile/codeInspection/ui/header/ProfilesComboBox.java
platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionConfigTreeNode.java

index 5471f2a1d872c7e192e590005b3f95a314a43c4d..5b97ac419510d50136ef54cd055c201c82bdf8f9 100644 (file)
@@ -37,7 +37,7 @@ class SingleInspectionProfilePanelTest : LightIdeaTestCase() {
     val profile = configureInspections(arrayOf(myInspection), project, testRootDisposable)
 
     val model = profile.modifiableModel
-    val panel = SingleInspectionProfilePanel(ProjectInspectionProfileManager.getInstanceImpl(project), profile.name, model, profile)
+    val panel = SingleInspectionProfilePanel(ProjectInspectionProfileManager.getInstanceImpl(project), model)
     panel.isVisible = true
     panel.reset()
 
@@ -63,7 +63,7 @@ class SingleInspectionProfilePanelTest : LightIdeaTestCase() {
 
     val model = profile.modifiableModel
 
-    val panel = SingleInspectionProfilePanel(profileManager, profile.name, model, profile)
+    val panel = SingleInspectionProfilePanel(profileManager, model)
     panel.isVisible = true
     panel.reset()
     TestCase.assertEquals(InspectionProfileTest.getInitializedTools(model).toString(), 1,
index 94d113a4b22c44d52e09de49d0132f43f48e4f3e..5eac29f164d22cc59697647d3998d95f87dbe1ef 100644 (file)
@@ -157,9 +157,9 @@ public class CodeInspectionAction extends BaseAnalysisAction {
     }
 
     @Override
-    protected void addProfile(InspectionProfileImpl model, InspectionProfileImpl profile) {
-      super.addProfile(model, profile);
-      myProfilesCombo.addProfile(profile);
+    protected void addProfile(InspectionProfileImpl model) {
+      super.addProfile(model);
+      myProfilesCombo.addProfile((InspectionProfileImpl)model.getParentProfile());
     }
 
     @Override
@@ -193,17 +193,6 @@ public class CodeInspectionAction extends BaseAnalysisAction {
 
     private void createUIComponents() {
       myBrowseProfilesCombo = new ComboboxWithBrowseButton(new ProfilesComboBox() {
-        @Override
-        protected boolean isProjectLevel(InspectionProfileImpl p) {
-          return p.isProjectLevel();
-        }
-
-        @NotNull
-        @Override
-        protected String getProfileName(InspectionProfileImpl p) {
-          return p.getDisplayName();
-        }
-
         @Override
         protected void onProfileChosen(InspectionProfileImpl inspectionProfile) {
           //do nothing here
index 403e1cc2ca9001bc9cabf12bd94cd179d1c85ba2..8b2520a2cf406ba633850ada0e7ffabdbb8224b3 100644 (file)
@@ -34,6 +34,7 @@ import com.intellij.ide.ui.search.SearchableOptionsRegistrar;
 import com.intellij.lang.annotation.HighlightSeverity;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.colors.TextAttributesKey;
 import com.intellij.openapi.editor.markup.TextAttributes;
@@ -44,7 +45,6 @@ import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.JDOMUtil;
 import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.profile.Profile;
 import com.intellij.profile.ProfileManager;
 import com.intellij.profile.codeInspection.InspectionProfileManager;
 import com.intellij.profile.codeInspection.ProjectInspectionProfileManager;
@@ -67,6 +67,7 @@ import com.intellij.util.ui.JBInsets;
 import com.intellij.util.ui.JBUI;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.util.ui.tree.TreeUtil;
+import gnu.trove.THashMap;
 import gnu.trove.THashSet;
 import org.jdom.Element;
 import org.jetbrains.annotations.NonNls;
@@ -90,12 +91,6 @@ import java.io.StringReader;
 import java.util.*;
 import java.util.List;
 
-import com.intellij.util.containers.Queue;
-
-/**
- * User: anna
- * Date: 31-May-2006
- */
 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";
@@ -104,13 +99,12 @@ public class SingleInspectionProfilePanel extends JPanel {
 
   private static final float DIVIDER_PROPORTION_DEFAULT = 0.5f;
 
-  private final List<ToolDescriptors> myInitialToolDescriptors = new ArrayList<>();
+  private final Map<HighlightDisplayKey, ToolDescriptors> myInitialToolDescriptors = new THashMap<>();
   private final InspectionConfigTreeNode myRoot =
-    new InspectionConfigTreeNode(InspectionsBundle.message("inspection.root.node.title"));
+    new InspectionConfigTreeNode.Group(InspectionsBundle.message("inspection.root.node.title"));
   private final Alarm myAlarm = new Alarm();
   private final ProjectInspectionProfileManager myProjectProfileManager;
-  @NotNull private Profile myOriginal;
-  private InspectionProfileImpl mySelectedProfile;
+  private InspectionProfileImpl myProfile;
   private JEditorPane myBrowser;
   private JPanel myOptionsPanel;
   private JPanel myInspectionProfilePanel = null;
@@ -124,12 +118,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   private boolean myModified = false;
   private InspectionsConfigTreeTable myTreeTable;
   private TreeExpander myTreeExpander;
-  @NotNull
-  private String myCurrentProfileName;
   private boolean myIsInRestore = false;
-  private boolean myIsProjectLevel;
-  private JBSplitter myRightSplitter;
-  private JBSplitter myMainSplitter;
 
   private String[] myInitialScopesOrder;
   private Disposable myDisposable = new Disposable() {
@@ -138,15 +127,14 @@ public class SingleInspectionProfilePanel extends JPanel {
   };
 
   public SingleInspectionProfilePanel(@NotNull ProjectInspectionProfileManager projectProfileManager,
-                                      @NotNull String inspectionProfileName,
-                                      @NotNull ModifiableModel profile,
-                                      @NotNull Profile original) {
+                                      @NotNull ModifiableModel profile) {
     super(new BorderLayout());
     myProjectProfileManager = projectProfileManager;
-    myOriginal = original;
-    mySelectedProfile = (InspectionProfileImpl)profile;
-    myCurrentProfileName = inspectionProfileName;
-    myIsProjectLevel = profile.getProfileManager() == projectProfileManager;
+    myProfile = (InspectionProfileImpl)profile;
+  }
+
+  public Map<HighlightDisplayKey, ToolDescriptors> getInitialToolDescriptors() {
+    return myInitialToolDescriptors;
   }
 
   private static VisibleTreeState getExpandedNodes(InspectionProfileImpl profile) {
@@ -194,7 +182,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
   public static String renderSeverity(HighlightSeverity severity) {
     if (HighlightSeverity.INFORMATION.equals(severity)) return "No highlighting, only fix"; //todo severity presentation
-    return StringUtil.capitalizeWords(severity.getName().toLowerCase(), true);
+    return StringUtil.capitalizeWords(severity.getName().toLowerCase(Locale.US), true);
   }
 
   private static void updateUpHierarchy(final InspectionConfigTreeNode parent) {
@@ -228,7 +216,7 @@ public class SingleInspectionProfilePanel extends JPanel {
         }
       }
       final String description = descriptor.getToolWrapper().loadDescription();
-      if (description != null && StringUtil.containsIgnoreCase(description.toLowerCase(), stripped)) {
+      if (description != null && StringUtil.containsIgnoreCase(description.toLowerCase(Locale.US), stripped)) {
         if (!forceInclude) return true;
       } else if (forceInclude) return false;
     }
@@ -291,7 +279,7 @@ public class SingleInspectionProfilePanel extends JPanel {
         return child;
       }
     }
-    InspectionConfigTreeNode child = new InspectionConfigTreeNode(group);
+    InspectionConfigTreeNode child = new InspectionConfigTreeNode.Group(group);
     root.add(child);
     return child;
   }
@@ -329,8 +317,8 @@ public class SingleInspectionProfilePanel extends JPanel {
       @Override
       public void stateChanged() {
         //invoke after all other listeners
-        SwingUtilities.invokeLater(() -> {
-          if (mySelectedProfile == null) return; //panel was disposed
+        ApplicationManager.getApplication().invokeLater(() -> {
+          if (myProfile == null) return; //panel was disposed
           updateProperSettingsForSelection();
           wereToolSettingsModified();
         });
@@ -342,7 +330,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private void updateSelectedProfileState() {
-    if (mySelectedProfile == null) return;
+    if (myProfile == null) return;
     restoreTreeState();
     repaintTableData();
     updateSelection();
@@ -361,7 +349,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private void loadDescriptorsConfigs(boolean onlyModified) {
-    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors) {
+    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors.values()) {
       loadDescriptorConfig(toolDescriptors.getDefaultDescriptor(), onlyModified);
       for (Descriptor descriptor : toolDescriptors.getNonDefaultDescriptors()) {
         loadDescriptorConfig(descriptor, onlyModified);
@@ -370,13 +358,13 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private void loadDescriptorConfig(Descriptor descriptor, boolean ifModifier) {
-    if (!ifModifier || mySelectedProfile.isProperSetting(descriptor.getKey().toString())) {
+    if (!ifModifier || myProfile.isProperSetting(descriptor.getKey().toString())) {
       descriptor.loadConfig();
     }
   }
 
   private void wereToolSettingsModified() {
-    for (final ToolDescriptors toolDescriptor : myInitialToolDescriptors) {
+    for (final ToolDescriptors toolDescriptor : myInitialToolDescriptors.values()) {
       Descriptor desc = toolDescriptor.getDefaultDescriptor();
       if (wereToolSettingsModified(desc, true)) return;
       List<Descriptor> descriptors = toolDescriptor.getNonDefaultDescriptors();
@@ -388,7 +376,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private boolean wereToolSettingsModified(Descriptor descriptor, boolean isDefault) {
-    if (!mySelectedProfile.isToolEnabled(descriptor.getKey(), descriptor.getScope(), myProjectProfileManager.getProject())) {
+    if (!myProfile.isToolEnabled(descriptor.getKey(), descriptor.getScope(), myProjectProfileManager.getProject())) {
       return false;
     }
     Element oldConfig = descriptor.getConfig();
@@ -396,11 +384,9 @@ public class SingleInspectionProfilePanel extends JPanel {
 
     ScopeToolState state = null;
     if (isDefault) {
-      state =
-        mySelectedProfile.getToolDefaultState(descriptor.getKey().toString(), myProjectProfileManager.getProject());
+      state = myProfile.getToolDefaultState(descriptor.getKey().toString(), myProjectProfileManager.getProject());
     } else {
-      for (ScopeToolState candidate : mySelectedProfile
-        .getNonDefaultTools(descriptor.getKey().toString(), myProjectProfileManager.getProject())) {
+      for (ScopeToolState candidate : myProfile.getNonDefaultTools(descriptor.getKey().toString(), myProjectProfileManager.getProject())) {
         final String scope = descriptor.getScopeName();
         if (Comparing.equal(candidate.getScopeName(), scope)) {
           state = candidate;
@@ -429,7 +415,7 @@ public class SingleInspectionProfilePanel extends JPanel {
       InspectionConfigTreeNode node = (InspectionConfigTreeNode)selectionPath.getLastPathComponent();
       final Descriptor descriptor = node.getDefaultDescriptor();
       if (descriptor != null) {
-        final boolean properSetting = mySelectedProfile.isProperSetting(descriptor.getKey().toString());
+        final boolean properSetting = myProfile.isProperSetting(descriptor.getKey().toString());
         if (node.isProperSetting() != properSetting) {
           myAlarm.cancelAllRequests();
           myAlarm.addRequest(() -> myTreeTable.repaint(), 300);
@@ -441,15 +427,16 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private void initToolStates() {
-    final InspectionProfileImpl profile = mySelectedProfile;
+    final InspectionProfileImpl profile = myProfile;
     if (profile == null) return;
     myInitialToolDescriptors.clear();
     final Project project = myProjectProfileManager.getProject();
     for (final ScopeToolState state : profile.getDefaultStates(myProjectProfileManager.getProject())) {
       if (!accept(state.getTool())) continue;
-      myInitialToolDescriptors.add(ToolDescriptors.fromScopeToolState(state, profile, project));
+      final ToolDescriptors descriptors = ToolDescriptors.fromScopeToolState(state, profile, project);
+      myInitialToolDescriptors.put(descriptors.getDefaultDescriptor().getKey(), descriptors);
     }
-    myInitialScopesOrder = mySelectedProfile.getScopesOrder();
+    myInitialScopesOrder = myProfile.getScopesOrder();
   }
 
   protected boolean accept(InspectionToolWrapper entry) {
@@ -459,7 +446,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   private void postProcessModification() {
     wereToolSettingsModified();
     //resetup configs
-    for (ScopeToolState state : mySelectedProfile.getAllTools(myProjectProfileManager.getProject())) {
+    for (ScopeToolState state : myProfile.getAllTools(myProjectProfileManager.getProject())) {
       state.resetConfigPanel();
     }
     fillTreeData(myProfileFilter.getFilter(), true);
@@ -473,7 +460,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
   private void filterTree(@Nullable String filter) {
     if (myTreeTable != null) {
-      getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
+      getExpandedNodes(myProfile).saveVisibleState(myTreeTable.getTree());
       fillTreeData(filter, true);
       reloadModel();
       restoreTreeState();
@@ -502,7 +489,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
     try {
       myIsInRestore = true;
-      getExpandedNodes(mySelectedProfile).restoreVisibleState(myTreeTable.getTree());
+      getExpandedNodes(myProfile).restoreVisibleState(myTreeTable.getTree());
     }
     finally {
       myIsInRestore = false;
@@ -514,7 +501,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
     DefaultActionGroup actions = new DefaultActionGroup();
 
-    actions.add(new InspectionFilterAction(mySelectedProfile, myInspectionsFilter, myProjectProfileManager.getProject(), myProfileFilter));
+    actions.add(new InspectionFilterAction(myProfile, myInspectionsFilter, myProjectProfileManager.getProject(), myProfileFilter));
     actions.addSeparator();
 
     actions.add(actionManager.createExpandAllAction(myTreeExpander, myTreeTable));
@@ -523,12 +510,12 @@ public class SingleInspectionProfilePanel extends JPanel {
 
       @Override
       public void update(@NotNull AnActionEvent e) {
-        e.getPresentation().setEnabled(mySelectedProfile != null && mySelectedProfile.isExecutable(myProjectProfileManager.getProject()));
+        e.getPresentation().setEnabled(myProfile != null && myProfile.isExecutable(myProjectProfileManager.getProject()));
       }
 
       @Override
       public void actionPerformed(@NotNull AnActionEvent e) {
-        mySelectedProfile.resetToEmpty(e.getProject());
+        myProfile.resetToEmpty(e.getProject());
         loadDescriptorsConfigs(false);
         postProcessModification();
       }
@@ -537,7 +524,7 @@ public class SingleInspectionProfilePanel extends JPanel {
     actions.add(new AdvancedSettingsAction(myProjectProfileManager.getProject(), myRoot) {
       @Override
       protected InspectionProfileImpl getInspectionProfile() {
-        return mySelectedProfile;
+        return myProfile;
       }
 
       @Override
@@ -555,7 +542,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
   private void repaintTableData() {
     if (myTreeTable != null) {
-      getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
+      getExpandedNodes(myProfile).saveVisibleState(myTreeTable.getTree());
       reloadModel();
       restoreTreeState();
     }
@@ -615,7 +602,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
       @Override
       public InspectionProfileImpl getInspectionProfile() {
-        return mySelectedProfile;
+        return myProfile;
       }
     }, myDisposable);
     myTreeTable.setTreeCellRenderer(renderer);
@@ -635,7 +622,7 @@ public class SingleInspectionProfilePanel extends JPanel {
         }
 
         if (!myIsInRestore) {
-          InspectionProfileImpl selected = mySelectedProfile;
+          InspectionProfileImpl selected = myProfile;
           if (selected != null) {
             InspectionProfileImpl baseProfile = (InspectionProfileImpl)selected.getParentProfile();
             if (baseProfile != null) {
@@ -667,8 +654,7 @@ public class SingleInspectionProfilePanel extends JPanel {
       public String convert(TreePath o) {
         final InspectionConfigTreeNode node = (InspectionConfigTreeNode)o.getLastPathComponent();
         final Descriptor descriptor = node.getDefaultDescriptor();
-        return descriptor != null ? InspectionsConfigTreeComparator.getDisplayTextToSort(descriptor.getText()) : InspectionsConfigTreeComparator
-          .getDisplayTextToSort(node.getGroupName());
+        return InspectionsConfigTreeComparator.getDisplayTextToSort(descriptor != null ? descriptor.getText() : node.getGroupName());
       }
     });
 
@@ -684,7 +670,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
       @Override
       public void treeCollapsed(TreeExpansionEvent event) {
-        InspectionProfileImpl selected = mySelectedProfile;
+        InspectionProfileImpl selected = myProfile;
         final InspectionProfileImpl parentProfile = (InspectionProfileImpl)selected.getParentProfile();
         if (parentProfile != null) {
           getExpandedNodes(parentProfile).saveVisibleState(myTreeTable.getTree());
@@ -694,7 +680,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
       @Override
       public void treeExpanded(TreeExpansionEvent event) {
-        InspectionProfileImpl selected = mySelectedProfile;
+        InspectionProfileImpl selected = myProfile;
         if (selected != null) {
           final InspectionConfigTreeNode node = (InspectionConfigTreeNode)event.getPath().getLastPathComponent();
           final InspectionProfileImpl parentProfile = (InspectionProfileImpl)selected.getParentProfile();
@@ -724,7 +710,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
   private JPopupMenu compoundPopup() {
     final DefaultActionGroup group = new DefaultActionGroup();
-    final SeverityRegistrar severityRegistrar = ((SeverityProvider)mySelectedProfile.getProfileManager()).getOwnSeverityRegistrar();
+    final SeverityRegistrar severityRegistrar = ((SeverityProvider)myProfile.getProfileManager()).getOwnSeverityRegistrar();
     for (HighlightSeverity severity : LevelChooserAction.getSeverities(severityRegistrar, includeDoNotShow())) {
       final HighlightDisplayLevel level = HighlightDisplayLevel.find(severity);
       group.add(new AnAction(renderSeverity(severity), renderSeverity(severity), level.getIcon()) {
@@ -753,13 +739,13 @@ public class SingleInspectionProfilePanel extends JPanel {
   private boolean includeDoNotShow(List<InspectionConfigTreeNode> nodes) {
     final Project project = myProjectProfileManager.getProject();
     return !nodes.stream()
-      .filter(node -> mySelectedProfile.getToolDefaultState(node.getKey().toString(), project).getTool() instanceof GlobalInspectionToolWrapper)
+      .filter(node -> myProfile.getToolDefaultState(node.getKey().toString(), project).getTool() instanceof GlobalInspectionToolWrapper)
       .findFirst()
       .isPresent();
   }
 
   private void fillTreeData(@Nullable String filter, boolean forceInclude) {
-    if (mySelectedProfile == null) return;
+    if (myProfile == null) return;
     myRoot.removeAllChildren();
     myRoot.dropCache();
     List<Set<String>> keySetList = new ArrayList<>();
@@ -769,13 +755,14 @@ public class SingleInspectionProfilePanel extends JPanel {
     }
     Project project = myProjectProfileManager.getProject();
     final boolean emptyFilter = myInspectionsFilter.isEmptyFilter();
-    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors) {
+    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors.values()) {
       final Descriptor descriptor = toolDescriptors.getDefaultDescriptor();
       if (filter != null && !filter.isEmpty() && !isDescriptorAccepted(descriptor, filter, forceInclude, keySetList, quoted)) {
         continue;
       }
-      final InspectionConfigTreeNode node = new InspectionConfigTreeNode(toolDescriptors);
-      if (!emptyFilter && !myInspectionsFilter.matches(mySelectedProfile.getTools(toolDescriptors.getDefaultDescriptor().getKey().toString(), project), node)) {
+      final InspectionConfigTreeNode node = new InspectionConfigTreeNode.Tool(toolDescriptors.getDefaultDescriptor().getKey(), this);
+      if (!emptyFilter && !myInspectionsFilter.matches(
+        myProfile.getTools(toolDescriptors.getDefaultDescriptor().getKey().toString(), project), node)) {
         continue;
       }
       getGroupNode(myRoot, toolDescriptors.getDefaultDescriptor().getGroup()).add(node);
@@ -809,7 +796,7 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private void updateOptionsAndDescriptionPanel(final TreePath... paths) {
-    if (mySelectedProfile == null || paths == null || paths.length == 0) {
+    if (myProfile == null || paths == null || paths.length == 0) {
       return;
     }
     final TreePath path = paths[0];
@@ -819,7 +806,9 @@ public class SingleInspectionProfilePanel extends JPanel {
       final InspectionConfigTreeNode singleNode = paths.length == 1 && ((InspectionConfigTreeNode)paths[0].getLastPathComponent()).getDefaultDescriptor() != null
                                                   ? ContainerUtil.getFirstItem(nodes) : null;
       if (singleNode != null) {
-        if (singleNode.getDefaultDescriptor().loadDescription() != null) {
+        final Descriptor descriptor = singleNode.getDefaultDescriptor();
+        LOG.assertTrue(descriptor != null);
+        if (descriptor.loadDescription() != null) {
           // need this in order to correctly load plugin-supplied descriptions
           final Descriptor defaultDescriptor = singleNode.getDefaultDescriptor();
           final String description = defaultDescriptor.loadDescription();
@@ -851,7 +840,7 @@ public class SingleInspectionProfilePanel extends JPanel {
 
       final Set<String> scopesNames = new THashSet<>();
       for (final InspectionConfigTreeNode node : nodes) {
-        final List<ScopeToolState> nonDefaultTools = mySelectedProfile.getNonDefaultTools(node.getDefaultDescriptor().getKey().toString(), project);
+        final List<ScopeToolState> nonDefaultTools = myProfile.getNonDefaultTools(node.getDefaultDescriptor().getKey().toString(), project);
         for (final ScopeToolState tool : nonDefaultTools) {
           scopesNames.add(tool.getScopeName());
         }
@@ -861,7 +850,7 @@ public class SingleInspectionProfilePanel extends JPanel {
       if (scopesNames.isEmpty()) {
 
         final LevelChooserAction severityLevelChooser =
-          new LevelChooserAction(((SeverityProvider)mySelectedProfile.getProfileManager()).getOwnSeverityRegistrar(),
+          new LevelChooserAction(((SeverityProvider)myProfile.getProfileManager()).getOwnSeverityRegistrar(),
                                  includeDoNotShow(nodes)) {
             @Override
             protected void onChosen(final HighlightSeverity severity) {
@@ -869,8 +858,8 @@ public class SingleInspectionProfilePanel extends JPanel {
               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, null, project);
+                final boolean toUpdate = myProfile.getErrorLevel(key, scope, project) != level;
+                myProfile.setErrorLevel(key, level, null, project);
                 if (toUpdate) node.dropCache();
               }
               myTreeTable.updateUI();
@@ -880,7 +869,7 @@ public class SingleInspectionProfilePanel extends JPanel {
           ScopesAndSeveritiesTable.getSeverity(ContainerUtil.map(nodes, node -> node.getDefaultDescriptor().getState()));
         severityLevelChooser.setChosen(severity);
 
-        final ScopesChooser scopesChooser = new ScopesChooser(ContainerUtil.map(nodes, node -> node.getDefaultDescriptor()), mySelectedProfile, project, null) {
+        final ScopesChooser scopesChooser = new ScopesChooser(ContainerUtil.map(nodes, node -> node.getDefaultDescriptor()), myProfile, project, null) {
           @Override
           protected void onScopesOrderChanged() {
             myTreeTable.updateUI();
@@ -913,7 +902,7 @@ public class SingleInspectionProfilePanel extends JPanel {
                                                  JBUI.insets(2, 0), 0, 0));
         severityPanelWeightY = 0.0;
         if (singleNode != null) {
-          setConfigPanel(configPanelAnchor, mySelectedProfile.getToolDefaultState(singleNode.getDefaultDescriptor().getKey().toString(),
+          setConfigPanel(configPanelAnchor, myProfile.getToolDefaultState(singleNode.getDefaultDescriptor().getKey().toString(),
                                                                                   project));
         }
       }
@@ -924,7 +913,7 @@ public class SingleInspectionProfilePanel extends JPanel {
           }
         }
         final JTable scopesAndScopesAndSeveritiesTable =
-          new ScopesAndSeveritiesTable(new ScopesAndSeveritiesTable.TableSettings(nodes, mySelectedProfile, project) {
+          new ScopesAndSeveritiesTable(new ScopesAndSeveritiesTable.TableSettings(nodes, myProfile, project) {
             @Override
             protected void onScopeChosen(@NotNull final ScopeToolState state) {
               setConfigPanel(configPanelAnchor, state);
@@ -1013,7 +1002,7 @@ public class SingleInspectionProfilePanel extends JPanel {
     final Project project = myProjectProfileManager.getProject();
     for (final InspectionConfigTreeNode node : nodes) {
       final String toolId = node.getDefaultDescriptor().getKey().toString();
-      if (mySelectedProfile.getTools(toolId, project).isEnabled()) {
+      if (myProfile.getTools(toolId, project).isEnabled()) {
         return true;
       }
     }
@@ -1037,22 +1026,18 @@ public class SingleInspectionProfilePanel extends JPanel {
   }
 
   private boolean setSelectedProfileModified(boolean modified) {
-    mySelectedProfile.setModified(modified);
+    myProfile.setModified(modified);
     return modified;
   }
 
-  public ModifiableModel getSelectedProfile() {
-    return mySelectedProfile;
+  public ModifiableModel getProfile() {
+    return myProfile;
   }
 
-  private void setSelectedProfile(final ModifiableModel modifiableModel) {
-    if (mySelectedProfile == modifiableModel) return;
-    mySelectedProfile = (InspectionProfileImpl)modifiableModel;
-    if (mySelectedProfile != null) {
-      myCurrentProfileName = mySelectedProfile.getName();
-    }
+  private void setProfile(final ModifiableModel modifiableModel) {
+    if (myProfile == modifiableModel) return;
+    myProfile = (InspectionProfileImpl)modifiableModel;
     initToolStates();
-    filterTree();
   }
 
   @Override
@@ -1066,12 +1051,12 @@ public class SingleInspectionProfilePanel extends JPanel {
     }
     myAlarm.cancelAllRequests();
     myProfileFilter.dispose();
-    if (mySelectedProfile != null) {
-      for (ScopeToolState state : mySelectedProfile.getAllTools(myProjectProfileManager.getProject())) {
+    if (myProfile != null) {
+      for (ScopeToolState state : myProfile.getAllTools(myProjectProfileManager.getProject())) {
         state.resetConfigPanel();
       }
     }
-    mySelectedProfile = null;
+    myProfile = null;
     Disposer.dispose(myDisposable);
     myDisposable = null;
   }
@@ -1091,13 +1076,14 @@ public class SingleInspectionProfilePanel extends JPanel {
                                                                    new JBInsets(2, 2, 0, 0)));
     descriptionPanel.add(ScrollPaneFactory.createScrollPane(myBrowser), BorderLayout.CENTER);
 
-    myRightSplitter = new JBSplitter(true, "SingleInspectionProfilePanel.HORIZONTAL_DIVIDER_PROPORTION", DIVIDER_PROPORTION_DEFAULT);
-    myRightSplitter.setFirstComponent(descriptionPanel);
+    JBSplitter rightSplitter =
+      new JBSplitter(true, "SingleInspectionProfilePanel.HORIZONTAL_DIVIDER_PROPORTION", DIVIDER_PROPORTION_DEFAULT);
+    rightSplitter.setFirstComponent(descriptionPanel);
 
     myOptionsPanel = new JPanel(new GridBagLayout());
     initOptionsAndDescriptionPanel();
-    myRightSplitter.setSecondComponent(myOptionsPanel);
-    myRightSplitter.setHonorComponentsMinimumSize(true);
+    rightSplitter.setSecondComponent(myOptionsPanel);
+    rightSplitter.setHonorComponentsMinimumSize(true);
 
     final JScrollPane tree = initTreeScrollPane();
 
@@ -1109,34 +1095,36 @@ public class SingleInspectionProfilePanel extends JPanel {
     northPanel.add(createTreeToolbarPanel().getComponent(), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL,
                                                                                    JBUI.emptyInsets(), 0, 0));
 
-    myMainSplitter = new OnePixelSplitter(false, DIVIDER_PROPORTION_DEFAULT, 0.01f, 0.99f);
-    myMainSplitter.setSplitterProportionKey("SingleInspectionProfilePanel.VERTICAL_DIVIDER_PROPORTION");
-    myMainSplitter.setFirstComponent(tree);
-    myMainSplitter.setSecondComponent(myRightSplitter);
-    myMainSplitter.setHonorComponentsMinimumSize(false);
+    JBSplitter mainSplitter = new OnePixelSplitter(false, DIVIDER_PROPORTION_DEFAULT, 0.01f, 0.99f);
+    mainSplitter.setSplitterProportionKey("SingleInspectionProfilePanel.VERTICAL_DIVIDER_PROPORTION");
+    mainSplitter.setFirstComponent(tree);
+    mainSplitter.setSecondComponent(rightSplitter);
+    mainSplitter.setHonorComponentsMinimumSize(false);
 
     final JPanel panel = new JPanel(new BorderLayout());
     panel.add(northPanel, BorderLayout.NORTH);
-    panel.add(myMainSplitter, BorderLayout.CENTER);
+    panel.add(mainSplitter, BorderLayout.CENTER);
     return panel;
   }
 
   public boolean isModified() {
     if (myModified) return true;
-    if (mySelectedProfile.isChanged()) return true;
-    if (myIsProjectLevel != (mySelectedProfile.getProfileManager() == myProjectProfileManager)) return true;
-    if (!Comparing.strEqual(myCurrentProfileName, mySelectedProfile.getName())) return true;
-    if (!Comparing.equal(myInitialScopesOrder, mySelectedProfile.getScopesOrder())) return true;
+    if (myProfile.isChanged()) return true;
+    if (myProfile.getParentProfile().isProjectLevel() != myProfile.isProjectLevel()) return true;
+    if (!Comparing.strEqual(myProfile.getParentProfile().getName(), myProfile.getName())) return true;
+    if (!Comparing.equal(myInitialScopesOrder, myProfile.getScopesOrder())) return true;
     return descriptorsAreChanged();
   }
 
   public void reset() {
     myModified = false;
-    setSelectedProfile(mySelectedProfile);
+    setProfile(myProfile);
+    filterTree();
     final String filter = myProfileFilter.getFilter();
     myProfileFilter.reset();
     myProfileFilter.setSelectedItem(filter);
-    myIsProjectLevel = mySelectedProfile.getProfileManager() == myProjectProfileManager;
+    myProfile.setName(myProfile.getParentProfile().getName());
+    myProfile.setProjectLevel(myProfile.getParentProfile().isProjectLevel());
   }
 
   public void apply() throws ConfigurationException {
@@ -1144,56 +1132,53 @@ public class SingleInspectionProfilePanel extends JPanel {
     if (!modified) {
       return;
     }
-    final ModifiableModel selectedProfile = getSelectedProfile();
+    final ModifiableModel selectedProfile = getProfile();
 
-    ProfileManager profileManager = myIsProjectLevel ? myProjectProfileManager : InspectionProfileManager.getInstance();
-    selectedProfile.setProjectLevel(myIsProjectLevel);
+    ProfileManager profileManager = selectedProfile.isProjectLevel() ? myProjectProfileManager : InspectionProfileManager.getInstance();
     if (selectedProfile.getProfileManager() != profileManager) {
-      if (selectedProfile.getProfileManager().getProfile(selectedProfile.getName(), false) == myOriginal) {
+      if (selectedProfile.getProfileManager().getProfile(selectedProfile.getName(), false) == myProfile.getParentProfile()) {
         selectedProfile.getProfileManager().deleteProfile(selectedProfile.getName());
       }
-      selectedProfile.setName(myCurrentProfileName);
       copyUsedSeveritiesIfUndefined(selectedProfile, profileManager);
       selectedProfile.setProfileManager(profileManager);
     } else {
-      if (!Comparing.equal(myCurrentProfileName, selectedProfile.getName())) {
-        if (selectedProfile.getProfileManager().getProfile(selectedProfile.getName(), false) == myOriginal) {
-          selectedProfile.getProfileManager().deleteProfile(selectedProfile.getName());
-        }
-        selectedProfile.setName(myCurrentProfileName);
-        selectedProfile.getProfileManager().updateProfile(selectedProfile);
+      if (selectedProfile.getProfileManager().getProfile(selectedProfile.getName(), false) == myProfile.getParentProfile()) {
+        selectedProfile.getProfileManager().deleteProfile(selectedProfile.getName());
       }
+      selectedProfile.getProfileManager().updateProfile(selectedProfile);
     }
 
     InspectionProfile parentProfile = selectedProfile.getParentProfile();
     selectedProfile.commit();
-    setSelectedProfile(parentProfile.getModifiableModel());
+    myProfile = (InspectionProfileImpl)parentProfile.getModifiableModel();
     setSelectedProfileModified(false);
     myModified = false;
-    myOriginal = selectedProfile.getProfileManager().getProfile(selectedProfile.getName());
+    myRoot.dropCache();
+    initToolStates();
+    updateOptionsAndDescriptionPanel();
   }
 
   private boolean descriptorsAreChanged() {
-    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors) {
+    for (ToolDescriptors toolDescriptors : myInitialToolDescriptors.values()) {
       Descriptor desc = toolDescriptors.getDefaultDescriptor();
       Project project = myProjectProfileManager.getProject();
-      if (mySelectedProfile.isToolEnabled(desc.getKey(), null, project) != desc.isEnabled()){
+      if (myProfile.isToolEnabled(desc.getKey(), null, project) != desc.isEnabled()){
         return true;
       }
-      if (mySelectedProfile.getErrorLevel(desc.getKey(), desc.getScope(), project) != desc.getLevel()) {
+      if (myProfile.getErrorLevel(desc.getKey(), desc.getScope(), project) != desc.getLevel()) {
         return true;
       }
       final List<Descriptor> descriptors = toolDescriptors.getNonDefaultDescriptors();
       for (Descriptor descriptor : descriptors) {
-        if (mySelectedProfile.isToolEnabled(descriptor.getKey(), descriptor.getScope(), project) != descriptor.isEnabled()) {
+        if (myProfile.isToolEnabled(descriptor.getKey(), descriptor.getScope(), project) != descriptor.isEnabled()) {
           return true;
         }
-        if (mySelectedProfile.getErrorLevel(descriptor.getKey(), descriptor.getScope(), project) != descriptor.getLevel()) {
+        if (myProfile.getErrorLevel(descriptor.getKey(), descriptor.getScope(), project) != descriptor.getLevel()) {
           return true;
         }
       }
 
-      final List<ScopeToolState> tools = mySelectedProfile.getNonDefaultTools(desc.getKey().toString(), project);
+      final List<ScopeToolState> tools = myProfile.getNonDefaultTools(desc.getKey().toString(), project);
       if (tools.size() != descriptors.size()) {
         return true;
       }
@@ -1209,23 +1194,6 @@ public class SingleInspectionProfilePanel extends JPanel {
     return false;
   }
 
-  public boolean isProjectLevel() {
-    return myIsProjectLevel;
-  }
-
-  public void setIsProjectLevel(boolean value) {
-    myIsProjectLevel = value;
-  }
-
-  @NotNull
-  public String getCurrentProfileName() {
-    return myCurrentProfileName;
-  }
-
-  public void setCurrentProfileName(@NotNull String currentProfileName) {
-    myCurrentProfileName = currentProfileName;
-  }
-
   @Override
   public void setVisible(boolean aFlag) {
     if (aFlag && myInspectionProfilePanel == null) {
@@ -1279,7 +1247,7 @@ public class SingleInspectionProfilePanel extends JPanel {
                                 final boolean showOptionsAndDescriptorPanels,
                                 @NotNull HighlightDisplayLevel level) {
     final HighlightDisplayKey key = child.getDefaultDescriptor().getKey();
-    mySelectedProfile.setErrorLevel(key, level, null, myProjectProfileManager.getProject());
+    myProfile.setErrorLevel(key, level, null, myProjectProfileManager.getProject());
     child.dropCache();
     if (showOptionsAndDescriptorPanels) {
       updateOptionsAndDescriptionPanel(new TreePath(child.getPath()));
@@ -1302,9 +1270,9 @@ public class SingleInspectionProfilePanel extends JPanel {
 
     @Override
     protected void onlineFilter() {
-      if (mySelectedProfile == null) return;
+      if (myProfile == null) return;
       final String filter = getFilter();
-      getExpandedNodes(mySelectedProfile).saveVisibleState(myTreeTable.getTree());
+      getExpandedNodes(myProfile).saveVisibleState(myTreeTable.getTree());
       fillTreeData(filter, true);
       reloadModel();
       if (filter == null || filter.isEmpty()) {
index 9cdd409e14a8134a5d8ca20e14be10a5a521084c..7cfc0ee621fa834ba986e73f3cd22e037f78b653 100644 (file)
@@ -38,10 +38,7 @@ import com.intellij.openapi.options.ConfigurationException;
 import com.intellij.openapi.options.SearchableConfigurable;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Disposer;
-import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VfsUtilCore;
@@ -55,7 +52,6 @@ import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.util.Alarm;
 import com.intellij.util.SystemProperties;
-import com.intellij.util.containers.HashMap;
 import com.intellij.util.ui.JBUI;
 import com.intellij.util.ui.UIUtil;
 import org.jdom.Document;
@@ -72,6 +68,7 @@ import java.util.*;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 public abstract class InspectionToolsConfigurable extends BaseConfigurable
   implements ErrorsConfigurable, SearchableConfigurable, Configurable.NoScroll {
@@ -84,12 +81,10 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
 
   protected final InspectionProfileManager myApplicationProfileManager;
   protected final ProjectInspectionProfileManager myProjectProfileManager;
-  private final CardLayout myLayout = new CardLayout();
-  private final Map<Profile, SingleInspectionProfilePanel> myPanels =
-    new HashMap<>();
+  private final List<SingleInspectionProfilePanel> myPanels = new ArrayList<>();
   private final List<Profile> myDeletedProfiles = new ArrayList<>();
   protected ProfilesChooser myProfiles;
-  private JPanel myPanel;
+  private JPanel myProfilePanelHolder;
   private AuxiliaryRightPanel myAuxiliaryRightPanel;
   private Alarm mySelectionAlarm;
 
@@ -115,9 +110,9 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
                                                  boolean modifyName,
                                                  boolean modifyLevel) {
     LOG.assertTrue(modifyLevel || modifyName);
-    String profileDefaultName = getProfilePanel(selectedProfile).getCurrentProfileName();
+    String profileDefaultName = selectedProfile.getName();
 
-    final boolean isProjectLevel = getProfilePanel(selectedProfile).isProjectLevel() ^ modifyLevel;
+    final boolean isProjectLevel = selectedProfile.isProjectLevel() ^ modifyLevel;
     if (modifyName) {
       final Matcher matcher = COPIED_PROFILE_SUFFIX_PATTERN.matcher(profileDefaultName);
       int nextIdx;
@@ -152,17 +147,14 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
 
     final InspectionProfileImpl modifiableModel = inspectionProfile.getModifiableModel();
     modifiableModel.setModified(true);
-    addProfile(modifiableModel, inspectionProfile);
+    addProfile(modifiableModel);
     return modifiableModel;
   }
 
-  protected void addProfile(InspectionProfileImpl model, InspectionProfileImpl profile) {
-    final String modelName = model.getName();
-    final SingleInspectionProfilePanel panel = createPanel(model, profile, modelName);
-    myPanel.add(getCardName(model), panel);
-
+  protected void addProfile(InspectionProfileImpl model) {
+    final SingleInspectionProfilePanel panel = createPanel(model);
+    myPanels.add(panel);
     myProfiles.getProfilesComboBox().addProfile(model);
-    putProfile(model, panel);
     myProfiles.getProfilesComboBox().selectProfile(model);
   }
 
@@ -204,10 +196,10 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     final JPanel toolbar = new JPanel();
     toolbar.setBorder(BorderFactory.createEmptyBorder(0, 0, 7, 0));
 
-    myPanel = new JPanel();
+    myProfilePanelHolder = new JPanel(new BorderLayout());
 
     wholePanel.add(toolbar, BorderLayout.PAGE_START);
-    wholePanel.add(myPanel, BorderLayout.CENTER);
+    wholePanel.add(myProfilePanelHolder, BorderLayout.CENTER);
 
     myAuxiliaryRightPanel = new AuxiliaryRightPanel(new AuxiliaryRightPanel.DescriptionSaveListener() {
       @Override
@@ -229,22 +221,9 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     myProfiles = new ProfilesChooser(myProjectProfileManager.getProject()) {
       @Override
       public void onProfileChosen(InspectionProfileImpl inspectionProfile) {
-        myLayout.show(myPanel, getCardName(inspectionProfile));
+        showProfile(inspectionProfile);
         myAuxiliaryRightPanel.showDescription(inspectionProfile.getDescription());
       }
-
-      @Override
-      protected boolean isProjectLevel(InspectionProfileImpl profile) {
-        final SingleInspectionProfilePanel panel = getProfilePanel(profile);
-        return panel == null ? profile.isProjectLevel() : panel.isProjectLevel();
-      }
-
-      @NotNull
-      @Override
-      protected String getProfileName(InspectionProfileImpl p) {
-        final SingleInspectionProfilePanel panel = getProfilePanel(p);
-        return panel == null ? p.getDisplayName(): panel.getCurrentProfileName();
-      }
     };
     JPanel profilesHolder = new JPanel();
     profilesHolder.setLayout(new CardLayout());
@@ -254,12 +233,12 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
       @Override
       public boolean isProjectLevel() {
         SingleInspectionProfilePanel panel = getSelectedPanel();
-        return panel != null && panel.isProjectLevel();
+        return panel != null && panel.getProfile().isProjectLevel();
       }
 
       @Override
       public boolean canChangeProfileLevel() {
-        return !hasName(getSelectedPanel().getCurrentProfileName(), !isProjectLevel());
+        return !hasName(getSelectedPanel().getProfile().getName(), !isProjectLevel());
       }
 
       @Override
@@ -273,7 +252,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
       public void setAsGlobal() {
         final SingleInspectionProfilePanel selectedPanel = getSelectedPanel();
         LOG.assertTrue(selectedPanel != null, "No settings selectedPanel for: " + getSelectedObject());
-        selectedPanel.setIsProjectLevel(false);
+        selectedPanel.getProfile().setProjectLevel(false);
         myProfiles.getProfilesComboBox().resort();
         myProfiles.invalidate();
         myProfiles.repaint();
@@ -296,12 +275,12 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
       }
 
       private void rename(@NotNull final InspectionProfileImpl inspectionProfile) {
-        final String initialName = getSelectedPanel().getCurrentProfileName();
+        final String initialName = getSelectedPanel().getProfile().getName();
         myProfiles.showEditCard(initialName, new SaveInputComponentValidator() {
           @Override
           public void doSave(@NotNull String text) {
             if (!text.equals(initialName)) {
-              getProfilePanel(inspectionProfile).setCurrentProfileName(text);
+              inspectionProfile.setName(text);
               myProfiles.getProfilesComboBox().resort();
             }
             myProfiles.showComboBoxCard();
@@ -309,11 +288,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
 
           @Override
           public boolean checkValid(@NotNull String text) {
-            final SingleInspectionProfilePanel singleInspectionProfilePanel = myPanels.get(inspectionProfile);
-            if (singleInspectionProfilePanel == null) {
-              return false;
-            }
-            final boolean isValid = text.equals(initialName) || !hasName(text, singleInspectionProfilePanel.isProjectLevel());
+            final boolean isValid = text.equals(initialName) || !hasName(text, inspectionProfile.isProjectLevel());
             if (isValid) {
               myAuxiliaryRightPanel.showDescription(getSelectedObject().getDescription());
             }
@@ -340,6 +315,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
       public void delete() {
         final InspectionProfileImpl selectedProfile = myProfiles.getProfilesComboBox().getSelectedProfile();
         myProfiles.getProfilesComboBox().removeProfile(selectedProfile);
+        myPanels.remove(getProfilePanel(selectedProfile));
         myDeletedProfiles.add(selectedProfile);
         myProfiles.getProfilesComboBox().setSelectedIndex(0);
       }
@@ -413,7 +389,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
               }
               final ModifiableModel model = profile.getModifiableModel();
               model.setModified(true);
-              addProfile((InspectionProfileImpl)model, profile);
+              addProfile((InspectionProfileImpl)model);
 
               //TODO myDeletedProfiles ? really need this
               myDeletedProfiles.remove(profile);
@@ -448,7 +424,6 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     toolbar.add(myAuxiliaryRightPanel, new GridBagConstraints(3, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                                               JBUI.insetsLeft(15), 0, 0));
 
-    myPanel.setLayout(myLayout);
     return wholePanel;
   }
 
@@ -524,7 +499,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     if (!Comparing.equal(selectedProfile, currentProfile)) {
       return true;
     }
-    for (SingleInspectionProfilePanel panel : myPanels.values()) {
+    for (SingleInspectionProfilePanel panel : myPanels) {
       if (panel.isModified()) return true;
     }
     if (getProfiles().size() != myPanels.size()) return true;
@@ -534,31 +509,21 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
   @Override
   public void apply() throws ConfigurationException {
     SingleInspectionProfilePanel selectedPanel = getSelectedPanel();
-    for (Profile inspectionProfile : myPanels.keySet()) {
-      if (myDeletedProfiles.remove(inspectionProfile)) {
-        deleteProfile(getProfilePanel(inspectionProfile).getSelectedProfile());
-      }
-      else {
-        SingleInspectionProfilePanel panel = getProfilePanel(inspectionProfile);
-        panel.apply();
-        if (setActiveProfileAsDefaultOnApply() && panel == selectedPanel) {
-          applyRootProfile(panel.getCurrentProfileName(), panel.isProjectLevel());
-        }
+    for (Profile profile : myDeletedProfiles) {
+      deleteProfile(profile);
+    }
+    myDeletedProfiles.clear();
+
+    for (SingleInspectionProfilePanel panel : myPanels) {
+      panel.apply();
+      if (setActiveProfileAsDefaultOnApply() && panel == selectedPanel) {
+        applyRootProfile(panel.getProfile().getName(), panel.getProfile().isProjectLevel());
       }
     }
-    doReset();
   }
 
   protected abstract void applyRootProfile(@NotNull String name, boolean isProjectLevel);
 
-  private SingleInspectionProfilePanel getProfilePanel(Profile inspectionProfile) {
-    return myPanels.get(inspectionProfile);
-  }
-
-  private void putProfile(Profile profile, SingleInspectionProfilePanel panel) {
-    myPanels.put(profile, panel);
-  }
-
   private void deleteProfile(@NotNull Profile profile) {
     if (profile.getProfileManager() == myApplicationProfileManager) {
       myApplicationProfileManager.deleteProfile(profile.getName());
@@ -583,19 +548,17 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     final Collection<Profile> profiles = getProfiles();
     final List<InspectionProfileImpl> modifiableProfiles = new ArrayList<>(profiles.size());
     for (Profile profile : profiles) {
-      final String profileName = profile.getName();
       final ModifiableModel modifiableProfile = ((InspectionProfileImpl)profile).getModifiableModel();
       final InspectionProfileImpl inspectionProfile = (InspectionProfileImpl)modifiableProfile;
       modifiableProfiles.add(inspectionProfile);
-      final SingleInspectionProfilePanel panel = createPanel(inspectionProfile, profile, profileName);
-      putProfile(modifiableProfile, panel);
-      myPanel.add(getCardName(inspectionProfile), panel);
+      final SingleInspectionProfilePanel panel = createPanel(inspectionProfile);
+      myPanels.add(panel);
     }
     myProfiles.getProfilesComboBox().reset(modifiableProfiles);
     myAuxiliaryRightPanel.showDescription(getSelectedObject().getDescription());
     final InspectionProfileImpl inspectionProfile = getCurrentProfile();
     myProfiles.getProfilesComboBox().selectProfile(inspectionProfile);
-    myLayout.show(myPanel, getCardName(inspectionProfile));
+    showProfile(inspectionProfile);
     final SingleInspectionProfilePanel panel = getSelectedPanel();
     if (panel != null) {
       panel.setVisible(true);//make sure that UI was initialized
@@ -605,12 +568,8 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     }
   }
 
-  private static String getCardName(final InspectionProfileImpl inspectionProfile) {
-    return (inspectionProfile.isProjectLevel() ? "s" : "a") + inspectionProfile.getName();
-  }
-
-  private SingleInspectionProfilePanel createPanel(InspectionProfileImpl profile, Profile original, String profileName) {
-    return new SingleInspectionProfilePanel(myProjectProfileManager, profileName, profile, original) {
+  private SingleInspectionProfilePanel createPanel(InspectionProfileImpl profile) {
+    return new SingleInspectionProfilePanel(myProjectProfileManager, profile) {
       @Override
       protected boolean accept(InspectionToolWrapper entry) {
         return super.accept(entry) && acceptTool(entry);
@@ -645,7 +604,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
 
   @Override
   public void disposeUIResources() {
-    for (SingleInspectionProfilePanel panel : myPanels.values()) {
+    for (SingleInspectionProfilePanel panel : myPanels) {
       panel.disposeUI();
     }
     myPanels.clear();
@@ -660,6 +619,15 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     myProfiles.getProfilesComboBox().selectProfile((InspectionProfileImpl)profile);
   }
 
+  private SingleInspectionProfilePanel getProfilePanel(InspectionProfileImpl profile) {
+    for (SingleInspectionProfilePanel panel : myPanels) {
+      if (panel.getProfile().equals(profile)) {
+        return panel;
+      }
+    }
+    throw new AssertionError();
+  }
+
   @Override
   public void selectInspectionTool(String selectedToolShortName) {
     final InspectionProfileImpl inspectionProfile = getSelectedObject();
@@ -679,12 +647,12 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
   }
 
   private String configuredProfiles() {
-    return "configured profiles: " + StringUtil.join(myPanels.keySet(), ", ");
+    return "configured profiles: " + StringUtil.join(myPanels.stream().map(p -> p.getProfile().getName()).collect(Collectors.toList()), ", ");
   }
 
   private boolean hasName(@NotNull final String name, boolean shared) {
-    for (SingleInspectionProfilePanel p : myPanels.values()) {
-      if (name.equals(p.getCurrentProfileName()) && shared == p.isProjectLevel()) {
+    for (SingleInspectionProfilePanel p : myPanels) {
+      if (name.equals(p.getProfile().getName()) && shared == p.getProfile().isProjectLevel()) {
         return true;
       }
     }
@@ -703,4 +671,13 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable
     SingleInspectionProfilePanel panel = getProfilePanel(inspectionProfile);
     return panel == null ? null : panel.getPreferredFocusedComponent();
   }
+
+  private void showProfile(InspectionProfileImpl profile) {
+    final SingleInspectionProfilePanel panel = getProfilePanel(profile);
+    myProfilePanelHolder.removeAll();
+    myProfilePanelHolder.add(panel);
+    panel.setVisible(true);
+    myProfilePanelHolder.revalidate();
+    myProfilePanelHolder.repaint();
+  }
 }
index 75487aec427d2fb09a4d85fdc889640225431728..4183106480529333f80db20616ba32787f76988b 100644 (file)
@@ -21,7 +21,6 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.util.ui.JBUI;
-import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
 import java.awt.*;
@@ -52,17 +51,6 @@ public abstract class ProfilesChooser extends JPanel {
       protected void onProfileChosen(InspectionProfileImpl inspectionProfile) {
         ProfilesChooser.this.onProfileChosen(inspectionProfile);
       }
-
-      @Override
-      protected boolean isProjectLevel(InspectionProfileImpl p) {
-        return ProfilesChooser.this.isProjectLevel(p);
-      }
-
-      @NotNull
-      @Override
-      protected String getProfileName(InspectionProfileImpl p) {
-        return ProfilesChooser.this.getProfileName(p);
-      }
     };
     myComboBoxPanel.add(myProfilesComboBox, COMBO_CARD);
 
@@ -84,11 +72,6 @@ public abstract class ProfilesChooser extends JPanel {
 
   protected abstract void onProfileChosen(InspectionProfileImpl profile);
 
-  protected abstract boolean isProjectLevel(final InspectionProfileImpl p);
-
-  @NotNull
-  protected abstract String getProfileName(final InspectionProfileImpl p);
-
   void showEditCard(final String initialValue, final SaveInputComponentValidator inputValidator) {
     mySaveListener.setDelegate(inputValidator);
     mySubmitNameComponent.setText(initialValue);
index 4b7b61c6eee1496b1c7d52aab187ec4b0423a8b5..e7d78d99cbabf220dbb15ab787b1ab29a24b5763 100644 (file)
@@ -18,7 +18,6 @@ package com.intellij.profile.codeInspection.ui.header;
 import com.intellij.codeInspection.ex.InspectionProfileImpl;
 import com.intellij.icons.AllIcons;
 import com.intellij.openapi.ui.ComboBox;
-import com.intellij.openapi.util.Comparing;
 import com.intellij.profile.Profile;
 import com.intellij.ui.IdeBorderFactory;
 import com.intellij.ui.ListCellRendererWrapper;
@@ -32,6 +31,7 @@ import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -45,7 +45,9 @@ public abstract class ProfilesComboBox extends ComboBox<InspectionProfileImpl> {
   private InspectionProfileImpl myFirstGlobalProfile;
 
   public ProfilesComboBox() {
-    myComboModel = new SortedComboBoxModel<>(this::compare);
+    final Comparator<InspectionProfileImpl> comparator =
+      Comparator.comparing(InspectionProfileImpl::isProjectLevel).reversed().thenComparing(InspectionProfileImpl::getDisplayName);
+    myComboModel = new SortedComboBoxModel<>(comparator);
     setModel(myComboModel);
     //noinspection GtkPreferredJComboBoxRenderer
     setRenderer(new ListCellRenderer<Object>() {
@@ -57,9 +59,9 @@ public abstract class ProfilesComboBox extends ComboBox<InspectionProfileImpl> {
                               final boolean selected,
                               final boolean hasFocus) {
           if (index == -1) {
-            setIcon(isProjectLevel(value) ? AllIcons.General.ProjectSettings : AllIcons.General.Settings);
+            setIcon(value.isProjectLevel() ? AllIcons.General.ProjectSettings : AllIcons.General.Settings);
           }
-          setText(getProfileName(value));
+          setText(value.getDisplayName());
         }
       };
 
@@ -111,11 +113,6 @@ public abstract class ProfilesComboBox extends ComboBox<InspectionProfileImpl> {
     });
   }
 
-  protected abstract boolean isProjectLevel(final InspectionProfileImpl p);
-
-  @NotNull
-  protected abstract String getProfileName(final InspectionProfileImpl p);
-
   protected abstract void onProfileChosen(final InspectionProfileImpl inspectionProfile);
 
   public void selectProfile(InspectionProfileImpl inspectionProfile) {
@@ -133,14 +130,14 @@ public abstract class ProfilesComboBox extends ComboBox<InspectionProfileImpl> {
 
   void removeProfile(InspectionProfileImpl profile) {
     myComboModel.remove(profile);
-    if (!isProjectLevel(profile) && profile == myFirstGlobalProfile) {
+    if (!profile.isProjectLevel() && profile == myFirstGlobalProfile) {
       findFirstGlobalProfile();
     }
   }
 
   public void addProfile(InspectionProfileImpl inspectionProfile) {
     myComboModel.add(inspectionProfile);
-    if (!isProjectLevel(inspectionProfile)) {
+    if (!inspectionProfile.isProjectLevel()) {
       findFirstGlobalProfile();
     }
   }
@@ -154,22 +151,10 @@ public abstract class ProfilesComboBox extends ComboBox<InspectionProfileImpl> {
     return myComboModel.getItems();
   }
 
-  private int compare(@NotNull InspectionProfileImpl p1, @NotNull InspectionProfileImpl p2) {
-    final boolean isProjectLevel1 = isProjectLevel(p1);
-    final boolean isProjectLevel2 = isProjectLevel(p2);
-    int res = Comparing.compare(isProjectLevel2, isProjectLevel1);
-    if (res != 0) {
-      return res;
-    }
-    final String currentProfileName1 = getProfileName(p1);
-    final String currentProfileName2 = getProfileName(p2);
-    return Comparing.compare(currentProfileName1, currentProfileName2);
-  }
-
   private void findFirstGlobalProfile() {
     myFirstGlobalProfile = null;
     for (InspectionProfileImpl profile : getProfiles()) {
-      if (!isProjectLevel(profile)) {
+      if (!profile.isProjectLevel()) {
         myFirstGlobalProfile = profile;
         break;
       }
index a2845df1c5752d39bdb3faba7ffc7dabc8c9a9ad..c27e9a34da01472ae974c693a9f6b396a6f218cb 100644 (file)
@@ -18,6 +18,7 @@ package com.intellij.profile.codeInspection.ui.inspectionsTree;
 import com.intellij.codeInsight.daemon.HighlightDisplayKey;
 import com.intellij.codeInspection.ex.Descriptor;
 import com.intellij.openapi.util.ClearableLazyValue;
+import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
 import com.intellij.profile.codeInspection.ui.ToolDescriptors;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -28,7 +29,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
  * @author anna
  * @since 14-May-2009
  */
-public class InspectionConfigTreeNode extends DefaultMutableTreeNode {
+public abstract class InspectionConfigTreeNode extends DefaultMutableTreeNode {
   private final ClearableLazyValue<Boolean> myProperSetting = new ClearableLazyValue<Boolean>() {
     @NotNull
     @Override
@@ -48,8 +49,25 @@ public class InspectionConfigTreeNode extends DefaultMutableTreeNode {
     }
   };
 
-  public InspectionConfigTreeNode(@NotNull Object userObject) {
-    super(userObject);
+  public static class Group extends InspectionConfigTreeNode {
+    public Group(@NotNull String label) {
+      setUserObject(label);
+    }
+  }
+
+  public static class Tool extends InspectionConfigTreeNode {
+    @NotNull private final HighlightDisplayKey myKey;
+    @NotNull private final SingleInspectionProfilePanel myPanel;
+
+    public Tool(@NotNull HighlightDisplayKey key, @NotNull SingleInspectionProfilePanel panel) {
+      myKey = key;
+      myPanel = panel;
+    }
+
+    @Override
+    public Object getUserObject() {
+      return myPanel.getInitialToolDescriptors().get(myKey);
+    }
   }
 
   public HighlightDisplayKey getKey() {
@@ -64,12 +82,13 @@ public class InspectionConfigTreeNode extends DefaultMutableTreeNode {
 
   @Nullable
   public ToolDescriptors getDescriptors() {
-    if (userObject instanceof String) return null;
-    return (ToolDescriptors)userObject;
+    final Object userObject = getUserObject();
+    return userObject instanceof String ? null : (ToolDescriptors)userObject;
   }
 
   @Nullable
   public String getGroupName() {
+
     return userObject instanceof String ? (String)userObject : null;
   }
 
@@ -89,6 +108,7 @@ public class InspectionConfigTreeNode extends DefaultMutableTreeNode {
 
   @Override
   public String toString() {
+    final Object userObject = getUserObject();
     if (userObject instanceof ToolDescriptors) {
       return ((ToolDescriptors)userObject).getDefaultDescriptor().getText();
     }