// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 Ġ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 . ide . util Ċ Ċ import Ġcom . intellij . ide . Ide Bundle Ċ import Ġcom . intellij . ide . util . Psi Element List Cell Renderer . Item Matchers Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . ui . Animated Icon Ċ import Ġcom . intellij . ui . Colo red List Cell Renderer Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . ui . speed Search . Speed Search Util Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . awt . Component Ċ import Ġjava . util . concurrent . Future Ċ import Ġjavax . swing .* Ċ Ċ internal Ġclass ĠPsi Element Background List Cell Renderer ( ĊĠ Ġprivate Ġval Ġrenderer : ĠPsi Element List Cell Renderer < *> Ċ ) Ġ: ĠList Cell Renderer < Psi Element > Ġ{ ĊĊĠ Ġprivate Ġval Ġmy Loading Component Renderer : ĠList Cell Renderer < Any > Ġ= Ġobject Ġ: ĠCo lo red List Cell Renderer < Any >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( list : ĠJ List < out ĠAny >, Ġvalue : ĠAny ?, Ġindex : ĠInt , Ġselected : ĠBoolean , Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġbackground Ġ= ĠUI Util . getList Background ( selected , Ġhas Focus ) ĊĠĠĠĠĠ Ġicon Ġ= ĠAnimated Icon . Default . INSTANCE ĊĠĠĠĠĠ Ġappend ( Ide Bundle . message (" progress . text . loading ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġmy Component Ġ= ĠPsi Element List Cell Renderer Component () ĊĊĠ Ġoverride Ġfun ĠgetList Cell Renderer Component ( list : ĠJ List < out ĠPsi Element >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Selected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Has Focus : ĠBoolean ): ĠComponent Ġ{ ĊĠĠĠ Ġval Ġfuture : ĠFuture < Renderer Components > Ġ= Ġget Computer ( list , Ġrenderer ). compute Components Async ( value ) ĊĠĠĠ Ġif Ġ(! future . is Done ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġmy Loading Component Renderer . getList Cell Renderer Component ( list , Ġvalue , Ġindex , Ġis Selected , Ġcell Has Focus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġmy Component . removeAll () ĊĠĠĠ Ġval Ġ( left , Ġright ) Ġ= Ġfuture . get () ĊĊĠĠĠ Ġval Ġselected Fg Ġ= Ġif Ġ( isSelected ) ĠUI Util . getList Selection Foreground ( cell Has Focus ) Ġelse Ġnull ĊĠĠĠ Ġval Ġbg Ġ= Ġif Ġ( isSelected ) ĠUI Util . getList Selection Background ( cell Has Focus ) Ġelse Ġleft . background ĊĊĠĠĠ Ġmy Component . background Ġ= Ġbg ĊĊĠĠĠ Ġif Ġ( right Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġsp acer Ġ= ĠJPanel () ĊĠĠĠĠĠ Ġsp acer . background Ġ= Ġbg ĊĠĠĠĠĠ Ġsp acer . border Ġ= ĠBorder Factory . create Empty Border ( 0 , Ġ 2 , Ġ 0 , Ġ 2 ) ĊĠĠĠĠĠ Ġmy Component . add ( spacer , ĠBorderLayout . CENTER ) ĊĊĠĠĠĠĠ Ġval Ġright Renderer : ĠList Cell Renderer < Any > Ġ= Ġobject Ġ: ĠDefault List Cell Renderer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetList Cell Renderer Component ( list : ĠJ List <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Selected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Has Focus : ĠBoolean ): ĠComponent Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġsuper . getList Cell Renderer Component ( list , Ġvalue , Ġindex , Ġis Selected , Ġcell Has Focus ) ĊĠĠĠĠĠĠĠĠĠ Ġforeground Ġ= Ġselected Fg Ġ?: Ġright . foreground ĊĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġbg ĊĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġright . icon ĊĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġright . text ĊĠĠĠĠĠĠĠĠĠ Ġborder Ġ= Ġright . border ĊĠĠĠĠĠĠĠĠĠ Ġhorizontal Text Position Ġ= Ġright . horizontal Text Position ĊĠĠĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= Ġright . horizontal Alignment ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġright Renderer Component Ġ= Ġright Renderer . getList Cell Renderer Component ( list , Ġvalue , Ġindex , Ġis Selected , Ġcell Has Focus ) ĊĠĠĠĠĠ Ġmy Component . add ( right Renderer Component , ĠBorderLayout . EAST ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġleft Renderer : ĠList Cell Renderer < Psi Element > Ġ= Ġobject Ġ: ĠCo lo red List Cell Renderer < Psi Element >() Ġ{ ĊĊĠĠĠĠĠ Ġval Ġitem Matchers : ĠItem Matchers Ġ= Ġrenderer . getItem Matchers ( list , Ġvalue ) ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( list : ĠJ List < out ĠPsi Element >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Ġ= Ġbg ĊĠĠĠĠĠĠĠ Ġicon Ġ= Ġleft . icon ĊĠĠĠĠĠĠĠ Ġborder Ġ= Ġleft . border ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Iterator Ġ= Ġleft . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( fragment Iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġfragment Iterator . next () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtext Attributes Ġ= Ġfragment Iterator . text Attributes ĊĠĠĠĠĠĠĠĠĠ Ġval Ġeffective Text Attributes Ġ= Ġselected Fg ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Text Attributes . merge ( text Attributes , ĠSimple Text Attributes ( 0 , Ġselected Fg )) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtext Attributes ĊĠĠĠĠĠĠĠĠĠ ĠSpeed Search Util . append Colo red Fragment For Matcher ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext , Ġthis , Ġeffective Text Attributes , Ġitem Matchers . name Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeffective Text Attributes . bgColor , Ġselected ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġleft Renderer Component Ġ= Ġleft Renderer . getList Cell Renderer Component ( list , Ġvalue , Ġindex , Ġis Selected , Ġcell Has Focus ) ĊĠĠĠ Ġmy Component . add ( left Renderer Component , ĠBorderLayout . WEST ) ĊĊĠĠĠ Ġreturn Ġmy Component ĊĠ Ġ} Ċ } Ċ