/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 Ġandroidx . compose . desktop Ċ Ċ import Ġandroidx . compose . ui . window . v 1 . MenuBar Ċ Ċ object ĠApp Manager Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( object Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon App Exit ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġshared MenuBar : ĠMenu Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġdefault Action On Windows Empty : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĠSystem . exit ( 0 ) Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġon Windows Empty Action : Ġ(() Ġ-> ĠUnit )? Ġ= Ġdefault Action On Windows Empty ĊĊĠĠĠ Ġprivate Ġvar Ġon App Start : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġon App Exit : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġwindows List Ġ= Ġmutable Set Of < App Frame >() ĊĊĠĠĠ Ġval Ġwindows : ĠList < App Frame > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwindows List . toList () ĊĊĠĠĠ Ġval Ġfocused Window : ĠApp Frame ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Focused Window () ĊĊĠĠĠ Ġprivate Ġfun Ġcurrent Focused Window (): ĠApp Frame ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( current Ġin Ġwindows List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current . window . is Focused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġadd Window ( window : ĠApp Frame ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( windows List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon App Start ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( windows List . contains ( window )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwindows List . add ( window ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġremove Window ( window : ĠApp Frame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwindows List . remove ( window ) ĊĠĠĠĠĠĠĠ Ġwindow . dispose () ĊĠĠĠĠĠĠĠ Ġif Ġ( windows List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Windows Empty Action ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Events ( ĊĠĠĠĠĠĠĠ Ġon App Start : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon App Exit : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon Windows Empty : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on App Start Ġ= Ġon App Start ĊĠĠĠĠĠĠĠ Ġthis . on App Exit Ġ= Ġon App Exit ĊĠĠĠĠĠĠĠ Ġthis . on Windows Empty Action Ġ= Ġon Windows Empty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Menu ( menu Bar : ĠMenu Bar ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġshared MenuBar Ġ= Ġmenu Bar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ordered Windows List Ġ= Ġmutable ListOf < App Frame >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġwindows List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame . inv oker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Ordered Windows List . add ( frame ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġdialog Ordered Windows List . union ( windows List )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ