package Ġcom . blogspot . android ga id am ak Ċ Ċ import Ġat . Hex Lib . library . Hex Lib Ċ import Ġcom . blogspot . android ga id am ak . data . search Ċ import Ġcom . blogspot . android ga id am ak . data . search By Byte Difference Ċ import Ġjavafx . beans . property . Simple String Property Ċ import Ġjavafx . collections . FX Collections Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . collections . transformation . Filter edList Ċ import Ġjavafx . embed . swing . Swing Node Ċ import Ġjavafx . event . EventHandler Ċ import Ġjavafx . f xml . Initial izable Ċ import Ġjavafx . scene . control .* Ċ import Ġjavafx . scene . control . cell . TextField List Cell Ċ import Ġjavafx . scene . control . cell . TextField TableCell Ċ import Ġjavafx . scene . layout . Border Pane Ċ import Ġjavafx . stage . FileChooser Ċ import Ġjavafx . util . Callback Ċ import Ġjavafx . util . String Converter Ċ import Ġjava . io . File Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Predicate Ċ import Ġjavax . swing . Swing Utilities ĊĊ Ċ class ĠJ FX Hex Edit Controller Ġ: ĠInitial izable Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġopened File : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġj fx Hex Edit : ĠJ FX Hex Edit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhex Lib : ĠHex Lib ĊĠĠĠ Ġlateinit Ġvar Ġborder Pane : ĠBorder Pane ĊĠĠĠ Ġlateinit Ġvar Ġedit Menu : ĠMenu ĊĠĠĠ Ġlateinit Ġvar Ġsave MenuItem : ĠMenuItem ĊĠĠĠ Ġlateinit Ġvar Ġsave As MenuItem : ĠMenuItem ĊĠĠĠ Ġlateinit Ġvar Ġstatus Label : ĠLabel ĊĊĠĠĠ Ġlateinit Ġvar Ġbyte Column : ĠTable Column < String , ĠString > ĊĠĠĠ Ġlateinit Ġvar Ġchar Column : ĠTable Column < String , ĠString > ĊĠĠĠ Ġlateinit Ġvar Ġmapping TableView : ĠTable View < String > ĊĊĠĠĠ Ġlateinit Ġvar Ġbyte Field : ĠTextField ĊĠĠĠ Ġlateinit Ġvar Ġchar Field : ĠTextField ĊĊĠĠĠ Ġlateinit Ġvar Ġsearch ListView : ĠListView < Byte > ĊĠĠĠ Ġlateinit Ġvar Ġbyte Search TextField : ĠTextField ĊĠĠĠ Ġprivate Ġval Ġsearch Byte List : ĠObservable List < Byte > Ġ= ĠFX Collections . observable ArrayList () ĊĠĠĠ Ġlateinit Ġvar Ġinput Type Choice Box : ĠChoice Box < String > ĊĊĠĠĠ Ġoverride Ġfun Ġinitialize ( location : ĠURL ?, Ġresources : ĠResource Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" initialize Ġ$ border Pane ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsw ing Node Ġ= ĠSw ing Node () ĊĠĠĠĠĠĠĠ ĠSw ing Utilities . invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Lib Ġ= ĠHex Lib () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsw ing Node . content Ġ= Ġhex Lib ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Column . cell Value Factory Ġ= ĠCallback Ġ{ Ġstring Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Byte Ġ= Ġhex Lib . text Editor . mapping Table . indexOf ( stringValue . value ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple String Property ( get Hex Representation ( target Byte )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Column . on Edit Commit Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Byte ( event . newValue . substring ( 2 )) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Byte : ĠByte Ġ= Ġread Byte ( event . oldValue . substring ( 2 )) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhex Lib . text Editor . map ( it , Ġhex Lib . text Editor . mapping Table [ old Byte . toInt ()] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhex Lib . text Editor . un map ( old Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Column . cell Factory Ġ= ĠTextField TableCell . for TableColumn () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Column . cell Value Factory Ġ= ĠCallback Ġ{ Ġstring Value Ġ-> ĠSimple String Property ( stringValue . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Column . on Edit Commit Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Byte Ġ= Ġhex Lib . text Editor . mapping Table . indexOf ( event . oldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhex Lib . text Editor . map ( target Byte . to Byte (), Ġevent . newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Column . cell Factory Ġ= ĠTextField TableCell . for TableColumn () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping TableView . items Ġ= ĠFilter edList ( hex Lib . text Editor . mapping Table , ĠPredicate Ġ{ Ġstring Ġ-> Ġstring Ġ!= Ġnull Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġborder Pane . center Ġ= Ġsw ing Node ĊĠĠĠĠĠĠĠ Ġsync Ui () ĊĊĠĠĠĠĠĠĠ Ġsearch ListView . items Ġ= Ġsearch Byte List ĊĠĠĠĠĠĠĠ Ġsearch ListView . cell Factory Ġ= ĠTextField List Cell . for ListView ( object Ġ: ĠString Converter < Byte >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString ( item : ĠByte ?): ĠString Ġ= Ġitem ?. let Ġ{ Ġget Hex Representation ( it ) Ġ} Ġ?: Ġ" null " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom String ( string : ĠString ?): ĠByte Ġ= Ġstring ?. let Ġ{ Ġread Byte ( it . substring ( 2 )) Ġ} Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ}) Ċ // ĠĠĠĠĠĠĠ Ġsearch ListView . cell Factory Ġ= ĠCallback Ġ{ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠList Cell < Byte >() Ġ{ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate Item ( item : ĠByte ?, Ġempty : ĠBoolean ) Ġ{ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . update Item ( item , Ġempty ) Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġitem ?. let Ġ{ Ġget Hex Representation ( it ) Ġ} Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ //// ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ //// ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsearch ListView . is Editable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsearch ListView . on Edit Commit Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> Ġsearch Byte List [ event . index ] Ġ= Ġevent . newValue Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput Type Choice Box . items Ġ= ĠFX Collections . observable ArrayList (" Hex ", Ġ" Dec ") ĊĠĠĠĠĠĠĠ Ġinput Type Choice Box . value Ġ= Ġ" Hex " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Hex Representation ( byte : ĠByte ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 x " Ġ+ Ġbyte . to U Byte (). toString ( 1 6 ). pad Start ( 2 , Ġ' 0 ') ĊĊĠĠĠ Ġfun Ġopen File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Chooser Ġ= ĠFile Chooser () ĊĠĠĠĠĠĠĠ Ġfile Chooser . title Ġ= Ġ" Open ĠFile " ĊĠĠĠĠĠĠĠ Ġval Ġselected File Ġ= Ġfile Chooser . show Open Dialog ( j fx Hex Edit . stage ) ĊĠĠĠĠĠĠĠ Ġselected File ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopened File Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Lib . byte Content Ġ= Ġit . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ"${ it . name } Ġloaded " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Ui () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave File () Ġ{ ĊĠĠĠĠĠĠĠ Ġopened File ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes ( hex Lib . byte Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ"$ name Ġsaved " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsync Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave MenuItem . is Disable Ġ= Ġopened File Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġsave As MenuItem . is Disable Ġ= Ġopened File Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġedit Menu . is Disable Ġ= Ġopened File Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġedit Menu . items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . is Disable Ġ= Ġopened File Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Application ( stage : ĠJ FX Hex Edit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . j fx Hex Edit Ġ= Ġstage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcut () Ġ{ ĊĠĠĠĠĠĠĠ Ġhex Lib . hex Transfer Handler . cut Content 2 Clipboard () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy () Ġ{ ĊĠĠĠĠĠĠĠ Ġhex Lib . hex Transfer Handler . copy Content 2 Clipboard () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpaste () Ġ{ ĊĠĠĠĠĠĠĠ Ġhex Lib . hex Transfer Handler . paste Content From Clipboard () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Mapping () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbyte Key : ĠByte Ġ= Ġread Byte ( byte Field ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġchar Value Ġ= Ġchar Field . text ĊĠĠĠĠĠĠĠ Ġif Ġ( char Value . length Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" Only Ġ 1 Ġcharacter Ġis Ġsupported Ġfor Ġnow " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Field . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Field . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhex Lib . text Editor . map ( byte Key , Ġchar Value ) ĊĊĠĠĠĠĠĠĠ Ġbyte Field . clear () ĊĠĠĠĠĠĠĠ Ġchar Field . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Undo ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġredo () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Redo ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Byte ( textField : ĠTextField ): ĠByte ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradix Ġ= Ġif Ġ( input Type Choice Box . value Ġ== Ġ" Dec ") Ġ 1 0 Ġelse Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Value Ġ= Ġtext Field . text . toInt ( radix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Field . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intValue Ġ> Ġ 2 5 5 Ġ|| Ġint Value Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" Not Ġa Ġbyte " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġint Value . to Byte () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Number FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" Not Ġa Ġbyte " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Field . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Byte ( text : ĠString ): ĠByte ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradix Ġ= Ġif Ġ( input Type Choice Box . value Ġ== Ġ" Dec ") Ġ 1 0 Ġelse Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Value Ġ= Ġtext . toInt ( radix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intValue Ġ> Ġ 2 5 5 Ġ|| Ġint Value Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" Not Ġa Ġbyte " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġint Value . to Byte () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Number FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" Not Ġa Ġbyte " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Search Byte () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠbyteValue : ĠByte Ġ= Ġread Byte ( byte Search TextField ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġsearch Byte List . add ( byte Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch By Byte Diff () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġhex Lib . byte Content . search By Byte Difference ( hex Lib . cursor Position , Ġsearch Byte List . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" position Ġby Ġdif : Ġ$ position " ĊĠĠĠĠĠĠĠ Ġhex Lib . set Cursor Post ion ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Exact () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġhex Lib . byte Content . search ( hex Lib . cursor Position , Ġsearch Byte List . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġstatus Label . text Ġ= Ġ" position Ġexact : Ġ$ position " ĊĠĠĠĠĠĠĠ Ġhex Lib . set Cursor Post ion ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Search () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Byte List . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Mapping () Ġ{ ĊĠĠĠĠĠĠĠ Ġhex Lib . text Editor . clear Map () ĊĠĠĠ Ġ} Ċ } Ċ