package Ġdocker . volumes . ui . components Ċ Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . openapi . ui . Dialog Wrapper Ċ import Ġcom . intellij . ui . Add Edit Remove Panel Ċ import Ġcom . intellij . ui . layout . Validation Info Builder Ċ import Ġcom . intellij . ui . layout . panel Ċ import Ġdocker . volumes . Docker Volumes Bundle . message Pointer Ċ import Ġdocker . volumes . ui . utils . check Regex Ċ import Ġdocker . volumes . ui . utils . isNotEmpty Ċ import Ġdocker . volumes . ui . utils . to Error Ċ import Ġjavax . swing . Default ComboBox Model Ċ import Ġjavax . swing . J ComboBox Ċ import Ġjavax . swing . J Component Ċ import Ġjavax . swing . JTextField Ċ import Ġutils . Failure Ċ import Ġutils . Result Ċ import Ġutils . Success Ċ import Ġutils . filter If Ċ import Ġutils . first Or Ċ import Ġutils . minus If NotNull Ċ import Ġutils . otherwise Ċ import Ġutils . then Ċ Ċ class ĠDocker Volume Pair Panel ( ĊĠĠĠ Ġtitle : ĠString , ĊĠĠĠ Ġval Ġpossible Values : ĠMap < String , ĠArray < String >> Ġ= Ġmap Of () Ċ ) Ġ: ĠAdd Edit Remove Panel < Pair < String , ĠString >>( My Pair TableModel (), Ġmutable ListOf (), Ġtitle ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . table . set Show Columns ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Item ( pair : ĠPair < String , ĠString >): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġedit Item ( pair : ĠPair < String , ĠString >): ĠPair < String , ĠString >? Ġ= Ġdo Add Or Edit ( pair ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Item (): ĠPair < String , ĠString >? Ġ= Ġdo Add Or Edit ( null ) ĊĊĠĠĠ Ġprivate Ġfun Ġdo Add Or Edit ( pair : ĠPair < String , ĠString >? ): ĠPair < String , ĠString >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Keys Ġ= Ġthis . data . toMap (). keys . minus If NotNull ( pair ?. first ) ĊĠĠĠĠĠĠĠ Ġval Ġoption Dialog Ġ= ĠMy Add Or Edit Pair Dialog ( pair , Ġdata Keys , Ġpossible Values . filter If ( pair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! data Keys . contains ( it . key ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! option Dialog . show AndGet ()) Ġnull Ġelse Ġoption Dialog . getValue (). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . isNotBlank () Ġ&& Ġit . second . isNotBlank () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMy Add Or Edit Pair Dialog ( ĊĠĠĠĠĠĠĠ Ġoption : ĠPair < String , ĠString > ?, ĊĠĠĠĠĠĠĠ Ġval Ġalready Defined Keys : ĠSet < String >, ĊĠĠĠĠĠĠĠ Ġval Ġpossible Values : ĠMap < String , ĠArray < String >> ĊĠĠĠ Ġ) Ġ: ĠDialog Wrapper ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmy Name : ĠString Ġ= Ġoption ?. first Ġ?: Ġpossible Values . keys . first Or Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmy Value : ĠString Ġ= Ġoption ?. second Ġ?: Ġpossible Values [ my Name ]. first Or Ġ{ Ġ"" Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġif Ġ( option Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Pointer (" docker . volume . pair . panel . dialog . add New . title ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġmessage Pointer (" docker . volume . pair . panel . dialog . edit . title ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Center Panel (): ĠJ Component ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Component Ġ= Ġcreate Editable Combo box ( possible Values . values . first Or Ġ{ Ġempty Array () Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Value . isNotBlank ()) Ġeditor . item Ġ= Ġmy Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Listener Ġ{ Ġmy Value Ġ= Ġit . item . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Component Ġ= Ġcreate Editable Combo box ( possible Values . keys . to Typed Array ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Name . isNotBlank ()) Ġeditor . item Ġ= Ġmy Name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Name Ġ= Ġit . item . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . state Change Ġ== Ġ 1 ) Ġvalue Component . set New Array ( possible Values [ my Name ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpanel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( message Pointer (" docker . volume . pair . panel . name . title ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Component ( grow X , Ġgrow Y , Ġpush Y ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Validation On Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis NotEmpty ( text Value ()) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Regex ( it , Ġ" ([ a - zA - Z 0 - 9 ]) +") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġthen Ġ:: asset That Is Unique Name Ġotherwise Ġthis :: to Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. focused () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ( message Pointer (" docker . volume . pair . panel . value . title ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Component ( grow X , Ġgrow Y , Ġpush Y ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Validation On Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis NotEmpty ( text Value ()) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Regex ( it , Ġ" ([ a - zA - Z 0 - 9 _. , {} = :/ - ]) +") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġotherwise Ġthis :: to Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetValue () Ġ= ĠPair ( my Name , Ġmy Value ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Editable Combo box ( array : ĠArray < String >): ĠCombo Box < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCombo Box ( Default ComboBox Model ( array )). apply Ġ{ Ġis Editable Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġasset That Is Unique Name ( value : ĠString ): ĠResult < String > Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalready Defined Keys . contains ( value ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure ( message Pointer (" docker . volume . pair . panel . errors . key Already Defined ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSuccess ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠValidation Info Builder . text Value (): ĠString Ġ= Ġwhen Ġ( val Ġcomponent : ĠJ Component Ġ= Ġthis . component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJTextField Ġ-> Ġcomponent . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ ComboBox < *> Ġ-> Ġcomponent . editor . item . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Unknown ĠJ Component ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMy Pair TableModel Ġ: ĠAdd Edit Remove Panel . TableModel < Pair < String , ĠString >>() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Column Count (): ĠInt Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ColumnName ( column : ĠInt ): ĠString Ġ= Ġif Ġ( column Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Pointer (" docker . volume . pair . panel . table . name . title ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġmessage Pointer (" docker . volume . pair . panel . table . value . title ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Field ( pair : ĠPair < String , ĠString >, Ġc : ĠInt ): ĠString Ġ= Ġif Ġ( c Ġ== Ġ 0 ) Ġpair . first Ġelse Ġpair . second ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > ĠJ ComboBox < T >. set New Array ( array : ĠArray < T > ?) Ġ{ ĊĠĠĠ Ġif Ġ( array Ġ== Ġnull ) Ġreturn ĊĊĠĠĠ Ġwith (( this . model Ġas ĠDefault ComboBox Model )) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove All Elements () ĊĠĠĠĠĠĠĠ Ġarray . forEach Ġ{ Ġadd Element ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġthis . editor . item Ġ= Ġarray . first OrNull () Ċ } Ċ