// Ġ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 Ġcom . intellij . execution . target Ċ Ċ import Ġcom . intellij . execution . Execution Bundle Ċ import Ġcom . intellij . execution . configurations . Runtime ConfigurationException Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . openapi . action System .* Ċ import Ġcom . intellij . openapi . keymap . Key map Util Ċ import Ġcom . intellij . openapi . project . D umb Aware Ċ import Ġcom . intellij . openapi . project . D umb Aware Action Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Master Details Component Ċ import Ġcom . intellij . ui . Colo red Tree Cell Renderer Ċ import Ġcom . intellij . ui . Common Actions Panel Ċ import Ġcom . intellij . ui . Layer ed Icon Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . util . Icon Util Ċ import Ġcom . intellij . util . Platform Icons Ċ import Ġcom . intellij . util . containers . toArray Ċ import Ġcom . intellij . util . text . Unique Name Generator Ċ import Ġcom . intellij . util . text . nul lize Ċ import Ġcom . intellij . util . ui . Status Text Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġjavax . swing . Icon Ċ import Ġjavax . swing . J Tree Ċ Ċ class ĠTarget Environments Master Details Ġ@ Jvm Over loads Ġconstructor ( ĊĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠ Ġprivate Ġval Ġinitial Selected Name : ĠString ? Ġ= Ġnull , ĊĠ Ġprivate Ġval Ġdefault Language Runtime : ĠLanguage Runtime Type < *> ? Ċ ) Ġ: ĠMaster Details Component () Ġ{ ĊĊĠ Ġprivate Ġvar Ġ_ last Selected Config : ĠTarget Environment Configuration ? Ġ= Ġnull ĊĠ Ġinternal Ġval Ġselected Config : ĠTarget Environment Configuration ? ĊĠĠĠ Ġget () Ġ= Ġmy Current Configurable ?. editable Object Ġas ? ĠTarget Environment Configuration Ġ?: Ġ_ last Selected Config ĊĊĠ Ġprivate Ġval Ġtarget Manager : ĠTarget Environments Manager Ġget () Ġ= ĠTarget Environments Manager . getInstance ( project ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġ// Ġnote Ġthat Ġ` Master Details Component ` Ġdoes Ġnot Ġwork Ġwithout Ġ` init Tree ()` ĊĠĠĠ Ġinit Tree () ĊĠĠĠ Ġmy Tree . cell Renderer Ġ= ĠTarget Environment Renderer () ĊĠĠĠ Ġmy Tree . empty Text . text Ġ= Ġ" No Ġtargets Ġadded " ĊĠĠĠ Ġmy Tree . empty Text . append Secondary Text ( Execution Bundle . message (" targets . details . status . text . add . new . target "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Text Attributes . LINK _ ATTRIBUTES ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpopup Ġ= ĠAction Manager . getInstance (). create Action PopupMenu (" Target Environments Configurable . Empty List Text ", ĠCreate New Target Group ()) ĊĠĠĠĠĠ Ġval Ġsize Ġ= Ġmy Tree . empty Text . preferred Size ĊĠĠĠĠĠ Ġval Ġtext Y Ġ= Ġmy Tree . height Ġ/ Ġif Ġ( my Tree . empty Text . is Show Above Center ) Ġ 3 Ġelse Ġ 2 ĊĠĠĠĠĠ Ġpopup . component . show ( my Tree , Ġ( my Tree . width Ġ- Ġsize . width ) Ġ/ Ġ 2 , Ġtext Y Ġ+ Ġsize . height ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġshortcut Text Ġ= ĠKey map Util . getFirst Keyboard Shortcut Text ( Common Actions Panel . get Common Shortcut ( Common Actions Panel . Buttons . ADD )) ĊĠĠĠ Ġmy Tree . empty Text . append Secondary Text (" Ġ($ shortcut Text )", ĠStatus Text . DEFAULT _ ATTRIBUTES , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget DisplayName (): ĠString Ġ= ĠExecution Bundle . message (" targets . details . configurable . name . remote . targets ") ĊĊĠ Ġoverride Ġfun Ġget Empty Selection String (): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠExecution Bundle . message (" targets . details . status . text . select . target . to . configure ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠ Ġmy Root . removeAll Children () ĊĊĠĠĠ Ġall Targets (). forEach Ġ{ Ġnext Target Ġ-> Ġadd Target Node ( next Target ) Ġ} ĊĊĠĠĠ Ġsuper . reset () ĊĊĠĠĠ Ġinitial Selected Name ?. let Ġ{ Ġselect Node In Tree ( initial Selected Name ) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġis Modified (): ĠBoolean Ġ= ĊĠĠĠ Ġall Targets (). size Ġ!= Ġget Configured Targets (). size Ġ|| ĊĠĠĠ Ġdeleted Targets (). isNotEmpty () Ġ|| ĊĠĠĠ Ġsuper . is Modified () ĊĊĠ Ġoverride Ġfun Ġcreate Actions ( from Popup : ĠBoolean ): ĠList < An Action > Ġ= Ġmutable ListOf ( ĊĠĠĠ ĠCreate New Target Group (), ĊĠĠĠ ĠMy Delete Action (), ĊĠĠĠ ĠDuplicate Action () ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun Ġprocess Removed Items () Ġ{ ĊĠĠĠ Ġval Ġdeleted Targets Ġ= Ġdeleted Targets () ĊĠĠĠ Ġdeleted Targets . forEach Ġ{ Ġtarget Manager . targets . remove Config ( it ) Ġ} ĊĠĠĠ Ġsuper . process Removed Items () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġwas Object Stored ( editable Object : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtarget Manager . targets . resolved Configs (). contains ( editable Object ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdeleted Targets (): ĠSet < Target Environment Configuration > Ġ= Ġall Targets (). toSet () Ġ- Ġget Configured Targets () ĊĊĠ Ġoverride Ġfun Ġapply () Ġ{ ĊĠĠĠ Ġsuper . apply () ĊĊĠĠĠ Ġval Ġadded Configs Ġ= Ġget Configured Targets () Ġ- Ġtarget Manager . targets . resolved Configs () ĊĠĠĠ Ġadded Configs . forEach Ġ{ Ġtarget Manager . add Target ( it ) Ġ} ĊĊĠĠĠ ĠT REE _ UP DAT ER . run () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdispose UI Resources () Ġ{ ĊĠĠĠ Ġ_ last Selected Config Ġ= Ġselected Object Ġas ? ĠTarget Environment Configuration ĊĠĠĠ Ġsuper . dispose UI Resources () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġall Targets () Ġ= Ġtarget Manager . targets . resolved Configs () ĊĊĠ Ġprivate Ġfun Ġadd Target Node ( target : ĠTarget Environment Configuration ): ĠMy Node Ġ{ ĊĠĠĠ Ġval Ġconfigurable Ġ= ĠTarget Environment Details Configurable ( project , Ġtarget , Ġdefault Language Runtime , ĠT REE _ UP DAT ER ) ĊĠĠĠ Ġval Ġnode Ġ= ĠTarget Environment Node ( target , Ġconfigurable ) ĊĠĠĠ Ġadd Node ( node , Ġmy Root ) ĊĠĠĠ Ġselect Node In Tree ( node ) ĊĠĠĠ Ġreturn Ġmy Root ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Configured Targets (): ĠList < Target Environment Configuration > Ġ= ĊĠĠĠ Ġmy Root . children (). as Sequence () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġnode Ġ-> Ġ( node Ġas ĠMy Node ). configurable ?. editable Object Ġas ? ĠTarget Environment Configuration Ġ} ĊĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠ Ġ. toList () ĊĊĠ Ġprivate Ġinner Ġclass ĠCreate New Target Action < T Ġ: ĠTarget Environment Configuration >( private Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtype : ĠTarget Environment Type < T >) ĊĠĠĠ Ġ: ĠD umb Aware Action ( type . displayName , Ġnull , Ġtype . icon ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Config : ĠTarget Environment Configuration ĊĊĠĠĠĠĠ Ġval Ġwizard Ġ= ĠTarget Environment Wizard . create Wizard ( project , Ġtype , Ġdefault Language Runtime ) ĊĠĠĠĠĠ Ġif Ġ( wizard Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! wizard . show AndGet ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġnew Config Ġ= Ġwizard . subject ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Config Ġ= Ġtype . create Default Config () ĊĠĠĠĠĠĠĠ Ġtype . initialize New ly Created ( new Config ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( new Config . displayName . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Config . displayName Ġ= ĠUnique Name Generator . generate Unique Name ( type . displayName ) Ġ{ Ġcur Name Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġget Configured Targets (). none Ġ{ Ġit . displayName Ġ== Ġcur Name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// Ġthere Ġmay Ġbe Ġnot Ġyet Ġstored Ġnames ĊĠĠĠĠĠ Ġtarget Manager . ensure Unique Name ( new Config ) ĊĠĠĠĠĠ Ġval ĠnewNode Ġ= Ġadd Target Node ( new Config ) ĊĠĠĠĠĠ Ġselect Node In Tree ( new Node , Ġtrue , Ġtrue ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠCreate New Target Group Ġ: ĠAction Group ( Execution Bundle . message (" targets . details . action . add . text "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĠIcon Util . get Add Icon ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Group With Pre selection , ĠD umb Aware Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġregister Custom Shortcut Set ( Common Actions Panel . get Common Shortcut ( Common Actions Panel . Buttons . ADD ), Ġmy Tree ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Children ( e : ĠAn ActionEvent ?): ĠArray < An Action > Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTarget Environment Type . EXTENSION _ NAME . extension List ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠCreate New Target Action ( project , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toArray ( An Action . EMPTY _ ARRAY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Action Group (): ĠAction Group Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠDuplicate Action Ġ: ĠD umb Aware Action ( Execution Bundle . message (" targets . details . action . duplicate . text "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExecution Bundle . message (" targets . details . action . duplicate . description "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform Icons . COPY _ ICON ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġregister Custom Shortcut Set ( Common Shortcut s . get Duplicate (), Ġmy Tree ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠ Ġtemplate Presentation . isEnabled Ġ= Ġget Selected Target () Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠ Ġduplicate Selected ()?. let Ġ{ Ġcopy Ġ-> ĊĠĠĠĠĠĠĠ Ġtarget Manager . add Target ( copy ) ĊĠĠĠĠĠĠĠ Ġval ĠnewNode Ġ= Ġadd Target Node ( copy ) ĊĠĠĠĠĠĠĠ Ġselect Node In Tree ( new Node , Ġtrue , Ġtrue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġduplicate Selected (): ĠTarget Environment Configuration ? Ġ= ĊĠĠĠĠĠ Ġget Selected Target ()?. let Ġ{ Ġit . getTarget Type (). duplicate Config ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Selected Target () Ġ= Ġselected Node ?. configurable ?. editable Object Ġas ? ĠTarget Environment Configuration ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠTarget Environment Node ( private Ġval Ġtarget : ĠTarget Environment Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigurable : ĠTarget Environment Details Configurable ) Ġ: ĠMy Node ( configurable ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget DisplayName () Ġ= Ġtarget . displayName ĊĊĠĠĠ Ġval Ġconfigured Languages : ĠString ĊĠĠĠĠĠ Ġget () Ġ= Ġtarget . runtime s . resolved Configs () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . get Runtime Type (). displayName Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Sorted Set () ĊĠĠĠĠĠĠĠ Ġ. join ToString () ĊĊĠĠĠ Ġfun Ġcompute Icon ( expanded : ĠBoolean ): ĠIcon ? Ġ{ ĊĠĠĠĠĠ Ġval Ġraw Icon Ġ= Ġthis . configurable ?. get Icon ( expanded ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġvalid Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget . validate Configuration () ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠRuntime ConfigurationException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġif Ġ( valid ) Ġraw Icon Ġelse ĠLayer ed Icon . create ( raw Icon , ĠAll Icons . Run Configurations . Invalid Configuration Layer ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠTarget Environment Renderer Ġ: ĠCo lo red Tree Cell Renderer () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( tree : ĠJ Tree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Focus : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠ Ġval Ġnode Ġ= Ġvalue Ġas ? ĠTarget Environment Node Ġ?: Ġreturn ĊĠĠĠĠĠ Ġfont Ġ= ĠUI Util . get Tree Font () ĊĠĠĠĠĠ Ġicon Ġ= Ġnode . compute Icon ( expanded ) ĊĊĠĠĠĠĠ Ġappend ( node . displayName , ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĊĠĠĠĠĠ Ġnode . configured Languages . nul lize ()?. let Ġ{ Ġlanguages Ġ-> ĊĠĠĠĠĠĠĠ Ġappend (" Ġ Ġ", ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠ Ġappend ( languages , ĠSimple Text Attributes . GRAY ED _ ATTRIBUTES ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }