/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 Ġ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 . project Generator . panel . package Manager Ċ Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . openapi . ui . Validation Info Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . ui . JB Color Ċ import Ġcom . intellij . ui . Side Border Ċ import Ġcom . intellij . ui . Toolbar Decorator Ċ import Ġcom . intellij . ui . components . JB TextField Ċ import Ġcom . intellij . ui . table . JB Table Ċ import Ġcom . intellij . util . ui . Abstract TableCell Editor Ċ import Ġcom . intellij . util . ui . JB Dimension Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġorg . jetbrains . r . R Bundle Ċ import Ġorg . jetbrains . r . interpreter . R Interpreter Location Ċ import Ġorg . jetbrains . r . project Generator . template . R Project Settings Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . awt . Component Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Consumer Ċ import Ġjavax . swing . J ComboBox Ċ import Ġjavax . swing . J Component Ċ import Ġjavax . swing . JPanel Ċ import Ġjavax . swing . J Table Ċ import Ġjavax . swing . event . Document Event Ċ import Ġjavax . swing . event . Document Listener Ċ import Ġjavax . swing . table . Abstract TableModel Ċ import Ġjavax . swing . table . TableCell Renderer Ċ import Ġkotlin . collections . HashMap Ċ Ċ const Ġval ĠSET T INGS _ NAME _ COLUMN Ġ= Ġ 0 Ċ const Ġval ĠSET T INGS _ VALUE _ COLUMN Ġ= Ġ 1 Ċ Ċ /** Ċ Ġ* ĠPack rat ĠâĢĶ Ġthe ĠR Ġpackage Ġmanager Ċ Ġ*/ Ċ class ĠRP ack rat Panel ( private Ġval Ġr Project Settings : ĠR Project Settings ) Ġ: ĠR PackageManager Panel ( r Project Settings ) Ġ{ ĊĊĠ Ġoverride Ġval Ġpanel Name : ĠString ĊĠĠĠ Ġget () Ġ= Ġ" Pack rat Ġpackage Ġmanager Ġpanel " ĊĊĠ Ġoverride Ġval Ġpackage Manager Name : ĠString ĊĠĠĠ Ġget () Ġ= Ġ" Pack rat " ĊĊĠ Ġoverride Ġval Ġr PackageName : ĠString ĊĠĠĠ Ġget () Ġ= Ġ" pack rat " ĊĊĠ Ġoverride Ġval Ġinit Project Script Name : ĠString ĊĠĠĠ Ġget () Ġ= Ġ" create Pack rat " ĊĊĠ Ġoverride Ġval Ġwill Create Description Ġ= Ġfalse ĊĊĠ Ġprivate Ġval Ġlast Settings Request Ġ= ĠLast Settings Request () ĊĠ Ġprivate Ġval Ġerror BackgroundColor Ġ= ĠJ B Color . GRAY ĊĠ Ġprivate Ġval Ġtable Model Ġ= ĠPack rat Settings TableModel () ĊĠ Ġprivate Ġval Ġtable Cell Editor Ġ= ĠPack rat TableCell Editor () ĊĠ Ġprivate Ġval Ġtable Panel : ĠJPanel ĊĠ Ġprivate Ġvar Ġerror Action : ĠConsumer < List < Validation Info >> ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġtable Ġ= Ġobject Ġ: ĠJ B Table ( table Model ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprepare Renderer ( renderer : ĠTable Cell Renderer , Ġrow : ĠInt , Ġcolumn : ĠInt ): ĠComponent Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġsuper . prepare Renderer ( renderer , Ġrow , Ġcolumn ) ĊĠĠĠĠĠ Ġif Ġ( table Model . is Bad Row Value ( row ) Ġ&& Ġ! is Cell Selected ( row , Ġcolumn )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcomponent . background Ġ= Ġerror BackgroundColor ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġerror Messages Ġ= ĠHashMap < Int , ĠString >() ĊĠ Ġprivate Ġval Ġvalidation Infos ĊĠĠĠ Ġget () Ġ= Ġerror Messages . values . map Ġ{ ĠValidation Info ( it ) Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġlayout Ġ= ĠBorderLayout () ĊĠĠĠ Ġtable . getColumn Model (). getColumn ( SETTINGS _ VALUE _ COLUMN ). set Cell Editor ( table Cell Editor ) ĊĠĠĠ Ġtable . set Show Grid ( false ) ĊĠĠĠ Ġtable Panel Ġ= ĠToolbar Decorator . create Decorator ( table ). disable UpDown Actions (). disable Add Action (). disable Remove Action (). create Panel () ĊĠĠĠ Ġadd ( table Panel ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġgenerate Project ( project : ĠProject , Ġbase Dir : ĠVirtual File , Ġmodule : ĠModule ) Ġ{ ĊĠĠĠ Ġval Ġpack rat Settings Ġ= Ġtable Model . getData (). map Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġit . value ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġis ĠPack art Logical Constants Ġ-> Ġ"${ it . name } Ġ= Ġ$ value " ĊĠĠĠĠĠĠĠ Ġvalue Ġis ĠPack rat Expanded Logical Constants Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠPack rat Expanded Logical Constants . AUTO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . name } Ġ= Ġ' auto '" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . name } Ġ= Ġ$ value " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġreal Value Ġ= ĠString Join er (", Ġ", Ġ" c (", Ġ") ") ĊĠĠĠĠĠĠĠĠĠ Ġ( value Ġas ĠString ). split ("," ). forEach Ġ{ Ġvalue Part Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Value . add ("' ${ value Part . trim () }' ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ"${ it . name } Ġ= Ġ$ real Value " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpack rat Settings List Ġ= ĠString Join er (", Ġ", Ġ" list (", Ġ") ") ĊĠĠĠ Ġpack rat Settings . forEach Ġ{ Ġpack rat Settings List . add ( it ) Ġ} ĊĊĠĠĠ Ġinitialize Package ( project , Ġbase Dir , ĠlistOf ( base Dir . path , Ġpack rat Settings List . toString ())) ĊĠĠĠ Ġfocus File ( project , Ġbase Dir , Ġ". R profile ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġvalidate Settings (): ĠList < Validation Info > Ġ{ ĊĠĠĠ Ġtable Cell Editor . stop Cell Editing () ĊĠĠĠ Ġif Ġ(! r Project Settings . installed Packages . contains ( r PackageName )) Ġ{ ĊĠĠĠĠĠ Ġtable Model . is Table Editable Ġ= Ġfalse ĊĠĠĠĠĠ Ġtable Model . clear Bad Value () ĊĠĠĠĠĠ Ġtable . update UI () ĊĠĠĠĠĠ Ġrun Is Package Installed Action ( false ) ĊĠĠĠĠĠ Ġreturn ĠlistOf ( Validation Info ( R Bundle . message (" project . setting . missing . package . manager ", Ġr PackageName ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrun Is Package Installed Action ( true ) ĊĠĠĠ Ġtable Model . is Table Editable Ġ= Ġtrue ĊĠĠĠ Ġval Ġvalidation Infos Ġ= Ġvalidate All Pack rat Settings () ĊĠĠĠ Ġtable . update UI () ĊĠĠĠ Ġreturn Ġvalidation Infos ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvalidate All Pack rat Settings (): ĠList < Validation Info > Ġ{ ĊĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġtable Model . rowCount ) Ġ{ ĊĠĠĠĠĠ Ġvalidate Pack rat Settings ( row ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġvalidation Infos ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvalidate Pack rat Settings ( row : ĠInt , Ġvalue : ĠAny Ġ= Ġtable Model . getValue At ( row , ĠSET T INGS _ VALUE _ COLUMN )) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġis ĠString Ġ&& Ġvalue . isNotBlank ()) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( value Part Ġin Ġvalue . split ("," ). map Ġ{ Ġit . trim () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Part . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror Messages [ row ] Ġ= ĠR Bundle . message (" project . setting . pack rat . warning . comma ") ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( table Model . getValue At ( row , ĠSET T INGS _ NAME _ COLUMN ) Ġ== Ġ" external . packages ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Part . isNotEmpty () Ġ&& Ġ! r Project Settings . installed Packages . contains ( value Part )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Messages [ row ] Ġ= ĠR Bundle . message (" project . setting . pack rat . warning . missing . package ", Ġvalue Part ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġerror Messages . remove ( row ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġerror Messages . remove ( row ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtable Model . setIs Bad Row Value ( error Messages . containsKey ( row ), Ġrow ) ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Pack rat Settings ( interpreter : ĠR Interpreter Location ) Ġ{ ĊĠĠĠ Ġif Ġ( interpreter Ġ!= Ġlast Settings Request . interpreter Location ) Ġ{ ĊĠĠĠĠĠ Ġlast Settings Request . interpreter Location Ġ= Ġinterpreter ĊĠĠĠĠĠ Ġlast Settings Request . settings Ġ= ĠgetAll Pack rat Settings ( interpreter ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtable Model . update Data Rows ( last Settings Request . settings . to Typed Array ()) ĊĠĠĠ Ġval Ġborders Size Ġ= Ġ( table Panel . border Ġas ĠSide Border ). get Border Insets ( table Panel ) ĊĠĠĠ Ġtable Panel . setPreferredSize ( JB Dimension (- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . row Height Ġ* Ġtable . rowCount Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . table Header . preferred Size . height Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborders Size . bottom Ġ+ Ġborders Size . top )) ĊĠ Ġ} ĊĊĠ Ġfun Ġset ErrorAction ( action : ĠConsumer < List < Validation Info >>) Ġ{ ĊĠĠĠ Ġerror Action Ġ= Ġaction ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠPack rat Settings TableModel Ġ: ĠAbstract TableModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcolumn Names Ġ= ĠarrayOf (" Option ", Ġ" Value ") ĊĠĠĠ Ġprivate Ġvar Ġdata Ġ= Ġempty Array < Array < Any >>() ĊĠĠĠ Ġprivate Ġvar Ġis Bad Value Ġ= Ġempty Array < Boolean >() ĊĠĠĠ Ġvar Ġis Table Editable Ġ= Ġtrue ĊĊĠĠĠ Ġfun Ġupdate Data Rows ( data Rows : ĠArray < Pack rat Settings <* >>) Ġ{ ĊĠĠĠĠĠ Ġval Ġdata Map Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠ Ġdata . forEach Ġ{ Ġdata Map [ it [ SETTINGS _ NAME _ COLUMN ] Ġas ĠString ] Ġ= Ġit [ SETTINGS _ VALUE _ COLUMN ] Ġ} ĊĠĠĠĠĠ Ġdata Ġ= Ġdata Rows . map Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Map . containsKey ( it . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPack rat Settings ( it . name , Ġdata Map [ it . name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. map Ġ{ ĠarrayOf < Any >( it . name , Ġit . value Ġas ĠAny ) Ġ}. to Typed Array () ĊĊĠĠĠĠĠ Ġis Bad Value Ġ= ĠArray < Boolean >( data . size ) Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠ Ġfire TableData Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetData (): ĠList < Pack rat Settings <* >> Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdata . map Ġ{ ĠPack rat Settings (( it [ SETTINGS _ NAME _ COLUMN ] Ġas ĠString ), Ġit [ SETTINGS _ VALUE _ COLUMN ]) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Column Count (): ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcolumn Names . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget RowCount (): ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdata . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ColumnName ( column : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcolumn Names [ column ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue At ( row : ĠInt , Ġcolumn : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdata [ row ][ column ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Cell Editable ( row : ĠInt , Ġcolumn : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġis Table Editable Ġ&& Ġcolumn Ġ== ĠSET T INGS _ VALUE _ COLUMN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue At ( value : ĠAny ?, Ġrow : ĠInt , Ġcolumn : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġvalue Ġ?: Ġreturn ĊĠĠĠĠĠ Ġdata [ row ][ column ] Ġ= Ġvalue ĊĠĠĠĠĠ Ġfire TableCell Updated ( row , Ġcolumn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetIs Bad Row Value ( is Bad Value : ĠBoolean , Ġrow : ĠInt ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this . is Bad Value [ row ] Ġ!= Ġis Bad Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Bad Value [ row ] Ġ= Ġis Bad Value ĊĠĠĠĠĠĠĠ Ġfire TableCell Updated ( row , ĠSET T INGS _ VALUE _ COLUMN ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Bad Row Value ( row : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġis Bad Value [ row ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Bad Value () Ġ{ ĊĠĠĠĠĠ Ġis Bad Value . fill ( false ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠPack rat TableCell Editor Ġ: ĠAbstract TableCell Editor () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcomponent : ĠJ Component ĊĊĠĠĠ Ġoverride Ġfun Ġget Cell Editor Value (): ĠAny Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( component Ġis ĠJ ComboBox <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( component Ġas ĠJ ComboBox < *> ). selected Item ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ( component Ġas ĠJ B TextField ). text ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget TableCell Editor Component ( table : ĠJ Table ?, Ġvalue : ĠAny ?, Ġis Selected : ĠBoolean , Ġrow : ĠInt , Ġcolumn : ĠInt ): ĠComponent Ġ{ ĊĠĠĠĠĠ Ġval Ġdefault BackgroundColor Ġ= Ġbackground ĊĠĠĠĠĠ Ġcomponent Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPack art Logical Constants Ġ-> ĠCombo Box < Pack art Logical Constants >( ĊĠĠĠĠĠĠĠĠĠ ĠPack art Logical Constants . values ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġselected Item Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġdefault BackgroundColor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠPack rat Expanded Logical Constants Ġ-> ĠCombo Box < Pack rat Expanded Logical Constants >( ĊĠĠĠĠĠĠĠĠĠ ĠPack rat Expanded Logical Constants . values ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġselected Item Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġdefault BackgroundColor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠJ B TextField ( value . toString ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġif Ġ( table Model . is Bad Row Value ( row )) Ġerror BackgroundColor Ġelse Ġdefault BackgroundColor ĊĠĠĠĠĠĠĠĠĠ Ġget Document (). add Document Listener ( object Ġ: ĠDocument Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchanged Update ( event : ĠDocument Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Pack rat Settings ( row , Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Action ?. accept ( validation Infos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ apply . background Ġ= Ġif Ġ( error Messages . containsKey ( row )) Ġerror BackgroundColor Ġelse Ġdefault BackgroundColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinsert Update ( event : ĠDocument Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Update ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Update ( event : ĠDocument Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Update ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġcomponent ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠLast Settings Request ( var Ġinterpreter Location : ĠR Interpreter Location ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsettings : ĠList < Pack rat Settings <* >> Ġ= Ġempty List ()) Ċ } Ċ