@@ -23,6 +23,7 @@ import { CfgEditorPanel } from "../CfgEditor/CfgEditorPanel";
2323import { obtainWorkspaceRoots } from "../Utils/Helpers" ;
2424import { Logger } from "../Utils/Logger" ;
2525
26+ import { ConfigObj } from "./ConfigObject" ;
2627import { ArtifactAttr } from "./ArtifactLocator" ;
2728import { OneStorage } from "./OneStorage" ;
2829
@@ -157,6 +158,21 @@ export abstract class Node {
157158 // Return a NodeType as a string value
158159 return NodeType [ this . type ] ;
159160 }
161+
162+ /**
163+ * Match possible node types from the given uri
164+ */
165+ static matchType ( uri : vscode . Uri ) : NodeType {
166+ if ( BaseModelNode . extList . some ( ( ext ) => uri . fsPath . endsWith ( ext ) ) ) {
167+ return NodeType . baseModel ;
168+ } else if ( ConfigNode . extList . some ( ( ext ) => uri . fsPath . endsWith ( ext ) ) ) {
169+ return NodeType . config ;
170+ } else if ( ProductNode . extList . some ( ( ext ) => uri . fsPath . endsWith ( ext ) ) ) {
171+ return NodeType . product ;
172+ }
173+
174+ return NodeType . directory ;
175+ }
160176}
161177
162178class NodeFactory {
@@ -516,6 +532,16 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
516532 readonly onDidChangeTreeData : vscode . Event < Node | undefined | void > =
517533 this . _onDidChangeTreeData . event ;
518534
535+ private _onDidChangeConfig : vscode . EventEmitter < vscode . Uri > =
536+ new vscode . EventEmitter < vscode . Uri > ( ) ;
537+ readonly onDidChangeConfig : vscode . Event < vscode . Uri > =
538+ this . _onDidChangeConfig . event ;
539+
540+ private _onDidDeleteProduct : vscode . EventEmitter < vscode . Uri > =
541+ new vscode . EventEmitter < vscode . Uri > ( ) ;
542+ readonly onDidDeleteProduct : vscode . Event < vscode . Uri > =
543+ this . _onDidDeleteProduct . event ;
544+
519545 private fileWatcher = vscode . workspace . createFileSystemWatcher ( `**/*` ) ;
520546
521547 private _tree : Node [ ] | undefined ;
@@ -543,30 +569,85 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
543569 provider . refresh ( ) ;
544570 } ) ,
545571 provider . fileWatcher . onDidChange ( ( uri : vscode . Uri ) => {
546- if (
547- [
548- ...BaseModelNode . extList ,
549- ...ConfigNode . extList ,
550- ...ProductNode . extList ,
551- ] . includes ( path . parse ( uri . path ) . ext )
552- ) {
553- Logger . info (
554- "OneExploer" ,
555- `Refresh explorer view on a file change in '${ uri . path } '`
556- ) ;
557- // TODO Handle by each node types
558- provider . refresh ( ) ;
572+ switch ( Node . matchType ( uri ) ) {
573+ case NodeType . config :
574+ provider . _onDidChangeConfig . fire ( uri ) ;
575+ break ;
576+ case NodeType . baseModel :
577+ case NodeType . product :
578+ default :
579+ // Do nothing
580+ break ;
559581 }
560582 } ) ,
583+ provider . onDidChangeConfig ( ( uri : vscode . Uri ) => {
584+ let nodesChanged : Node [ ] = [ ] ;
585+
586+ const oldCfgObj = OneStorage . getCfgObj ( uri . fsPath ) ;
587+ const newCfgObj = ConfigObj . createConfigObj ( uri ) ! ;
588+
589+ const [ adopters , droppers ] = ConfigObj . diffBaseModels (
590+ newCfgObj ,
591+ oldCfgObj
592+ ) ;
593+
594+ // Create new config node
595+ adopters
596+ . map ( ( adopter ) => OneStorage . getBaseModelNode ( adopter ) )
597+ . forEach ( ( adopterNode ) => {
598+ OneStorage . insert (
599+ NodeFactory . create ( NodeType . config , uri . fsPath , adopterNode )
600+ ) ;
601+ adopterNode . resetChildren ( ) ;
602+ adopterNode . getChildren ( ) ;
603+ nodesChanged . push ( adopterNode ) ;
604+ } ) ;
605+
606+ // Remove old config node
607+ OneStorage . getNodes ( uri . fsPath ) . forEach ( ( node ) => {
608+ if ( droppers . some ( ( dropper ) => dropper === node ?. parent ?. path ) ) {
609+ OneStorage . delete ( node , true ) ;
610+ }
611+ } ) ;
612+
613+ droppers
614+ . map ( ( dropper ) => OneStorage . getBaseModelNode ( dropper ) )
615+ . forEach ( ( dropperNode ) => {
616+ dropperNode . resetChildren ( ) ;
617+ dropperNode . getChildren ( ) ;
618+ nodesChanged . push ( dropperNode ) ;
619+ } ) ;
620+
621+ nodesChanged . forEach ( ( node ) => {
622+ provider . _onDidChangeTreeData . fire ( node ) ;
623+ } ) ;
624+ } ) ,
561625 provider . fileWatcher . onDidDelete ( ( uri : vscode . Uri ) => {
562- const nodes = OneStorage . getNodes ( uri . fsPath ) ;
563- if ( nodes . length === 0 ) {
564- return ;
626+ switch ( Node . matchType ( uri ) ) {
627+ case NodeType . product :
628+ provider . _onDidDeleteProduct . fire ( uri ) ;
629+ break ;
630+ case NodeType . directory :
631+ case NodeType . config :
632+ case NodeType . baseModel :
633+ OneStorage . getNodes ( uri . fsPath ) . forEach ( ( node ) => {
634+ OneStorage . delete ( node , true ) ;
635+ provider . _onDidChangeTreeData . fire ( node . parent ) ;
636+ } ) ;
637+ break ;
638+ default :
639+ // Do nothing
640+ break ;
565641 }
566-
567- nodes . forEach ( ( node ) => {
568- OneStorage . delete ( node , true ) ;
569- provider . refresh ( node . parent ) ;
642+ } ) ,
643+ provider . onDidDeleteProduct ( ( uri : vscode . Uri ) => {
644+ OneStorage . getNodes ( uri . fsPath ) . forEach ( ( node ) => {
645+ OneStorage . delete ( node ) ;
646+
647+ const dropper = node . parent ;
648+ dropper ! . resetChildren ( ) ;
649+ dropper ! . getChildren ( ) ;
650+ provider . _onDidChangeTreeData . fire ( dropper ) ;
570651 } ) ;
571652 } ) ,
572653 vscode . workspace . onDidChangeWorkspaceFolders ( ( ) => {
0 commit comments