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

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