diff --git a/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/MostCommonUsagePatternsComponent.java b/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/MostCommonUsagePatternsComponent.java index 9e3e591d9936..16964499a987 100644 --- a/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/MostCommonUsagePatternsComponent.java +++ b/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/MostCommonUsagePatternsComponent.java @@ -17,9 +17,7 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; -import com.intellij.ui.Gray; -import com.intellij.ui.JBColor; -import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.*; import com.intellij.ui.components.ActionLink; import com.intellij.ui.components.JBPanelWithEmptyText; import com.intellij.ui.components.panels.VerticalLayout; @@ -37,6 +35,7 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.scroll.BoundedRangeModelThresholdListener; import kotlin.Unit; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,22 +51,25 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl private final @NotNull UsageViewImpl myUsageView; private final @NotNull JBPanelWithEmptyText myMainPanel; private final @NotNull JScrollPane myScrollPane; + private final @NotNull SimpleColoredComponent myResultsText; + private @NotNull Set mySelectedUsages; private @Nullable ClusteringSearchSession mySession; private boolean myIsShowingSimilarUsages; - private boolean isDisposed = false; private @Nullable BackgroundableProcessIndicator myProcessIndicator; private int myAlreadyRenderedSnippets; public MostCommonUsagePatternsComponent(@NotNull UsageViewImpl usageView) { - super(false); + super(true); myUsageView = usageView; + myResultsText = new SimpleColoredComponent(); myProject = usageView.getProject(); - setToolbar((JComponent)createToolbar(SIMILAR_USAGES_PREVIEW_TOOLBAR)); + mySelectedUsages = myUsageView.getSelectedUsages(); + setToolbar(createMostCommonUsagesToolbar()); myMainPanel = new JBPanelWithEmptyText(); myMainPanel.setLayout(new VerticalLayout(0)); myMainPanel.setBackground(UIUtil.getTextFieldBackground()); - addMostCommonUsagesForSelectedGroups(myUsageView.getSelectedUsages()); + addMostCommonUsagesForSelectedGroups(); myScrollPane = ScrollPaneFactory.createScrollPane(myMainPanel, true); myScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); revalidate(); @@ -82,7 +84,7 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl return mySession; } - public ActionToolbar createToolbar(@NotNull String place) { + public JComponent createMostCommonUsagesToolbar() { DefaultActionGroup actionGroup = new DefaultActionGroup(); actionGroup.add( new RefreshAction(IdeBundle.messagePointer("action.refresh"), IdeBundle.messagePointer("action.refresh"), AllIcons.Actions.Refresh) { @@ -91,7 +93,9 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl myMainPanel.removeAll(); myMainPanel.revalidate(); myIsShowingSimilarUsages = false; - addMostCommonUsagesForSelectedGroups(myUsageView.getSelectedUsages()); + mySelectedUsages = myUsageView.getSelectedUsages(); + updateResultsText(UsageViewBundle.message("similar.usages.0.results", mySelectedUsages.size())); + addMostCommonUsagesForSelectedGroups(); setContent(myScrollPane); } @@ -108,6 +112,7 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl public void actionPerformed(@NotNull AnActionEvent e) { if (myIsShowingSimilarUsages) { myIsShowingSimilarUsages = false; + updateResultsText(UsageViewBundle.message("similar.usages.0.results", mySelectedUsages.size())); ActivityTracker.getInstance().inc(); setContent(myScrollPane); revalidate(); @@ -117,25 +122,38 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl @Override public void update(@NotNull AnActionEvent event) { Presentation presentation = event.getPresentation(); - presentation.setEnabled(myIsShowingSimilarUsages); + presentation.setVisible(myIsShowingSimilarUsages); } }); - ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(place, actionGroup, false); - actionToolbar.setTargetComponent(myMainPanel); - return actionToolbar; + ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(SIMILAR_USAGES_PREVIEW_TOOLBAR, actionGroup, true); + actionToolbar.getComponent().setBackground(UIUtil.getTextFieldBackground()); + actionToolbar.setTargetComponent(this); + JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT)); + toolbar.setBackground(UIUtil.getTextFieldBackground()); + updateResultsText(UsageViewBundle.message("similar.usages.0.results", mySelectedUsages.size())); + toolbar.add(myResultsText); + toolbar.add(actionToolbar.getComponent()); + return toolbar; } - private @NotNull ActionLink createOpenSimilarUsagesActionLink(UsageInfo info, @NotNull Set usagesToRender) { - final ActionLink actionLink = new ActionLink(UsageViewBundle.message("similar.usages.show.0.similar.usages.title", usagesToRender.size() - 1), e -> { - myIsShowingSimilarUsages = true; + private void updateResultsText(@NotNull @Nls String message) { + myResultsText.clear(); + myResultsText.append(message, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); + } + + private @NotNull ActionLink createOpenSimilarUsagesActionLink(@NotNull UsageInfo info, @NotNull Set usagesToRender) { + final ActionLink actionLink = + new ActionLink(UsageViewBundle.message("similar.usages.show.0.similar.usages.title", usagesToRender.size() - 1), e -> { + myIsShowingSimilarUsages = true; + updateResultsText(UsageViewBundle.message("0.similar.usages", usagesToRender.size() - 1)); ActivityTracker.getInstance().inc(); - final SimilarUsagesComponent mySimilarComponent = new SimilarUsagesComponent(info, this); - JScrollPane similarUsagesScrollPane = ScrollPaneFactory.createScrollPane(mySimilarComponent, true); + final SimilarUsagesComponent similarComponent = new SimilarUsagesComponent(info, this); + JScrollPane similarUsagesScrollPane = ScrollPaneFactory.createScrollPane(similarComponent, true); final JScrollBar scrollBar = similarUsagesScrollPane.getVerticalScrollBar(); - mySimilarComponent.renderOriginalUsage(); - mySimilarComponent.renderSimilarUsages(usagesToRender); + similarComponent.renderOriginalUsage(); + similarComponent.renderSimilarUsages(usagesToRender); BoundedRangeModelThresholdListener.install(scrollBar, () -> { - mySimilarComponent.renderSimilarUsages(usagesToRender); + similarComponent.renderSimilarUsages(usagesToRender); return Unit.INSTANCE; }); setContent(similarUsagesScrollPane); @@ -193,7 +211,7 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl } } - private void addMostCommonUsagesForSelectedGroups(@NotNull final Set selectedUsages) { + private void addMostCommonUsagesForSelectedGroups() { Ref> sortedClusters = new Ref<>(); Task.Backgroundable loadMostCommonUsagePatternsTask = new Task.Backgroundable(myProject, UsageViewBundle.message( @@ -212,7 +230,7 @@ public class MostCommonUsagePatternsComponent extends SimpleToolWindowPanel impl ClusteringSearchSession session = getSession(); if (session != null) { ApplicationManager.getApplication().runReadAction(() -> { - sortedClusters.set(session.getClustersForSelectedUsages(indicator, selectedUsages)); + sortedClusters.set(session.getClustersForSelectedUsages(indicator, mySelectedUsages)); }); } } diff --git a/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/SimilarUsagesComponent.java b/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/SimilarUsagesComponent.java index fac61eef5c13..daaa5d18886b 100644 --- a/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/SimilarUsagesComponent.java +++ b/platform/usageView-impl/src/com/intellij/find/findUsages/similarity/SimilarUsagesComponent.java @@ -4,7 +4,10 @@ package com.intellij.find.findUsages.similarity; import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Disposer; import com.intellij.psi.PsiElement; -import com.intellij.ui.*; +import com.intellij.ui.Gray; +import com.intellij.ui.JBColor; +import com.intellij.ui.SimpleColoredComponent; +import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.components.panels.VerticalLayout; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewBundle; @@ -27,10 +30,6 @@ public class SimilarUsagesComponent extends JPanel implements Disposable { public SimilarUsagesComponent(@NotNull UsageInfo originalUsage, @NotNull Disposable parent) { myOriginalUsage = originalUsage; setLayout(new VerticalLayout(0)); - TitlePanel titlePanel = new TitlePanel(); - titlePanel.getLabel().setHorizontalAlignment(SwingConstants.LEFT); - titlePanel.setText(UsageViewBundle.message("similar.usages.tab.title")); - add(titlePanel); setBackground(UIUtil.getTextFieldBackground()); Disposer.register(parent, this); } diff --git a/platform/usageView/resources/messages/UsageViewBundle.properties b/platform/usageView/resources/messages/UsageViewBundle.properties index edcc86ffbe14..b0525bf366f3 100644 --- a/platform/usageView/resources/messages/UsageViewBundle.properties +++ b/platform/usageView/resources/messages/UsageViewBundle.properties @@ -132,6 +132,8 @@ occurrences.found.in.comments.strings.non.java.files.and.generated.code=Occurren similar.usages.tab.name=Similar Usages similar.usages.tab.title=Similar usages similar.usages.the.original.usage.label=(the original usage) +similar.usages.0.results={0, number} {0, choice, 1#result|2#results} with similar usages +0.similar.usages={0, number} similar {0, choice, 1#usage|2#usages} similar.usages.loading.most.common.usage.patterns.progress.title=Loading most common usage patterns similar.usages.show.0.similar.usages.title=Show {0, number} similar {0, choice, 1#usage|2#usages} similar.usages.show.usage.features.action.calculating.usage.features.progress.title=Calculating Usage Features \ No newline at end of file diff --git a/platform/usageView/src/com/intellij/usages/similarity/clustering/ClusteringSearchSession.java b/platform/usageView/src/com/intellij/usages/similarity/clustering/ClusteringSearchSession.java index 27c8bc80f2b2..e74874031522 100644 --- a/platform/usageView/src/com/intellij/usages/similarity/clustering/ClusteringSearchSession.java +++ b/platform/usageView/src/com/intellij/usages/similarity/clustering/ClusteringSearchSession.java @@ -65,7 +65,7 @@ public class ClusteringSearchSession { @RequiresBackgroundThread @RequiresReadLock - public @NotNull List getClustersForSelectedUsages(@NotNull ProgressIndicator indicator, Set selectedUsages) { + public @NotNull List getClustersForSelectedUsages(@NotNull ProgressIndicator indicator, @NotNull Set selectedUsages) { //create new ArrayList from clusters to avoid concurrent modification and do all the needed sorting and filtering in non-blocking way return new ArrayList<>(getClusters()).stream() .map(cluster -> new UsageCluster(cluster.getOnlySelectedUsages(selectedUsages))) diff --git a/platform/usageView/src/com/intellij/usages/similarity/clustering/UsageCluster.java b/platform/usageView/src/com/intellij/usages/similarity/clustering/UsageCluster.java index 538646c2ec5e..4251ab037820 100644 --- a/platform/usageView/src/com/intellij/usages/similarity/clustering/UsageCluster.java +++ b/platform/usageView/src/com/intellij/usages/similarity/clustering/UsageCluster.java @@ -59,7 +59,7 @@ public class UsageCluster { */ @RequiresReadLock @RequiresBackgroundThread - public @NotNull Set getOnlySelectedUsages(Set selectedUsages) { + public @NotNull Set getOnlySelectedUsages(@NotNull Set selectedUsages) { synchronized (myUsages) { return myUsages.stream().filter(e -> e.isValid() && selectedUsages.contains(e)).collect(Collectors.toSet()); }