@@ -7,17 +7,140 @@ 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' ;
1213
14+ interface ComponentInfo extends ComponentWorkspaceFolder {
15+ getParent ( ) : ComponentInfo ;
16+
17+ getChildren ( ) : ComponentInfo [ ] ;
18+
19+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem ;
20+ }
21+
22+ abstract class ComponentInfo implements ComponentInfo {
23+ parent : ComponentInfo | null ;
24+
25+ constructor ( parent : ComponentInfo , folder : ComponentWorkspaceFolder ) {
26+ this . parent = parent ;
27+ this . component = folder . component ;
28+ this . contextPath = folder . contextPath ;
29+ }
30+
31+ getParent ( ) : ComponentInfo {
32+ return this . parent ;
33+ }
34+
35+ getChildren ( ) : ComponentInfo [ ] {
36+ return [ ] ;
37+ }
38+ }
39+
40+ class ComponentInfoCommand extends ComponentInfo implements CommandProvider {
41+ command :Command ;
42+
43+ constructor ( parent : ComponentInfo , command : Command ) {
44+ super ( parent , parent ) ;
45+ this . command = command ;
46+ }
47+
48+ getCommand ( ) : Command {
49+ return this . command ;
50+ }
51+
52+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
53+ return {
54+ label : this . command . id ,
55+ workspaceFolder : this ,
56+ tooltip : `Command: ${ this . command . id } ` ,
57+ contextValue : `openshift-component-command${ Component . generateContextStateSuffixValue ( this ) } ` ,
58+ iconPath : vsc . Uri . file ( path . join ( __dirname , '../../images/component' , 'workspace.png' ) ) ,
59+ collapsibleState : vsc . TreeItemCollapsibleState . None
60+ } ;
61+ }
62+ }
63+
64+ class ComponentInfoCommands extends ComponentInfo {
65+ private children : ComponentInfo [ ] ;
66+
67+ constructor ( parent : ComponentInfo ) {
68+ super ( parent , parent ) ;
69+ }
70+
71+ getChildren ( ) : ComponentInfo [ ] {
72+ if ( ! this . children ) {
73+ const thisCommands = this . component . devfileData . devfile . commands ;
74+ if ( thisCommands === undefined ) {
75+ this . children = [ ] ;
76+ } else {
77+ this . children = thisCommands . flatMap ( c => new ComponentInfoCommand ( this , c ) ) ;
78+ }
79+ }
80+ return this . children ;
81+ }
82+
83+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
84+ return {
85+ label : 'Commands' ,
86+ workspaceFolder : this ,
87+ tooltip : 'Commands' ,
88+ contextValue : 'openshift-component-commands' ,
89+ iconPath : vsc . Uri . file ( path . join ( __dirname , '../../images/component' , 'workspace.png' ) ) ,
90+ collapsibleState : vsc . TreeItemCollapsibleState . Collapsed
91+ } ;
92+ }
93+ }
94+
95+ class ComponentInfoRoot extends ComponentInfo {
96+ private children : ComponentInfo [ ] ;
97+
98+ constructor ( folder : ComponentWorkspaceFolder ) {
99+ super ( null , folder ) ;
100+ }
101+
102+ getParent ( ) : ComponentInfo {
103+ return this ;
104+ }
105+
106+ getChildren ( ) : ComponentInfo [ ] {
107+ if ( ! this . children ) {
108+ const thisCommands = this . component . devfileData . devfile . commands ;
109+ if ( thisCommands === undefined ) {
110+ this . children = [ ] ;
111+ } else {
112+ this . children = [ new ComponentInfoCommands ( this ) ] ;
113+ }
114+ }
115+ return this . children ;
116+ }
117+
118+ toTreeItem ( ) : ComponentWorkspaceFolderTreeItem {
119+ const tooltip = [ 'Component' ,
120+ `Name: ${ this . component . devfileData . devfile . metadata . name } ` ,
121+ `Context: ${ this . contextPath } ` ,
122+ ] . join ( '\n' ) ;
123+
124+ return {
125+ label : Component . renderLabel ( this ) ,
126+ workspaceFolder : this ,
127+ tooltip,
128+ contextValue : Component . generateContextValue ( this ) ,
129+ iconPath : vsc . Uri . file ( path . join ( __dirname , '../../images/component' , 'workspace.png' ) ) ,
130+ collapsibleState : vsc . TreeItemCollapsibleState . Collapsed
131+ } ;
132+ }
133+ }
134+
13135export interface ComponentWorkspaceFolderTreeItem extends vsc . TreeItem {
14136 workspaceFolder : ComponentWorkspaceFolder ;
15137}
16138
17- export class ComponentsTreeDataProvider extends BaseTreeDataProvider < ComponentWorkspaceFolder > {
139+ export class ComponentsTreeDataProvider extends BaseTreeDataProvider < ComponentInfo > {
18140
19141 static dataProviderInstance : ComponentsTreeDataProvider ;
20142 public odoWorkspace = new OdoWorkspace ( ) ;
143+ private children : ComponentInfo [ ] ;
21144
22145 private constructor ( ) {
23146 super ( ) ;
@@ -30,7 +153,7 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
30153 private refresh ( contextPath ?: string ) : void {
31154 if ( contextPath ) {
32155 const folder = this . odoWorkspace . findComponent ( vsc . workspace . getWorkspaceFolder ( vsc . Uri . parse ( contextPath ) ) ) ;
33- this . onDidChangeTreeDataEmitter . fire ( folder )
156+ this . onDidChangeTreeDataEmitter . fire ( new ComponentInfoRoot ( folder ) ) ;
34157 } else {
35158 this . odoWorkspace . reset ( ) ;
36159 this . onDidChangeTreeDataEmitter . fire ( undefined ) ;
@@ -48,7 +171,7 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
48171 await vsc . commands . executeCommand ( 'revealInExplorer' , vsc . Uri . parse ( context . contextPath ) ) ;
49172 }
50173
51- createTreeView ( id : string ) : vsc . TreeView < ComponentWorkspaceFolder > {
174+ createTreeView ( id : string ) : vsc . TreeView < ComponentInfo > {
52175 if ( ! this . treeView ) {
53176 this . treeView = vsc . window . createTreeView ( id , {
54177 treeDataProvider : this ,
@@ -64,25 +187,24 @@ export class ComponentsTreeDataProvider extends BaseTreeDataProvider<ComponentWo
64187 return ComponentsTreeDataProvider . dataProviderInstance ;
65188 }
66189
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- } ;
190+ getTreeItem ( element : ComponentInfo ) : ComponentWorkspaceFolderTreeItem {
191+ return element . toTreeItem ( ) ;
79192 }
80193
81- getChildren ( element ?: ComponentWorkspaceFolder ) : vsc . ProviderResult < ComponentWorkspaceFolder [ ] > {
82- const result = element ? [ ] : this . odoWorkspace . getComponents ( ) ;
194+ getChildren ( element ?: ComponentInfo ) : vsc . ProviderResult < ComponentInfo [ ] > {
195+ if ( element ) {
196+ return Promise . resolve ( element . getChildren ( ) ) ;
197+ }
198+
199+ if ( this . children ) {
200+ return Promise . resolve ( this . children ) ;
201+ }
202+
203+ const result = this . odoWorkspace . getComponents ( ) ;
83204 return Promise . resolve ( result ) . then ( async result1 => {
84205 await vsc . commands . executeCommand ( 'setContext' , 'openshift.component.explorer.init' , ! result1 ?. length && result1 . length === 0 ) ;
85- return result ;
206+ this . children = result1 . flatMap ( f => new ComponentInfoRoot ( f ) ) ;
207+ return this . children ;
86208 } )
87209 }
88210}
0 commit comments