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