/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġorg . jetbrains . project or . server . core . ij . md Ċ Ċ import Ġorg . jetbrains . project or . util . logging . Logger Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . Desktop Ċ import Ġjava . awt . Dimension Ċ import Ġjava . awt . Point Ċ import Ġjava . net . URI Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ public Ġobject ĠPanel Updater Ġ{ ĊĊĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger < Panel Updater >() ĊĊĠ Ġpublic Ġvar Ġshow Callback : Ġ(( id : ĠInt , Ġshown : ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġresize Callback : Ġ(( id : ĠInt , Ġsize : ĠDimension ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġmove Callback : Ġ(( id : ĠInt , Ġpos : ĠPoint ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġdispose Callback : Ġ(( id : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġplace To Window Callback : Ġ(( id : ĠInt , Ġroot Component : ĠComponent ?) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġset Html Callback : Ġ(( id : ĠInt , Ġlast Changed Html : ĠString ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġset Css Callback : Ġ(( id : ĠInt , Ġlast Css String : ĠString ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠ Ġpublic Ġvar Ġscroll Callback : Ġ(( id : ĠInt , Ġlast Scroll Offset : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠ Ġpublic Ġfun Ġopen In External Browser ( link : ĠString ) Ġ{ ĊĠĠĠ ĠDesktop . get Desktop (). browse ( URI ( link )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġid To Panel Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĊĠ Ġprivate Ġval Ġid To Panel Ġ= Ġmutable Map Of < Int , ĠPanel Delegate >() ĊĊĠ Ġinternal Ġfun Ġput ( panel : ĠPanel Delegate ) Ġ{ ĊĠĠĠ Ġid To Panel Lock . write Ġ{ ĊĠĠĠĠĠ Ġid To Panel [ panel . id ] Ġ= Ġpanel ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġupdate All () Ġ{ ĊĠĠĠ Ġid To Panel Lock . read Ġ{ ĊĠĠĠĠĠ Ġid To Panel . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġshow ( it ) ĊĠĠĠĠĠĠĠ Ġresize ( it ) ĊĠĠĠĠĠĠĠ Ġmove ( it ) ĊĠĠĠĠĠĠĠ Ġplace To Window ( it ) ĊĠĠĠĠĠĠĠ Ġset Html ( it ) ĊĠĠĠĠĠĠĠ Ġset Css ( it ) ĊĠĠĠĠĠĠĠ Ġscroll ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġshow ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġshow Callback ?. invoke ( id , Ġpanel . shown ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġresize ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġresize Callback ?. invoke ( id , ĠDimension ( panel . width , Ġpanel . height )) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġmove ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġmove Callback ?. invoke ( id , ĠPoint ( panel . x , Ġpanel . y )) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġdispose ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġid To Panel Lock . write Ġ{ Ġid To Panel . remove ( id ) Ġ} ĊĠĠĠ Ġdispose Callback ?. invoke ( id ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġplace To Window ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġplace To Window Callback ?. invoke ( id , Ġpanel . root Component ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġset Html ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġset Html Callback ?. invoke ( id , Ġpanel . last Changed Html ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġset Css ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġset Css Callback ?. invoke ( id , Ġpanel . last Css String ) ĊĠ Ġ} ĊĊĠ Ġinternal Ġfun Ġscroll ( id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= Ġid To Panel Lock . read Ġ{ Ġid To Panel [ id ] Ġ?: Ġreturn Ġ} ĊĠĠĠ Ġscroll Callback ?. invoke ( id , Ġpanel . last Scroll Offset ) ĊĠ Ġ} Ċ } Ċ