/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠJ ason ĠMon k Ċ Ġ* ĠĊ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* ĠĊ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠĊ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . mon kop edia . lan tern a . navigation Ċ Ċ import Ġcom . google code . lan tern a . gui 2 . Component Ċ import Ġcom . google code . lan tern a . gui 2 . Multi Window Text GUI Ċ import Ġcom . mon kop edia . dynamic layout . Caching Panel Ċ import Ġcom . mon kop edia . util . exception Handler Ċ import Ġcom . mon kop edia . util . logger Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . system . exit Process Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ private Ġval ĠLOGGER Ġ= ĠNavigation :: class . logger Ċ class ĠNavigation ( val Ġgui : ĠMulti Window Text GUI ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor Ġ{ Ġr Ġ-> ĠThread ( r , Ġ" Navigation ") Ġ} ĊĠĠĠ Ġprivate Ġval Ġdispatcher Ġ= Ġexecutor . as Coroutine Dispatcher () Ġ+ ĠLOGGER . exception Handler ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( dispatcher ) ĊĊĠĠĠ Ġprivate Ġval Ġback Stack Ġ= Ġmutable ListOf < Screen >() ĊĊĠĠĠ Ġval Ġon Screen Changed Listeners Ġ= Ġmutable ListOf <( Screen ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġprivate Ġvar Ġtop Screen : ĠScreen ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġset Top Screen Ġ$ value Ġ$ field ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġvalue ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Window Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : ĠH iding Ġ$ last Window , Ġshowing Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Window ?. hide ( this @ Navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. show ( this @ Navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Screen Changed Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke ( value Ġ?: Ġreturn @ launch ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġopen ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġopen Ġ$ screen ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen ?. let Ġ{ Ġback Stack . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen Ġ= Ġscreen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġshow Dialog ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġopen Ġdialog Ġ$ screen ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen . show ( this @ Navigation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġhide Dialog ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġopen Ġdialog Ġ$ screen ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen . hide ( this @ Navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen . destroy ( this @ Navigation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġreplace ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġreplace Ġ$ top Screen Ġwith Ġ$ screen ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen ?. destroy ( this @ Navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen Ġ= Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Writer (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace ( PrintWriter ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Writer (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . cause ?. printStackTrace ( PrintWriter ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġpop Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen ?. destroy ( this @ Navigation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Screen Ġ= Ġback Stack . remove Last OrNull (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Navigation : Ġopen Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġback Stack . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . destroy ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtop Screen ?. destroy ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Header Container : ĠC aching Panel ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġheader : ĠComponent ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Header Container ?. remove Component ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Header Container ?. addComponent ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġattach Header ( container : ĠC aching Panel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Header Container ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Header Ġattached Ġalready Ġwhile Ġadding Ġ$ container ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetach Header ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Header Container Ġ= Ġcontainer ĊĠĠĠĠĠĠĠ Ġheader ?. addTo ( container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetach Header ( container : ĠC aching Panel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer . removeAll Components () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Header Container Ġ!= Ġcontainer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Header Ġ$ container Ġis Ġnot Ġcurrently Ġattached ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Header Container Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ