LeftRightRenderer: prefer composition over inheritance

GitOrigin-RevId: b03ef05a09c70c5828d1529c31d34ee9cb52c786
This commit is contained in:
Daniil Ovchinnikov
2021-05-04 13:21:33 +00:00
committed by intellij-monorepo-bot
parent 32c51f0e31
commit 08f7fd4202
2 changed files with 33 additions and 43 deletions
@@ -1,4 +1,4 @@
// 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.
// Copyright 2000-2021 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.codeInsight.hint;
import com.intellij.application.options.CodeStyle;
@@ -253,43 +253,33 @@ public class ImplementationViewComponent extends JPanel {
}
private static ListCellRenderer<FileDescriptor> createRenderer(Project project) {
return new LeftRightRenderer<>() {
@NotNull
ListCellRenderer<FileDescriptor> mainRenderer = new ColoredListCellRenderer<>() {
@Override
protected ListCellRenderer<FileDescriptor> getMainRenderer() {
return new ColoredListCellRenderer<>() {
@Override
protected void customizeCellRenderer(@NotNull JList<? extends FileDescriptor> list,
FileDescriptor value, int index, boolean selected, boolean hasFocus) {
if (value != null) {
ImplementationViewElement element = value.myElement;
setIcon(getIconForFile(value.myFile, project));
append(element.getPresentableText());
String presentation = element.getContainerPresentation();
if (presentation != null) {
append(" ");
append(StringUtil.trimStart(StringUtil.trimEnd(presentation, ")"), "("), SimpleTextAttributes.GRAYED_ATTRIBUTES);
}
}
protected void customizeCellRenderer(@NotNull JList<? extends FileDescriptor> list,
FileDescriptor value, int index, boolean selected, boolean hasFocus) {
if (value != null) {
ImplementationViewElement element = value.myElement;
setIcon(getIconForFile(value.myFile, project));
append(element.getPresentableText());
String presentation = element.getContainerPresentation();
if (presentation != null) {
append(" ");
append(StringUtil.trimStart(StringUtil.trimEnd(presentation, ")"), "("), SimpleTextAttributes.GRAYED_ATTRIBUTES);
}
};
}
@NotNull
@Override
protected ListCellRenderer<FileDescriptor> getRightRenderer() {
return new SimpleListCellRenderer<>() {
@Override
public void customize(@NotNull JList<? extends FileDescriptor> list,
FileDescriptor value, int index, boolean selected, boolean hasFocus) {
if (value != null) {
setText(value.myElement.getLocationText());
setIcon(value.myElement.getLocationIcon());
}
}
};
}
}
};
ListCellRenderer<FileDescriptor> rightRenderer = new SimpleListCellRenderer<>() {
@Override
public void customize(@NotNull JList<? extends FileDescriptor> list,
FileDescriptor value, int index, boolean selected, boolean hasFocus) {
if (value != null) {
setText(value.myElement.getLocationText());
setIcon(value.myElement.getLocationIcon());
}
}
};
return new LeftRightRenderer<>(mainRenderer, rightRenderer);
}
@TestOnly
@@ -14,10 +14,10 @@ import javax.swing.ListCellRenderer
* [mainRenderer] component is aligned to the left, [rightRenderer] component is aligned to the right.
* This renderer uses background from [mainRenderer] component.
*/
abstract class LeftRightRenderer<T> : ListCellRenderer<T> {
protected abstract val mainRenderer: ListCellRenderer<T>
protected abstract val rightRenderer: ListCellRenderer<T>
class LeftRightRenderer<T>(
private val mainRenderer: ListCellRenderer<T>,
private val rightRenderer: ListCellRenderer<T>,
) : ListCellRenderer<T> {
private val spacer = JPanel().apply {
border = JBUI.Borders.empty(0, 2)
@@ -25,11 +25,11 @@ abstract class LeftRightRenderer<T> : ListCellRenderer<T> {
private val component = JPanel(BorderLayout())
final override fun getListCellRendererComponent(list: JList<out T>,
value: T,
index: Int,
isSelected: Boolean,
cellHasFocus: Boolean): Component {
override fun getListCellRendererComponent(list: JList<out T>,
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 {