Files
openide/platform/execution.serviceView/src/ServiceView.java
Nicolay Mitropolsky 0cab552af4 [service-view] IJPL-163793 migrate ServiceViewDescriptor.getDataProvider to uiDataSnapshot
GitOrigin-RevId: ffeb11360315bc8694b64e82031c01808200d266
2024-10-09 20:03:50 +00:00

184 lines
6.9 KiB
Java

// 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.execution.serviceView;
import com.intellij.execution.services.*;
import com.intellij.ide.DeleteProvider;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.RecursionManager;
import com.intellij.platform.execution.serviceView.ServiceModel.ServiceViewItem;
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.*;
import java.awt.*;
import java.util.List;
import java.util.stream.Collectors;
abstract class ServiceView extends JPanel implements UiDataProvider, Disposable {
private final Project myProject;
private final ServiceViewModel myModel;
protected final ServiceViewUi myUi;
private final ServiceViewOptions myViewOptions = new ServiceViewOptions() {
@Override
public boolean isGroupByContributor() {
return ServiceView.this.isGroupByContributor();
}
};
private AutoScrollToSourceHandler myAutoScrollToSourceHandler;
protected ServiceView(LayoutManager layout, @NotNull Project project, @NotNull ServiceViewModel model, @NotNull ServiceViewUi ui) {
super(layout);
myProject = project;
myModel = model;
myUi = ui;
}
@Override
public void dispose() {
}
Project getProject() {
return myProject;
}
ServiceViewModel getModel() {
return myModel;
}
ServiceViewUi getUi() {
return myUi;
}
void saveState(@NotNull ServiceViewState state) {
myModel.saveState(state);
}
@NotNull
abstract List<ServiceViewItem> getSelectedItems();
abstract Promise<Void> select(@NotNull Object service, @NotNull Class<?> contributorClass);
abstract Promise<Void> expand(@NotNull Object service, @NotNull Class<?> contributorClass);
abstract Promise<Void> extract(@NotNull Object service, @NotNull Class<?> contributorClass);
abstract void onViewSelected();
abstract void onViewUnselected();
boolean isGroupByContributor() {
return myModel.isGroupByContributor();
}
void setGroupByContributor(boolean value) {
myModel.setGroupByContributor(value);
}
abstract List<Object> getChildrenSafe(@NotNull List<Object> valueSubPath, @NotNull Class<?> contributorClass);
void setAutoScrollToSourceHandler(@NotNull AutoScrollToSourceHandler autoScrollToSourceHandler) {
myAutoScrollToSourceHandler = autoScrollToSourceHandler;
}
void onViewSelected(@NotNull ServiceViewDescriptor descriptor) {
descriptor.onNodeSelected(ContainerUtil.map(getSelectedItems(), ServiceViewItem::getValue));
if (myAutoScrollToSourceHandler != null) {
myAutoScrollToSourceHandler.onMouseClicked(this);
}
}
abstract void jumpToServices();
static ServiceView createView(@NotNull Project project, @NotNull ServiceViewModel viewModel, @NotNull ServiceViewState viewState) {
setViewModelState(viewModel, viewState);
return viewModel instanceof ServiceViewModel.SingeServiceModel ?
createSingleView(project, viewModel) :
createTreeView(project, viewModel, viewState);
}
private static ServiceView createTreeView(@NotNull Project project, @NotNull ServiceViewModel model, @NotNull ServiceViewState state) {
return new ServiceTreeView(project, model, new ServiceViewTreeUi(state), state);
}
private static ServiceView createSingleView(@NotNull Project project, @NotNull ServiceViewModel model) {
return new ServiceSingleView(project, model, new ServiceViewSingleUi());
}
@Override
public void uiDataSnapshot(@NotNull DataSink sink) {
List<ServiceViewItem> selection = getSelectedItems();
ServiceViewItem onlyItem = ContainerUtil.getOnlyItem(selection);
sink.set(PlatformCoreDataKeys.HELP_ID,
ServiceViewManagerImpl.getToolWindowContextHelpId());
sink.set(PlatformCoreDataKeys.SELECTED_ITEMS,
ContainerUtil.map2Array(selection, ServiceViewItem::getValue));
sink.set(PlatformCoreDataKeys.SELECTED_ITEM,
onlyItem != null ? onlyItem.getValue() : null);
sink.set(ServiceViewActionProvider.SERVICES_SELECTED_ITEMS, selection);
ServiceViewContributor<?> contributor = ServiceViewDragHelper.getTheOnlyRootContributor(selection);
sink.lazy(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, () -> {
DeleteProvider deleteProvider = getDeleteProvider(contributor);
ServiceViewDeleteProvider viewDeleteProvider = new ServiceViewDeleteProvider(this);
if (deleteProvider == null) {
return viewDeleteProvider;
}
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()));
sink.set(ServiceViewActionUtils.OPTIONS_KEY, myViewOptions);
List<Navigatable> navigatables = ContainerUtil.mapNotNull(selection, item -> item.getViewDescriptor().getNavigatable());
sink.set(CommonDataKeys.NAVIGATABLE_ARRAY,
navigatables.toArray(Navigatable.EMPTY_NAVIGATABLE_ARRAY));
ServiceViewDescriptor descriptor = onlyItem == null || onlyItem.isRemoved() ? null : onlyItem.getViewDescriptor();
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) {
viewModel.setGroupByContributor(viewState.groupByContributor);
}
}