ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Tools/MetaEditor.pas
Revision: 233
Committed: Fri Jun 29 12:38:24 2007 UTC (18 years, 3 months ago) by alloc
Content type: text/x-pascal
File size: 6905 byte(s)
Log Message:

File Contents

# Content
1 unit MetaEditor;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, _BaseTemplate, ExtCtrls, VirtualTrees, StdCtrls, ComCtrls, Grids,
8 MPHexEditor, Wrapgrid, VTHeaderPopup, Menus, _TreeElement;
9
10 type
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
54 implementation
55 {$R *.dfm}
56 uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes;
57
58 type
59 PNodeData = ^TNodeData;
60
61 TNodeData = record
62 Field: TTreeElement;
63 end;
64
65 function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
66 ARecord: TNodeData): PVirtualNode;
67 var
68 Data: PNodeData;
69 begin
70 Result := AVST.AddChild(ANode);
71 Data := AVST.GetNodeData(Result);
72 AVST.ValidateNode(Result, False);
73 Data^ := ARecord;
74 end;
75
76
77 procedure TForm_Meta.NewCon(ID: Integer);
78 var
79 i: Integer;
80 data: TNodeData;
81 node: PVirtualNode;
82 Meta: TMetaManager;
83 root: TTreeElement;
84 begin
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;
99 end;
100
101
102 procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree;
103 Node: PVirtualNode; var ChildCount: Cardinal);
104 var
105 data: PNodeData;
106 newdata: TNodeData;
107 newnode: PVirtualNode;
108 i: Integer;
109 Meta: TMetaManager;
110 begin
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];
128 end;
129
130
131 procedure TForm_Meta.VSTFocusChanged(Sender: TBaseVirtualTree;
132 Node: PVirtualNode; Column: TColumnIndex);
133 var
134 data: PNodeData;
135 begin
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;
147 end;
148
149
150 procedure TForm_Meta.VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
151 NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
152 var Allowed: Boolean);
153 var
154 data: PNodeData;
155 i: Integer;
156 begin
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;
180 end;
181
182
183 procedure TForm_Meta.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
184 Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
185 var
186 Data: PNodeData;
187 begin
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 end;
208 end;
209 end;
210
211
212 procedure TForm_Meta.VSTPaintText(Sender: TBaseVirtualTree;
213 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
214 TextType: TVSTTextType);
215 var
216 Data: PNodeData;
217 begin
218 Data := Sender.GetNodeData(Node);
219 if TextType = ttNormal then
220 begin
221 case Column of
222 0:
223 begin
224 if Data.Field is TFile then
225 begin
226 if Length(TFile(Data.Field).FileInfo.Name) = 0 then
227 TargetCanvas.Font.Color := $C06060;
228 if TFile(Data.Field).FileInfo.Size = 0 then
229 TargetCanvas.Font.Color := $2020A0;
230 end;
231 end;
232 end;
233 end;
234 end;
235
236
237
238 procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction);
239 begin
240 // Meta.Free;
241 inherited;
242 end;
243
244 procedure TForm_Meta.FormCreate(Sender: TObject);
245 begin
246 inherited;
247 OnNewConnection := NewCon;
248
249 VST.NodeDataSize := SizeOf(TNodeData);
250 VST.Font.Charset := AppSettings.CharSet;
251 VST.Clear;
252
253 UpdateConList;
254 end;
255
256 end.