source: oup/current/Tools/MetaEditor.pas@ 237

Last change on this file since 237 was 237, checked in by alloc, 18 years ago
File size: 6.8 KB
RevLine 
[209]1unit MetaEditor;
[217]2
[209]3interface
[217]4
[209]5uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
[232]7 Dialogs, _BaseTemplate, ExtCtrls, VirtualTrees, StdCtrls, ComCtrls, Grids,
[233]8 MPHexEditor, Wrapgrid, VTHeaderPopup, Menus, _TreeElement;
[209]9
10type
[217]11 TForm_Meta = class(TForm_BaseTemplate)
[209]12 VST: TVirtualStringTree;
[217]13 splitter: TSplitter;
[232]14 rightPages: TPageControl;
15 tab_hex: TTabSheet;
16 tab_meta: TTabSheet;
17 panel_hex_actions: TPanel;
18 hex: TMPHexEditor;
19 splitter_hex_1: TSplitter;
20 value_viewer: TWrapGrid;
21 splitter_hex_2: TSplitter;
22 structviewer: TVirtualStringTree;
[233]23 value_viewer_context: TPopupMenu;
24 value_viewer_context_copy: TMenuItem;
25 value_viewer_context_copyasdec: TMenuItem;
26 value_viewer_context_copyasfloat: TMenuItem;
27 value_viewer_context_copyasbitset: TMenuItem;
28 value_viewer_context_copyasstring: TMenuItem;
29 value_viewer_context_copyashex: TMenuItem;
30 VTHPopup: TVTHeaderPopupMenu;
31 btn_export: TButton;
32 btn_import: TButton;
[209]33 procedure FormCreate(Sender: TObject);
[212]34 procedure VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode;
35 var ChildCount: Cardinal);
[217]36 procedure FormClose(Sender: TObject; var Action: TCloseAction);
[214]37 procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
38 Column: TColumnIndex);
39 procedure VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
40 NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
41 var Allowed: Boolean);
[217]42 procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
43 Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
44 procedure VSTPaintText(Sender: TBaseVirtualTree;
45 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
46 TextType: TVSTTextType);
[209]47 private
[233]48 root: TTreeElement;
[217]49 procedure NewCon(ID: Integer);
[209]50 public
51 end;
52
53
54implementation
55{$R *.dfm}
[232]56uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes;
[209]57
58type
59 PNodeData = ^TNodeData;
60
61 TNodeData = record
[233]62 Field: TTreeElement;
[209]63 end;
64
65function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
66 ARecord: TNodeData): PVirtualNode;
67var
68 Data: PNodeData;
69begin
70 Result := AVST.AddChild(ANode);
71 Data := AVST.GetNodeData(Result);
72 AVST.ValidateNode(Result, False);
73 Data^ := ARecord;
74end;
75
76
[217]77procedure TForm_Meta.NewCon(ID: Integer);
[212]78var
79 i: Integer;
80 data: TNodeData;
81 node: PVirtualNode;
[231]82 Meta: TMetaManager;
[233]83 root: TTreeElement;
[212]84begin
[217]85 if ID >= 0 then
[212]86 begin
[232]87 //VST
[212]88 VST.Clear;
89 VST.BeginUpdate;
[237]90// root := ConManager.Connection[FConnectionID].MetaData.Root;
91 root := ConManager.Connection[FConnectionID].MetaData.FileById[454];
[233]92 for i := 0 to root.ChildCount - 1 do
[212]93 begin
[233]94 data.Field := root.Child[i];
[232]95 node := AddVSTEntry(VST, nil, data);
96 VST.HasChildren[node] := True;
[212]97 end;
98 VST.EndUpdate;
99 end;
100end;
101
[209]102
[217]103procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree;
104 Node: PVirtualNode; var ChildCount: Cardinal);
[209]105var
[217]106 data: PNodeData;
107 newdata: TNodeData;
108 newnode: PVirtualNode;
[209]109 i: Integer;
[231]110 Meta: TMetaManager;
[209]111begin
[231]112 data := Sender.GetNodeData(node);
[232]113 Meta := ConManager.Connection[ConnectionID].MetaData;
[233]114
115 if data.Field.ChildCount > 0 then
[232]116 begin
[233]117 for i := 0 to data.Field.ChildCount - 1 do
[232]118 begin
[233]119 newdata.Field := data.Field.Child[i];
[232]120 newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata);
[233]121 if newdata.Field.ChildCount > 0 then
[232]122 Sender.HasChildren[newnode] := True;
123 end;
124 end;
[231]125 ChildCount := Sender.ChildCount[Node];
[209]126end;
127
128
[214]129procedure TForm_Meta.VSTFocusChanged(Sender: TBaseVirtualTree;
130 Node: PVirtualNode; Column: TColumnIndex);
131var
132 data: PNodeData;
133begin
134 data := Sender.GetNodeData(Node);
135 if data.Field is TFile then
136 begin
137 TFile(data.Field).InitEditor;
138 if Assigned(TFile(data.Field).Editor) then
139 begin
[232]140 TFile(data.Field).Editor.Align := alClient;
141 tab_meta.InsertControl(TFile(data.Field).Editor);
[214]142 TFile(data.Field).Opened := True;
143 end;
144 end;
145end;
146
[217]147
[214]148procedure TForm_Meta.VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
149 NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
150 var Allowed: Boolean);
151var
152 data: PNodeData;
153 i: Integer;
154begin
155 data := Sender.GetNodeData(NewNode);
156 if data.Field is TFile then
157 begin
158 TFile(data.Field).InitEditor;
159 if Assigned(TFile(data.Field).Editor) then
160 Allowed := not TFile(data.Field).Opened
161 else
162 Allowed := True;
163 end;
164 if Allowed and Assigned(OldNode) then
165 begin
166 data := Sender.GetNodeData(OldNode);
167 if data.Field is TFile then
168 begin
169 if TFile(data.Field).Opened then
170 begin
[232]171 if tab_meta.ControlCount > 0 then
172 for i := 0 to tab_meta.ControlCount - 1 do
173 tab_meta.RemoveControl(tab_meta.Controls[i]);
[214]174 TFile(data.Field).Opened := False;
175 end;
176 end;
177 end;
178end;
179
[217]180
[209]181procedure TForm_Meta.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
182 Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
183var
184 Data: PNodeData;
185begin
186 Data := Sender.GetNodeData(Node);
187 CellText := '';
188 if TextType = ttNormal then
189 begin
190 case Column of
[212]191 0:
[209]192 begin
[233]193 CellText := Data.Field.GetCaption;
[209]194 end;
195 1:
[212]196 begin
197 if Data.Field is TFile then
[231]198 CellText := TFile(Data.Field).FileInfo.Extension;
[212]199 end;
[209]200 2:
[212]201 begin
202 if Data.Field is TFile then
[231]203 CellText := IntToStr(TFile(Data.Field).FileInfo.ID);
[212]204 end;
[236]205 3:
206 begin
207 if Data.Field is TDataField then
208 CellText := TDataField(Data.Field).ValueAsString;
209 end;
[212]210 end;
[209]211 end;
212end;
213
[217]214
[212]215procedure TForm_Meta.VSTPaintText(Sender: TBaseVirtualTree;
216 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
217 TextType: TVSTTextType);
218var
219 Data: PNodeData;
220begin
221 Data := Sender.GetNodeData(Node);
222 if TextType = ttNormal then
223 begin
224 case Column of
225 0:
226 begin
227 if Data.Field is TFile then
[213]228 begin
[231]229 if Length(TFile(Data.Field).FileInfo.Name) = 0 then
[213]230 TargetCanvas.Font.Color := $C06060;
[231]231 if TFile(Data.Field).FileInfo.Size = 0 then
[213]232 TargetCanvas.Font.Color := $2020A0;
233 end;
[212]234 end;
235 end;
236 end;
237end;
238
[209]239
[217]240
241procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction);
[209]242begin
[229]243// Meta.Free;
[217]244 inherited;
[209]245end;
[217]246
247procedure TForm_Meta.FormCreate(Sender: TObject);
248begin
249 inherited;
250 OnNewConnection := NewCon;
251
252 VST.NodeDataSize := SizeOf(TNodeData);
253 VST.Font.Charset := AppSettings.CharSet;
254 VST.Clear;
255
256 UpdateConList;
257end;
258
[209]259end.
Note: See TracBrowser for help on using the repository browser.