/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 - 2 0 1 7 ĠPeng ĠW an Ġ< ph yl ame @ 1 6 3 . com > Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠJ em . Ċ Ġ* Ċ Ġ* Ġ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 Ġj em . im ab w . ui Ċ Ċ import Ġjavafx . application . Platform Ċ import Ġjavafx . beans . binding . Bindings Ċ import Ġjavafx . scene . control .* Ċ import Ġjavafx . scene . layout . Border Pane Ċ import Ġjavafx . scene . layout . V Box Ċ import Ġjavafx . stage . Directory Chooser Ċ import Ġjavafx . stage . FileChooser Ċ import Ġjavafx . stage . Modal ity Ċ import Ġjavafx . stage . Window Ċ import Ġj cl p . Value Map Ċ import Ġj cl p . text . if NotEmpty Ċ import Ġj cl p . trace Text Ċ import Ġj em . Chapter Ċ import Ġj em . ep m . E pm Manager Ċ import Ġj em . ep m . File Parser Ċ import Ġj em . ep m . PM AB _ NAME Ċ import Ġj em . im ab w .* Ċ import Ġj em . title Ċ import Ġm ala . App Ċ import Ġm ala . ixin . graphic For Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . Callable Ċ Ċ fun ĠDialog <* >. init ( title : ĠString , Ġowner : ĠWindow , Ġtag : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠ Ġheader Text Ġ= Ġnull ĊĠĠĠ Ġthis . title Ġ= Ġtitle ĊĠĠĠ Ġinit Modal ity ( Modal ity . WINDOW _ MOD AL ) ĊĠĠĠ Ġinit Owner ( owner ) ĊĠĠĠ Ġif Ġ( tag . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġset On Showing Ġ{ ĠUI Settings . restore State ( this , Ġtag ) Ġ} ĊĠĠĠĠĠĠĠ Ġset On Hidden Ġ{ ĠUI Settings . store State ( this , Ġtag ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġalert ( type : ĠAlert . Alert Type , Ġtitle : ĠString , Ġcontent : ĠString , Ġowner : ĠWindow Ġ= ĠIm ab w . top Window ): ĠAlert Ġ{ ĊĠĠĠ Ġreturn ĠAlert ( type , Ġcontent ). apply Ġ{ Ġinit ( title , Ġowner ) Ġ} Ċ } Ċ Ċ fun Ġinfo ( title : ĠString , Ġcontent : ĠString , Ġowner : ĠWindow Ġ= ĠIm ab w . top Window ) Ġ{ ĊĠĠĠ Ġalert ( Alert . Alert Type . INFORMATION , Ġtitle , Ġcontent , Ġowner ). show And Wait () Ċ } Ċ Ċ fun Ġerror ( title : ĠString , Ġcontent : ĠString , Ġowner : ĠWindow Ġ= ĠIm ab w . top Window ) Ġ{ ĊĠĠĠ Ġalert ( Alert . Alert Type . ERROR , Ġtitle , Ġcontent , Ġowner ). show And Wait () Ċ } Ċ Ċ fun Ġconfirm ( title : ĠString , Ġcontent : ĠString , Ġowner : ĠWindow Ġ= ĠIm ab w . top Window ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġwith ( alert ( Alert . Alert Type . CONFIRM ATION , Ġtitle , Ġcontent , Ġowner )) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow And Wait (). get () Ġ== ĠButton Type . OK ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġdebug ( title : ĠString , Ġcontent : ĠString , Ġthrowable : ĠThrowable , Ġowner : ĠWindow ) Ġ{ ĊĠĠĠ Ġwith ( alert ( Alert . Alert Type . NONE , Ġtitle , Ġcontent , Ġowner )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Area Ġ= ĠText Area (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Editable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Focus Tra versable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Class Ġ+= Ġ" error - text " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog Pane . expand able Content Ġ= Ġtext Area ĊĠĠĠĠĠĠĠ Ġdialog Pane . button Types Ġ+= ĠButton Type . CLOSE ĊĠĠĠĠĠĠĠ Ġgraphic Ġ= ĠApp . assets . graphic For (" dialog / bug ") ĊĠĠĠĠĠĠĠ Ġdialog Pane . expanded Property (). addListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( textArea . text . isEmpty ()) Ġtext Area . text Ġ= Ġthrowable . trace Text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow And Wait () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġinput ( ĊĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġlabel : ĠString , ĊĠĠĠĠĠĠĠ Ġinitial : ĠString , ĊĠĠĠĠĠĠĠ Ġcan Empty : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġmust Diff : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġowner : ĠWindow Ġ= ĠIm ab w . top Window Ċ ): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġwith ( TextInput Dialog ( initial )) Ġ{ ĊĠĠĠĠĠĠĠ Ġgraphic Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinit ( title , Ġowner ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Field Ġ= Ġeditor ĊĠĠĠĠĠĠĠ Ġtext Field . pref Column Count Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġval Ġok Button Ġ= Ġdialog Pane . lookup Button ( Button Type . OK ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( must Diff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . create Boolean Binding ( Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Field . text . let Ġ{ Ġit . isEmpty () Ġ|| Ġit Ġ== Ġinitial Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġtext Field . text Property ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . isEmpty ( textField . text Property ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( must Diff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . equal ( textField . text Property (), Ġinitial )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontent Text Ġ= Ġlabel ĊĠĠĠĠĠĠĠ Ġshow And Wait (). let Ġ{ Ġif Ġ( it . isPresent ) Ġit . get () Ġelse Ġnull Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtext ( ĊĠĠĠĠĠĠĠ Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġinitial : ĠString , ĊĠĠĠĠĠĠĠ Ġcan Empty : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġmust Diff : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġowner : ĠWindow Ġ= ĠIm ab w . top Window Ċ ): ĠString ? Ġ{ ĊĠĠĠ Ġwith ( Dialog < Button Type >()) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( title , Ġowner , Ġ" text ") ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠV Box (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Pane . content Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtext Area Ġ= ĠText Area (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġinitial ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Wrap Text Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . children Ġ+= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġopen Button Ġ= ĠButton Type ( App . tr (" ui . button . open "), ĠButton Bar . Button Data . LEFT ) ĊĠĠĠĠĠĠĠ Ġdialog Pane . button Types . addAll ( Button Type . OK , ĠButton Type . CANCEL , Ġopen Button ) ĊĠĠĠĠĠĠĠ Ġdialog Pane . lookup Button ( open Button ). is Disable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġok Button Ġ= Ġdialog Pane . lookup Button ( Button Type . OK ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( must Diff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . create Boolean Binding ( Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Area . text . let Ġ{ Ġit . isEmpty () Ġ|| Ġit Ġ== Ġinitial Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġtext Area . text Property ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . isEmpty ( textArea . text Property ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( must Diff ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok Button . disable Property (). bind ( Bindings . equal ( textArea . text Property (), Ġinitial )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠPlatform . run Later Ġ{ Ġtext Area . request Focus () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( show And Wait (). get () Ġ== ĠButton Type . OK ) Ġtext Area . text Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġfile Chooser Ġ= ĠFile Chooser (). apply Ġ{ ĊĠĠĠ Ġ( Workbench . work ?. path Ġ?: ĠHistory . latest )?. let Ġ{ ĠFile ( it ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Directory Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Directory Ġ= Ġit . parent File ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġdirectory Chooser Ġ= ĠDirectory Chooser () Ċ Ċ private Ġval Ġall Extension Filter Ġ= ĠFile Chooser . Extension Filter ( getExtension Name (" any "), Ġ"* .* ") Ċ Ċ private Ġfun Ġget Extension Name ( ext : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠApp . opt Tr (" misc . ext .$ ext ") Ġ?: ĠApp . tr (" misc . ext . common ", Ġext . toUpperCase ()) Ċ } Ċ Ċ private Ġfun Ġset Extension Filters ( cho oser : ĠFile Chooser , Ġextensions : ĠCollection < Collection < String >>, Ġselected : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġfilters Ġ= Ġcho oser . extension Filters ĊĠĠĠ Ġfor Ġ( extension Ġin Ġextensions ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFile Chooser . Extension Filter ( getExtension Name ( extension . first ()), Ġextension . map Ġ{ Ġ"* .$ it " Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Ġ+= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Ġin Ġextension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcho oser . selected Extension Filter Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġselect Open File ( title : ĠString , Ġowner : ĠWindow ): ĠFile ? Ġ{ ĊĠĠĠ Ġfile Chooser . title Ġ= Ġtitle ĊĠĠĠ Ġfile Chooser . extension Filters . clear () ĊĠĠĠ Ġreturn Ġfile Chooser . show Open Dialog ( owner ) Ċ } Ċ Ċ fun Ġselect Save File ( title : ĠString , Ġinit Name : ĠString Ġ= Ġ"", Ġowner : ĠWindow ): ĠFile ? Ġ{ ĊĠĠĠ Ġfile Chooser . title Ġ= Ġtitle ĊĠĠĠ Ġfile Chooser . extension Filters . set All ( all Extension Filter ) ĊĠĠĠ Ġfile Chooser . initial FileName Ġ= Ġinit Name ĊĠĠĠ Ġreturn Ġfile Chooser . show Save Dialog ( owner ) Ċ } Ċ Ċ fun Ġselect Directory ( title : ĠString , Ġowner : ĠWindow ): ĠFile ? Ġ{ ĊĠĠĠ Ġdirectory Chooser . title Ġ= Ġtitle ĊĠĠĠ Ġreturn Ġdirectory Chooser . show Dialog ( owner ) Ċ } Ċ Ċ fun Ġselect Open Image ( title : ĠString , Ġowner : ĠWindow ): ĠFile ? Ġ{ ĊĠĠĠ Ġfile Chooser . title Ġ= Ġtitle ĊĠĠĠ ĠGeneral Settings . last Image Dir . if NotEmpty Ġ{ Ġfile Chooser . initial Directory Ġ= ĠFile ( it ) Ġ} ĊĠĠĠ Ġfile Chooser . extension Filters . set All ( all Extension Filter ) ĊĠĠĠ Ġset Extension Filters ( file Chooser , Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of (" jpg ", Ġ" jpeg "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of (" png "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of (" bmp "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of (" gif ") ĊĠĠĠ Ġ), Ġ"") ĊĠĠĠ Ġreturn Ġfile Chooser . show Open Dialog ( owner )?. apply Ġ{ ĠGeneral Settings . last Image Dir Ġ= Ġparent Ġ} Ċ } Ċ Ċ private Ġfun Ġparser Extensions (): ĠList < Set < String >> Ġ{ ĊĠĠĠ Ġreturn ĠE pm Manager . services . filter Ġ{ Ġit . has Parser Ġ&& Ġit Ġis ĠFile Parser Ġ}. map Ġ{ Ġit . keys Ġ} Ċ } Ċ Ċ private Ġfun Ġm aker Extensions (): ĠList < Set < String >> Ġ{ ĊĠĠĠ Ġreturn ĠE pm Manager . services . filter Ġ{ Ġit . has Maker Ġ}. map Ġ{ Ġit . keys Ġ} Ċ } Ċ Ċ private Ġfun Ġmake Save Result ( file : ĠFile , Ġcho oser : ĠFile Chooser ): ĠPair < File , ĠString > Ġ{ ĊĠĠĠ Ġvar Ġextension Ġ= Ġfile . extension ĊĠĠĠ Ġval Ġextensions Ġ= Ġcho oser . selected Extension Filter . extensions ĊĠĠĠ Ġif Ġ( extensions . find Ġ{ Ġextension Ġin Ġit Ġ} Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextension Ġ= Ġextensions . first (). substring ( 2 ) Ġ// Ġtrim Ġ'* .' ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfile Ġto Ġextension Ċ } Ċ Ċ fun Ġopen Book File ( owner : ĠWindow ): ĠFile ? Ġ{ ĊĠĠĠ Ġfile Chooser . title Ġ= ĠApp . tr (" d . open Book . title ") ĊĠĠĠ Ġfile Chooser . extension Filters . clear () ĊĠĠĠ Ġset Extension Filters ( file Chooser , Ġparser Extensions (), ĠPM AB _ NAME ) ĊĠĠĠ ĠGeneral Settings . last Book Dir . if NotEmpty Ġ{ Ġfile Chooser . initial Directory Ġ= ĠFile ( it ) Ġ} ĊĠĠĠ Ġreturn Ġfile Chooser . show Open Dialog ( owner )?. also Ġ{ ĠGeneral Settings . last Book Dir Ġ= Ġit . parent Ġ} Ċ } Ċ Ċ fun Ġsave Book File ( name : ĠString , Ġformat : ĠString , Ġowner : ĠWindow ): ĠPair < File , ĠString >? Ġ{ ĊĠĠĠ Ġfile Chooser . initial FileName Ġ= Ġname ĊĠĠĠ Ġfile Chooser . title Ġ= ĠApp . tr (" d . save Book . title ") ĊĠĠĠ Ġfile Chooser . extension Filters . set All ( FileChooser . Extension Filter ( getExtension Name ( format ), Ġ"* .$ format ")) ĊĠĠĠ ĠGeneral Settings . last Book Dir . if NotEmpty Ġ{ Ġfile Chooser . initial Directory Ġ= ĠFile ( it ) Ġ} ĊĠĠĠ Ġreturn Ġfile Chooser . show Save Dialog ( owner )?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠGeneral Settings . last Book Dir Ġ= Ġit . parent ĊĠĠĠĠĠĠĠ Ġmake Save Result ( it , Ġfile Chooser ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsave Book File ( name : ĠString , Ġowner : ĠWindow ): ĠPair < File , ĠString >? Ġ{ ĊĠĠĠ Ġfile Chooser . initial FileName Ġ= Ġname ĊĠĠĠ Ġfile Chooser . title Ġ= ĠApp . tr (" d . save Book . title ") ĊĠĠĠ Ġfile Chooser . extension Filters . clear () ĊĠĠĠ Ġset Extension Filters ( file Chooser , Ġm aker Extensions (), ĠPM AB _ NAME ) ĊĠĠĠ ĠGeneral Settings . last Book Dir . if NotEmpty Ġ{ Ġfile Chooser . initial Directory Ġ= ĠFile ( it ) Ġ} ĊĠĠĠ Ġreturn Ġfile Chooser . show Save Dialog ( owner )?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠGeneral Settings . last Book Dir Ġ= Ġit . parent ĊĠĠĠĠĠĠĠ Ġmake Save Result ( it , Ġfile Chooser ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġopen Book Files ( owner : ĠWindow ): ĠList < File >? Ġ{ ĊĠĠĠ Ġfile Chooser . title Ġ= ĠApp . tr (" d . open Book . title ") ĊĠĠĠ Ġfile Chooser . extension Filters . clear () ĊĠĠĠ Ġset Extension Filters ( file Chooser , Ġparser Extensions (), ĠPM AB _ NAME ) ĊĠĠĠ ĠGeneral Settings . last Book Dir . if NotEmpty Ġ{ Ġfile Chooser . initial Directory Ġ= ĠFile ( it ) Ġ} ĊĠĠĠ Ġreturn Ġfile Chooser . show Open Multiple Dialog ( owner )?. also Ġ{ ĠGeneral Settings . last Book Dir Ġ= Ġit . first (). parent Ġ} Ċ } Ċ Ċ fun Ġedit Attributes ( chapter : ĠChapter , Ġowner : ĠWindow ): ĠBoolean Ġ{ ĊĠĠĠ Ġwith ( Dialog < Button Type >()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Resizable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinit ( App . tr (" d . edit Attribute . title ", Ġchapter . title ), Ġowner , Ġ" attributes ") ĊĠĠĠĠĠĠĠ Ġval Ġpane Ġ= ĠAttribute Pane ( chapter ). apply Ġ{ Ġdialog Pane . content Ġ= ĠBorder Pane ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġdialog Pane . button Types . set All ( Button Type . OK , ĠButton Type . CANCEL ) ĊĠĠĠĠĠĠĠ Ġdialog Pane . content . style Ġ+= Ġ"- fx - padding : Ġ 0 " ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġshow And Wait (). get () ĊĠĠĠĠĠĠĠ Ġpane . store State () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Ġ== ĠButton Type . OK Ġ&& Ġpane . is Modified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane . sync Variants () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġedit Variants ( map : ĠValue Map , Ġtitle : ĠString , Ġignored Keys : ĠSet < String > Ġ= Ġempty Set (), Ġowner : ĠWindow ): ĠBoolean Ġ{ ĊĠĠĠ Ġwith ( Dialog < Button Type >()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Resizable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinit ( title , Ġowner , Ġ" variants ") ĊĠĠĠĠĠĠĠ Ġval Ġpane Ġ= Ġobject Ġ: ĠVariant Pane ( map , Ġ" variants ", Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġignored Keys () Ġ= Ġignored Keys ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog Pane . content Ġ= Ġpane ĊĠĠĠĠĠĠĠ Ġdialog Pane . content . style Ġ+= Ġ"- fx - padding : Ġ 0 " ĊĠĠĠĠĠĠĠ Ġdialog Pane . button Types . set All ( Button Type . OK , ĠButton Type . CANCEL ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġshow And Wait (). get () ĊĠĠĠĠĠĠĠ Ġpane . store State () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Ġ== ĠButton Type . OK Ġ&& Ġpane . is Modified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane . sync Variants () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ