IDEA-354490 Fixes

GitOrigin-RevId: fb38dc1163ab0d75f19e0dc5a9ab91c594f18beb
This commit is contained in:
Anton Kozub
2024-09-27 12:55:03 +02:00
committed by intellij-monorepo-bot
parent e2d7d259e9
commit d2863574f6
5 changed files with 52 additions and 4 deletions

View File

@@ -5,7 +5,9 @@ import com.intellij.ide.structureView.logical.ConvertElementsProvider
import com.intellij.ide.structureView.logical.LogicalStructureElementsProvider
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiClassOwner
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
class ClassOwnerLogicalStructureElementsProvider: LogicalStructureElementsProvider<PsiClassOwner, Any> {
override fun getElements(parent: PsiClassOwner): List<Any> {
val result = mutableListOf<Any>()

View File

@@ -1004,7 +1004,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre
.map(path -> getPathBounds(path))
.ifPresent(pathBounds -> {
floatingToolbar.hideImmediately();
floatingToolbar.setBounds(getBounds().width - 70, pathBounds.y - 5, 60, pathBounds.height + 5);
floatingToolbar.setBounds(getParent().getBounds().width - 70, pathBounds.y - 5, 60, pathBounds.height + 5);
floatingToolbar.scheduleShow();
});
}

View File

@@ -81,7 +81,12 @@ public abstract class PsiTreeElementBase <T extends PsiElement> implements Struc
private @NotNull List<StructureViewTreeElement> doGetChildren(boolean withCustomRegions) {
T element = getElement();
return element == null ? Collections.emptyList() : mergeWithExtensions(element, getChildrenBase(), withCustomRegions);
if (element == null) return Collections.emptyList();
Collection<StructureViewTreeElement> baseChildren = getChildrenBase();
if (!isAllowExtensions()) {
return (baseChildren instanceof List<StructureViewTreeElement> list) ? list : new ArrayList<>(baseChildren);
}
return mergeWithExtensions(element, baseChildren, withCustomRegions);
}
@Override
@@ -105,6 +110,11 @@ public abstract class PsiTreeElementBase <T extends PsiElement> implements Struc
public abstract @NotNull Collection<StructureViewTreeElement> getChildrenBase();
@ApiStatus.Internal
public boolean isAllowExtensions() {
return true;
}
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

View File

@@ -7,9 +7,11 @@ import com.intellij.ide.structureView.StructureViewModel
import com.intellij.ide.structureView.StructureViewModelBase
import com.intellij.ide.structureView.StructureViewTreeElement
import com.intellij.ide.structureView.impl.common.PsiTreeElementBase
import com.intellij.ide.structureView.logical.ContainerElementsProvider
import com.intellij.ide.structureView.logical.ExternalElementsProvider
import com.intellij.ide.structureView.logical.LogicalStructureTreeElementProvider
import com.intellij.ide.structureView.logical.PropertyElementProvider
import com.intellij.ide.structureView.logical.model.LogicalContainerPresentationProvider
import com.intellij.ide.structureView.logical.model.LogicalModelPresentationProvider
import com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel
import com.intellij.ide.util.treeView.smartTree.TreeElement
@@ -19,9 +21,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiTarget
import com.intellij.ui.SimpleTextAttributes
import java.awt.Component
import java.util.concurrent.ConcurrentHashMap
import java.util.function.Supplier
import javax.swing.Icon
internal class LogicalStructureViewModel private constructor(psiFile: PsiFile, editor: Editor?, assembledModel: LogicalStructureAssembledModel<*>, elementBuilder: ElementsBuilder)
@@ -107,6 +107,12 @@ private class ElementsBuilder {
}
}
}
else if (groupingObject is ContainerElementsProvider<*, *>
&& LogicalContainerPresentationProvider.getForObject(groupingObject)?.isFlatElements() == true) {
for (child in childrenProvider()) {
result.add(createViewTreeElement(child))
}
}
else if (groupingObject is ExternalElementsProvider<*, *>) {
val groupElement = groupElements.getOrPut(assembledModel) {
ConcurrentHashMap(mapOf(groupingObject to LogicalGroupStructureElement (assembledModel, groupingObject, childrenProvider)))
@@ -188,6 +194,8 @@ private class ElementsBuilder {
return getChildrenNodes(assembledModel)
}
override fun isAllowExtensions(): Boolean = false
override fun getLogicalAssembledModel() = assembledModel
override fun equals(other: Any?): Boolean {
@@ -275,6 +283,8 @@ private class ElementsBuilder {
return emptyList() // getChildrenNodes (assembledModel, parentKey + "." + assembledModel.model.hashCode())
}
override fun isAllowExtensions(): Boolean = false
override fun getLogicalAssembledModel() = assembledModel
override fun equals(other: Any?): Boolean {

View File

@@ -0,0 +1,26 @@
// 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.ide.structureView.logical.model
import com.intellij.ide.presentation.PresentationProvider
import com.intellij.ide.structureView.logical.ContainerElementsProvider
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.util.ClassExtension
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
abstract class LogicalContainerPresentationProvider<T: ContainerElementsProvider<*, *>>: PresentationProvider<T>() {
companion object {
private val PROVIDER_EP = ExtensionPointName<PresentationProvider<*>>("com.intellij.presentationProvider")
private val PROVIDERS = ClassExtension<PresentationProvider<*>>(PROVIDER_EP.name)
fun <T: ContainerElementsProvider<*, *>> getForObject(obj: T): LogicalContainerPresentationProvider<T>? {
return PROVIDERS.findSingle(obj::class.java) as? LogicalContainerPresentationProvider<T>
}
}
open fun isFlatElements(): Boolean = false
override fun getTypeName(t: T?): String = ""
}