From 9d35542c9a60879bd6d6b80f998b89b42a988ed2 Mon Sep 17 00:00:00 2001 From: "Nikita.Ashihmin" Date: Wed, 22 May 2024 06:29:26 +0400 Subject: [PATCH] PY-69919 Jupyter(fix): Start use temp file on macos so copy images GitOrigin-RevId: f43cac73a0ac4cd80550be6addb61bc85bcdbfee --- .../visualization/r/inlays/ClipboardUtils.kt | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/notebooks/visualization/src/org/jetbrains/plugins/notebooks/visualization/r/inlays/ClipboardUtils.kt b/notebooks/visualization/src/org/jetbrains/plugins/notebooks/visualization/r/inlays/ClipboardUtils.kt index b569b4841806..24fe60e5d532 100644 --- a/notebooks/visualization/src/org/jetbrains/plugins/notebooks/visualization/r/inlays/ClipboardUtils.kt +++ b/notebooks/visualization/src/org/jetbrains/plugins/notebooks/visualization/r/inlays/ClipboardUtils.kt @@ -8,6 +8,7 @@ import com.intellij.notification.Notification import com.intellij.notification.NotificationType import com.intellij.notification.Notifications import com.intellij.openapi.ide.CopyPasteManager +import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil import org.jetbrains.plugins.notebooks.visualization.r.VisualizationBundle import java.awt.Image @@ -16,8 +17,7 @@ import java.awt.datatransfer.StringSelection import java.awt.datatransfer.Transferable import java.awt.datatransfer.UnsupportedFlavorException import java.awt.image.BufferedImage -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream +import java.io.File import javax.imageio.ImageIO import javax.swing.JTable @@ -122,7 +122,21 @@ object ClipboardUtils { // https://bugs.openjdk.org/browse/JDK-8313706 // https://youtrack.jetbrains.com/issue/PY-69919/Result-of-Copy-plot-command-results-in-Unsupported-image-type-in-Google-Slides fun copyPngImageToClipboard(image: BufferedImage) { - CopyPasteManager.getInstance().setContents(PngTransferable(image)) + val tempImage = FileUtil.createTempFile("clipboard", ".png") + ImageIO.write(image, "png", tempImage) + + CopyPasteManager.getInstance().setContents(FileTransferable(listOf(tempImage))) + } + + private class FileTransferable(private val files: List) : Transferable { + override fun getTransferDataFlavors(): Array = arrayOf(DataFlavor.javaFileListFlavor) + override fun isDataFlavorSupported(flavor: DataFlavor): Boolean = DataFlavor.javaFileListFlavor.equals(flavor) + override fun getTransferData(flavor: DataFlavor): List { + if (!isDataFlavorSupported(flavor)) + throw UnsupportedFlavorException(flavor) + + return files + } } private class ImageTransferable(private val image: Image) : Transferable { @@ -141,26 +155,4 @@ object ClipboardUtils { return image } } - - /** - * When using [ImageTransferable], the image data is transferred in format by OS decision, - * for example, macOS can use TIFF format. This class transfers the image data as png. - */ - private class PngTransferable(private val image: BufferedImage) : Transferable { - - private val pngFlavor = DataFlavor("image/png;class=java.io.InputStream", "PNG Image") - - override fun getTransferDataFlavors() = arrayOf(pngFlavor) - - override fun isDataFlavorSupported(dataFlavor: DataFlavor) = pngFlavor == dataFlavor - - override fun getTransferData(dataFlavor: DataFlavor): Any { - if (!isDataFlavorSupported(dataFlavor)) - throw UnsupportedFlavorException(dataFlavor) - - val outputStream = ByteArrayOutputStream() - ImageIO.write(image, "png", outputStream) - return ByteArrayInputStream(outputStream.toByteArray()) - } - } } \ No newline at end of file