[collab] make rounded panel truly rounded

GitOrigin-RevId: 3528728e910773ea77c6d81bbe821a9b1aa0421b
This commit is contained in:
Ivan Semenov
2022-02-17 09:25:15 +00:00
committed by intellij-monorepo-bot
parent 430a02200f
commit f5fe913015
3 changed files with 69 additions and 42 deletions
@@ -0,0 +1,36 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.collaboration.ui.codereview.comment
import com.intellij.collaboration.ui.CollaborationToolsUIUtil
import com.intellij.openapi.editor.colors.EditorColors
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.ui.IdeBorderFactory
import com.intellij.ui.JBColor
import java.awt.BorderLayout
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import javax.swing.JComponent
import javax.swing.JPanel
object ReviewUIUtil {
private const val EDITOR_INLAY_PANEL_ARC = 10
fun createEditorInlayPanel(component: JComponent): JPanel {
val roundedLineBorder = IdeBorderFactory.createRoundedBorder(EDITOR_INLAY_PANEL_ARC)
return RoundedPanel(BorderLayout(), EDITOR_INLAY_PANEL_ARC - 2).apply {
border = roundedLineBorder
add(component)
}.also {
CollaborationToolsUIUtil.overrideUIDependentProperty(it) {
val scheme = EditorColorsManager.getInstance().globalScheme
background = scheme.defaultBackground
roundedLineBorder.setColor(scheme.getColor(EditorColors.TEARLINE_COLOR) ?: JBColor.border())
}
component.addComponentListener(object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) =
it.dispatchEvent(ComponentEvent(component, ComponentEvent.COMPONENT_RESIZED))
})
}
}
}
@@ -1,62 +1,52 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.collaboration.ui.codereview.comment
import com.intellij.openapi.editor.colors.EditorColors
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.ui.IdeBorderFactory
import com.intellij.util.ui.GraphicsUtil
import com.intellij.util.ui.JBInsets
import org.jetbrains.annotations.ApiStatus
import java.awt.*
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import java.awt.geom.RoundRectangle2D
import javax.swing.JComponent
import javax.swing.JPanel
import kotlin.properties.Delegates.observable
fun wrapComponentUsingRoundedPanel(component: JComponent): JComponent {
val wrapper = RoundedPanel(BorderLayout())
wrapper.add(component)
component.addComponentListener(object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) =
wrapper.dispatchEvent(ComponentEvent(component, ComponentEvent.COMPONENT_RESIZED))
})
return wrapper
}
private class RoundedPanel(layout: LayoutManager?) : JPanel(layout) {
private var borderLineColor: Color? = null
@ApiStatus.Internal
class RoundedPanel(layout: LayoutManager?, private val arc: Int = 8) : JPanel(layout) {
init {
isOpaque = false
cursor = Cursor.getDefaultCursor()
updateColors()
border = IdeBorderFactory.createRoundedBorder(arc + 2)
}
override fun updateUI() {
super.updateUI()
updateColors()
}
private fun updateColors() {
val scheme = EditorColorsManager.getInstance().globalScheme
background = scheme.defaultBackground
borderLineColor = scheme.getColor(EditorColors.TEARLINE_COLOR)
override fun paintChildren(g: Graphics) {
val g2 = g.create() as Graphics2D
try {
g2.clip(getShape())
super.paintChildren(g2)
}
finally {
g2.dispose()
}
}
override fun paintComponent(g: Graphics) {
GraphicsUtil.setupRoundedBorderAntialiasing(g)
val g2 = g.create() as Graphics2D
try {
GraphicsUtil.setupRoundedBorderAntialiasing(g2)
g2.clip(getShape())
super.paintComponent(g2)
}
finally {
g2.dispose()
}
}
val g2 = g as Graphics2D
private fun getShape(): Shape {
val rect = Rectangle(size)
JBInsets.removeFrom(rect, insets)
// 2.25 scale is a @#$!% so we adjust sizes manually
val rectangle2d = RoundRectangle2D.Float(rect.x.toFloat() + 0.5f, rect.y.toFloat() + 0.5f,
rect.width.toFloat() - 1f, rect.height.toFloat() - 1f,
10f, 10f)
g2.color = background
g2.fill(rectangle2d)
borderLineColor?.let {
g2.color = borderLineColor
g2.draw(rectangle2d)
}
return RoundRectangle2D.Float(rect.x.toFloat() - 0.5f, rect.y.toFloat() - 0.5f,
rect.width.toFloat() + 0.5f, rect.height.toFloat() + 0.5f,
arc.toFloat(), arc.toFloat())
}
}
@@ -2,7 +2,8 @@
package org.jetbrains.plugins.github.pullrequest.comment.ui
import com.intellij.collaboration.async.CompletableFutureUtil.successOnEdt
import com.intellij.collaboration.ui.codereview.comment.wrapComponentUsingRoundedPanel
import com.intellij.collaboration.ui.codereview.comment.ReviewUIUtil
import com.intellij.collaboration.ui.codereview.comment.RoundedPanel
import com.intellij.diff.util.Side
import com.intellij.openapi.progress.EmptyProgressIndicator
import com.intellij.openapi.project.Project
@@ -29,7 +30,7 @@ internal constructor(private val project: Project,
override fun createThreadComponent(thread: GHPRReviewThreadModel): JComponent =
GHPRReviewThreadComponent.create(project, thread, reviewDataProvider, avatarIconsProvider, currentUser).apply {
border = JBUI.Borders.empty(8, 8)
}.let(::wrapComponentUsingRoundedPanel)
}.let { ReviewUIUtil.createEditorInlayPanel(it) }
override fun createSingleCommentComponent(side: Side, line: Int, startLine: Int, hideCallback: () -> Unit): JComponent {
val textFieldModel = GHCommentTextFieldModel(project) {
@@ -104,5 +105,5 @@ internal constructor(private val project: Project,
hideCallback()
}.apply {
border = JBUI.Borders.empty(8)
}.let(::wrapComponentUsingRoundedPanel)
}.let { ReviewUIUtil.createEditorInlayPanel(it) }
}