package Ġj dr . ex ia . view . men ubar Ċ Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Experimental Compose Ui Api Ċ import Ġandroidx . compose . ui . input . key . Key Ċ import Ġandroidx . compose . ui . input . key . Key Shortcut Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġandroidx . compose . ui . window . Frame Window Scope Ċ import Ġandroidx . compose . ui . window . MenuBar Ċ import Ġandroidx . compose . ui . window . MenuBar Scope Ċ import Ġj dr . ex ia . O LE BO _ VERSION _ CODE Ċ import Ġj dr . ex ia . O LE BO _ VERSION _ NAME Ċ import Ġj dr . ex ia . localization .* Ċ import Ġj dr . ex ia . main Ċ import Ġj dr . ex ia . model . dao . DAO Ċ import Ġj dr . ex ia . model . dao . load O le bo Zip Data Ċ import Ġj dr . ex ia . model . dao . zip O le bo Directory Ċ import Ġj dr . ex ia . update . Change logs Dialog Ċ import Ġj dr . ex ia . update . get Change logs Ċ import Ġj dr . ex ia . view . Settings Dialog Ċ import Ġj dr . ex ia . view . Window StateManager Ċ import Ġj dr . ex ia . view . element . dialog . Confirm Message Ċ import Ġj dr . ex ia . view . element . dialog . Loading Dialog Ċ import Ġj dr . ex ia . view . element . dialog . Message Dialog Ċ import Ġj dr . ex ia . view . tools . window Ancestor Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Del icate Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ import Ġjavax . swing . J FileChooser Ċ import Ġjavax . swing . JOptionPane Ċ import Ġjavax . swing . file cho oser . FileName Extension Filter Ċ Ċ @ Composable Ċ fun ĠFrame Window Scope . Main MenuBar ( exit Application : Ġ() Ġ-> ĠUnit ) Ġ= ĠMenu Bar Ġ{ ĊĠĠĠ ĠMain Menus ( exit Application ) Ċ } Ċ Ċ @ Opt In ( Experimental Compose Ui Api :: class ) Ċ @ Composable Ċ fun ĠMenu Bar Scope . Main Menus ( exit Application : Ġ() Ġ-> ĠUnit ) Ġ= ĠMenu ( text Ġ= ĠString Locale [ STR _ FILES ], Ġmnemonic Ġ= Ġ' f ') Ġ{ ĊĠĠĠ Ġval Ġlong Process Running Message Ġ= Ġremember Ġ{ Ġmutable State Of ("") Ġ} ĊĊĠĠĠ Ġif Ġ( long Process Running Message . value . isNotBlank ()) ĊĠĠĠĠĠĠĠ ĠLoading Dialog ( reason Message Ġ= Ġlong Process Running Message . value ) ĊĊĠĠĠ ĠItem ( text Ġ= ĠString Locale [ STR _ EXPORT _ DATA ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġ" ole bo " ĊĠĠĠĠĠĠĠ ĠJ FileChooser (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dialog Title Ġ= ĠString Locale [ STR _ EXPORT _ DATA ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . file Filter Ġ= ĠFileName Extension Filter ( String Locale [ STR _ O LE BO _ FILE ], Ġextension ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . show Save Dialog ( this . window Ancestor ) Ġ== ĠJ FileChooser . APPRO VE _ OPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile To Save Ġ= Ġif Ġ( this . selected File . extension Ġ== Ġextension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selected File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("${ this . selected File . parent File . absolute Path }${ File . separator }${ this . selected File . name Without Extension }. $ extension ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file To Save . exists () Ġ|| ĠJOptionPane . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Locale [ ST _ FILE _ AL READY _ EXISTS ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Locale [ STR _ SAVE _ AS ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . YES _ NO _ OPTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠJOptionPane . YES _ OPTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Process Running Message . execute Blocking Process ( String Locale [ STR _ EXPORT _ DATA ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip O le bo Directory ( file To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġconfirmed Import Ġby Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĊĠĠĠ Ġvar Ġinfo Message : ĠString ? Ġby Ġremember Ġ{ Ġmutable State Of ( null ) Ġ} ĊĊĠĠĠ Ġif Ġ( confirmed Import ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConfirm Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠString Locale [ ST _ WARNING _ CONFIG _ RESET ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠString Locale [ STR _ IMPORT _ DATA ], ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClose Request Ġ= Ġ{ Ġconfirmed Import Ġ= Ġfalse Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ FileChooser (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dialog Title Ġ= ĠString Locale [ STR _ IMPORT _ DATA ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . file Filter Ġ= ĠFileName Extension Filter ( String Locale [ STR _ O LE BO _ FILE ], Ġ" ole bo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . show Open Dialog ( this . window Ancestor ) Ġ== ĠJ FileChooser . APPRO VE _ OPTION Ġ&& Ġ! this . selected File . isDirectory Ġ&& Ġthis . selected File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Process Running Message . execute Blocking Process ( String Locale [ STR _ IMPORT _ DATA ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload O le bo Zip Data ( selected File ). on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Message Ġ= ĠString Locale [ ST _ CONFIGURATION _ IMPORTED ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclose Ġall Ġcomp osable Ġwindows Ġand Ġthen Ġrestart Ġthe Ġmain Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Application () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDAO . refresh Database () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Message Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Message Ġ= Ġ"${ String Locale [ ST _ UNKNOWN _ ERROR ]} Ġ${ String Locale [ ST _ FILE _ MAY _ BE _ CORR UP TED ]}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinfo Message ?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠMessage Dialog (" Info ", Ġmessage Ġ= Ġit , ĠonClose Request Ġ= Ġ{ Ġinfo Message Ġ= Ġnull Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠItem ( text Ġ= ĠString Locale [ STR _ IMPORT _ DATA ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfirmed Import Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSe parator () ĊĊĠĠĠ Ġvar Ġis Settings Dialog Visible Ġby Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĊĠĠĠ Ġif Ġ( is Settings Dialog Visible ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSettings Dialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Settings Dialog Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow StateManager . current Focused Window ?. rep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠItem ( text Ġ= ĠString Locale [ STR _ OPTIONS ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Settings Dialog Visible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠItem ( text Ġ= ĠString Locale [ STR _ TA KE _ SCREEN SHOT ], Ġenabled Ġ= Ġfalse , Ġshortcut Ġ= ĠKey Shortcut ( Key . P , Ġctrl Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġthis @ File Menu . window Ancestor ĊĠĠĠĠĠĠĠ ĠJ FileChooser (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dialog Title Ġ= ĠString Locale [ STR _ TA KE _ SCREEN SHOT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . file Filter Ġ= ĠFileName Extension Filter (" Image ĠPNG ", Ġ" png ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . show Save Dialog ( parent ) Ġ== ĠJ FileChooser . APPRO VE _ OPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile To Save Ġ= Ġif Ġ( this . selected File . extension Ġ== Ġ" png ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selected File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("${ this . selected File . parent File . absolute Path }${ File . separator }${ this . selected File . name Without Extension }. png ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsave Img Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage IO . write ( get Screen Shot ( parent ), Ġ" png ", Ġfile To Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file To Save . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠJOptionPane . show Confirm Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Locale [ ST _ FILE _ AL READY _ EXISTS ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Locale [ STR _ SAVE _ AS ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOptionPane . YES _ NO _ OPTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠJOptionPane . YES _ OPTION ) Ġsave Img () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġsave Img () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġchange logs Ġby Ġremember Ġ{ Ġmutable State Of ("") Ġ} ĊĊĠĠĠ ĠItem ( text Ġ= Ġ" Change logs ") Ġ{ ĊĠĠĠĠĠĠĠ Ġchange logs Ġ= Ġget Change logs () Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( change logs . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠChange logs Dialog ( change logs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange logs Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġabout Dialog Visible Ġby Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĊĠĠĠ ĠItem ( text Ġ= ĠString Locale [ STR _ AB OUT ], Ġshortcut Ġ= ĠKey Shortcut ( Key . F 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġabout Dialog Visible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( about Dialog Visible ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMessage Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠString Locale [ STR _ AB OUT ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOle bo Ġ- Ġ${ String Locale [ STR _ APP _ VERSION ]} Ġ$ O LE BO _ VERSION _ NAME Ġ- Ġ${ String Locale [ STR _ VERSION _ CODE ]} Ġ$ O LE BO _ VERSION _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ String Locale [ ST _ DE VELO PED _ BY ]} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClose Request Ġ= Ġ{ Ġabout Dialog Visible Ġ= Ġfalse Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 5 0 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 2 1 5 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Line Height Ġ= Ġ 4 5 . sp ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Del icate Cor outines Api :: class ) Ċ private Ġinline Ġfun ĠMutable State < String >. execute Blocking Process ( ĊĠĠĠ Ġreason Message : ĠString , ĊĠĠĠ Ġcross inline Ġprocess : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ċ ) Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠ Ġvalue Ġ= Ġreason Message ĊĠĠĠ Ġprocess () ĊĠĠĠ Ġvalue Ġ= Ġ"" Ċ }