--- oup/current/Tools/MetaEditor.pas 2007/06/20 10:57:51 229 +++ oup/current/Tools/MetaEditor.pas 2007/07/14 20:22:05 239 @@ -4,13 +4,35 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, _BaseTemplate, ExtCtrls, VirtualTrees, StdCtrls; + Dialogs, _BaseTemplate, ExtCtrls, VirtualTrees, StdCtrls, ComCtrls, Grids, + MPHexEditor, Wrapgrid, VTHeaderPopup, Menus, _TreeElement; type TForm_Meta = class(TForm_BaseTemplate) VST: TVirtualStringTree; - Panel2: TPanel; splitter: TSplitter; + rightPages: TPageControl; + tab_hex: TTabSheet; + tab_meta: TTabSheet; + panel_hex_actions: TPanel; + hex: TMPHexEditor; + splitter_hex_1: TSplitter; + value_viewer: TWrapGrid; + splitter_hex_2: TSplitter; + structviewer: TVirtualStringTree; + value_viewer_context: TPopupMenu; + value_viewer_context_copy: TMenuItem; + value_viewer_context_copyasdec: TMenuItem; + value_viewer_context_copyasfloat: TMenuItem; + value_viewer_context_copyasbitset: TMenuItem; + value_viewer_context_copyasstring: TMenuItem; + value_viewer_context_copyashex: TMenuItem; + VTHPopup: TVTHeaderPopupMenu; + btn_export: TButton; + btn_import: TButton; + vst_popup: TPopupMenu; + vst_newRoot: TMenuItem; + vst_setRoot: TMenuItem; procedure FormCreate(Sender: TObject); procedure VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal); @@ -25,21 +47,28 @@ type procedure VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); + procedure VSTGetPopupMenu(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; const P: TPoint; var AskParent: Boolean; + var PopupMenu: TPopupMenu); + procedure vst_setRootClick(Sender: TObject); + procedure vst_newRootClick(Sender: TObject); private + root: TTreeElement; procedure NewCon(ID: Integer); public + procedure SetRoot(TreeElem: TTreeElement); end; implementation {$R *.dfm} -uses _MetaManager, _FileTypes, Data; +uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes, Main; type PNodeData = ^TNodeData; TNodeData = record - Field: TObject; + Field: TTreeElement; end; function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; @@ -55,40 +84,33 @@ end; procedure TForm_Meta.NewCon(ID: Integer); +begin + if ID >= 0 then + SetRoot(ConManager.Connection[FConnectionID].MetaData.Root); +end; + + +procedure TForm_Meta.SetRoot(TreeElem: TTreeElement); var - a,b,c: Int64; i: Integer; data: TNodeData; node: PVirtualNode; begin -{ - if ID >= 0 then + if FConnectionID <> TreeElem.ConnectionID then + SelectConnection(TreeElem.ConnectionID); + root := TreeElem; + VST.Clear; + VST.BeginUpdate; + for i := 0 to root.ChildCount - 1 do begin - QueryPerformanceFrequency(c); - QueryPerformanceCounter(a); - if not Assigned(Meta) then - Meta := TMetaManager.Create(ID, Self); - QueryPerformanceCounter(b); - ShowMessage('Loading Done - ' + FloatToStr((b-a)/c) + 's'); - - VST.Clear; - VST.BeginUpdate; - for i := 0 to Meta.FileCount - 1 do - begin - if Assigned(Meta.FileById[i]) then - begin - data.Field := Meta.FileById[i]; - node := AddVSTEntry(VST, nil, data); - if Meta.FileById[i].ChildCount > 0 then - VST.HasChildren[node] := True; - end; - end; - VST.EndUpdate; + data.Field := root.Child[i]; + node := AddVSTEntry(VST, nil, data); + if data.Field.ChildCount > 0 then + VST.HasChildren[node] := True; end; -} + VST.EndUpdate; end; - procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal); var @@ -96,21 +118,22 @@ var newdata: TNodeData; newnode: PVirtualNode; i: Integer; - id: Integer; + Meta: TMetaManager; begin -{ - data := VST.GetNodeData(node); - for i := 0 to Meta.FileById[TFile(data.Field).FileID].ChildCount - 1 do - begin - id := Meta.FileById[TFile(data.Field).FileID].LinkByIndex[i].DestID; - Meta.InitFile(id); - newdata.Field := Meta.FileById[id]; - newnode := AddVSTEntry(VST, Node, newdata); - if Meta.FileById[id].ChildCount > 0 then - VST.HasChildren[newnode] := True; + data := Sender.GetNodeData(node); + Meta := ConManager.Connection[ConnectionID].MetaData; + + if data.Field.ChildCount > 0 then + begin + for i := 0 to data.Field.ChildCount - 1 do + begin + newdata.Field := data.Field.Child[i]; + newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata); + if newdata.Field.ChildCount > 0 then + Sender.HasChildren[newnode] := True; + end; end; - ChildCount := Meta.FileById[TFile(data.Field).FileID].ChildCount; -} + ChildCount := Sender.ChildCount[Node]; end; @@ -125,7 +148,8 @@ begin TFile(data.Field).InitEditor; if Assigned(TFile(data.Field).Editor) then begin - panel2.InsertControl(TFile(data.Field).Editor); + TFile(data.Field).Editor.Align := alClient; + tab_meta.InsertControl(TFile(data.Field).Editor); TFile(data.Field).Opened := True; end; end; @@ -155,9 +179,9 @@ begin begin if TFile(data.Field).Opened then begin - if panel2.ControlCount > 0 then - for i := 0 to panel2.ControlCount - 1 do - panel2.RemoveControl(panel2.Controls[i]); + if tab_meta.ControlCount > 0 then + for i := 0 to tab_meta.ControlCount - 1 do + tab_meta.RemoveControl(tab_meta.Controls[i]); TFile(data.Field).Opened := False; end; end; @@ -177,22 +201,22 @@ begin case Column of 0: begin - if Data.Field is TFile then - begin - CellText := TFile(Data.Field).FileName; - if CellText = '' then - CellText := 'Unnamed'; - end; + CellText := Data.Field.GetCaption; end; 1: begin if Data.Field is TFile then - CellText := TFile(Data.Field).FileExt; + CellText := TFile(Data.Field).FileInfo.Extension; end; 2: begin if Data.Field is TFile then - CellText := IntToStr(TFile(Data.Field).FileID); + CellText := IntToStr(TFile(Data.Field).FileInfo.ID); + end; + 3: + begin + if Data.Field is TDataField then + CellText := TDataField(Data.Field).ValueAsString; end; end; end; @@ -213,9 +237,9 @@ begin begin if Data.Field is TFile then begin - if Length(TFile(Data.Field).FileName) = 0 then + if Length(TFile(Data.Field).FileInfo.Name) = 0 then TargetCanvas.Font.Color := $C06060; - if TFile(Data.Field).FileSize = 0 then + if TFile(Data.Field).FileInfo.Size = 0 then TargetCanvas.Font.Color := $2020A0; end; end; @@ -225,6 +249,51 @@ end; +procedure TForm_Meta.VSTGetPopupMenu(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; const P: TPoint; + var AskParent: Boolean; var PopupMenu: TPopupMenu); +var + data: PNodeData; +begin + inherited; + AskParent := False; + if Assigned(Node) then + begin + Sender.Selected[Node] := True; + Sender.FocusedNode := Node; + data := Sender.GetNodeData(Node); + if Column = 0 then + begin + if TTreeElement(data.Field).GetChildCount > 0 then + PopupMenu := vst_popup + else + PopupMenu := nil; + end; + end; +end; + +procedure TForm_Meta.vst_newRootClick(Sender: TObject); +var + data: PNodeData; + form: TForm_BaseTemplate; +begin + inherited; + data := VST.GetNodeData(VST.FocusedNode); + form := nil; + form := Form_Main.open_child('meta'); + if form is TForm_Meta then + TForm_Meta(form).SetRoot(data.Field); +end; + +procedure TForm_Meta.vst_setRootClick(Sender: TObject); +var + data: PNodeData; +begin + inherited; + data := VST.GetNodeData(VST.FocusedNode); + SetRoot(data.Field); +end; + procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction); begin // Meta.Free;