From f0980cd281d9bb96c7205876579aabaf08623c4f Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 5 Feb 2019 16:24:12 +0300 Subject: [PATCH] [platform] add LeftRightRenderer combining two renderers --- .../com/intellij/ui/list/LeftRightRenderer.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 platform/platform-api/src/com/intellij/ui/list/LeftRightRenderer.kt diff --git a/platform/platform-api/src/com/intellij/ui/list/LeftRightRenderer.kt b/platform/platform-api/src/com/intellij/ui/list/LeftRightRenderer.kt new file mode 100644 index 000000000000..1260de7ceb80 --- /dev/null +++ b/platform/platform-api/src/com/intellij/ui/list/LeftRightRenderer.kt @@ -0,0 +1,48 @@ +// Copyright 2000-2019 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.ui.list + +import com.intellij.util.ui.JBUI +import java.awt.BorderLayout +import java.awt.Component +import javax.swing.JList +import javax.swing.JPanel +import javax.swing.ListCellRenderer + +/** + * A renderer which combines two renderers. + * + * [mainRenderer] component is aligned to the left, [rightRenderer] component is aligned to the right. + * This renderer uses background from [mainRenderer] component. + */ +abstract class LeftRightRenderer : ListCellRenderer { + + protected abstract val mainRenderer: ListCellRenderer + protected abstract val rightRenderer: ListCellRenderer + + private val spacer = JPanel().apply { + border = JBUI.Borders.empty(0, 2) + } + + private val component = JPanel(BorderLayout()) + + final override fun getListCellRendererComponent(list: JList, + value: T, + index: Int, + isSelected: Boolean, + cellHasFocus: Boolean): Component { + val mainComponent = mainRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus) + val rightComponent = rightRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus) + mainComponent.background.let { + component.background = it + spacer.background = it + rightComponent.background = it + } + component.apply { + removeAll() + add(mainComponent, BorderLayout.WEST) + add(spacer, BorderLayout.CENTER) + add(rightComponent, BorderLayout.EAST) + } + return component + } +}