diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java
index bec77ce68c8a..f7984e6d4900 100644
--- a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java
+++ b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java
@@ -26,6 +26,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.ide.CopyPasteManager;
+import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -80,7 +81,7 @@ import java.util.Objects;
*
* @author Alexey Efimov
*/
-final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, ImageComponentDecorator, Disposable {
+final class ImageEditorUI extends JPanel implements UiDataProvider, CopyProvider, ImageComponentDecorator, Disposable {
@NonNls
private static final String IMAGE_PANEL = "image";
@NonNls
@@ -594,53 +595,34 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider,
}
@Override
- @Nullable
- public Object getData(@NotNull String dataId) {
- if (CommonDataKeys.PROJECT.is(dataId)) {
- return editor != null ? editor.getProject() : null;
- }
- else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) {
- return editor != null ? editor.getFile() : null;
- }
- else if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) {
- return editor != null ? new VirtualFile[]{editor.getFile()} : VirtualFile.EMPTY_ARRAY;
- }
- else if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) {
- return this;
- }
- else if (PlatformDataKeys.CUT_PROVIDER.is(dataId) && copyPasteSupport != null) {
- return copyPasteSupport.getCutProvider();
- }
- else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
- return deleteProvider;
- }
- else if (ImageComponentDecorator.DATA_KEY.is(dataId)) {
- return editor != null ? editor : this;
- }
- else if (PlatformCoreDataKeys.BGT_DATA_PROVIDER.is(dataId)) {
- return (DataProvider)slowId -> getSlowData(slowId);
- }
- return null;
- }
+ public void uiDataSnapshot(@NotNull DataSink sink) {
+ sink.set(DATA_KEY, editor != null ? editor : this);
+ if (editor == null) return;
+ Project project = editor.getProject();
+ VirtualFile file = editor.getFile();
- private @Nullable Object getSlowData(@NotNull String dataId) {
- if (CommonDataKeys.PSI_FILE.is(dataId)) {
- return findPsiFile();
+ sink.set(CommonDataKeys.PROJECT, project);
+ sink.set(CommonDataKeys.VIRTUAL_FILE, file);
+ sink.set(CommonDataKeys.VIRTUAL_FILE_ARRAY, new VirtualFile[]{file});
+ sink.set(PlatformDataKeys.COPY_PROVIDER, this);
+ if (copyPasteSupport != null) {
+ sink.set(PlatformDataKeys.CUT_PROVIDER, copyPasteSupport.getCutProvider());
}
- else if (CommonDataKeys.PSI_ELEMENT.is(dataId)) {
- return findPsiFile();
- }
- else if (PlatformCoreDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) {
- PsiElement psi = findPsiFile();
+ sink.set(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, deleteProvider);
+ sink.lazy(CommonDataKeys.PSI_FILE, () -> {
+ return findPsiFile(project, file);
+ });
+ sink.lazy(CommonDataKeys.PSI_ELEMENT, () -> {
+ return findPsiFile(project, file);
+ });
+ sink.lazy(PlatformCoreDataKeys.PSI_ELEMENT_ARRAY, () -> {
+ PsiElement psi = findPsiFile(project, file);
return psi != null ? new PsiElement[]{psi} : PsiElement.EMPTY_ARRAY;
- }
- return null;
+ });
}
- @Nullable
- private PsiFile findPsiFile() {
- VirtualFile file = editor != null ? editor.getFile() : null;
- return file != null && file.isValid() ? PsiManager.getInstance(editor.getProject()).findFile(file) : null;
+ private static @Nullable PsiFile findPsiFile(@NotNull Project project, @NotNull VirtualFile file) {
+ return file.isValid() ? PsiManager.getInstance(project).findFile(file) : null;
}
@Override
diff --git a/images/src/org/intellij/images/editor/impl/jcef/JCefImageViewerUI.kt b/images/src/org/intellij/images/editor/impl/jcef/JCefImageViewerUI.kt
index 2ddf892f2da6..3ec26176902a 100644
--- a/images/src/org/intellij/images/editor/impl/jcef/JCefImageViewerUI.kt
+++ b/images/src/org/intellij/images/editor/impl/jcef/JCefImageViewerUI.kt
@@ -4,7 +4,8 @@ package org.intellij.images.editor.impl.jcef
import com.intellij.openapi.Disposable
import com.intellij.openapi.actionSystem.ActionGroup
import com.intellij.openapi.actionSystem.ActionManager
-import com.intellij.openapi.actionSystem.DataProvider
+import com.intellij.openapi.actionSystem.DataSink
+import com.intellij.openapi.actionSystem.UiDataProvider
import com.intellij.openapi.editor.colors.EditorColors
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.ui.Messages
@@ -34,11 +35,14 @@ import javax.swing.SwingConstants
import javax.swing.SwingUtilities
class JCefImageViewerUI(private val myContentComponent: Component,
- private val myViewer: JCefImageViewer) : JPanel(), DataProvider, Disposable {
+ private val myViewer: JCefImageViewer
+) : JPanel(), UiDataProvider, Disposable {
private val myInfoLabel: JLabel
private val myViewPort: JPanel
- override fun getData(dataId: String): Any? = if (ImageComponentDecorator.DATA_KEY.`is`(dataId)) myViewer else null
+ override fun uiDataSnapshot(sink: DataSink) {
+ sink[ImageComponentDecorator.DATA_KEY] = myViewer
+ }
override fun dispose() {
myViewer.preferredFocusedComponent.removeMouseWheelListener(MOUSE_WHEEL_LISTENER)
diff --git a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java
index 12ce37a0c139..cdf9f3451eed 100644
--- a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java
+++ b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java
@@ -21,12 +21,11 @@ import com.intellij.openapi.vfs.*;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
-import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.containers.JBIterable;
import org.intellij.images.ImagesBundle;
import org.intellij.images.fileTypes.ImageFileTypeManager;
import org.intellij.images.options.*;
@@ -58,7 +57,7 @@ import java.util.*;
import static com.intellij.pom.Navigatable.EMPTY_NAVIGATABLE_ARRAY;
-final class ThumbnailViewUI extends JPanel implements DataProvider, Disposable {
+final class ThumbnailViewUI extends JPanel implements UiDataProvider, Disposable {
private final ThumbnailView thumbnailView;
private final CopyPasteSupport copyPasteSupport;
@@ -318,7 +317,8 @@ final class ThumbnailViewUI extends JPanel implements DataProvider, Disposable {
}
public VirtualFile @NotNull [] getSelection() {
- return getSelectedFiles();
+ List list = this.list == null ? Collections.emptyList() : this.list.getSelectedValuesList();
+ return list.toArray(VirtualFile.EMPTY_ARRAY);
}
private final class ThumbnailListCellRenderer extends ThumbnailComponent
@@ -512,89 +512,41 @@ final class ThumbnailViewUI extends JPanel implements DataProvider, Disposable {
}
@Override
- @Nullable
- public Object getData(@NotNull String dataId) {
- if (CommonDataKeys.PROJECT.is(dataId)) {
- return thumbnailView.getProject();
- }
- else if (PlatformCoreDataKeys.BGT_DATA_PROVIDER.is(dataId)) {
- VirtualFile[] selectedFiles = getSelectedFiles();
- return (DataProvider)slowId -> getSlowData(slowId, selectedFiles);
- }
- else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) {
- VirtualFile[] selectedFiles = getSelectedFiles();
- return selectedFiles.length > 0 ? selectedFiles[0] : null;
- }
- else if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) {
- return getSelectedFiles();
- }
- else if (CommonDataKeys.NAVIGATABLE.is(dataId)) {
- VirtualFile[] selectedFiles = getSelectedFiles();
- return new ThumbnailNavigatable(selectedFiles.length > 0 ? selectedFiles[0] : null);
- }
- else if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) {
- return copyPasteSupport.getCopyProvider();
- }
- else if (PlatformDataKeys.CUT_PROVIDER.is(dataId)) {
- return copyPasteSupport.getCutProvider();
- }
- else if (PlatformDataKeys.PASTE_PROVIDER.is(dataId)) {
- return copyPasteSupport.getPasteProvider();
- }
- else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
- return deleteProvider;
- }
- else if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
- VirtualFile[] selectedFiles = getSelectedFiles();
- Set navigatables = new HashSet<>(selectedFiles.length);
- for (VirtualFile selectedFile : selectedFiles) {
- if (!selectedFile.isDirectory()) {
- navigatables.add(new ThumbnailNavigatable(selectedFile));
- }
- }
- return navigatables.toArray(EMPTY_NAVIGATABLE_ARRAY);
- }
- else if (ThumbnailView.DATA_KEY.is(dataId)) {
- return thumbnailView;
- }
- else if (ImageComponentDecorator.DATA_KEY.is(dataId)) {
- return thumbnailView;
- }
+ public void uiDataSnapshot(@NotNull DataSink sink) {
+ Project project = thumbnailView.getProject();
+ VirtualFile @NotNull [] selection = getSelection();
- return null;
- }
+ sink.set(CommonDataKeys.PROJECT, project);
+ sink.set(CommonDataKeys.VIRTUAL_FILE,
+ selection.length > 0 ? selection[0] : null);
+ sink.set(CommonDataKeys.VIRTUAL_FILE_ARRAY, selection);
+ sink.set(CommonDataKeys.NAVIGATABLE,
+ new ThumbnailNavigatable(selection.length > 0 ? selection[0] : null));
+ sink.set(PlatformDataKeys.COPY_PROVIDER, copyPasteSupport.getCopyProvider());
+ sink.set(PlatformDataKeys.CUT_PROVIDER, copyPasteSupport.getCutProvider());
+ sink.set(PlatformDataKeys.PASTE_PROVIDER, copyPasteSupport.getPasteProvider());
+ sink.set(PlatformDataKeys.DELETE_ELEMENT_PROVIDER, deleteProvider);
+ sink.set(CommonDataKeys.NAVIGATABLE_ARRAY, JBIterable.of(selection)
+ .filter(o -> !o.isDirectory())
+ .map(o -> (Navigatable)new ThumbnailNavigatable(o))
+ .unique()
+ .toArray(EMPTY_NAVIGATABLE_ARRAY));
+ sink.set(ThumbnailView.DATA_KEY, thumbnailView);
+ sink.set(ImageComponentDecorator.DATA_KEY, thumbnailView);
- private @Nullable Object getSlowData(@NotNull String dataId, VirtualFile @NotNull [] selectedFiles) {
- if (CommonDataKeys.PSI_FILE.is(dataId)) {
- return getData(CommonDataKeys.PSI_ELEMENT.getName());
- }
- else if (CommonDataKeys.PSI_ELEMENT.is(dataId)) {
- return selectedFiles.length > 0 ? PsiManager.getInstance(thumbnailView.getProject()).findFile(selectedFiles[0]) : null;
- }
- else if (PlatformCoreDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) {
- return getSelectedElements();
- }
- return null;
- }
-
-
- private PsiElement @NotNull [] getSelectedElements() {
- VirtualFile[] selectedFiles = getSelectedFiles();
- Set psiElements = new HashSet<>(selectedFiles.length);
- PsiManager psiManager = PsiManager.getInstance(thumbnailView.getProject());
- for (VirtualFile file : selectedFiles) {
- PsiFile psiFile = psiManager.findFile(file);
- PsiElement element = psiFile != null ? psiFile : psiManager.findDirectory(file);
- if (element != null) {
- psiElements.add(element);
- }
- }
- return PsiUtilCore.toPsiElementArray(psiElements);
- }
-
- private VirtualFile @NotNull [] getSelectedFiles() {
- List selection = list == null ? Collections.emptyList() : list.getSelectedValuesList();
- return selection.toArray(VirtualFile.EMPTY_ARRAY);
+ sink.lazy(CommonDataKeys.PSI_FILE, () -> {
+ return selection.length > 0 ? PsiManager.getInstance(project).findFile(selection[0]) : null;
+ });
+ sink.lazy(CommonDataKeys.PSI_ELEMENT, () -> {
+ return selection.length > 0 ? PsiManager.getInstance(project).findFile(selection[0]) : null;
+ });
+ sink.lazy(PlatformCoreDataKeys.PSI_ELEMENT_ARRAY, () -> {
+ PsiManager psiManager = PsiManager.getInstance(project);
+ return JBIterable.of(selection)
+ .filterMap(o -> (PsiElement)(o.isDirectory() ? psiManager.findDirectory(o) : psiManager.findFile(o)))
+ .unique()
+ .toArray(PsiElement.EMPTY_ARRAY);
+ });
}
@Override