package Ġfeature a . device Chooser . studio ; Ċ Ċ import Ġfeature a . desktop . Main Stage Proxy Ċ import Ġfeature a . desktop . j fx .* Ċ import Ġfeature a . file Transfer . File Transfer Ċ import Ġfeature a . file Transfer . File Transfer EventListener Ċ import Ġfeature a . file Transfer . F tp Server Ċ import Ġfeature a . jvm . normalized Path Ċ import Ġfeature a . runtime . Component Ċ import Ġfeature a . runtime . Module Ċ import Ġfeature a . runtime . import Ċ import Ġjavafx . beans . property . ReadOnly String Wrapper Ċ import Ġjavafx . beans . value . Observable Value Ċ import Ġjavafx . event . EventHandler Ċ import Ġjavafx . geometry . Insets Ċ import Ġjavafx . scene . Scene Ċ import Ġjavafx . scene . control .* Ċ import Ġjavafx . scene . layout . Column Constraints Ċ import Ġjavafx . scene . layout . Grid Pane Ċ import Ġjavafx . scene . layout . Priority Ċ import Ġjavafx . scene . layout . Row Constraints Ċ import Ġjavafx . stage . FileChooser Ċ import Ġjavafx . stage . Stage Ċ import Ġjavafx . stage . Stage Style Ċ import Ġjavafx . util . Callback Ċ import Ġjava . io . File Ċ import Ġkotlin . concurrent . thread Ċ Ċ private Ġtype alias ĠDevices Chooser Cell Ġ= ĠTable Column . Cell Data Features < F tp Server , ĠString > Ċ Ċ class ĠDevices Chooser Dialog ( override Ġval Ġmodule : ĠModule ) Ġ: ĠComponent , ĠStage () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmain Stage : ĠStage Ġ= Ġimport ( Main Stage Proxy ) ĊĊĠĠĠ Ġprivate Ġval ĠprogressBar Dialog Ġ= ĠFS ProgressBar Dialog (" Upload ĠBundle ") ĊĠĠĠ Ġprivate Ġval Ġftp Servers TableView Ġ= ĠF ST ableView < F tp Server >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġselection Model . selection Mode Ġ= ĠSelection Mode . SINGLE ĊĠĠĠĠĠĠĠ Ġplaceholder Ġ= ĠLabel ("< none >") ĊĠĠĠĠĠĠĠ Ġcolumns . add ( TableColumn < F tp Server , ĠString >(" Model "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Editable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Value Factory Ġ= ĠCallback < Devices Chooser Cell , ĠObservable Value < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReadOnly String Wrapper ("${ it . value . brand } Ġ(${ it . value . model }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġon DoubleClick Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsmart Resize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġupload Button Ġ= ĠButton (" Upload "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis Default Button Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġon Action Ġ= ĠEventHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbundle TextField Ġ= ĠTextField () ĊĊĠĠĠ Ġprivate Ġval Ġup loader Ġ= ĠFile Transfer (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd File Transfer Component Listener ( object Ġ: ĠFile Transfer EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonUpdate F tp Servers ( ftp Servers : ĠSet < F tp Server >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġftp Servers TableView . items . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġftp Servers TableView . items . addAll ( ftp Servers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Upload File Progress ( ftp Server : ĠF tp Server ?, Ġfile : ĠFile ?, Ġprogress : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ== Ġ 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar Dialog . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar Dialog . update Progress ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Component () Ġ{ ĊĠĠĠĠĠĠĠ Ġup loader . create Uploader () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonDelete Component () Ġ{ ĊĠĠĠĠĠĠĠ Ġup loader . destroy Uploader () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Connected ĠDevices " ĊĠĠĠĠĠĠĠ Ġinit Style ( Stage Style . UT ILITY ) ĊĠĠĠĠĠĠĠ Ġinit Owner ( main Stage ) ĊĠĠĠĠĠĠĠ Ġclose On Escape () ĊĠĠĠĠĠĠĠ Ġval Ġcontent Panel Ġ= ĠGrid Pane (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= ĠIn sets ( 8 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh gap Ġ= Ġ 8 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv gap Ġ= Ġ 8 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontent Panel . add ( ftp Servers TableView , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcontent Panel . add ( bundle TextField . with Button (" ...") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile Chooser (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Filters . add ( FileChooser . Extension Filter (" Application ĠBundle Ġ(* . bundle )", Ġ"*. bundle ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show Open Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle TextField . text Ġ= Ġfile . normalized Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcontent Panel . add ( fill Width ( right Ġ= ĠlistOf ( upload Button )), Ġ 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcontent Panel . column Constraints . add ( Column Constraints (). apply Ġ{ Ġh grow Ġ= ĠPriority . ALWAYS Ġ}) ĊĠĠĠĠĠĠĠ Ġcontent Panel . row Constraints . add ( Row Constraints (). apply Ġ{ Ġv grow Ġ= ĠPriority . ALWAYS Ġ}) ĊĠĠĠĠĠĠĠ Ġcontent Panel . row Constraints . add ( Row Constraints (). apply Ġ{ Ġv grow Ġ= ĠPriority . NE VER Ġ}) ĊĠĠĠĠĠĠĠ Ġcontent Panel . row Constraints . add ( Row Constraints (). apply Ġ{ Ġv grow Ġ= ĠPriority . NE VER Ġ}) ĊĠĠĠĠĠĠĠ Ġscene Ġ= ĠScene ( content Panel , Ġ 4 0 0 . 0 , Ġ 4 0 0 . 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbundle TextField . text Ġ= Ġstudio Preferences . device Chooser Bundle ĊĠĠĠĠĠĠĠ Ġbundle TextField . text Property (). onChange Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstudio Preferences . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Chooser Bundle Ġ= Ġtext Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġftp Server Ġ= Ġftp Servers TableView . selection Model . selected Item Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbundle Path Ġ= Ġbundle TextField . text ĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġup loader . upload File ( ftp Server , ĠFile ( bundle Path )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhide () ĊĠĠĠĠĠĠĠ ĠprogressBar Dialog . show And Wait () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow ( filePath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠ Ġbundle TextField . text Ġ= ĠfilePath ĊĠĠĠ Ġ} Ċ Ċ } Ċ