PY-82344 Fix disposer exception

(cherry picked from commit 713c7c0b49884b0b6744c60b119329336906a9e2)

GitOrigin-RevId: e0f732af21c33be59aabf505a39b6918563f036b
This commit is contained in:
Daniil Kalinin
2025-10-27 13:42:01 +00:00
committed by intellij-monorepo-bot
parent 55277d1f50
commit 49abc884b2
@@ -2,7 +2,7 @@
package com.intellij.pycharm.community.ide.impl.promo
import com.intellij.openapi.Disposable
import com.intellij.openapi.observable.util.whenDisposed
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.wm.BannerStartPagePromoter
import com.intellij.openapi.wm.impl.IdeBackgroundUtil
@@ -18,6 +18,7 @@ import javax.swing.JPanel
@ApiStatus.Internal
abstract class PyCommunityToUnifiedWelcomeScreenBannerBase : BannerStartPagePromoter() {
override val headerLabel: @Nls String = ""
override val actionLabel: @Nls String = ""
override val description: @Nls String = ""
@@ -32,24 +33,28 @@ abstract class PyCommunityToUnifiedWelcomeScreenBannerBase : BannerStartPageProm
override fun runAction() {}
fun wrapIntoSvgBackgroundPanel(panel: JPanel): JPanel {
val disposable = Disposer.newDisposable("BackgroundPanel")
val url = WelcomeToUnifiedWelcomeScreenBanner::class.java.getResource("/backgrounds/promotion_bg.svg") ?: return panel
val backgroundImage = SVGLoader.load(url, 1f)
val backgroundPanel = BackgroundPanel(BorderLayout(), backgroundImage, disposable)
val backgroundPanel = BackgroundPanel(BorderLayout(), backgroundImage)
backgroundPanel.add(panel, BorderLayout.CENTER)
backgroundPanel.isOpaque = false
return backgroundPanel
}
private class BackgroundPanel(layout: LayoutManager, private val image: Image, parentDisposable: Disposable) : JPanel(layout) {
private class BackgroundPanel(layout: LayoutManager, private val image: Image) : JPanel(layout), Disposable {
private var disposable: Disposable? = null
// Unfortunately, we don't have a proper disposable hierarchy for BannerStartPagePromoter
private var disposable: Disposable = Disposer.newDisposable(ApplicationManager.getApplication(),
"PyCommunityToUnifiedWelcomeScreenBannerBase.BackgroundPanel")
init {
parentDisposable.whenDisposed { clearResources() }
installBackground()
}
override fun dispose() {
Disposer.dispose(disposable)
}
override fun paintComponent(g: Graphics) {
super.paintComponent(g)
val g2 = g.create() as Graphics2D
@@ -63,31 +68,16 @@ abstract class PyCommunityToUnifiedWelcomeScreenBannerBase : BannerStartPageProm
}
}
override fun getComponentGraphics(g: Graphics?): Graphics? {
override fun getComponentGraphics(g: Graphics?): Graphics {
return JBSwingUtilities.runGlobalCGTransform(this, super.getComponentGraphics(g))
}
override fun updateUI() {
super.updateUI()
@Suppress("SENSELESS_COMPARISON")
if (image != null) {
installBackground()
}
}
private fun installBackground() {
clearResources()
disposable = Disposer.newDisposable("BackgroundPanel")
IdeBackgroundUtil.createTemporaryBackgroundTransform(this, image,
IdeBackgroundUtil.Fill.SCALE,
IdeBackgroundUtil.Anchor.MIDDLE_RIGHT,
1f, JBInsets.emptyInsets(),
disposable)
}
private fun clearResources() {
disposable?.let { Disposer.dispose(it) }
disposable = null
}
}
}