You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.8 KiB
89 lines
2.8 KiB
/* |
|
* Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. |
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. |
|
*/ |
|
|
|
package org.jetbrains.compose.desktop.ide.preview.ui |
|
|
|
import com.intellij.icons.AllIcons |
|
import com.intellij.openapi.project.Project |
|
import com.intellij.ui.SimpleTextAttributes |
|
import com.intellij.ui.components.JBPanel |
|
import com.intellij.util.ui.StatusText |
|
import java.awt.Color |
|
import java.awt.Dimension |
|
import java.awt.Graphics |
|
import java.awt.image.BufferedImage |
|
import java.util.concurrent.atomic.AtomicReference |
|
import javax.swing.SwingUtilities |
|
|
|
internal class PreviewPanel(private val myProject: Project) : JBPanel<PreviewPanel>() { |
|
sealed class PreviewPanelState { |
|
data class Image(val image: BufferedImage, val dimension: Dimension) : PreviewPanelState() |
|
class Error(val error: String) : PreviewPanelState() |
|
} |
|
private val myState = AtomicReference<PreviewPanelState>() |
|
private val myStatusText = object : StatusText(this) { |
|
override fun isStatusVisible(): Boolean { |
|
return myState.get() is PreviewPanelState.Error |
|
} |
|
} |
|
|
|
init { |
|
SwingUtilities.invokeLater { |
|
myStatusText.initStatusText() |
|
} |
|
} |
|
|
|
fun StatusText.initStatusText() { |
|
clear() |
|
appendLine( |
|
AllIcons.General.Error, |
|
"Preview rendering encountered an error", |
|
SimpleTextAttributes.REGULAR_ATTRIBUTES, |
|
null |
|
) |
|
appendLine( |
|
"Show details", |
|
SimpleTextAttributes.LINK_ATTRIBUTES |
|
) { |
|
val errorText = (myState.get() as? PreviewPanelState.Error)?.error |
|
showTextDialog("Preview Error Details", errorText.orEmpty(), myProject) |
|
} |
|
} |
|
|
|
override fun paintComponent(g: Graphics) { |
|
super.paintComponent(g) |
|
|
|
when (val state = myState.get()) { |
|
is PreviewPanelState.Image -> { |
|
val (image, dimension) = state |
|
val w = dimension.width |
|
val h = dimension.height |
|
g.color = Color.WHITE |
|
g.fillRect(0, 0, w, h) |
|
g.drawImage(image, 0, 0, w, h, null) |
|
} |
|
is PreviewPanelState.Error -> { |
|
myStatusText.paint(this, g) |
|
} |
|
} |
|
} |
|
|
|
fun previewImage(image: BufferedImage, imageDimension: Dimension) { |
|
myState.set(PreviewPanelState.Image(image, imageDimension)) |
|
SwingUtilities.invokeLater { |
|
repaint() |
|
} |
|
} |
|
|
|
fun error(error: String) { |
|
myState.set(PreviewPanelState.Error(error)) |
|
SwingUtilities.invokeLater { |
|
repaint() |
|
} |
|
} |
|
|
|
override fun getPreferredSize(): Dimension? = |
|
(myState.get() as? PreviewPanelState.Image)?.dimension ?: super.getPreferredSize() |
|
} |