IJPL-160202 move navigation ui data to UsageCodeSnippetComponent

This fixes navigation for previews in "similar usage" mode.

GitOrigin-RevId: 02ffa5b38870d6b392342bf9566e989bda9514c8
This commit is contained in:
Max Medvedev
2024-08-21 11:42:17 +02:00
committed by intellij-monorepo-bot
parent 9b73ef56dd
commit e9084e9ce8
3 changed files with 33 additions and 23 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.find.findUsages.similarity;
import com.intellij.openapi.Disposable;
@@ -62,7 +62,7 @@ public class SimilarUsagesComponent extends JPanel implements Disposable {
if (virtualFile == null) return;
SnippetRenderingData data = UsageCodeSnippetComponent.calculateSnippetRenderingData(element, rangeInElement);
if (data == null) return;
final UsageCodeSnippetComponent codeSnippet = new UsageCodeSnippetComponent(data);
final UsageCodeSnippetComponent codeSnippet = new UsageCodeSnippetComponent(data, info);
Disposer.register(this, codeSnippet);
JPanel headerPanelForUsage = getHeaderPanelForUsage(info, codeSnippet.getEditor().getBackgroundColor());
if (myOriginalUsage == info) {

View File

@@ -1,7 +1,10 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.find.findUsages.similarity;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataSink;
import com.intellij.openapi.actionSystem.UiDataProvider;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorSettings;
@@ -11,14 +14,17 @@ import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.ex.MarkupModelEx;
import com.intellij.openapi.editor.markup.HighlighterLayer;
import com.intellij.openapi.editor.markup.HighlighterTargetArea;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.util.ProperTextRange;
import com.intellij.openapi.util.TextRange;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiNamedElement;
import com.intellij.ui.EditorTextFieldCellRenderer;
import com.intellij.ui.RemoteTransferUIManager;
import com.intellij.usageView.UsageInfo;
import com.intellij.usages.impl.UsagePreviewPanel;
import com.intellij.util.ui.JBUI;
import org.jetbrains.annotations.NotNull;
@@ -26,11 +32,16 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
class UsageCodeSnippetComponent extends EditorTextFieldCellRenderer.SimpleWithGutterRendererComponent {
private static final int CONTEXT_LINE_NUMBER = 3;
import static com.intellij.pom.Navigatable.EMPTY_NAVIGATABLE_ARRAY;
UsageCodeSnippetComponent(@NotNull SnippetRenderingData renderingData) {
class UsageCodeSnippetComponent extends EditorTextFieldCellRenderer.SimpleWithGutterRendererComponent implements UiDataProvider {
private static final int CONTEXT_LINE_NUMBER = 3;
@NotNull private final UsageInfo myUsageInfo;
UsageCodeSnippetComponent(@NotNull SnippetRenderingData renderingData,
@NotNull UsageInfo usageInfo) {
super(renderingData.getProject(), renderingData.getLanguage(), false);
myUsageInfo = usageInfo;
setupEditor();
addUsagePreview(renderingData);
getEditor().getGutterComponentEx().setLineNumberConverter(renderingData.getConverter());
@@ -70,6 +81,18 @@ class UsageCodeSnippetComponent extends EditorTextFieldCellRenderer.SimpleWithGu
highlightRange(result.getSelectionRange());
}
@Override
public void uiDataSnapshot(@NotNull DataSink sink) {
sink.lazy(CommonDataKeys.NAVIGATABLE_ARRAY, () -> {
var file = myUsageInfo.getVirtualFile();
if (file == null) return EMPTY_NAVIGATABLE_ARRAY;
var navigationOffset = myUsageInfo.getNavigationOffset();
var openFileDescriptor = new OpenFileDescriptor(myUsageInfo.getProject(), file, navigationOffset);
return new Navigatable[]{openFileDescriptor};
});
}
public static @Nullable SnippetRenderingData calculateSnippetRenderingData(@NotNull PsiElement element,
@Nullable ProperTextRange infoRange) {
PsiDocumentManager docManager = PsiDocumentManager.getInstance(element.getProject());

View File

@@ -2,10 +2,6 @@
package com.intellij.find.findUsages.similarity
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataSink
import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.fileEditor.OpenFileDescriptor
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.Iconable
import com.intellij.ui.Gray
@@ -28,10 +24,10 @@ import javax.swing.JPanel
internal class UsagePreviewComponent private constructor(
usageView: UsageView,
private val usageInfo: UsageInfo,
usageInfo: UsageInfo,
renderingData: SnippetRenderingData,
parent: Disposable,
) : JBPanel<JBPanel<*>>(), Disposable, UiDataProvider {
) : JBPanel<JBPanel<*>>(), Disposable {
var header: JPanel
private var mySnippetComponent: UsageCodeSnippetComponent
private val myUsageView: UsageView
@@ -41,27 +37,18 @@ internal class UsagePreviewComponent private constructor(
myUsageView = usageView
header = createHeaderWithLocationLink(usageInfo)
add(header)
mySnippetComponent = UsageCodeSnippetComponent(renderingData)
mySnippetComponent = UsageCodeSnippetComponent(renderingData, usageInfo)
add(mySnippetComponent)
if (!Disposer.tryRegister(parent, this)) {
Disposer.dispose(parent)
}
}
override fun uiDataSnapshot(sink: DataSink) {
sink.lazy(CommonDataKeys.NAVIGATABLE_ARRAY) {
val file = usageInfo.virtualFile ?: return@lazy emptyArray()
val navigationOffset = usageInfo.navigationOffset
val openFileDescriptor = OpenFileDescriptor(usageInfo.project, file, navigationOffset)
arrayOf(openFileDescriptor)
}
}
fun renderCluster(usageInfo: UsageInfo, renderingData: SnippetRenderingData) {
removeAll()
header = createHeaderWithLocationLink(usageInfo)
Disposer.dispose(mySnippetComponent)
mySnippetComponent = UsageCodeSnippetComponent(renderingData)
mySnippetComponent = UsageCodeSnippetComponent(renderingData, usageInfo)
add(header)
add(mySnippetComponent)
}