package Ġs cape . editor . gui . controller Ċ Ċ import Ġjavafx . application . Platform Ċ import Ġjavafx . beans . value . Observable Value Ċ import Ġjavafx . f xml . FXML Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġjavafx . collections . FX Collections Ċ import Ġjavafx . collections . transformation . Filter edList Ċ import Ġjavafx . collections . transformation . Sort edList Ċ import Ġjavafx . concurrent . Task Ċ import Ġjavafx . scene . control .* Ċ import Ġjavafx . scene . control . cell . PropertyValue Factory Ċ import Ġjavafx . scene . image . ImageView Ċ import Ġs cape . editor . gui . App Ċ import Ġs cape . editor . gui . Settings Ċ import Ġs cape . editor . gui . model . Store Entry Model Ċ import Ġs cape . editor . gui . model . Store Model Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . nio . channels . Channels Ċ import Ġjava . util . zip . CRC 3 2 Ċ import Ġjavafx . scene . control . Alert . Alert Type Ċ import Ġjavafx . scene . text . Text Ċ import Ġjavafx . stage .* Ċ import Ġs cape . editor . gui . event . Load Cache Event Ċ import Ġs cape . editor . gui . plugin . PluginManager Ċ import Ġjava . nio . file . Files Ċ import Ġkotlin . collections . HashSet ĊĊ Ċ class ĠMain Controller Ġ: ĠBaseController () Ġ{ ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Table : ĠTable View < Store Model > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Icon Col : ĠTable Column < Store Model , ĠImageView > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Name Col : ĠTable Column < Store Model , ĠString > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Index Col : ĠTable Column < Store Model , ĠInt > ĊĊĠĠĠ Ġprivate Ġval Ġstore Data Ġ= ĠFX Collections . observable ArrayList < Store Model >() ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry Table : ĠTable View < Store Entry Model > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry Icon Col : ĠTable Column < Store Entry Model , ĠImageView > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry File Col : ĠTable Column < Store Entry Model , ĠInt > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry Name Col : ĠTable Column < Store Entry Model , ĠString > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry Size Col : ĠTable Column < Store Entry Model , ĠString > ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Tf : ĠTextField ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġstore Entry Tf : ĠTextField ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġlateinit Ġvar Ġtitle : ĠText ĊĊĠĠĠ Ġprivate Ġval Ġstore Entry Data Ġ= ĠFX Collections . observable ArrayList < Store Entry Model >() ĊĊĠĠĠ Ġoverride Ġfun Ġinitialize ( location : ĠURL , Ġresources : ĠResource Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle . text Ġ= Ġ" S cape ĠEditor Ġ[ build Ġ${ App . VERSION }] " ĊĠĠĠĠĠĠĠ Ġstore Icon Col . cell Value Factory Ġ= ĠProperty Value Factory (" icon ") ĊĠĠĠĠĠĠĠ Ġstore Name Col . setCellValue Factory Ġ{ Ġit . value . name Property Ġ} ĊĠĠĠĠĠĠĠ Ġstore Index Col . setCellValue Factory Ġ{ Ġit . value . id Property Ġas ĠObservable Value < Int > Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġf iler ed Store List Ġ= ĠFilter edList ( store Data ) Ġ{ Ġtrue } ĊĠĠĠĠĠĠĠ Ġstore Tf . text Property (). addListener Ġ{ Ġ_, Ġ_, ĠnewValue Ġ-> Ġf iler ed Store List . set Predicate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ== Ġnull Ġ|| ĠnewValue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlowercase Ġ= ĠnewValue . toLowerCase () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name . toLowerCase (). contains ( lowercase ) Ġ|| Ġit . id . toString (). contains ( lowercase )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted Store List Ġ= ĠSort edList ( filer ed Store List ) ĊĠĠĠĠĠĠĠ Ġsorted Store List . comparator Property (). bind ( store Table . comparator Property ()) ĊĠĠĠĠĠĠĠ Ġstore Table . items Ġ= Ġsorted Store List ĊĊĠĠĠĠĠĠĠ Ġstore Table . selection Model . selected ItemProperty (). addListener Ġ{ Ġ_, Ġ_ Ġ, newValue Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ?: Ġreturn @ addListener ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠnewValue . id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġstore . file Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Ġ== Ġnull Ġ|| Ġfiles Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġstore . readFile ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexists Ġ= Ġdata Ġ!= Ġnull Ġ&& Ġdata . capacity () Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġif Ġ( data Ġ== Ġnull Ġ) Ġ 0 Ġelse Ġdata . capacity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgz ipped Ġ= Ġif Ġ( data Ġ== Ġnull ) Ġfalse Ġelse ĠSettings . is G zip ( data . array ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstore Entry Name Ġ= ĠSettings . get Store Entry Reference Name ( id , Ġi ) Ġ?: Ġi . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! store Entry Name . endsWith (". gz ") Ġ&& Ġgz ipped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Entry Name . indexOf (".") Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Name Ġ= Ġstore Entry Name . substring ( 0 , Ġstore Entry Name . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Name Ġ= Ġstore Entry Name . plus (". gz ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Entry Model ( i , Ġstore Entry Name , Ġsize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon ( data . array ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon (" file _ 3 2 . png ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . add ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Table . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstore Entry Icon Col . cell Value Factory Ġ= ĠProperty Value Factory (" icon ") ĊĠĠĠĠĠĠĠ Ġstore Entry File Col . setCellValue Factory Ġ{ Ġit . value . id Property Ġas ĠObservable Value < Int > Ġ} ĊĠĠĠĠĠĠĠ Ġstore Entry Name Col . setCellValue Factory Ġ{ Ġit . value . name Property Ġ} ĊĠĠĠĠĠĠĠ Ġstore Entry Size Col . setCellValue Factory Ġ{ Ġit . value . size Property Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfiltered Store Entry List Ġ= ĠFilter edList ( store Entry Data ) Ġ{ Ġtrue } ĊĠĠĠĠĠĠĠ Ġstore Entry Tf . text Property (). addListener Ġ{ Ġ_, Ġ_, ĠnewValue Ġ-> Ġfiltered Store Entry List . set Predicate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ== Ġnull Ġ|| ĠnewValue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlowercase Ġ= ĠnewValue . toLowerCase () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name . toLowerCase (). contains ( lowercase ) Ġ|| Ġit . id . toString (). contains ( lowercase )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Predicate Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted Store Entry List Ġ= ĠSort edList ( filtered Store Entry List ) ĊĠĠĠĠĠĠĠ Ġsorted Store Entry List . comparator Property (). bind ( store Entry Table . comparator Property ()) ĊĠĠĠĠĠĠĠ Ġstore Entry Table . items Ġ= Ġsorted Store Entry List ĊĊĠĠĠĠĠĠĠ Ġon Populate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġopen Plugin List () Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Scene (" Plugin Scene ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġdelete Store () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Index Ġ= Ġstore Table . selection Model . selectedIndex ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġalert Ġ= ĠAlert ( Alert Type . CONFIRM ATION ) ĊĠĠĠĠĠĠĠ Ġalert . header Text Ġ= Ġ" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġdelete Ġthis Ġstore ?" ĊĊĠĠĠĠĠĠĠ Ġval Ġoptional Ġ= Ġalert . show And Wait () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! optional . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoptional . get () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠButton Type . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠApp . fs . root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . fs . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete IfExists ( path . resolve (" main _ file _ cache . idx ${ selected Store . id } ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . fs . load () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . fs . def ragment () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Data . remove At ( selectedIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġcreate Store () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠText Input Dialog () ĊĠĠĠĠĠĠĠ Ġinput . title Ġ= Ġ" Input " ĊĠĠĠĠĠĠĠ Ġinput . header Text Ġ= Ġ" Name Ġthis Ġstore " ĊĠĠĠĠĠĠĠ Ġinput . content Text Ġ= Ġ" Please Ġenter Ġa Ġname :" ĊĠĠĠĠĠĠĠ Ġval Ġoptional Ġ= Ġinput . show And Wait () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! optional . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoptional . get () ĊĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠHashSet < Int >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġnext Id Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted Ġ= Ġstore Data . sorted Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġ Ġo 1 . id . compareTo ( o 2 . id )} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( store Ġin Ġsorted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( store . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set . contains ( next Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Id ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSettings . put Store Name ( next Id , Ġresult ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . fs . create Store ( next Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Data . add ( Store Model ( next Id , Ġresult )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġimport Store Entries () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠDirectory Chooser () ĊĠĠĠĠĠĠĠ Ġcho oser . title Ġ= Ġ" Select Ġdirectory Ġto Ġimport " ĊĠĠĠĠĠĠĠ Ġcho oser . initial Directory Ġ= ĠFile ("./ ") ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġcho oser . show Dialog ( App . main Stage ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġdir . list Files () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfiles . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġfiles [ i ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠFiles . read All Bytes ( file . to Path ()) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgz ipped Ġ= ĠSettings . is G zip ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġid : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġfile . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . indexOf (".") Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( 0 , Ġname . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġname . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore . writeFile ( id , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġfile . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! name . endsWith (". gz ") Ġ&& Ġgz ipped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . indexOf (".") Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( 0 , Ġname . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . plus (". gz ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Entry Model ( id , Ġname , Ġdata . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gz ipped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon (" gz _ 3 2 . png ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ< Ġstore Entry Data . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data [ id ] Ġ= Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . add ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ( i Ġ+ Ġ 1 ). toDouble () Ġ/ Ġfiles . size Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Message ( String . format ("% . 2 f % s ", Ġprogress , Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress (( i Ġ+ Ġ 1 ). toDouble (), Ġfiles . size . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Table . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Task (" Import Ġtask ", Ġtask ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġexport Store Entries () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠDirectory Chooser () ĊĠĠĠĠĠĠĠ Ġcho oser . title Ġ= Ġ" Select Ġa Ġdirectory Ġto Ġexport Ġto " ĊĠĠĠĠĠĠĠ Ġcho oser . initial Directory Ġ= ĠFile ("./ ") ĊĠĠĠĠĠĠĠ Ġval Ġselected Dir Ġ= Ġcho oser . show Dialog ( App . main Stage ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Dir Ġ= ĠFile ( selected Dir , Ġ" index ${ selected Store . id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! index Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstore . file Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata = Ġstore . readFile ( i ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . capacity () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= ĠSettings . get Store Entry Reference Name ( store . store Id , Ġi ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . is G zip ( data . array ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"$ i . gz " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"$ i . dat " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( File ( index Dir , Ġ"$ name ")). use Ġ{ Ġf os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannels . new Channel ( fos ). write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ( i Ġ+ Ġ 1 ). toDouble () Ġ/ Ġstore . file Count Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Message ( String . format ("% . 2 f % s ", Ġprogress , Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress (( i Ġ+ Ġ 1 ). toDouble (), Ġstore . file Count . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Task (" Export Ġtask ", Ġtask ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġrename Store () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Index Ġ= Ġstore Table . selection Model . selectedIndex ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠText Input Dialog (" w alter ") ĊĠĠĠĠĠĠĠ Ġdialog . title Ġ= Ġ" Input " ĊĠĠĠĠĠĠĠ Ġdialog . header Text Ġ= Ġ" Name Ġa Ġstore " ĊĠĠĠĠĠĠĠ Ġdialog . content Text Ġ= Ġ" Please Ġenter Ġa Ġname :" ĊĠĠĠĠĠĠĠ Ġval Ġoptional Ġ= Ġdialog . show And Wait () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! optional . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoptional . get () ĊĊĠĠĠĠĠĠĠ ĠSettings . put Store Name ( selected Store . id , Ġresult ) ĊĠĠĠĠĠĠĠ Ġstore Data [ selected Store Index ] Ġ= ĠStore Model ( selected Store . id , Ġresult ) ĊĠĠĠĠĠĠĠ Ġstore Table . refresh () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġadd Store Entry () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠFile Chooser () ĊĠĠĠĠĠĠĠ Ġcho oser . title Ġ= Ġ" Select Ġfiles Ġto Ġadd " ĊĠĠĠĠĠĠĠ Ġcho oser . initial Directory Ġ= ĠFile ("./ ") ĊĠĠĠĠĠĠĠ Ġval Ġselected Files Ġ= Ġcho oser . show Open Multiple Dialog ( App . main Stage ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġselected Files . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected File Ġ= Ġselected Files [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Count Ġ= Ġstore . file Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġfile Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġselected File . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġname . indexOf (".") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( 0 , Ġname . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġname . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Data Ġ= ĠFiles . read All Bytes ( selected File . to Path ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store . writeFile ( id , Ġfile Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgz ipped Ġ= ĠSettings . is G zip ( file Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġselected File . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gz ipped Ġ&& Ġ! name . endsWith (". gz ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . indexOf (".") Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( 0 , Ġname . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . plus (". gz ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Entry Model ( id , Ġname , Ġfile Data . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gz ipped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon (" gz _ 3 2 . png ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ< Ġfile Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data [ id ] Ġ= Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . add ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . put Store Entry Reference Name ( selected Store . id , Ġid , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ( i Ġ+ Ġ 1 ). toDouble () Ġ/ Ġselected Files . size Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Message ( String . format ("% . 2 f % s ", Ġprogress , Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress (( i Ġ+ Ġ 1 ). toDouble (), Ġselected Files . size . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Table . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Task (" Import ĠTask ", Ġtask ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Populate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠPlugin Manager . post ( Load Cache Event ( App . fs )) ĊĠĠĠĠĠĠĠ Ġstore Entry Data . clear () ĊĠĠĠĠĠĠĠ Ġstore Data . clear () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠApp . fs . store Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Name Ġ= ĠSettings . get Store Reference Name ( i ) Ġ?: Ġ" unknown " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Model ( i , Ġstore Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Data . add ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġexport Store Entry () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Entries Ġ= Ġstore Entry Table . selection Model . selected Items Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠDirectory Chooser () ĊĠĠĠĠĠĠĠ Ġcho oser . title Ġ= Ġ" Select Ġa Ġdirectory Ġto Ġexport Ġto " ĊĠĠĠĠĠĠĠ Ġcho oser . initial Directory Ġ= ĠFile ("./ ") ĊĠĠĠĠĠĠĠ Ġval Ġselected Dir Ġ= Ġcho oser . show Dialog ( App . main Stage ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġselected Store Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġstore . readFile ( entry . id ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġentry . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! entry . name . endsWith (". gz ") Ġ&& ĠSettings . is G zip ( buf . array ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . indexOf (".") Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . substring ( 0 , Ġname . indexOf (". ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname . plus (". gz ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . put Store Entry Reference Name ( selected Store . id , Ġentry . id , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( File ( selected Dir , Ġname )). use Ġ{ Ġf os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠChannels . new Channel ( fos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . write ( buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġreplace Store Entry () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Entry Ġ= Ġstore Entry Table . selection Model . selected Item Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠFile Chooser () ĊĠĠĠĠĠĠĠ Ġcho oser . title Ġ= Ġ" Select Ġfile " ĊĠĠĠĠĠĠĠ Ġcho oser . initial Directory Ġ= ĠFile ("./ ") ĊĠĠĠĠĠĠĠ Ġval Ġselected File Ġ= Ġcho oser . show Open Dialog ( App . main Stage ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected File . length () Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata = ĠFiles . read All Bytes ( selected File . to Path ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store . writeFile ( selected Store Entry . id , Ġdata )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Entry Model ( selected Store Entry . id , Ġselected File . name , Ġdata . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon ( data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data [ selected Store Entry . id ] Ġ= Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . put Store Entry Reference Name ( store . store Id , Ġselected Store Entry . id , Ġselected File . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ 1 . 0 Ġ/ Ġ 1 Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Message ( String . format ("% . 2 f % s ", Ġprogress , Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress (( 2 ). toDouble (), Ġ 1 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Task (" Replace ĠTask ", Ġtask ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Clear () Ġ{ ĊĠĠĠĠĠĠĠ Ġstore Entry Data . clear () ĊĠĠĠĠĠĠĠ Ġstore Data . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġremove Store Entry () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Entries Ġ= Ġstore Entry Table . selection Model . selected Items Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġalert Ġ= ĠAlert ( Alert Type . CONFIRM ATION ) ĊĠĠĠĠĠĠĠ Ġalert . header Text Ġ= Ġ" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġreplace Ġthis Ġfile ?" ĊĊĠĠĠĠĠĠĠ Ġval Ġoptional Ġ= Ġalert . show And Wait () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! optional . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoptional . get () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠButton Type . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġflag Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( selected Entry Ġin Ġselected Store Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġselected Entry . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store . writeFile ( file , ĠByteArray ( 0 ))) Ġ{ Ġ// Ġdef rag Ġuses Ġlen Ġ 0 Ġto Ġdetermine Ġif Ġa Ġfile Ġstore Ġshould Ġbe Ġtruncated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġstore Entry Data [ file ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠStore Entry Model ( entry . id , Ġentry . name , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . icon Ġ= ĠImageView ( Settings . get Icon (" file _ 3 2 . png ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data [ file ] Ġ= Ġmodel ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġstore . file Count Ġ- Ġ 1 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġthe Ġnumber Ġof Ġfiles Ġthat Ġneed Ġto Ġbe Ġremoved Ġfrom Ġthe Ġend Ġof Ġthe Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġremove Amount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstore Entry Data . size Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Entry Data [ i ]. size Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Amount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġremove Amount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Data . remove At ( store Entry Data . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . fs . def ragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore Entry Table . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġcompute Checksum () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! App . fs . is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselected Store Ġ= Ġstore Table . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Store Entry Ġ= Ġstore Entry Table . selection Model . selected Item Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġcrc Ġ= ĠCRC 3 2 () ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġobject : Task < Boolean >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠApp . fs . get Store ( selected Store . id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= Ġstore . readFile ( selected Store Entry . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchecksum Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buf Ġ!= Ġnull Ġ&& Ġbuf . capacity () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrc . update ( buf . array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchecksum Ġ= Ġcrc . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Ġ= ĠAlert ( Alert Type . INFORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert . title Ġ= Ġ" Computed Ġchecksum " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert . header Text Ġ= Ġ"$ checksum " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĊĠĠĠ Ġ} ĊĊ Ċ }