diff --git a/platform/execution.serviceView/src/ServiceViewActionProvider.java b/platform/execution.serviceView/src/ServiceViewActionProvider.java index 1bace8acd8ce..9aa0b44fb11f 100644 --- a/platform/execution.serviceView/src/ServiceViewActionProvider.java +++ b/platform/execution.serviceView/src/ServiceViewActionProvider.java @@ -14,7 +14,6 @@ import com.intellij.platform.execution.serviceView.ServiceModel.ServiceViewItem; import com.intellij.ui.ClientProperty; import com.intellij.ui.PopupHandler; import com.intellij.ui.tabs.JBTabs; -import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.tree.TreeModelAdapter; @@ -120,10 +119,6 @@ final class ServiceViewActionProvider { return getSelectedView(dataContext.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT)); } - static @Nullable ServiceView getSelectedView(@NotNull DataProvider provider) { - return getSelectedView(ObjectUtils.tryCast(provider.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT.getName()), Component.class)); - } - static @NotNull List getSelectedItems(@NotNull AnActionEvent e) { List items = e.getData(SERVICES_SELECTED_ITEMS); return items != null ? items : Collections.emptyList(); diff --git a/platform/execution.serviceView/src/ServiceViewNavBarExtension.java b/platform/execution.serviceView/src/ServiceViewNavBarExtension.java index b1c99e6fa8a7..9f775503b1b1 100644 --- a/platform/execution.serviceView/src/ServiceViewNavBarExtension.java +++ b/platform/execution.serviceView/src/ServiceViewNavBarExtension.java @@ -2,14 +2,14 @@ package com.intellij.platform.execution.serviceView; import com.intellij.ide.navigationToolbar.AbstractNavBarModelExtension; -import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public final class ServiceViewNavBarExtension extends AbstractNavBarModelExtension { @Override - public @Nullable String getPopupMenuGroup(@NotNull DataProvider provider) { - ServiceView serviceView = ServiceViewActionProvider.getSelectedView(provider); + public @Nullable String getPopupMenuGroup(@NotNull DataContext dataContext) { + ServiceView serviceView = ServiceViewActionProvider.getSelectedView(dataContext); return serviceView == null ? null : ServiceViewActionProvider.SERVICE_VIEW_ITEM_POPUP; } diff --git a/platform/navbar/backend/src/impl/NavBarBgtDataRule.kt b/platform/navbar/backend/src/impl/NavBarBgtDataRule.kt index e8f48742705a..89e7332dc90e 100644 --- a/platform/navbar/backend/src/impl/NavBarBgtDataRule.kt +++ b/platform/navbar/backend/src/impl/NavBarBgtDataRule.kt @@ -1,6 +1,7 @@ // 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.platform.navbar.backend.impl +import com.intellij.ide.navigationToolbar.NavBarModelExtension import com.intellij.ide.projectView.impl.ProjectRootsUtil import com.intellij.ide.util.DeleteHandler.DefaultDeleteProvider import com.intellij.model.Pointer @@ -11,7 +12,6 @@ import com.intellij.openapi.roots.ui.configuration.actions.ModuleDeleteProvider import com.intellij.openapi.vfs.VirtualFile import com.intellij.platform.navbar.NavBarVmItem import com.intellij.platform.navbar.backend.NavBarItem -import com.intellij.platform.navbar.impl.extensionData import com.intellij.pom.Navigatable import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement @@ -26,47 +26,51 @@ internal class NavBarBgtDataRule : UiDataRule { val pointers = selection.mapNotNull { (it as? IdeNavBarVmItem)?.pointer } if (pointers.isEmpty()) return + sink[PlatformDataKeys.SELECTED_ITEM] = selection.firstOrNull() + sink[PlatformDataKeys.SELECTED_ITEMS] = selection.toTypedArray() + sink.lazy(LangDataKeys.IDE_VIEW) { NavBarIdeView(pointers) } - sink[PlatformCoreDataKeys.BGT_DATA_PROVIDER] = DataProvider { dataId -> - val provider = DataProvider { - getBgData(project, pointers, it) - } - extensionData(dataId, provider) + defaultSnapshot(project, sink, pointers) + NavBarModelExtension.EP_NAME.forEachExtensionSafe { + it.uiDataSnapshot(sink, snapshot) } } } -private fun getBgData(project: Project, selectedItems: List>, dataId: String): Any? { - val seq = selectedItems.asSequence().mapNotNull { it.dereference() } - return when (dataId) { - CommonDataKeys.PROJECT.name -> project - PlatformDataKeys.SELECTED_ITEM.name -> seq.firstOrNull() - PlatformDataKeys.SELECTED_ITEMS.name -> seq.toList().toTypedArray() - PlatformCoreDataKeys.MODULE.name -> { - seq.firstNotNullOfOrNull { (it as? ModuleNavBarItem)?.data } - ?: seq.firstNotNullOfOrNull { - (it as? PsiNavBarItem)?.data?.let { psi -> - ModuleUtilCore.findModuleForPsiElement(psi) - } +private fun defaultSnapshot(project: Project, + sink: DataSink, pointers: + List>) { + val seq = { pointers.asSequence().mapNotNull { it.dereference() } } + sink.lazy(PlatformCoreDataKeys.MODULE) { + seq().firstNotNullOfOrNull { (it as? ModuleNavBarItem)?.data } + ?: seq().firstNotNullOfOrNull { + (it as? PsiNavBarItem)?.data?.let { psi -> + ModuleUtilCore.findModuleForPsiElement(psi) } } - LangDataKeys.MODULE_CONTEXT.name -> { - val dir = seq.firstNotNullOfOrNull { (it as? PsiNavBarItem)?.data as? PsiDirectory } - if (dir != null && ProjectRootsUtil.isModuleContentRoot(dir.virtualFile, project)) { - ModuleUtilCore.findModuleForPsiElement(dir) - } - else { - null - } + } + sink.lazy(LangDataKeys.MODULE_CONTEXT) { + val dir = seq().firstNotNullOfOrNull { (it as? PsiNavBarItem)?.data as? PsiDirectory } + if (dir != null && ProjectRootsUtil.isModuleContentRoot(dir.virtualFile, project)) { + ModuleUtilCore.findModuleForPsiElement(dir) } - CommonDataKeys.PSI_ELEMENT.name -> seq.firstNotNullOfOrNull { (it as? PsiNavBarItem)?.data } - PlatformCoreDataKeys.PSI_ELEMENT_ARRAY.name -> seq.mapNotNull { (it as? PsiNavBarItem)?.data } + else { + null + } + } + sink.lazy(CommonDataKeys.PSI_ELEMENT) { + seq().firstNotNullOfOrNull { (it as? PsiNavBarItem)?.data } + } + sink.lazy(PlatformCoreDataKeys.PSI_ELEMENT_ARRAY) { + seq().mapNotNull { (it as? PsiNavBarItem)?.data } .toList() .ifEmpty { null } ?.toArray(PsiElement.EMPTY_ARRAY) - CommonDataKeys.VIRTUAL_FILE_ARRAY.name -> seq.mapNotNull { + } + sink.lazy(CommonDataKeys.VIRTUAL_FILE_ARRAY) { + seq().mapNotNull { (it as? PsiNavBarItem)?.data?.let { psi -> PsiUtilCore.getVirtualFile(psi) } @@ -74,21 +78,22 @@ private fun getBgData(project: Project, selectedItems: List seq.mapNotNull { + } + sink.lazy(PlatformDataKeys.NAVIGATABLE_ARRAY) { + seq().mapNotNull { (it as? DefaultNavBarItem<*>)?.data as? Navigatable } .toList() .ifEmpty { null } ?.toArray(Navigatable.EMPTY_NAVIGATABLE_ARRAY) - PlatformDataKeys.DELETE_ELEMENT_PROVIDER.name -> ( - seq.firstNotNullOfOrNull { (it as? ModuleNavBarItem)?.data } != null).let { hasModule -> - if (hasModule) { - ModuleDeleteProvider.getInstance() - } - else { - DefaultDeleteProvider() - } - } - else -> null } -} + sink.lazy(PlatformDataKeys.DELETE_ELEMENT_PROVIDER) { + val hasModule = seq().firstNotNullOfOrNull { (it as? ModuleNavBarItem)?.data } != null + if (hasModule) { + ModuleDeleteProvider.getInstance() + } + else { + DefaultDeleteProvider() + } + } +} \ No newline at end of file diff --git a/platform/navbar/frontend/src/actions/NavBarContextMenuActionGroup.kt b/platform/navbar/frontend/src/actions/NavBarContextMenuActionGroup.kt index 841a7bc15920..871a75c13daf 100644 --- a/platform/navbar/frontend/src/actions/NavBarContextMenuActionGroup.kt +++ b/platform/navbar/frontend/src/actions/NavBarContextMenuActionGroup.kt @@ -12,14 +12,14 @@ internal class NavBarContextMenuActionGroup : ActionGroup() { return EMPTY_ARRAY } val dataContext = e.dataContext - val popupGroupId = contextMenuActionGroupId(dataContext::getData) + val popupGroupId = contextMenuActionGroupId(dataContext) val group = CustomActionsSchema.getInstance().getCorrectedAction(popupGroupId) as ActionGroup? ?: return EMPTY_ARRAY return group.getChildren(e) } } -private fun contextMenuActionGroupId(dataProvider: DataProvider): String { +private fun contextMenuActionGroupId(dataProvider: DataContext): String { for (modelExtension in NavBarModelExtension.EP_NAME.extensionList) { return modelExtension.getPopupMenuGroup(dataProvider) ?: continue diff --git a/platform/navbar/frontend/src/actions/NavBarUiDataRule.kt b/platform/navbar/frontend/src/actions/NavBarUiDataRule.kt index c7b119cd19d2..f417872cda7b 100644 --- a/platform/navbar/frontend/src/actions/NavBarUiDataRule.kt +++ b/platform/navbar/frontend/src/actions/NavBarUiDataRule.kt @@ -2,9 +2,9 @@ package com.intellij.platform.navbar.frontend.actions import com.intellij.ide.CopyPasteDelegator +import com.intellij.ide.navigationToolbar.NavBarModelExtension import com.intellij.openapi.actionSystem.* import com.intellij.platform.navbar.NavBarVmItem -import com.intellij.platform.navbar.impl.extensionData import javax.swing.JComponent internal class NavBarUiDataRule : UiDataRule { @@ -19,10 +19,8 @@ internal class NavBarUiDataRule : UiDataRule { sink[PlatformDataKeys.COPY_PROVIDER] = delegator.copyProvider sink[PlatformDataKeys.PASTE_PROVIDER] = delegator.pasteProvider - DataSink.uiDataSnapshot(sink, DataProvider { dataId -> - extensionData(dataId) { innerDataId -> - snapshot[DataKey.create(innerDataId)] - } - }) + NavBarModelExtension.EP_NAME.forEachExtensionSafe { + it.uiDataSnapshot(sink, snapshot) + } } } diff --git a/platform/navbar/shared/src/impl/extensions.kt b/platform/navbar/shared/src/impl/extensions.kt deleted file mode 100644 index 7a87db54f82e..000000000000 --- a/platform/navbar/shared/src/impl/extensions.kt +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.platform.navbar.impl - -import com.intellij.ide.impl.DataValidators -import com.intellij.ide.navigationToolbar.NavBarModelExtension -import com.intellij.openapi.actionSystem.CompositeDataProvider -import com.intellij.openapi.actionSystem.DataProvider -import com.intellij.openapi.actionSystem.PlatformCoreDataKeys - -fun extensionData(dataId: String, provider: DataProvider): Any? { - if (PlatformCoreDataKeys.BGT_DATA_PROVIDER.`is`(dataId)) { - val bgtProviders = NavBarModelExtension.EP_NAME.extensionList.mapNotNull { - it.getData(dataId, provider) as? DataProvider - } - return CompositeDataProvider.compose(bgtProviders) - } - for (modelExtension in NavBarModelExtension.EP_NAME.extensionList) { - val data = modelExtension.getData(dataId, provider) - if (data != null) { - return DataValidators.validOrNull(data, dataId, modelExtension) - } - } - return provider.getData(dataId) -} diff --git a/platform/platform-impl/api-dump-unreviewed.txt b/platform/platform-impl/api-dump-unreviewed.txt index 84bb960a5fad..7333d471e2ee 100644 --- a/platform/platform-impl/api-dump-unreviewed.txt +++ b/platform/platform-impl/api-dump-unreviewed.txt @@ -3373,11 +3373,13 @@ com.intellij.ide.navigationToolbar.NavBarModelExtension - getIcon(java.lang.Object):javax.swing.Icon - getLeafElement(com.intellij.openapi.actionSystem.DataContext):com.intellij.psi.PsiElement - a:getParent(com.intellij.psi.PsiElement):com.intellij.psi.PsiElement +- getPopupMenuGroup(com.intellij.openapi.actionSystem.DataContext):java.lang.String - getPopupMenuGroup(com.intellij.openapi.actionSystem.DataProvider):java.lang.String - a:getPresentableText(java.lang.Object):java.lang.String - getPresentableText(java.lang.Object,Z):java.lang.String - normalizeChildren():Z - processChildren(java.lang.Object,java.lang.Object,com.intellij.util.Processor):Z +- uiDataSnapshot(com.intellij.openapi.actionSystem.DataSink,com.intellij.openapi.actionSystem.DataSnapshot):V f:com.intellij.ide.navigationToolbar.NavBarRootPaneExtension - ():V a:com.intellij.ide.navigationToolbar.NavBarRootPaneExtension$NavBarWrapperPanel diff --git a/platform/platform-impl/src/com/intellij/ide/navigationToolbar/NavBarModelExtension.java b/platform/platform-impl/src/com/intellij/ide/navigationToolbar/NavBarModelExtension.java index cab837ba918a..8734dffb3b72 100644 --- a/platform/platform-impl/src/com/intellij/ide/navigationToolbar/NavBarModelExtension.java +++ b/platform/platform-impl/src/com/intellij/ide/navigationToolbar/NavBarModelExtension.java @@ -3,6 +3,8 @@ package com.intellij.ide.navigationToolbar; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.DataSink; +import com.intellij.openapi.actionSystem.DataSnapshot; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; @@ -49,8 +51,24 @@ public interface NavBarModelExtension { @NotNull Collection additionalRoots(Project project); + default void uiDataSnapshot(@NotNull DataSink sink, @NotNull DataSnapshot snapshot) { + } + + /** + * @noinspection unused + * @deprecated Unused. Use {@link #uiDataSnapshot} instead + */ + @Deprecated(forRemoval = true) default @Nullable Object getData(@NotNull String dataId, @NotNull DataProvider provider) { return null; } + /** @noinspection LambdaUnfriendlyMethodOverload*/ + default @Nullable String getPopupMenuGroup(@NotNull DataContext dataContext) { return null; } + + /** + * @noinspection LambdaUnfriendlyMethodOverload, unused + * @deprecated Unused. Use {@link #uiDataSnapshot} instead + */ + @Deprecated(forRemoval = true) default @Nullable String getPopupMenuGroup(@NotNull DataProvider provider) { return null; } default PsiElement getLeafElement(@NotNull DataContext dataContext) {