diff --git a/css/app.css b/css/app.css
index ccc9dac1..695d0533 100644
--- a/css/app.css
+++ b/css/app.css
@@ -1,19 +1,6 @@
-/*.lm_content>div { height: 100%; width: 100% }*/
-.lm_splitter.lm_horizontal .lm_drag_handle { left:-5px; width:15px }
-.lm_splitter.lm_vertical .lm_drag_handle { top:-5px; height:15px }
.errorWindow { background: white; font-family: Courier,monospace; font-size: 12px; white-space: pre-wrap; overflow-y: scroll; }
.errorWindow>div { margin: 5px; }
-#fileTree { font-family:Arial; font-size:12px }
body { line-height:normal }
-#fileTree { position:absolute; top:0; bottom:28px; width:100%; /*height:100%;*/ overflow: auto; }
-#fileTree .jstree-node { margin-left: 14px }
-#fileTree .jstree-container-ul>.jstree-node { margin-left:0 }
-#fileTree .jstree-clicked { background:initial }
-#fileTree .glyphicon { font-size:12px; margin-top:-1px; color:#eee; margin-right:3px }
-#fileTree .jstree-icon { margin-left:3px; margin-right:5px }
-#fileTree .jstree-ocl { display:none }
-#fileTreeCont .footer { position:absolute; bottom:0; width:100%; padding-left:2px }
-#fileTreeCont .footer .btn { width:33.3%; border-radius:0; font-size:13px; padding:3px 10px }
body { color:#333 }
.dropdown { position: absolute; display:none; z-index:9999 }
.dropdown-menu { z-index:9999 }
@@ -22,7 +9,6 @@ body { color:#333 }
.dropdown .glyphicon-folder-open { margin-left:-1px; margin-right:6px }
.dropdown .dropdown-menu>li>a { padding:3px 15px }
.btn { padding: 5px 10px; }
-.modal { color: white; }
.control-label { margin-bottom:8px }
.form-control { padding: 6px 12px; height:34px }
.modal-footer, .modal-body { padding: 15px }
@@ -35,6 +21,5 @@ body { color:#333 }
#aboutWebIde { position:absolute; bottom:10px; right:10px; font-size:12px }
#exportToJsonDiv, #parsedPathDiv, #selectionLengthDiv { font-size:13px; margin-top:5px }
#parsedPath { word-break: break-all; }
-#welcomeModalLabel { text-align:center }
-#welcomeModal .licenses { font-size:12px; margin-bottom:10px }
+
/*.marker_match { background:rgba(80, 255, 80, 0.30); }*/
diff --git a/package.json b/package.json
index cf721974..09e266bb 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,9 @@
"staticPath": "samples",
"staticOutPath": "samples"
},
+ {
+ "staticPath": "public"
+ },
{
"staticPath": "LICENSE-3RD-PARTY.txt"
},
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 00000000..b5a819ba
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 00000000..08d8e6d7
Binary files /dev/null and b/public/favicon.png differ
diff --git a/src/App.vue b/src/App.vue
index 0f223c10..732215fd 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,15 +1,42 @@
diff --git a/src/Components/FileTree/FileSystemVisitors/FileSystemVisitor.ts b/src/Components/FileTree/FileSystemVisitors/FileSystemVisitor.ts
new file mode 100644
index 00000000..8dd82de2
--- /dev/null
+++ b/src/Components/FileTree/FileSystemVisitors/FileSystemVisitor.ts
@@ -0,0 +1,93 @@
+import {
+ FILE_SYSTEM_TYPE_KAITAI,
+ FILE_SYSTEM_TYPE_LOCAL,
+ IFileSystem,
+ IFsItem,
+ ITEM_MODE_DIRECTORY,
+ ITEM_MODE_FILE
+} from "../../../v1/FileSystems/FileSystemsTypes";
+
+export const OPEN_FOLDER = "OPEN_FOLDER";
+export const CLOSED_FOLDER = "CLOSED_FOLDER";
+export const EMPTY_FOLDER = "EMPTY_FOLDER";
+export const BINARY_FILE = "BINARY_FILE";
+export const KSY_FILE = "KSY_FILE";
+
+export type NodeType = typeof EMPTY_FOLDER | typeof OPEN_FOLDER | typeof CLOSED_FOLDER | typeof BINARY_FILE | typeof KSY_FILE;
+
+export interface TreeNodeDisplay {
+ fullPath: string;
+ type: NodeType;
+ fileName: string;
+ isOpen: boolean;
+ storeId: typeof FILE_SYSTEM_TYPE_LOCAL | typeof FILE_SYSTEM_TYPE_KAITAI;
+ depth: number;
+}
+
+export class FileSystemVisitor {
+ private openPaths: string[];
+ private currentPath: string[] = [];
+ private visibleFsItemsNew: TreeNodeDisplay[] = [];
+
+ public visit(fileSystem: IFileSystem, openPaths: string[]) {
+ this.openPaths = openPaths;
+ this.visitFileSystem(fileSystem);
+ return this.visibleFsItemsNew;
+ }
+
+ private visitFileSystem(fileSystem: IFileSystem) {
+ if (!fileSystem.getRootNode()) {
+ this.visibleFsItemsNew = [];
+ return;
+ }
+ this.visitNode(fileSystem.getRootNode());
+
+ }
+
+ private visitNode(fsItem: IFsItem) {
+ this.currentPath.push(fsItem.fn);
+ const newNode = this.mapToNewNode(fsItem);
+ this.visibleFsItemsNew.push(newNode);
+
+ if (fsItem.type === ITEM_MODE_DIRECTORY && newNode.isOpen) {
+ Object.entries(fsItem.children || {})
+ .forEach(([key, child]) => {
+ child.fn = key;
+ this.visitNode(child);
+ });
+ }
+ this.currentPath.pop();
+ }
+
+
+ private mapToNewNode(fsItem: IFsItem): TreeNodeDisplay {
+ const fullPath = this.currentPath.join("/");
+ const isOpen = this.isDirectoryOpen(fullPath);
+ return {
+ type: this.getNodeType(isOpen, fsItem),
+ storeId: fsItem.fsType,
+ fullPath: fullPath,
+ fileName: fsItem.fn,
+ isOpen: isOpen,
+ depth: this.currentPath.length - 1
+ };
+ }
+
+ private getNodeType(isOpen: boolean, fsItem: IFsItem): NodeType {
+ switch (fsItem.type) {
+ case ITEM_MODE_FILE: {
+ return fsItem.fn.endsWith(".ksy") ? KSY_FILE : BINARY_FILE;
+ }
+ case ITEM_MODE_DIRECTORY: {
+ if (Object.keys(fsItem.children).length === 0) return EMPTY_FOLDER;
+ else if (isOpen) return OPEN_FOLDER;
+ else return CLOSED_FOLDER;
+ }
+ }
+ }
+
+ private isDirectoryOpen(path: string) {
+ const tempPath = this.currentPath.join("/");
+ return !!this.openPaths.find(openPath => openPath === tempPath);
+ }
+}
\ No newline at end of file
diff --git a/src/Components/FileTree/FileTree.vue b/src/Components/FileTree/FileTree.vue
index 6c66cc4c..dd2c9f9d 100644
--- a/src/Components/FileTree/FileTree.vue
+++ b/src/Components/FileTree/FileTree.vue
@@ -1,43 +1,62 @@
-