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
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 root := ConManager.Connection[FConnectionID].MetaData.FileById[454];
92 for i := 0 to root.ChildCount - 1 do
93 begin
94 data.Field := root.Child[i];
95 node := AddVSTEntry(VST, nil, data);
96 VST.HasChildren[node] := True;
97 end;
98 VST.EndUpdate;
99 end;
100end;
101
102
103procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree;
104 Node: PVirtualNode; var ChildCount: Cardinal);
105var
106 data: PNodeData;
107 newdata: TNodeData;
108 newnode: PVirtualNode;
109 i: Integer;
110 Meta: TMetaManager;
111begin
112 data := Sender.GetNodeData(node);
113 Meta := ConManager.Connection[ConnectionID].MetaData;
114
115 if data.Field.ChildCount > 0 then
116 begin
117 for i := 0 to data.Field.ChildCount - 1 do
118 begin
119 newdata.Field := data.Field.Child[i];
120 newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata);
121 if newdata.Field.ChildCount > 0 then
122 Sender.HasChildren[newnode] := True;
123 end;
124 end;
125 ChildCount := Sender.ChildCount[Node];
126end;
127
128
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
140 TFile(data.Field).Editor.Align := alClient;
141 tab_meta.InsertControl(TFile(data.Field).Editor);
142 TFile(data.Field).Opened := True;
143 end;
144 end;
145end;
146
147
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
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]);
174 TFile(data.Field).Opened := False;
175 end;
176 end;
177 end;
178end;
179
180
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
191 0:
192 begin
193 CellText := Data.Field.GetCaption;
194 end;
195 1:
196 begin
197 if Data.Field is TFile then
198 CellText := TFile(Data.Field).FileInfo.Extension;
199 end;
200 2:
201 begin
202 if Data.Field is TFile then
203 CellText := IntToStr(TFile(Data.Field).FileInfo.ID);
204 end;
205 3:
206 begin
207 if Data.Field is TDataField then
208 CellText := TDataField(Data.Field).ValueAsString;
209 end;
210 end;
211 end;
212end;
213
214
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
228 begin
229 if Length(TFile(Data.Field).FileInfo.Name) = 0 then
230 TargetCanvas.Font.Color := $C06060;
231 if TFile(Data.Field).FileInfo.Size = 0 then
232 TargetCanvas.Font.Color := $2020A0;
233 end;
234 end;
235 end;
236 end;
237end;
238
239
240
241procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction);
242begin
243// Meta.Free;
244 inherited;
245end;
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
259end.
Note: See TracBrowser for help on using the repository browser.