package Ġcn . je ff . app . editor . dbf Ċ Ċ import Ġcn . je ff . app . Global Vars Ċ import Ġcn . je ff . app . textInput Dialog Ġas Ġinput Text Ċ import Ġcom . linux ense . jav ad bf . DB F DataType Ċ import Ġcom . linux ense . jav ad bf . DB FF ield Ċ import Ġcom . linux ense . jav ad bf . DB F Reader Ċ import Ġcom . linux ense . jav ad bf . DB F Writer Ċ import Ġjavafx . beans . property . Simple Boolean Property Ċ import Ġjavafx . collections . Observable List Ġas ĠTable Data Ċ import Ġjavafx . geometry . Pos Ċ import Ġjavafx . scene . control . TableView Ċ import Ġjavafx . scene . input . KeyCode Ċ import Ġjavafx . scene . input . KeyCode Combination Ċ import Ġjavafx . scene . input . Key Combination Ċ import Ġjavafx . util . String Converter Ċ import Ġt orn ad of x .* Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . Charset Ċ Ċ class ĠD bf Wnd ( private Ġval Ġdb f Filename : ĠString ) Ġ: ĠFragment () Ġ{ ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ private Ġconst Ġval ĠNULL _ SIGN Ġ= Ġ"( null )" Ċ ĉ } ĊĊ ĉ private Ġval Ġis Modified Ġ= ĠSimple Boolean Property ( false ) Ċ ĉ private Ġval Ġdefault Charset Ġ= ĠCharset . forName ( Global Vars . app Conf . default Charset ) Ċ ĉ private Ġvar Ġthe Table : ĠTable View < Array < Any ? >> Ġby Ġsingle Assign ( Single Assign Thread Safety Mode . NONE ) ĊĊ ĉ override Ġval Ġroot Ġ= Ġborder pane Ġ{ Ċĉ ĉ val Ġ( fields , Ġrecords ) Ġ= Ġload D bf () Ċĉ ĉ top Ġ{ Ċĉĉ ĉ h box Ġ{ Ċĉĉĉ ĉ alignment Ġ= ĠPos . CENTER _ LEFT Ċĉĉĉ ĉ spacing Ġ= Ġ 1 0 . 0 Ċĉĉĉ ĉ padding All Ġ= Ġ 1 0 . 0 Ċĉĉĉ ĉ button (" ä¿ĿåŃĺ ä¿®æĶ¹ ") Ġ{ Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ save D bf ( fields , Ġrecords ) Ċĉĉĉĉĉ ĉ is Modified . value Ġ= Ġfalse Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ }. enable When ( is Modified ) Ċĉĉĉ ĉ label ( dbf Filename ) Ċĉĉĉ ĉ button (" å¯¼åĩº Excel ") Ġ{ Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ information (" æľª å®ŀçİ° ãĢĤ ") Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ button (" æ·»åĬł æĸ° è®°å½ķ ") Ġ{ Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ records . add ( array Of Null s ( fields . count ())) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ var Ġsearching Text Ġ= Ġ"" Ċĉĉĉ ĉ var Ġfound Index Ġ= Ġ- 1 Ċĉĉĉ ĉ button ("_ F æĲľç´¢ ") Ġ{ Ċĉĉĉĉ ĉ // Ġis Mnemonic Parsing Ġ= Ġfalse Ċĉĉĉĉ ĉ // shortcut ( KeyCode Combination ( KeyCode . F , ĠKeyCode Combination . CONTROL _ DOWN )) Ċ // ĉĉĉĉ ĉ shortcut (" Ctrl - F ") Ċ // ĉĉĉĉ ĉ shortcut (" Ctrl + F ") Ġ{ Ċ // ĉĉĉĉĉ ĉ println (" è¿Ļæł· åĲĹ ï¼Ł ") Ċ // ĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ input Text (" è¯·è¾ĵåħ¥ æĲľç´¢ åĨħå®¹ ", Ġsearching Text ) Ġ{ Ġinput ted Text Ġ-> Ċĉĉĉĉĉĉ ĉ search ing Text Ġ= Ġinput ted Text . let Ġ{ Ċĉĉĉĉĉĉĉ ĉ if Ġ( it . isBlank ()) Ċĉĉĉĉĉĉĉĉ ĉ NULL _ SIGN Ċĉĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉĉĉ ĉ it . trim () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ /* Ċĉĉĉĉĉĉ ĉ the Table . select Where Ġ{ Ġrec Ġ-> Ċĉĉĉĉĉĉĉ ĉ rec . any Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ it . toString (). contains ( text , Ġtrue ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ */ Ċĉĉĉĉĉĉ ĉ found Index Ġ= Ġrecords . indexOf First Ġ{ Ġrec Ġ-> Ċĉĉĉĉĉĉĉ ĉ rec . any Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ it . toString (). contains ( search ing Text , Ġtrue ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( found Index Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ information (" æī¾ ä¸įåĪ° åĮħåĲ« âĢľ $ search ing Text âĢĿ çļĦ ä»»ä½ķ åĨħå®¹ ãĢĤ ") Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ the Table . selection Model . select ( found Index ) Ċĉĉĉĉĉĉĉ ĉ the Table . scrollTo ( found Index ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ button ("_ N æĲ ľ ä¸ĭ ä¸Ģä¸ª ") Ġ{ Ċĉĉĉĉ ĉ shortcut ( KeyCode Combination ( KeyCode . GRE ATER , ĠKey Combination . CONTROL _ DOWN )) Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( found Index Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ information (" åħĪ åīį æ²¡æľī æĲľç´¢ åĪ° ï¼Į è¯· éĩįæĸ° æĲľç´¢ ãĢĤ ") Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġsub List Ġ= Ġrecords . sub List ( found Index Ġ+ Ġ 1 , Ġrecords . count ()) Ċĉĉĉĉĉĉ ĉ val Ġnext Found Ġ= Ġsub List . indexOf First Ġ{ Ġrec Ġ-> Ċĉĉĉĉĉĉĉ ĉ rec . any Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ it . toString (). contains ( search ing Text , Ġtrue ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( next Found Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ information (" åĲİ éĿ¢ æ²¡æľī åĮħåĲ« âĢľ $ search ing Text âĢĿ çļĦåĨħå®¹ äºĨ ãĢĤ ") Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ found Index Ġ+= Ġnext Found Ġ+ Ġ 1 ĠĠĠ Ġ// Ġ åĽłä¸º sub List æĺ¯ ä»İ found Index + 1 å¼Ģå§ĭ çļĦ ï¼Į Ċĉĉĉĉĉĉĉ ĉ // Ġæ ¼ ı äºĨ ä¸ĬéĿ¢ è¿Ļ åı¥ å°±ä¼ļ æľī bug ãĢĤ Ċĉĉĉĉĉĉĉ ĉ the Table . selection Model . select ( found Index ) Ċĉĉĉĉĉĉĉ ĉ the Table . scrollTo ( found Index ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ button ("_ P æĲ ľ ä¸Ĭ ä¸Ģä¸ª ") Ġ{ Ċĉĉĉĉ ĉ shortcut ( KeyCode Combination ( KeyCode . LESS , ĠKey Combination . CONTROL _ DOWN )) Ċĉĉĉĉ ĉ action Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( found Index Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉ ĉ information (" åħĪ åīį æ²¡æľī æĲľç´¢ åĪ° ï¼Į è¯· éĩįæĸ° æĲľç´¢ ãĢĤ ") Ċĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġsub List Ġ= Ġrecords . sub List ( 0 , Ġfound Index ) Ċĉĉĉĉĉĉ ĉ val Ġprev Found Ġ= Ġsub List . indexOf Last Ġ{ Ġrec Ġ-> Ċĉĉĉĉĉĉĉ ĉ rec . any Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ it . toString (). contains ( search ing Text , Ġtrue ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ if Ġ( prev Found Ġ< Ġ 0 ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ information (" åīį éĿ¢ æ²¡æľī åĮħåĲ« âĢľ $ search ing Text âĢĿ çļĦåĨħå®¹ äºĨ ãĢĤ ") Ċĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉ ĉ found Index Ġ= Ġprev Found Ċĉĉĉĉĉĉĉ ĉ the Table . selection Model . select ( found Index ) Ċĉĉĉĉĉĉĉ ĉ the Table . scrollTo ( found Index ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ center Ġ{ Ċĉĉ ĉ the Table Ġ= Ġtable view ( records ) Ġ{ Ċĉĉĉ ĉ is Table Menu Button Visible Ġ= Ġtrue Ċĉĉĉ ĉ fields . forEach Indexed Ġ{ Ġindex , Ġdb f Field Ġ-> Ċĉĉĉĉ ĉ column < Array < Any ? >, ĠAny >( dbf Field . name ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġarr Accessor Ġ= ĠArr Accessor ( it . value , Ġindex ) Ċĉĉĉĉĉ ĉ arr Accessor . observable ( Arr Accessor :: value ) Ċĉĉĉĉ ĉ }. make Editable ( object Ġ: ĠString Converter < Any >() Ġ{ Ċĉĉĉĉĉ ĉ override Ġfun ĠtoString ( obj : ĠAny ?) Ġ= Ġobj ?. toString () Ġ?: ĠNULL _ SIGN Ċĉĉĉĉĉ ĉ override Ġfun Ġfrom String ( a Str : ĠString ?): ĠAny Ġ{ Ċĉĉĉĉĉĉ ĉ is Modified . value Ġ= Ġtrue Ċĉĉĉĉĉĉ ĉ if Ġ( a Str . isNull Or Blank ()) Ġ{ Ċĉĉĉĉĉĉĉ ĉ // Ġ èĭ¥ ä¸ºç©º æĪĸ åıª åĮħåĲ« ç©º æł¼ ï¼Į æį¢ æĪĲ ç©º ä¿¡åı· ãĢĤ Ċĉĉĉĉĉĉĉ ĉ return ĠNULL _ SIGN Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ val Ġstr Ġ= Ġa Str . trim () Ċĉĉĉĉĉĉ ĉ return Ġwhen Ġ( dbf Field . type ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ DB F DataType . CHARACTER , ĠDB F DataType . VARCHAR Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ str Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ DB F DataType . NUMERIC , Ċĉĉĉĉĉĉĉ ĉ DB F DataType . FLOAT ING _ POINT , Ċĉĉĉĉĉĉĉ ĉ DB F DataType . DOUBLE , Ċĉĉĉĉĉĉĉ ĉ DB F DataType . CUR RE NCY Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ str . toDouble () Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ DB F DataType . LONG Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ str . toInt () Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ DB F DataType . LOG ICAL Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ str . to Boolean () Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ throw ĠIOException (" ä¸į æĶ¯æĮģ ä¿®æĶ¹ çļĦæķ°æį® ç±»åŀĭ ï¼ļ ${ dbf Field . type }") Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ }) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* Ġ è¯¢ éĹ® æĺ¯åĲ¦ åı¯ åħ³éĹŃ çªĹåı£ Ċĉ Ġ* Ġ@ return Ġ èĭ¥ ç¡®è®¤ åı¯ åħ³éĹŃ ï¼Į è¿ĶåĽŀ true ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġask For Close (): ĠBoolean Ġ{ Ċĉ ĉ if Ġ(! is Modified . value ) Ġ{ Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċĉ ĉ var Ġcan Close Ġ= Ġfalse Ċĉ ĉ confirm (" ä¸į ä¿ĿåŃĺ å°± åħ³éĹŃ åĲĹ ï¼Ł ") Ġ{ Ċĉĉ ĉ can Close Ġ= Ġtrue Ċĉ ĉ } Ċĉ ĉ return Ġcan Close Ċ ĉ } ĊĊ ĉ private Ġfun Ġload D bf (): ĠPair < List < DB FF ield >, ĠTable Data < Array < Any ? >>> Ġ{ Ċĉ ĉ DB F Reader ( FileInputStream ( dbf Filename ), Ġdefault Charset ). use Ġ{ Ġreader Ġ-> Ċĉĉ ĉ val Ġfields Ġ= Ġ( 0 Ġuntil Ġreader . field Count ). map Ġ{ Ġi Ġ-> Ċĉĉĉ ĉ reader . getField ( i ) Ċĉĉ ĉ } Ċĉĉ ĉ val Ġrecords Ġ= Ġ( 0 Ġuntil Ġreader . record Count ). map Ġ{ Ċĉĉĉ ĉ reader . next Record () Ġ?: ĠarrayOf Null s ( reader . field Count ) Ċĉĉ ĉ } Ċĉĉ ĉ return Ġfields Ġto Ġrecords . observable () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġsave D bf ( fields : ĠList < DB FF ield >, Ġrecords : ĠList < Array < Any ? >>) Ġ{ Ċĉ ĉ DB F Writer ( File OutputStream ( dbf Filename ), Ġdefault Charset ). use Ġ{ Ġwriter Ġ-> Ċĉĉ ĉ writer . set Fields ( fields . to Typed Array ()) Ċĉĉ ĉ records . forEach Ġ{ Ġrecord Ġ-> Ċĉĉĉ ĉ if Ġ( record . all Ġ{ Ġit Ġ== Ġnull Ġ}) Ġ{ Ċĉĉĉĉ ĉ // Ġwriter . add Record ( null ) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ writer . add Record ( record ) Ċĉĉĉ ĉ } Ċ // ĉĉĉ ĉ writer . add Record ( record ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ class ĠArr Accessor ( private Ġval Ġarr : ĠArray < Any ? >, Ġprivate Ġval Ġind : ĠInt ) Ġ{ Ċĉ ĉ var Ġvalue : ĠAny Ċĉĉ ĉ get () Ġ= Ġarr [ ind ] Ġ?: ĠNULL _ SIGN Ċĉĉ ĉ set ( value ) Ġ{ Ċĉĉĉ ĉ arr [ ind ] Ġ= Ġif Ġ( value Ġ== ĠNULL _ SIGN ) Ġnull Ġelse Ġvalue Ċĉĉ ĉ } Ċ ĉ } Ċ Ċ } Ċ