From 0cab552af4857e5e39efa7014663525ddcd11f17 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 9 Oct 2024 20:22:22 +0200 Subject: [PATCH] [service-view] IJPL-163793 migrate ServiceViewDescriptor.getDataProvider to uiDataSnapshot GitOrigin-RevId: ffeb11360315bc8694b64e82031c01808200d266 --- .../src/ServiceView.java | 59 +++++++++++++------ .../services/ServiceViewDescriptor.java | 5 ++ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/platform/execution.serviceView/src/ServiceView.java b/platform/execution.serviceView/src/ServiceView.java index f81e105ce6da..dee8b6b84ff2 100644 --- a/platform/execution.serviceView/src/ServiceView.java +++ b/platform/execution.serviceView/src/ServiceView.java @@ -12,6 +12,7 @@ import com.intellij.pom.Navigatable; import com.intellij.ui.AutoScrollToSourceHandler; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.concurrency.Promise; import javax.swing.*; @@ -123,18 +124,20 @@ abstract class ServiceView extends JPanel implements UiDataProvider, Disposable sink.set(ServiceViewActionProvider.SERVICES_SELECTED_ITEMS, selection); ServiceViewContributor contributor = ServiceViewDragHelper.getTheOnlyRootContributor(selection); - DataProvider delegate = contributor == null ? null : contributor.getViewDescriptor(myProject).getDataProvider(); - DeleteProvider deleteProvider = delegate == null ? null : PlatformDataKeys.DELETE_ELEMENT_PROVIDER.getData(delegate); - ServiceViewDeleteProvider viewDeleteProvider = new ServiceViewDeleteProvider(this); - if (deleteProvider == null) { - sink.set(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, viewDeleteProvider); - } - else { - if (deleteProvider instanceof ServiceViewContributorDeleteProvider o) { - o.setFallbackProvider(viewDeleteProvider); + sink.lazy(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, () -> { + DeleteProvider deleteProvider = getDeleteProvider(contributor); + ServiceViewDeleteProvider viewDeleteProvider = new ServiceViewDeleteProvider(this); + if (deleteProvider == null) { + return viewDeleteProvider; } - sink.set(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, deleteProvider); - } + else { + if (deleteProvider instanceof ServiceViewContributorDeleteProvider o) { + o.setFallbackProvider(viewDeleteProvider); + } + return deleteProvider; + } + }); + sink.set(PlatformDataKeys.COPY_PROVIDER, new ServiceViewCopyProvider(this)); sink.set(ServiceViewActionUtils.CONTRIBUTORS_KEY, getModel().getRoots().stream().map(item -> item.getRootContributor()).collect(Collectors.toSet())); @@ -145,14 +148,34 @@ abstract class ServiceView extends JPanel implements UiDataProvider, Disposable navigatables.toArray(Navigatable.EMPTY_NAVIGATABLE_ARRAY)); ServiceViewDescriptor descriptor = onlyItem == null || onlyItem.isRemoved() ? null : onlyItem.getViewDescriptor(); - DataProvider dataProvider = descriptor == null ? null : descriptor.getDataProvider(); - if (dataProvider != null) { - RecursionManager.doPreventingRecursion( - this, false, () -> { - DataSink.uiDataSnapshot(sink, dataProvider); - return null; - }); + if (descriptor instanceof UiDataProvider dp) { + sink.uiDataSnapshot(dp); } + else { + DataProvider dataProvider = descriptor == null ? null : descriptor.getDataProvider(); + if (dataProvider != null) { + RecursionManager.doPreventingRecursion( + this, false, () -> { + DataSink.uiDataSnapshot(sink, dataProvider); + return null; + }); + } + } + } + + private @Nullable DeleteProvider getDeleteProvider(@Nullable ServiceViewContributor contributor) { + if (contributor == null) return null; + ServiceViewDescriptor viewDescriptor = contributor.getViewDescriptor(myProject); + if (viewDescriptor instanceof UiDataProvider dataProvider) { + DataContext context = CustomizedDataContext.withSnapshot(DataContext.EMPTY_CONTEXT, sink -> { + sink.uiDataSnapshot(dataProvider); + }); + DeleteProvider deleteProvider = PlatformDataKeys.DELETE_ELEMENT_PROVIDER.getData(context); + if (deleteProvider != null) return deleteProvider; + } + + DataProvider delegate = viewDescriptor.getDataProvider(); + return delegate == null ? null : PlatformDataKeys.DELETE_ELEMENT_PROVIDER.getData(delegate); } private static void setViewModelState(@NotNull ServiceViewModel viewModel, @NotNull ServiceViewState viewState) { diff --git a/platform/lang-api/src/com/intellij/execution/services/ServiceViewDescriptor.java b/platform/lang-api/src/com/intellij/execution/services/ServiceViewDescriptor.java index 859b38e8145c..3c819694777d 100644 --- a/platform/lang-api/src/com/intellij/execution/services/ServiceViewDescriptor.java +++ b/platform/lang-api/src/com/intellij/execution/services/ServiceViewDescriptor.java @@ -7,6 +7,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.util.Key; import com.intellij.pom.Navigatable; import com.intellij.util.OpenSourceUtil; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,6 +15,8 @@ import javax.swing.*; import java.awt.event.MouseEvent; import java.util.List; +/// Subclasses could also implement the [UiDataProvider] to provide the [DataContext] +/// for the actions returned by [#getToolbarActions()] and [#getPopupActions()] public interface ServiceViewDescriptor { Key ACTION_HOLDER_KEY = Key.create("ServiceViewActionHolderContentComponent"); @@ -48,6 +51,8 @@ public interface ServiceViewDescriptor { return getToolbarActions(); } + /// Obsolete, implement [UiDataProvider] instead + @ApiStatus.Obsolete default @Nullable DataProvider getDataProvider() { return null; }