Similar Usages improved UI in panels changed layout, added numbers, removed Similar Usages title panel

GitOrigin-RevId: 1fc1312a9013702e6c2cd16dc01797529209f1ee
This commit is contained in:
Andrey Sokolov
2022-06-21 20:01:02 +00:00
committed by intellij-monorepo-bot
parent cb70896afd
commit 9f85df2165
5 changed files with 49 additions and 30 deletions
@@ -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<Usage> 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<SimilarUsage> 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<SimilarUsage> 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<Usage> selectedUsages) {
private void addMostCommonUsagesForSelectedGroups() {
Ref<Collection<UsageCluster>> 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));
});
}
}
@@ -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);
}
@@ -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
@@ -65,7 +65,7 @@ public class ClusteringSearchSession {
@RequiresBackgroundThread
@RequiresReadLock
public @NotNull List<UsageCluster> getClustersForSelectedUsages(@NotNull ProgressIndicator indicator, Set<Usage> selectedUsages) {
public @NotNull List<UsageCluster> getClustersForSelectedUsages(@NotNull ProgressIndicator indicator, @NotNull Set<Usage> 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)))
@@ -59,7 +59,7 @@ public class UsageCluster {
*/
@RequiresReadLock
@RequiresBackgroundThread
public @NotNull Set<SimilarUsage> getOnlySelectedUsages(Set<Usage> selectedUsages) {
public @NotNull Set<SimilarUsage> getOnlySelectedUsages(@NotNull Set<Usage> selectedUsages) {
synchronized (myUsages) {
return myUsages.stream().filter(e -> e.isValid() && selectedUsages.contains(e)).collect(Collectors.toSet());
}