@@ -7,17 +7,142 @@ import * as path from 'path';
77import * as vsc from 'vscode' ;
88import { BaseTreeDataProvider } from './base/baseTreeDataProvider' ;
99import { ComponentWorkspaceFolder , OdoWorkspace } from './odo/workspace' ;
10+ import { Command , CommandProvider } from './odo/componentTypeDescription' ;
1011import { Component } from './openshift/component' ;
1112import { vsCommand } from './vscommand' ;
13+ import { ThemeIcon } from 'vscode' ;
14+
15+ interface ComponentInfo extends ComponentWorkspaceFolder {
16+ getParent ( ) : ComponentInfo ;
17+
18+ getChildren ( ) : ComponentInfo [ ] ;
19+
20+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem ;
21+ }
22+
23+ abstract class ComponentInfo implements ComponentInfo {
24+ parent : ComponentInfo | null ;
25+
26+ constructor ( parent : ComponentInfo , folder : ComponentWorkspaceFolder ) {
27+ this . parent = parent ;
28+ this . component = folder . component ;
29+ this . contextPath = folder . contextPath ;
30+ }
31+
32+ getParent ( ) : ComponentInfo {
33+ return this . parent ;
34+ }
35+
36+ getChildren ( ) : ComponentInfo [ ] {
37+ return [ ] ;
38+ }
39+ }
40+
41+ class ComponentInfoCommand extends ComponentInfo implements CommandProvider {
42+ command :Command ;
43+
44+ private static icon = new ThemeIcon ( "terminal-view-icon" ) ;
45+
46+ constructor ( parent : ComponentInfo , command : Command ) {
47+ super ( parent , parent ) ;
48+ this . command = command ;
49+ }
50+
51+ getCommand ( ) : Command {
52+ return this . command ;
53+ }
54+
55+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
56+ return {
57+ label : this . command . id ,
58+ workspaceFolder : this ,
59+ tooltip : `Command: ${ this . command . id } ` ,
60+ contextValue : `openshift-component-command${ Component . generateContextStateSuffixValue ( this ) } ` ,
61+ iconPath : ComponentInfoCommand . icon ,
62+ collapsibleState : vsc . TreeItemCollapsibleState . None
63+ } ;
64+ }
65+ }
66+
67+ class ComponentInfoCommands extends ComponentInfo {
68+ private children : ComponentInfo [ ] ;
69+
70+ constructor ( parent : ComponentInfo ) {
71+ super ( parent , parent ) ;
72+ }
73+
74+ getChildren ( ) : ComponentInfo [ ] {
75+ if ( ! this . children ) {
76+ const thisCommands = this . component . devfileData . devfile . commands ;
77+ if ( thisCommands === undefined ) {
78+ this . children = [ ] ;
79+ } else {
80+ this . children = thisCommands . flatMap ( c => new ComponentInfoCommand ( this , c ) ) ;
81+ }
82+ }
83+ return this . children ;
84+ }
85+
86+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
87+ return {
88+ label : 'Commands' ,
89+ workspaceFolder : this ,
90+ tooltip : 'Commands' ,
91+ contextValue : 'openshift-component-commands' ,
92+ collapsibleState : vsc . TreeItemCollapsibleState . Collapsed
93+ } ;
94+ }
95+ }
96+
97+ class ComponentInfoRoot extends ComponentInfo {
98+ private children : ComponentInfo [ ] ;
99+
100+ constructor ( folder : ComponentWorkspaceFolder ) {
101+ super ( null , folder ) ;
102+ }
103+
104+ getParent ( ) : ComponentInfo {
105+ return this ;
106+ }
107+
108+ getChildren ( ) : ComponentInfo [ ] {
109+ if ( ! this . children ) {
110+ const thisCommands = this . component . devfileData . devfile . commands ;
111+ if ( thisCommands === undefined ) {
112+ this . children = [ ] ;
113+ } else {
114+ this . children = [ new ComponentInfoCommands ( this ) ] ;
115+ }
116+ }
117+ return this . children ;
118+ }
119+
120+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
121+ const tooltip = [ 'Component' ,
122+ `Name: ${ this . component . devfileData . devfile . metadata . name } ` ,
123+ `Context: ${ this . contextPath } ` ,
124+ ] . join ( '\n' ) ;
125+
126+ return {
127+ label : Component . renderLabel ( this ) ,
128+ workspaceFolder : this ,
129+ tooltip,
130+ contextValue : Component . generateContextValue ( this ) ,
131+ iconPath : vsc . Uri . file ( path . join ( __dirname , '../../images/component' , 'workspace.png' ) ) ,
132+ collapsibleState : vsc . TreeItemCollapsibleState . Collapsed
133+ } ;
134+ }
135+ }
12136
13137export interface ComponentWorkspaceFolderTreeItem extends vsc . TreeItem {
14138 workspaceFolder : ComponentWorkspaceFolder ;
15139}
16140
17- export class ComponentsTreeDataProvider extends BaseTreeDataProvider < ComponentWorkspaceFolder > {
141+ export class ComponentsTreeDataProvider extends BaseTreeDataProvider < ComponentInfo > {
18142
19143 static dataProviderInstance : ComponentsTreeDataProvider ;
20144 public odoWorkspace = new OdoWorkspace ( ) ;
145+ private children : ComponentInfo [ ] ;
21146
22147 private constructor ( ) {
23148 super ( ) ;
@@ -30,8 +155,9 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
30155 private refresh ( contextPath ?: string ) : void {
31156 if ( contextPath ) {
32157 const folder = this . odoWorkspace . findComponent ( vsc . workspace . getWorkspaceFolder ( vsc . Uri . parse ( contextPath ) ) ) ;
33- this . onDidChangeTreeDataEmitter . fire ( folder )
158+ this . onDidChangeTreeDataEmitter . fire ( new ComponentInfoRoot ( folder ) ) ;
34159 } else {
160+ this . children = undefined ; // Invalidate children cache so they wll be re-created
35161 this . odoWorkspace . reset ( ) ;
36162 this . onDidChangeTreeDataEmitter . fire ( undefined ) ;
37163 }
@@ -48,7 +174,7 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
48174 await vsc . commands . executeCommand ( 'revealInExplorer' , vsc . Uri . parse ( context . contextPath ) ) ;
49175 }
50176
51- createTreeView ( id : string ) : vsc . TreeView < ComponentWorkspaceFolder > {
177+ createTreeView ( id : string ) : vsc . TreeView < ComponentInfo > {
52178 if ( ! this . treeView ) {
53179 this . treeView = vsc . window . createTreeView ( id , {
54180 treeDataProvider : this ,
@@ -64,25 +190,24 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
64190 return ComponentsTreeDataProvider . dataProviderInstance ;
65191 }
66192
67- getTreeItem ( element : ComponentWorkspaceFolder ) : ComponentWorkspaceFolderTreeItem {
68- const tooltip = [ 'Component' ,
69- `Name: ${ element . component . devfileData . devfile . metadata . name } ` ,
70- `Context: ${ element . contextPath } ` ,
71- ] . join ( '\n' ) ;
72- return {
73- label : Component . renderLabel ( element ) ,
74- workspaceFolder : element ,
75- tooltip,
76- contextValue : Component . generateContextValue ( element ) ,
77- iconPath : vsc . Uri . file ( path . join ( __dirname , '../../images/component' , 'workspace.png' ) )
78- } ;
193+ getTreeItem ( element : ComponentInfo ) : ComponentWorkspaceFolderTreeItem {
194+ return element . toTreeItem ( ) ;
79195 }
80196
81- getChildren ( element ?: ComponentWorkspaceFolder ) : vsc . ProviderResult < ComponentWorkspaceFolder [ ] > {
82- const result = element ? [ ] : this . odoWorkspace . getComponents ( ) ;
197+ getChildren ( element ?: ComponentInfo ) : vsc . ProviderResult < ComponentInfo [ ] > {
198+ if ( element ) {
199+ return Promise . resolve ( element . getChildren ( ) ) ;
200+ }
201+
202+ if ( this . children ) {
203+ return Promise . resolve ( this . children ) ;
204+ }
205+
206+ const result = this . odoWorkspace . getComponents ( ) ;
83207 return Promise . resolve ( result ) . then ( async result1 => {
84208 await vsc . commands . executeCommand ( 'setContext' , 'openshift.component.explorer.init' , ! result1 ?. length && result1 . length === 0 ) ;
85- return result ;
209+ this . children = result1 . flatMap ( f => new ComponentInfoRoot ( f ) ) ;
210+ return this . children ;
86211 } )
87212 }
88213}
0 commit comments