/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . r . run . visual ize Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . application . invoke Later Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . file Chooser . FileChooser Descriptor Ċ import Ġcom . intellij . openapi . file Chooser . ex . FileChooser Dialog Impl Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . openapi . ui . TextField With Browse Button Ċ import Ġcom . intellij . openapi . ui . popup . JB Popup Factory Ċ import Ġcom . intellij . openapi . ui . popup . List Popup Ċ import Ġcom . intellij . openapi . ui . popup . Popup Step Ċ import Ġcom . intellij . openapi . ui . popup . util . Base List Popup Step Ċ import Ġcom . intellij . openapi . util . io . File Util Rt Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . ui .* Ċ import Ġcom . intellij . ui . components . labels . Link Label Ċ import Ġcom . intellij . ui . components . labels . Link Listener Ċ import Ġcom . intellij . util . Path Util Ċ import Ġcom . intellij . util . ui . J BU I Ċ import Ġorg . intellij . data vis . r . in lay s . components . Border less Dialog Wrapper Ċ import Ġorg . intellij . data vis . r . in lay s . components . Dialog Util Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . concurrency . Promise Ċ import Ġorg . jetbrains . concurrency . run Async Ċ import Ġorg . jetbrains . r . R Bundle Ċ import Ġorg . jetbrains . r . interpreter . Local Or Remote Path Ċ import Ġorg . jetbrains . r . interpreter . R Interpreter Ċ import Ġorg . jetbrains . r . interpreter . find File Ċ import Ġorg . jetbrains . r . interpreter . is Local Ċ import Ġorg . jetbrains . r . r interop . R Interop Ċ import Ġorg . jetbrains . r . run . visual ize . forms . R Import Data Dialog Form Ċ import Ġjava . awt . event . Focus Adapter Ċ import Ġjava . awt . event . Focus Event Ċ import Ġjava . awt . event . Item Event Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjavax . swing .* Ċ import Ġjavax . swing . event . Document Event Ċ import Ġkotlin . reflect . K Property Ċ Ċ abstract Ġclass ĠR Import Data Dialog ( ĊĠ Ġprotected Ġval Ġproject : ĠProject , ĊĠ Ġprotected Ġval Ġinter op : ĠR Interop , ĊĠ Ġparent : ĠDis posable , ĊĠ Ġprivate Ġval Ġinitial Path : ĠLocal Or Remote Path ? Ġ= Ġnull Ċ ) Ġ: ĠBorder less Dialog Wrapper ( project , ĠTITLE , ĠIde Modal ity Type . IDE ) Ġ{ ĊĠ Ġprivate Ġval Ġinterpreter Ġget () Ġ= Ġinter op . interpreter ĊĊĠ Ġprivate Ġval Ġfile Input Field Ġ= ĠTextField With Browse Button Ġ{ ĊĠĠĠ ĠfilePath Ġ= Ġchoose File () Ġ?: ĠfilePath ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġopen File Link Label Ġ= ĠLink Label < Any >( OPEN _ FILE _ TEXT , Ġnull , ĠLink Listener < Any > Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠ ĠfilePath Ġ= Ġchoose File () Ġ?: ĠfilePath ĊĠ Ġ}) ĊĊĠ Ġprivate Ġval Ġpreview Head Link Label Ġ= ĠLink Label < Any >(" $ DEFAULT _ PRE VIEW _ HEAD ", ĠCOM BO _ ICON , ĠLink Listener < Any > Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠ Ġchoose Preview Head () ĊĠ Ġ}) ĊĊĠ Ġprivate Ġval Ġform Ġ= ĠR Import Data Dialog Form (). apply Ġ{ ĊĠĠĠ Ġcontent Pane . preferred Size Ġ= ĠDialog Util . calculate PreferredSize ( Dialog Util . Size Preference . W IDE ) ĊĠĠĠ Ġpreview Status ComboBox Panel . add ( preview Head Link Label ) ĊĠĠĠ Ġok Cancel Buttons Panel . add ( create Ok Cancel Panel ()) ĊĠĠĠ Ġopen File Link Panel . add ( open File Link Label ) ĊĠĠĠ Ġfile Input Field Panel . add ( file Input Field ) ĊĠĠĠ Ġpreview Panel . detach () ĊĠĠĠ Ġoption Panel . detach () ĊĠĠĠ Ġno Data Label . apply Ġ{ ĊĠĠĠĠĠ Ġforeground Ġ= ĠH INT _ COLOR ĊĠĠĠĠĠ Ġfont Ġ= ĠH INT _ FONT ĊĠĠĠ Ġ} ĊĠĠĠ Ġopen File Link Label . apply Ġ{ ĊĠĠĠĠĠ Ġfont Ġ= ĠH INT _ FONT ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġpre viewer Ġ= ĠR Import Data Preview er ( parent , Ġform . preview Content Panel , Ġform . preview Status Panel ) ĊĠ Ġprivate Ġval Ġimporter Ġ= ĠR Data Importer ( interop ) ĊĊĠ Ġprivate Ġvar ĠfilePath : ĠLocal Or Remote Path ? Ġ= Ġnull ĊĠĠĠ Ġset ( path ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġon File Changed () ĊĠĠĠĠĠĠĠ Ġupdate Variable Name () ĊĠĠĠĠĠĠĠ Ġfile Input Field . text Ġ= Ġpath ?. path ?. be aut ify Path () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġpreview RowCount : ĠInt Ġ= ĠDEFAULT _ PRE VIEW _ HEAD ĊĠĠĠ Ġset ( count ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġcount ĊĠĠĠĠĠĠĠ Ġpreview Head Link Label . text Ġ= Ġ"$ count " ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġvariable Name Ġby ĠName Field Delegate ( form . name TextField ) ĊĠ Ġprivate Ġvar Ġview After Import Ġby ĠCheckBox Delegate ( form . view After Import CheckBox ) ĊĊĠ Ġprivate Ġvar Ġcurrent Configuration : ĠR Import Configuration ? Ġ= Ġnull ĊĊĠ Ġprotected Ġabstract Ġval Ġimport Option Component : ĠJ Component ĊĠ Ġprotected Ġabstract Ġval Ġimport Options : ĠR Import Options ? ĊĠ Ġprotected Ġabstract Ġval Ġsupported Formats : ĠList < String > ĊĊĠ Ġ@ Test Only ĊĠ Ġinternal Ġfun Ġvariable Name (): ĠString ? Ġ= Ġvariable Name ĊĊĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠ Ġsuper . init () ĊĠĠĠ Ġsetup StatusBar () ĊĠĠĠ Ġsetup Input Controls () ĊĠĠĠ Ġsetup Preview Component () ĊĠĠĠ ĠfilePath Ġ= Ġinitial Path ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Center Panel (): ĠJ Component ? Ġ{ ĊĠĠĠ Ġreturn Ġform . content Pane ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdo OK Action () Ġ{ ĊĠĠĠ Ġsuper . do OK Action () ĊĠĠĠ Ġimport Data () ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun Ġupdate Ok Action () Ġ{ ĊĠĠĠ Ġis OK Action Enabled Ġ= ĠfilePath Ġ!= Ġnull Ġ&& Ġvariable Name Ġ!= Ġnull Ġ&& Ġpre viewer . has Preview ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun Ġon File Changed () Ġ{ ĊĠĠĠ Ġ// ĠDo Ġnothing ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun ĠonUpdate Finished () Ġ{ ĊĠĠĠ ĠonUpdate Additional ?. let Ġ{ Ġit () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Only ĊĠ Ġvar ĠonUpdate Additional : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠ Ġprivate Ġfun Ġsetup Preview Component () Ġ{ ĊĠĠĠ Ġval Ġsplit ter Ġ= ĠOne Pixel Splitter ( false , Ġ 0 . 2 5 f ). apply Ġ{ ĊĠĠĠĠĠ Ġsecond Component Ġ= Ġpre viewer . component ĊĠĠĠĠĠ Ġfirst Component Ġ= Ġform . option Panel ĊĠĠĠ Ġ} ĊĠĠĠ Ġform . center Panel . add ( splitter ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsetup StatusBar () Ġ{ ĊĠĠĠ Ġform . preview Status Panel . border Ġ= ĠIde Border Factory . create Border ( Side Border . BOTTOM Ġor ĠSide Border . RIGHT ) ĊĠĠĠ Ġpreview Head Link Label . horizontal Text Position Ġ= ĠSw ing Constants . LEADING ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsetup Input Controls () Ġ{ ĊĠĠĠ Ġform . import Option Panel . add ( import Option Component ) ĊĠĠĠ Ġfile Input Field . textField . is Focus able Ġ= Ġfalse ĊĠĠĠ Ġpreview RowCount Ġ= ĠDEFAULT _ PRE VIEW _ HEAD ĊĠĠĠ Ġvariable Name Ġ= ĠDEFAULT _ VARIABLE _ NAME ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchoose Preview Head () Ġ{ ĊĠĠĠ Ġval Ġpopup Ġ= ĠPreview Head Popup Step (). create Popup () ĊĠĠĠ Ġpopup . show Under ne ath Of ( form . preview Status ComboBox Panel ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchoose File (): ĠLocal Or Remote Path ? Ġ{ ĊĠĠĠ Ġreturn Ġchoose File ( interpreter , Ġsupported Formats ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġimport Data () Ġ{ ĊĠĠĠ Ġvariable Name ?. let Ġ{ Ġname Ġ-> ĊĠĠĠĠĠ Ġcollect Import Configuration ()?. let Ġ{ Ġconfiguration Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġimporter . import Data ( name , Ġconfiguration . path , Ġconfiguration . options ) ĊĠĠĠĠĠĠĠ Ġupdate Editor Notifications () ĊĠĠĠĠĠĠĠ Ġif Ġ( view After Import ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠVisual ize Table Handler . visual ize Table ( interop , Ġref , Ġproject , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Editor Notifications () Ġ{ ĊĠĠĠ Ġrun Async Ġ{ ĊĠĠĠĠĠ ĠfilePath ?. find File ( interpreter )?. let Ġ{ ĠEditor Notifications . getInstance ( project ). update Notifications ( it ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠClear s Ġout Ġthe Ġgiven Ġstring Ġfrom Ġrestricted Ġcharacters ĊĠĠ Ġ* ĊĠĠ Ġ* ĠSteps : ĊĠĠ Ġ* Ġ- ĠReplace Ġall Ġcharacters Ġexcept Ġa - zA - Z 0 - 9 Ġand Ġ`. ` Ġwith Ġ`_ ` ĊĠĠ Ġ* Ġ- ĠReplace Ġall Ġcontinuous Ġ`_ ` Ġwith Ġonly Ġone ĊĠĠ Ġ* Ġ- ĠRemove Ġt ailing Ġ`_ ` ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return Ġmodified Ġstring , Ġmay Ġbe Ġempty ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġreplace Restricted Characters ( name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġname . replace ( Regex ("[ ^ \\ w |. ] "), Ġ"_ "). replace ( Regex ("_ + "), Ġ"_ "). replace ( Regex ("_ $ "), Ġ"") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Variable Name () Ġ{ ĊĠĠĠ Ġvar Ġname Ġ= ĠfilePath ?. let Ġ{ ĠFile Util Rt . getName Without Extension ( Path Util . get FileName ( it . path )) Ġ} ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull Ġ|| Ġname . isBlank ()) Ġ{ ĊĠĠĠĠĠ Ġname Ġ= ĠDEFAULT _ VARIABLE _ NAME ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġname Ġ= Ġreplace Restricted Characters ( name ) ĊĠĠĠĠĠ Ġif Ġ( name . isBlank () Ġ|| Ġname [ 0 ] Ġ== Ġ'_' Ġ|| Ġname [ 0 ]. is Digit () Ġ|| Ġ( name . length Ġ>= Ġ 2 Ġ&& Ġname [ 0 ] Ġ== Ġ'.' Ġ&& Ġname [ 1 ]. is Digit ())) ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" dataset ${ name . replace ( Regex ("^ [ _. ] "), Ġ""). let Ġ{ Ġif Ġ( it . isBlank ()) Ġ"" Ġelse Ġ"_ $ it " Ġ}}" ĊĠĠĠ Ġ} ĊĠĠĠ Ġvariable Name Ġ= Ġname ĊĠ Ġ} ĊĊĠ Ġ@ Synchron ized ĊĠ Ġprotected Ġfun Ġupdate Preview Async () Ġ{ ĊĠĠĠ Ġupdate Ok Action () ĊĠĠĠ Ġif Ġ(! form . option Panel . isEnabled ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġcollect Import Configuration ()?. let Ġ{ Ġconfiguration Ġ-> ĊĠĠĠĠĠ Ġif Ġ( configuration Ġ== Ġcurrent Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġform . option Panel . setEnabled Re cursively ( false ) ĊĠĠĠĠĠ Ġpre viewer . show Loading () ĊĠĠĠĠĠ Ġupdate Ok Action () ĊĠĠĠĠĠ Ġprepare Viewer Async ( configuration ) ĊĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġ( viewer , Ġerror Count ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġpre viewer . show Preview ( viewer , Ġerror Count ) ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Configuration Ġ= Ġconfiguration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn (" Unable Ġto Ġupdate Ġpreview ", Ġe ) ĊĠĠĠĠĠĠĠĠĠ Ġpre viewer . close Preview () ĊĠĠĠĠĠĠĠĠĠ Ġcurrent Configuration Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġshow Error Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Processed Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġform . option Panel . setEnabled Re cursively ( true ) ĊĠĠĠĠĠĠĠĠĠ ĠonUpdate Finished () ĊĠĠĠĠĠĠĠĠĠ Ġupdate Ok Action () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Error Dialog () Ġ{ ĊĠĠĠ Ġinvoke Later ( Modal ity State . state For Component ( form . content Pane )) Ġ{ ĊĠĠĠĠĠ ĠMessages . show Error Dialog ( PRE VIEW _ FAILURE _ DESCRIPTION , ĠPRE VIEW _ FAILURE _ TITLE ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprepare Viewer Async ( configuration : ĠR Import Configuration ): ĠPromise < Pair < R DataFrame Viewer , ĠInt >> Ġ{ ĊĠĠĠ Ġreturn Ġprepare Viewer Async ( configuration . path , Ġconfiguration . rowCount , Ġconfiguration . options ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprepare Viewer Async ( path : ĠLocal Or Remote Path , Ġrow Count : ĠInt , Ġoptions : ĠR Import Options ): ĠPromise < Pair < R DataFrame Viewer , ĠInt >> Ġ{ ĊĠĠĠ Ġreturn Ġimporter . preview Data Async ( path , Ġrow Count , Ġoptions ). then Async Ġ{ Ġ( ref , Ġerror Count ) Ġ-> ĊĠĠĠĠĠ Ġinter op . data Frame Get Viewer ( ref ). then Ġ{ Ġviewer Ġ-> ĊĠĠĠĠĠĠĠ ĠPair ( viewer , Ġerror Count ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcollect Import Configuration (): ĠR Import Configuration ? Ġ{ ĊĠĠĠ Ġreturn ĠfilePath ?. let Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠ Ġimport Options ?. let Ġ{ Ġoptions Ġ-> ĊĠĠĠĠĠĠĠ ĠR Import Configuration ( path , Ġpreview RowCount , Ġoptions ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠString . be aut ify Path (): ĠString Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= ĠPaths . get ( this ). be aut ify () ĊĠĠĠ Ġreturn Ġpath . take If Ġ{ Ġit . toString (). isNotEmpty () Ġ} ?. toString () Ġ?: ĠPROJECT _ DIRECTORY _ HINT ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPath . be aut ify (): ĠPath Ġ{ ĊĠĠĠ Ġval ĠbasePath Ġ= ĠPaths . get ( project . basePath !! ) ĊĠĠĠ Ġreturn Ġif Ġ( startsWith ( basePath )) ĠbasePath . rel ativ ize ( this ) Ġelse Ġthis ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠPreview Head Popup Step Ġ: ĠBase List Popup Step < Int >( null , ĠPRE VIEW _ HEAD _ VALUES ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Ch osen ( selected Value : ĠInt , Ġfinal Choice : ĠBoolean ): ĠPopup Step < *> ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdo Final Step Ġ{ ĊĠĠĠĠĠĠĠ Ġpreview RowCount Ġ= Ġselected Value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Popup (): ĠList Popup Ġ{ ĊĠĠĠĠĠ Ġreturn ĠJ B Popup Factory . getInstance (). create List Popup ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠName Field Delegate ( private Ġval Ġfield : ĠJTextField ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġfield . add TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Text Ġ= ĠINVALID _ NAME _ INPUT _ MESSAGE . take If Ġ{ Ġtry Parse () Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ ĠsetError Text ( error Text , Ġfield ) ĊĠĠĠĠĠĠĠ Ġupdate Ok Action () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠString ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtry Parse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠString ?) Ġ{ ĊĠĠĠĠĠ Ġfield . text Ġ= Ġvalue Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Parse (): ĠString ? Ġ{ ĊĠĠĠĠĠ Ġval Ġtext Ġ= Ġfield . text . trim () ĊĠĠĠĠĠ Ġif Ġ( text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( ch Ġin Ġtext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ch . is Letter Or Digit () Ġ&& Ġch Ġ!= Ġ'.' Ġ&& Ġch Ġ!= Ġ'_ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( text [ 0 ] Ġ== Ġ'_' Ġ|| Ġtext [ 0 ]. is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( text . length Ġ>= Ġ 2 Ġ&& Ġtext [ 0 ] Ġ== Ġ'.' Ġ&& Ġtext [ 1 ]. is Digit ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġtext ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġinner Ġclass ĠTextField Delegate ( private Ġval Ġfield : ĠJTextField ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġfield . add Focus Lost Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfield . addActionListener Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfield . text Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġfield . text Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ** Note :** Ġif Ġinput Ġis Ġblank Ġand Ġ[ isBlank Allowed ] Ġis Ġenabled , Ġa Ġresult Ġwill Ġbe Ġset Ġto Ġ(- 1 ) ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġinner Ġclass ĠInt Field Delegate ( private Ġval Ġfield : ĠJTextField , Ġprivate Ġval Ġis Blank Allowed : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġfield . add TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Text Ġ= ĠINVALID _ INTEGER _ INPUT _ MESSAGE . take If Ġ{ Ġtry Parse () Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠ ĠsetError Text ( error Text , Ġfield ) ĊĠĠĠĠĠĠĠ Ġupdate Ok Action () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfield . add Focus Lost Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfield . addActionListener Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠInt ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtry Parse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠInt ?) Ġ{ ĊĠĠĠĠĠ Ġfield . text Ġ= Ġ( value Ġ?: Ġ 0 ). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Parse (): ĠInt ? Ġ{ ĊĠĠĠĠĠ Ġif Ġ( isBlank Allowed Ġ&& Ġfield . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġfield . text . toInt OrNull ()?. take If Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġinner Ġclass ĠCheckBox Delegate ( private Ġval ĠcheckBox : ĠJ CheckBox ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ ĠcheckBox . addItem Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn ĠcheckBox . isSelected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ ĠcheckBox . isSelected Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġinner Ġclass ĠCombo Box Delegate < V >( private Ġval Ġcombo Box : ĠJ ComboBox < Any >, Ġentries : ĠList < ComboBox Entry < V >>) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcurrent Entries Ġ= Ġmutable ListOf < ComboBox Entry < V >>() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġupdate Entries ( entries ) ĊĠĠĠĠĠ Ġcombo Box . addItem Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( comboBox . isEnabled Ġ&& Ġe . state Change Ġ== ĠItem Event . SELECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Preview Async () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Entries ( entries : ĠList < ComboBox Entry < V >>) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( current Entries Ġ!= Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Entries . clear () ĊĠĠĠĠĠĠĠ Ġcurrent Entries . addAll ( entries ) ĊĠĠĠĠĠĠĠ Ġcombo Box . removeAll Items () ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġcurrent Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcombo Box . addItem ( entry . representation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠV Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcurrent Entries [ comboBox . selectedIndex ]. value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠV ) Ġ{ ĊĠĠĠĠĠ Ġcurrent Entries . find Ġ{ Ġit . value Ġ== Ġvalue Ġ} ?. let Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠ Ġcombo Box . selected Item Ġ= Ġentry ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġdata Ġclass ĠCombo Box Entry < V >( val Ġrepresentation : ĠString , Ġval Ġvalue : ĠV ) ĊĊĠ Ġprivate Ġdata Ġclass ĠR Import Configuration ( val Ġpath : ĠLocal Or Remote Path , Ġval Ġrow Count : ĠInt , Ġval Ġoptions : ĠR Import Options ) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ PRE VIEW _ HEAD Ġ= Ġ 5 0 ĊĠĠĠ Ġprivate Ġval ĠPRE VIEW _ HEAD _ VALUES Ġ= Ġ( 1 .. 1 0 ). map Ġ{ Ġit Ġ* Ġ 1 0 Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠLogger . getInstance ( R Import Csv Data Dialog :: class . java ) ĊĊĠĠĠ Ġprivate Ġval ĠTITLE Ġ= ĠR Bundle . message (" import . data . dialog . title ") ĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ VARIABLE _ NAME Ġ= ĠR Bundle . message (" import . data . dialog . default . variable . name ") ĊĠĠĠ Ġprivate Ġval ĠPROJECT _ DIRECTORY _ HINT Ġ= ĠR Bundle . message (" import . data . dialog . project . directory . hint ") ĊĠĠĠ Ġprivate Ġval ĠINVALID _ NAME _ INPUT _ MESSAGE Ġ= ĠR Bundle . message (" import . data . dialog . invalid . name . input . message ") ĊĠĠĠ Ġprivate Ġval ĠINVALID _ INTEGER _ INPUT _ MESSAGE Ġ= ĠR Bundle . message (" import . data . dialog . invalid . integer . input . message ") ĊĊĠĠĠ Ġprivate Ġval ĠPRE VIEW _ FAILURE _ TITLE Ġ= ĠR Bundle . message (" import . data . dialog . preview . failure . title ") ĊĠĠĠ Ġprivate Ġval ĠPRE VIEW _ FAILURE _ DESCRIPTION Ġ= ĠR Bundle . message (" import . data . dialog . preview . failure . description ") ĊĊĠĠĠ Ġprivate Ġval ĠOPEN _ FILE _ TEXT Ġ= ĠR Bundle . message (" import . data . dialog . preview . open . file ") ĊĠĠĠ Ġprivate Ġval ĠFILE _ CH OO SER _ TITLE Ġ= ĠR Bundle . message (" import . data . dialog . file . cho oser . title ") ĊĠĠĠ Ġprivate Ġval ĠFILE _ CH OO SER _ DESCRIPTION Ġ= ĠR Bundle . message (" import . data . dialog . file . cho oser . description ") ĊĊĠĠĠ Ġprivate Ġval ĠCOM BO _ ICON Ġ= ĠAll Icons . Actions . Find And Show Next Matches ĊĊĠĠĠ Ġprivate Ġval ĠH INT _ COLOR Ġ= ĠJ B Color . named Color (" Editor . foreground ", ĠJ B Color ( Gray ._ 8 0 , ĠGray ._ 1 6 0 )) ĊĠĠĠ Ġprivate Ġval ĠH INT _ FONT Ġ= ĠJ BU I . Fonts . label (). let Ġ{ Ġfont Ġ-> ĊĠĠĠĠĠ Ġfont . derive Font ( font . size Ġ+ Ġ 8 . 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠBoolean . to R Boolean (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( this ) Ġ" TRUE " Ġelse Ġ" FALSE " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠString . quote (): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġescaped Ġ= ĠString Util . escape Back Sl ashes ( this ) ĊĠĠĠĠĠ Ġreturn Ġif Ġ(! contains ('\ '' )) Ġ"' $ escaped '" Ġelse Ġ"\" $ escaped \"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠChar ?. quote (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis ?. quote () Ġ?: Ġ" '' " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠChar . quote (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ'\'' Ġ-> Ġ"\" '\ "" ĊĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġ"' \\\\ '" ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"' $ this '" ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck File Supported ( file : ĠVirtual File , Ġsupported Formats : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfile . extension ?. let Ġ{ Ġit . toLowerCase () Ġin Ġsupported Formats Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJ Component . detach () Ġ{ ĊĠĠĠĠĠ Ġparent . remove ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJ Component . setEnabled Re cursively ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġis Enabled Ġ= Ġenabled ĊĠĠĠĠĠ Ġfor Ġ( component Ġin Ġcomponents ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( component Ġis ĠJ Component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcomponent . setEnabled Re cursively ( enabled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠJTextField . add TextChanged Listener ( listener : Ġ( Document Event ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġdocument . add Document Listener ( object Ġ: ĠDocument Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtext Changed ( e : ĠDocument Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠJTextField . add Focus Lost Listener ( listener : Ġ( Focus Event ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġadd Focus Listener ( object Ġ: ĠFocus Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfocus Lost ( e : ĠFocus Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun With Disabled ( component : ĠJ Component , Ġtask : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġval Ġis Enabled Ġ= Ġcomponent . isEnabled ĊĠĠĠĠĠ Ġcomponent . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠ Ġtask () ĊĠĠĠĠĠ Ġcomponent . isEnabled Ġ= Ġis Enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠLocal Or Remote Path ?. or Choose File ( interpreter : ĠR Interpreter , Ġsupported Formats : ĠList < String >): ĠLocal Or Remote Path ? Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis Ġ?: Ġchoose File ( interpreter , Ġsupported Formats ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchoose File ( interpreter : ĠR Interpreter , Ġsupported Formats : ĠList < String >): ĠLocal Or Remote Path ? Ġ{ ĊĠĠĠĠĠ Ġval Ġproject Ġ= Ġinterpreter . project ĊĠĠĠĠĠ Ġval Ġis Remote : ĠBoolean ĊĠĠĠĠĠ Ġif Ġ( interpreter . is Local ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Remote Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuttons Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠ ĠR Bundle . message (" import . data . dialog . choose . host . local "), ĊĠĠĠĠĠĠĠĠĠ ĠR Bundle . message (" import . data . dialog . choose . host . remote "), ĊĠĠĠĠĠĠĠĠĠ ĠR Bundle . message (" import . data . dialog . choose . host . cancel ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMessages . show Dialog ( ĊĠĠĠĠĠĠĠĠĠ Ġproject , ĠR Bundle . message (" import . data . dialog . choose . host . message "), ĠFILE _ CH OO SER _ TITLE , Ġbuttons , ĊĠĠĠĠĠĠĠĠĠĠ 0 , ĠMessages . get Question Icon ()) ĊĠĠĠĠĠĠĠ Ġis Remote Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( is Remote ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġinterpreter . show FileChooser Dialog For Host () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠLocal Or Remote Path ( path , Ġtrue ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠFile Chooser Descriptor ( true , Ġfalse , Ġfalse , Ġfalse , Ġfalse , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġ. with File Filter Ġ{ Ġcheck File Supported ( it , Ġsupported Formats ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. with Description ( FILE _ CH OO SER _ DESCRIPTION ) ĊĠĠĠĠĠĠĠĠĠ Ġ. with Title ( FILE _ CH OO SER _ TITLE ) ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠFile Chooser Dialog Impl ( descriptor , Ġproject ) ĊĠĠĠĠĠĠĠ Ġval Ġchoice Ġ= Ġdialog . choose ( project ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchoice . first OrNull ()?. path ?. let Ġ{ ĠLocal Or Remote Path ( it , Ġfalse ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ