@ file : Suppress (" UNUSED _ AN ONY MO US _ PARAMETER ", Ġ" unused ") Ċ Ċ package Ġcom . github . wind ch op per . tools . password . drop . ui Ċ Ċ import Ġcom . github . wind ch op per . common . fx . c di . form . Form Ċ import Ġcom . github . wind ch op per . tools . password . drop . Application Ċ import Ġcom . github . wind ch op per . tools . password . drop . book .* Ċ import Ġcom . github . wind ch op per . tools . password . drop . crypto . Crypto Engine Ċ import Ġcom . github . wind ch op per . tools . password . drop . crypto . Salt Ċ import Ġcom . github . wind ch op per . tools . password . drop . misc .* Ċ import Ġjak arta . enterprise . context . Application Scoped Ċ import Ġjak arta . enterprise . event . Event Ċ import Ġjak arta . enterprise . event . Ob serves Ċ import Ġjak arta . inject . Inject Ċ import Ġjavafx . application . Platform Ċ import Ġjavafx . beans . binding . Bindings . create Boolean Binding Ċ import Ġjavafx . beans . binding . Bindings . not Ċ import Ġjavafx . beans . binding . Boolean Binding Ċ import Ġjavafx . event . ActionEvent Ċ import Ġjavafx . f xml . FXML Ċ import Ġjavafx . geometry . Dimension 2 D Ċ import Ġjavafx . geometry . Insets Ċ import Ġjavafx . scene . Parent Ċ import Ġjavafx . scene . Scene Ċ import Ġjavafx . scene . control .* Ċ import Ġjavafx . scene . effect . Drop Shadow Ċ import Ġjavafx . scene . image . Image Ċ import Ġjavafx . scene . image . Writable Image Ċ import Ġjavafx . scene . input . Clipboard Content Ċ import Ġjavafx . scene . input . Data Format Ċ import Ġjavafx . scene . input . Transfer Mode Ċ import Ġjavafx . scene . layout . Background Ċ import Ġjavafx . scene . layout . Background Fill Ċ import Ġjavafx . scene . layout . Corner Rad ii Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjavafx . scene . paint . Paint Ċ import Ġjavafx . scene . text . Text Ċ import Ġjavafx . stage . FileChooser Ċ import Ġjavafx . stage . FileChooser . Extension Filter Ċ import Ġjavafx . stage . Modal ity Ċ import Ġjavafx . stage . Screen Ċ import Ġjavafx . stage . Stage Style Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . net . URL Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjavax . image io . Image IO Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Application Scoped Ġ@ Form ( Application . FXML _ MAIN ) Ġclass ĠMain Controller : ĠController () Ġ{ ĊĊĠĠĠ Ġ@ Inject Ġprivate Ġlateinit Ġvar Ġbook Case : ĠBook Case ĊĠĠĠ Ġ@ Inject Ġprivate Ġlateinit Ġvar Ġtree Edit Event : ĠEvent < Tree Edit < Book Part >> ĊĠĠĠ Ġ@ Inject Ġprivate Ġlateinit Ġvar Ġtree Selection Event : ĠEvent < Tree Selection < Book Part >> ĊĠĠĠ Ġ@ Inject Ġprivate Ġlateinit Ġvar Ġmain Hide Event : ĠEvent < Main Hide > ĊĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġbook View : ĠTree View < Book Part > ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġnew Page MenuItem : ĠMenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġnew Paragraph MenuItem : ĠMenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġnew Phrase MenuItem : ĠMenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġedit MenuItem : ĠMenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġdelete MenuItem : ĠMenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġstay On Top MenuItem : ĠCheck MenuItem ĊĠĠĠ Ġ@ FXML Ġprivate Ġlateinit Ġvar Ġreload Book MenuItem : ĠMenuItem ĊĊĠĠĠ Ġprivate Ġvar Ġtr ay Icon : Ġjava . awt . Tray Icon ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġopen Book : ĠBook ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġpreferred Stage Size (): ĠDimension 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen . get Primary (). visual Bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠDimension 2 D ( it . width Ġ/ Ġ 6 , Ġit . height Ġ/ Ġ 3 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter Load ( form : ĠParent , Ġparameters : ĠMutable Map < String , Ġ* >, Ġform Namespace : ĠMutable Map < String , Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . after Load ( form , Ġparameters , Ġform Namespace ) ĊĊĠĠĠĠĠĠĠ Ġwith Ġ( stage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Style ( Stage Style . UT ILITY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠApplication . messages [" main . head "] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Always On Top Ġ= ĠApplication . st ay On Top . load (). value ?: false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstay On Top MenuItem . isSelected Ġ= Ġis Always On Top ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Close Request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Hide Event . fire ( Main Hide ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( scene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Ġ= ĠColor . TRANSP ARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Ġ( book View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( selection Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Mode Ġ= ĠSelection Mode . SINGLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected ItemProperty (). addListener Ġ{ Ġselected ItemProperty , Ġold Selection , Ġnew Selection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Selection Event . fire ( Tree Selection ( this @ Main Controller , Ġold Selection , Ġnew Selection )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Drag Detected Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . selected Item ?. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġbook Part Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Part Ġis ĠP hr ase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠClip board Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent [ Data Format . PLAIN _ TEXT ] Ġ= Ġbook Part . text ?: "" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrag Board Ġ= Ġbook View . start Drag And Drop ( Transfer Mode . COPY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Board . setContent ( content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġinvert Paint ( fill : ĠPaint ): ĠColor Ġ= Ġif Ġ( fill Ġis ĠColor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill . invert () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠLabel ( book Part . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . background Ġ= ĠBackground ( Background Fill ( Color . TRANSP ARENT , ĠCor ner Rad ii . EMPTY , ĠIn sets . EMPTY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . effect Ġ= ĠDrop Shadow ( 3 . 0 , Ġinvert Paint ( it . text Fill )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Bounds Ġ= ĠText ( book Part . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . font Ġ= Ġlabel . font ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bounds In Local ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Board . drag View Ġ= ĠWrit able Image ( text Bounds . width . toInt (), Ġtext Bounds . height . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġimage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . fill Ġ= ĠColor . TRANSP ARENT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. snapshot ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd MenuItem Bindings () ĊĊĠĠĠĠĠĠĠ Ġadd Tray Icon ( stage . icons ) ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Book Ġ= ĠApplication . open Book Path . load () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( book Case :: read Book ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: build New Book () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Book View From Book () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Encrypt Engine () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild New Book (): ĠBook Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBook (). also Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbook . name Ġ= ĠApplication . messages [" book . unnamed "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbook . new Page (). also Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . new Paragraph (). also Ġ{ Ġparagraph Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparagraph . new Phrase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfill Book View From Book () Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Book ?. let Ġ{ Ġloaded Book Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun With Fx Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Book MenuItem . is Disable Ġ= Ġloaded Book . path Ġ== Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Item Ġ= ĠTree Item < Book Part >( open Book ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook View . root Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expanded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Book . pages . forEach Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Item Ġ= ĠTree Item < Book Part >( page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . children . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expanded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage . paragraph s . forEach Ġ{ Ġparagraph Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparagraph Item Ġ= ĠTree Item < Book Part >( paragraph ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Item . children . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expanded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparagraph . ph rases . forEach Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTree Item < Book Part >( word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparagraph Item . children . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprepare Encrypt Engine () Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Book ?. let Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book . path Ġ!= Ġnull Ġ&& Ġbook . salt Raw Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( alert Choice , Ġpassword Property ) Ġ= Ġrun With Fx Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Alert Ġ= Ġprepare Alert ( Password Alert ( book . path Ġ== Ġnull ), ĠMod ality . APPLICATION _ MOD AL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( password Alert . show And Wait (), Ġpassword Alert . password Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Choice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ== ĠButton Type . OK Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Present Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . crypto Engine Ġ= ĠCrypto Engine ( password Property . get (), ĠS alt ( book . salt Raw ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbook . salt Raw Ġ= Ġit . salt Raw Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd MenuItem Bindings () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( book View . selection Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġselected Item Is ( type : ĠK Class < *> ): ĠBoolean Binding Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Boolean Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item ?. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġtype . is Instance ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: false ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected ItemProperty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Page MenuItem . disable Property (). bind ( selected ItemProperty (). isNull . or ( selected Item Is ( Book :: class ). not ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Paragraph MenuItem . disable Property (). bind ( selected ItemProperty (). isNull . or ( selected Item Is ( Page :: class ). not ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Phrase MenuItem . disable Property (). bind ( selected ItemProperty (). isNull . or ( selected Item Is ( Paragraph :: class ). not ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit MenuItem . disable Property (). bind ( selected ItemProperty (). isNull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete MenuItem . disable Property (). bind ( selected ItemProperty (). isNull . and ( not ( selected Item Is ( Internal Book Part :: class )))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Tray Icon ( images : ĠList < Image >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( java . awt . System Tray . is Supported ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Tray Ġ= Ġjava . awt . System Tray . getSystem Tray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtr ay Icon Image Ġ= ĠImage IO . read ( URL ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages . map Ġ{ Ġabs ( system Tray . tray Icon Size . width Ġ- Ġit . width ) Ġto Ġit . url Ġ}. min By OrNull Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!! . second )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtr ay Icon Ġ= Ġjava . awt . Tray Icon ( tray Icon Image , ĠApplication . messages [" tray . head "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġicon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Tray . add ( icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Action Ġ= Ġjava . awt . event . ActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( stage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Front () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon . addActionListener ( open Action ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon . popup Menu Ġ= Ġjava . awt . PopupMenu () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġmenu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . add ( java . awt . MenuItem ( Application . messages [" tray . show "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . addActionListener ( open Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . font Ġ= Ġjava . awt . Font . decode ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. derive Font ( java . awt . Font . BOLD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . add ( java . awt . MenuItem ( Application . messages [" tray . exit "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . addActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . exit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġnew Page ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( book View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . selected Item . let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( item . value Ġas ĠBook ). new Page (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . children . add ( TreeItem ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġnew Paragraph ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( book View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . selected Item . let Ġ{ Ġ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( item . value Ġas ĠPage ). new Paragraph (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . children . add ( TreeItem ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġnew Phrase ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( book View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . selected Item . let Ġ{ Ġ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( item . value Ġas ĠParagraph ). new Phrase (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . children . add ( TreeItem ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġedit ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtree Edit Event . fire ( Tree Edit ( this , Ġbook View . selection Model . selected Item )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġdelete ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( book View . selection Model . selected Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠInternal Book Part <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . children . remove ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove From Parent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprepare FileChooser (): ĠFile Chooser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile Chooser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initial Directory Ġ= Ġ( Application . open Book Path . load (). value ?. parent ?: Paths . get ( System . getProperty (" user . home ")) ). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . extension Filters . add ( Extension Filter ( Application . messages [" books "], Ġ"*. book . xml ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġopen ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprepare FileChooser (). show Open Dialog ( stage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Book ( file . to Path ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Book ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception ally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Book Ġ= Ġbook Case . read Book ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Book View From Book () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Encrypt Engine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġreload ( event : ĠAction Event ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġsave ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Book ?. let Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book . path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . path Ġ= ĠFile Chooser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initial Directory Ġ= Ġ( Application . open Book Path . load (). value ?: Paths . get ( System . getProperty (" user . home ")) ). to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . extension Filters . add ( Extension Filter ( Application . messages [" books "], Ġ"*. book . xml ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . show Save Dialog ( stage )?. to Path () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbook . path ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook Case . save Book ( book , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication . open Book Path . save ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġtoggle St ay On Top ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstage . is Always On Top Ġ= Ġstay On Top MenuItem . isSelected ĊĠĠĠĠĠĠĠ ĠApplication . st ay On Top . save ( st ay On Top MenuItem . isSelected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ FXML Ġfun Ġexit ( event : ĠAction Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlatform . exit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate (@ Ob serves Ġevent : ĠTree Update Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbook View . refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġafter Exit (@ Ob serves Ġevent : ĠExit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtr ay Icon ?. let Ġ{ Ġicon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava . awt . System Tray . getSystem Tray (). remove ( icon ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }