// ĠCopyright Ġ 2 0 2 1 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . ui Ċ Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . progress . Empty Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . ui . Animated Icon Ċ import Ġcom . intellij . ui . Simple List Cell Renderer Ċ import Ġcom . intellij . util . Alarm Ċ import Ġcom . intellij . util . Alarm Factory Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . concurrency . Async Promise Ċ import Ġsoftware . aws . tool k its . jetbrains . core . coroutines . dis posable Coroutine Scope Ċ import Ġsoftware . aws . tool k its . jetbrains . utils . ui . selected Ċ import Ġjava . awt . Component Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . swing . Default ComboBox Model Ċ import Ġjavax . swing . J List Ċ import Ġjavax . swing . Mutable ComboBox Model Ċ import Ġjavax . swing . event . List Data Listener Ċ Ċ class ĠAsync ComboBox < T >( ĊĠĠĠ Ġprivate Ġval Ġcombo Box Model : ĠMutable ComboBox Model < T > Ġ= ĠDefault ComboBox Model (), ĊĠĠĠ Ġcustom izer : ĠSimple List Cell Renderer . Customizer < in ĠT >? Ġ= Ġnull Ċ ) Ġ: ĠCombo Box < T >( comboBox Model ), ĠDis posable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġloading Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= Ġdis posable Coroutine Scope ( this ) ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrenderer Ġ= Ġobject Ġ: ĠSimple List Cell Renderer < T >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetList Cell Renderer Component ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist : ĠJ List < out ĠT > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠT ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Focus : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠComponent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġsuper . getList Cell Renderer Component ( list , Ġvalue , Ġindex , Ġselected , Ġhas Focus ) Ġas ĠSimple List Cell Renderer < *> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loading . get () Ġ&& Ġindex Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . icon Ġ= ĠAnimated Icon . Default . INSTANCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . text Ġ= Ġ" Loading " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcustomize ( list : ĠJ List < out ĠT >, Ġvalue : ĠT , Ġindex : ĠInt , Ġselected : ĠBoolean , Ġhas Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izer ?. customize ( this , Ġvalue , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreload Alarm Ġ= ĠAlarm Factory . getInstance (). create ( Alarm . Thread ToUse . SW ING _ THREAD , Ġthis ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Indicator : ĠProgress Indicator ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġpropose Model Update ( new Model : Ġsuspend Ġ( Mutable ComboBox Model < T >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreload Alarm . cancel All Requests () ĊĠĠĠĠĠĠĠ Ġcurrent Indicator ?. cancel () ĊĠĠĠĠĠĠĠ Ġloading . set ( true ) ĊĠĠĠĠĠĠĠ Ġremove All Items () ĊĠĠĠĠĠĠĠ Ġval Ġindicator Ġ= ĠEmpty Progress Indicator ( Modal ity State . NON _ MOD AL ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdelay Ġwith Ġmagic Ġnumber Ġto Ġdebounce ĊĠĠĠĠĠĠĠ Ġreload Alarm . add Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . getInstance (). run Process ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Model . invoke ( deleg ated ComboBox Model ( indicator )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 5 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget SelectedItem (): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getSelected Item () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun ĠwaitFor Selection (): ĠFuture < T ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠAsync Promise < T >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( loading . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . on Spin Wait () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfuture . set Result ( selected ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfuture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset SelectedItem ( an Object : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . setSelected Item ( an Object ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeleg ated ComboBox Model ( indicator : ĠProgress Indicator ) Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠMutable ComboBox Model < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Size () Ġ= Ġcombo Box Model . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ElementAt ( index : ĠInt ): ĠT Ġ= Ġcombo Box Model . getElement At ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd List Data Listener ( l : ĠList Data Listener ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove List Data Listener ( l : ĠList Data Listener ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset SelectedItem ( an Item : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombo Box Model . selected Item Ġ= Ġan Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget SelectedItem (): ĠAny Ġ= Ġcombo Box Model . selected Item ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Element ( item : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombo Box Model . addElement ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Element ( obj : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombo Box Model . remove Element ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert ElementAt ( item : ĠT ?, Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombo Box Model . insert ElementAt ( item , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove ElementAt ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . check Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombo Box Model . remove ElementAt ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ