Index: oup/current/Tools/MetaEditor.dfm
===================================================================
--- oup/current/Tools/MetaEditor.dfm	(revision 228)
+++ oup/current/Tools/MetaEditor.dfm	(revision 229)
@@ -4,10 +4,4 @@
   PixelsPerInch = 96
   TextHeight = 13
-  inherited panel_connection: TPanel
-    ExplicitWidth = 598
-    inherited combo_connection: TComboBox
-      ExplicitWidth = 532
-    end
-  end
   inherited panel_basecontent: TPanel
     ExplicitLeft = 0
Index: oup/current/Tools/MetaEditor.pas
===================================================================
--- oup/current/Tools/MetaEditor.pas	(revision 228)
+++ oup/current/Tools/MetaEditor.pas	(revision 229)
@@ -31,6 +31,4 @@
   end;
 
-var
-  Form_Meta: TForm_Meta;
 
 implementation
@@ -64,4 +62,5 @@
   node: PVirtualNode;
 begin
+{
   if ID >= 0 then
   begin
@@ -69,5 +68,5 @@
     QueryPerformanceCounter(a);
     if not Assigned(Meta) then
-      Meta := TMetaManager.Create(ID);
+      Meta := TMetaManager.Create(ID, Self);
     QueryPerformanceCounter(b);
     ShowMessage('Loading Done - ' + FloatToStr((b-a)/c) + 's');
@@ -87,4 +86,5 @@
     VST.EndUpdate;
   end;
+}
 end;
 
@@ -99,4 +99,5 @@
   id: Integer;
 begin
+{
   data := VST.GetNodeData(node);
   for i := 0 to Meta.FileById[TFile(data.Field).FileID].ChildCount - 1 do
@@ -110,4 +111,5 @@
   end;
   ChildCount := Meta.FileById[TFile(data.Field).FileID].ChildCount;
+}
 end;
 
@@ -226,5 +228,5 @@
 procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
-  Meta.Free;
+//  Meta.Free;
   inherited;
 end;
Index: oup/current/Tools/_TemplateFileList.dfm
===================================================================
--- oup/current/Tools/_TemplateFileList.dfm	(revision 228)
+++ oup/current/Tools/_TemplateFileList.dfm	(revision 229)
@@ -33,5 +33,5 @@
         Margins.Right = 1
         Margins.Bottom = 0
-        ActivePage = tab_files
+        ActivePage = tab_meta
         Align = alClient
         TabOrder = 0
@@ -284,4 +284,7 @@
             Header.Options = [hoColumnResize, hoDrag]
             TabOrder = 0
+            OnGetText = filelist_metaGetText
+            OnPaintText = filelist_metaPaintText
+            OnInitChildren = filelist_metaInitChildren
             Columns = <>
           end
Index: oup/current/Tools/_TemplateFileList.pas
===================================================================
--- oup/current/Tools/_TemplateFileList.pas	(revision 228)
+++ oup/current/Tools/_TemplateFileList.pas	(revision 229)
@@ -55,4 +55,11 @@
     procedure popup_linkshereClick(Sender: TObject);
     procedure filepopupPopup(Sender: TObject);
+    procedure filelist_metaGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
+      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
+    procedure filelist_metaInitChildren(Sender: TBaseVirtualTree;
+      Node: PVirtualNode; var ChildCount: Cardinal);
+    procedure filelist_metaPaintText(Sender: TBaseVirtualTree;
+      const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
+      TextType: TVSTTextType);
   private
     FSortBy: TSortType;
@@ -73,5 +80,24 @@
 {$R *.dfm}
 uses ConnectionManager, Exporters, Functions, StrUtils, WhatLinksHere, Main,
-  _BaseTemplate;
+  _BaseTemplate, _MetaTypes, Data, _MetaManager, _FileTypes;
+
+type
+  PNodeData = ^TNodeData;
+
+  TNodeData = record
+    Field: TObject;
+  end;
+
+function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
+  ARecord: TNodeData): PVirtualNode;
+var
+  Data: PNodeData;
+begin
+  Result := AVST.AddChild(ANode);
+  Data   := AVST.GetNodeData(Result);
+  AVST.ValidateNode(Result, False);
+  Data^ := ARecord;
+end;
+
 
 
@@ -108,4 +134,8 @@
   pattern: String;
   files: TStrings;
+  root: TExtensions;
+  i: Integer;
+  data: TNodeData;
+  node: PVirtualNode;
 begin
   if FConnectionID > -1 then
@@ -130,4 +160,16 @@
       filelist.Items.AddStrings(files);
     filelist.Visible := True;
+
+    //VST
+    filelist_meta.Clear;
+    filelist_meta.BeginUpdate;
+    root := ConManager.Connection[FConnectionID].MetaData.Root;
+    for i := 0 to High(root) do
+    begin
+      data.Field := root[i];
+      node := AddVSTEntry(filelist_meta, nil, data);
+      filelist_meta.HasChildren[node] := True;
+    end;
+    filelist_meta.EndUpdate;
   end;
 end;
@@ -217,4 +259,5 @@
 end;
 
+
 procedure TForm_TemplateFileList.filepopupPopup(Sender: TObject);
 var
@@ -338,4 +381,8 @@
 begin
   inherited;
+  filelist_meta.NodeDataSize := SizeOf(TNodeData);
+  filelist_meta.Font.Charset := AppSettings.CharSet;
+  filelist_meta.Clear;
+
   FAllowedExts := '';
   FAllowMultiSelect := False;
@@ -356,3 +403,83 @@
 
 
+
+procedure TForm_TemplateFileList.filelist_metaGetText(Sender: TBaseVirtualTree;
+  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
+  var CellText: WideString);
+var
+  data: PNodeData;
+begin
+  inherited;
+  data := Sender.GetNodeData(Node);
+  if data.Field is TExtension then
+  begin
+    CellText := TExtension(data.Field).Ext;
+  end;
+  if data.Field is TFile then
+  begin
+    if TFile(data.Field).FileName = '' then
+      CellText := TFile(data.Field).FileExt + ' (unnamed)'
+    else
+      CellText := TFile(data.Field).FileExt + ': ' + TFile(data.Field).FileName;
+  end;
+end;
+
+
+procedure TForm_TemplateFileList.filelist_metaInitChildren(
+  Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal);
+var
+  data: PNodeData;
+  i: Integer;
+  newdata: TNodeData;
+  newnode: PVirtualNode;
+  id: Integer;
+begin
+  inherited;
+  data := Sender.GetNodeData(Node);
+  if data.Field is TExtension then
+  begin
+    if TExtension(data.Field).FileCount = 0 then
+      TExtension(data.Field).InitList;
+    for i := 0 to TExtension(data.Field).FileCount - 1 do
+    begin
+      id := TExtension(data.Field).Files[i];
+      ConManager.Connection[FConnectionID].MetaData.InitFile(id);
+      newdata.Field := ConManager.Connection[FConnectionID].MetaData.FileById[id];
+      newnode := AddVSTEntry(filelist_meta, Node, newdata);
+      if ConManager.Connection[FConnectionID].MetaData.FileById[id].ChildCount > 0 then
+        filelist_meta.HasChildren[newnode] := True;
+      ChildCount := filelist_meta.ChildCount[node];
+    end;
+  end;
+  if data.Field is TFile then
+  begin
+    for i := 0 to TFile(data.Field).ChildCount - 1 do
+    begin
+      id := TFile(data.Field).LinkByIndex[i].DestID;
+      ConManager.Connection[FConnectionID].MetaData.InitFile(id);
+      newdata.Field := ConManager.Connection[FConnectionID].MetaData.FileById[id];
+      newnode := AddVSTEntry(filelist_meta, Node, newdata);
+      if ConManager.Connection[FConnectionID].MetaData.FileById[id].ChildCount > 0 then
+        filelist_meta.HasChildren[newnode] := True;
+    end;
+    ChildCount := filelist_meta.ChildCount[node];
+  end;
+end;
+
+procedure TForm_TemplateFileList.filelist_metaPaintText(
+  Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode;
+  Column: TColumnIndex; TextType: TVSTTextType);
+var
+  Data: PNodeData;
+begin
+  Data     := Sender.GetNodeData(Node);
+  if Data.Field is TFile then
+  begin
+    if Length(TFile(Data.Field).FileName) = 0 then
+      TargetCanvas.Font.Color := $C06060;
+    if TFile(Data.Field).FileSize = 0 then
+      TargetCanvas.Font.Color := $2020A0;
+  end;
+end;
+
 end.
