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

Last change on this file since 238 was 238, checked in by alloc, 17 years ago
File size: 8.0 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 vst_popup: TPopupMenu;
34 vst_newRoot: TMenuItem;
35 vst_setRoot: TMenuItem;
36 procedure FormCreate(Sender: TObject);
37 procedure VSTInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode;
38 var ChildCount: Cardinal);
39 procedure FormClose(Sender: TObject; var Action: TCloseAction);
40 procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
41 Column: TColumnIndex);
42 procedure VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
43 NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
44 var Allowed: Boolean);
45 procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
46 Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
47 procedure VSTPaintText(Sender: TBaseVirtualTree;
48 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
49 TextType: TVSTTextType);
50 procedure VSTGetPopupMenu(Sender: TBaseVirtualTree; Node: PVirtualNode;
51 Column: TColumnIndex; const P: TPoint; var AskParent: Boolean;
52 var PopupMenu: TPopupMenu);
53 procedure vst_setRootClick(Sender: TObject);
54 private
55 root: TTreeElement;
56 procedure NewCon(ID: Integer);
57 public
58 procedure SetRoot(TreeElem: TTreeElement);
59 end;
60
61
62implementation
63{$R *.dfm}
64uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes;
65
66type
67 PNodeData = ^TNodeData;
68
69 TNodeData = record
70 Field: TTreeElement;
71 end;
72
73function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
74 ARecord: TNodeData): PVirtualNode;
75var
76 Data: PNodeData;
77begin
78 Result := AVST.AddChild(ANode);
79 Data := AVST.GetNodeData(Result);
80 AVST.ValidateNode(Result, False);
81 Data^ := ARecord;
82end;
83
84
85procedure TForm_Meta.NewCon(ID: Integer);
86begin
87 if ID >= 0 then
88 SetRoot(ConManager.Connection[FConnectionID].MetaData.Root);
89end;
90
91
92procedure TForm_Meta.SetRoot(TreeElem: TTreeElement);
93var
94 i: Integer;
95 data: TNodeData;
96 node: PVirtualNode;
97begin
98 if FConnectionID <> TreeElem.ConnectionID then
99 SelectConnection(TreeElem.ConnectionID);
100 root := TreeElem;
101 VST.Clear;
102 VST.BeginUpdate;
103 for i := 0 to root.ChildCount - 1 do
104 begin
105 data.Field := root.Child[i];
106 node := AddVSTEntry(VST, nil, data);
107 if data.Field.ChildCount > 0 then
108 VST.HasChildren[node] := True;
109 end;
110 VST.EndUpdate;
111end;
112
113procedure TForm_Meta.VSTInitChildren(Sender: TBaseVirtualTree;
114 Node: PVirtualNode; var ChildCount: Cardinal);
115var
116 data: PNodeData;
117 newdata: TNodeData;
118 newnode: PVirtualNode;
119 i: Integer;
120 Meta: TMetaManager;
121begin
122 data := Sender.GetNodeData(node);
123 Meta := ConManager.Connection[ConnectionID].MetaData;
124
125 if data.Field.ChildCount > 0 then
126 begin
127 for i := 0 to data.Field.ChildCount - 1 do
128 begin
129 newdata.Field := data.Field.Child[i];
130 newnode := AddVSTEntry(TCustomVirtualStringTree(Sender), Node, newdata);
131 if newdata.Field.ChildCount > 0 then
132 Sender.HasChildren[newnode] := True;
133 end;
134 end;
135 ChildCount := Sender.ChildCount[Node];
136end;
137
138
139procedure TForm_Meta.VSTFocusChanged(Sender: TBaseVirtualTree;
140 Node: PVirtualNode; Column: TColumnIndex);
141var
142 data: PNodeData;
143begin
144 data := Sender.GetNodeData(Node);
145 if data.Field is TFile then
146 begin
147 TFile(data.Field).InitEditor;
148 if Assigned(TFile(data.Field).Editor) then
149 begin
150 TFile(data.Field).Editor.Align := alClient;
151 tab_meta.InsertControl(TFile(data.Field).Editor);
152 TFile(data.Field).Opened := True;
153 end;
154 end;
155end;
156
157
158procedure TForm_Meta.VSTFocusChanging(Sender: TBaseVirtualTree; OldNode,
159 NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
160 var Allowed: Boolean);
161var
162 data: PNodeData;
163 i: Integer;
164begin
165 data := Sender.GetNodeData(NewNode);
166 if data.Field is TFile then
167 begin
168 TFile(data.Field).InitEditor;
169 if Assigned(TFile(data.Field).Editor) then
170 Allowed := not TFile(data.Field).Opened
171 else
172 Allowed := True;
173 end;
174 if Allowed and Assigned(OldNode) then
175 begin
176 data := Sender.GetNodeData(OldNode);
177 if data.Field is TFile then
178 begin
179 if TFile(data.Field).Opened then
180 begin
181 if tab_meta.ControlCount > 0 then
182 for i := 0 to tab_meta.ControlCount - 1 do
183 tab_meta.RemoveControl(tab_meta.Controls[i]);
184 TFile(data.Field).Opened := False;
185 end;
186 end;
187 end;
188end;
189
190
191procedure TForm_Meta.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
192 Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
193var
194 Data: PNodeData;
195begin
196 Data := Sender.GetNodeData(Node);
197 CellText := '';
198 if TextType = ttNormal then
199 begin
200 case Column of
201 0:
202 begin
203 CellText := Data.Field.GetCaption;
204 end;
205 1:
206 begin
207 if Data.Field is TFile then
208 CellText := TFile(Data.Field).FileInfo.Extension;
209 end;
210 2:
211 begin
212 if Data.Field is TFile then
213 CellText := IntToStr(TFile(Data.Field).FileInfo.ID);
214 end;
215 3:
216 begin
217 if Data.Field is TDataField then
218 CellText := TDataField(Data.Field).ValueAsString;
219 end;
220 end;
221 end;
222end;
223
224
225procedure TForm_Meta.VSTPaintText(Sender: TBaseVirtualTree;
226 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
227 TextType: TVSTTextType);
228var
229 Data: PNodeData;
230begin
231 Data := Sender.GetNodeData(Node);
232 if TextType = ttNormal then
233 begin
234 case Column of
235 0:
236 begin
237 if Data.Field is TFile then
238 begin
239 if Length(TFile(Data.Field).FileInfo.Name) = 0 then
240 TargetCanvas.Font.Color := $C06060;
241 if TFile(Data.Field).FileInfo.Size = 0 then
242 TargetCanvas.Font.Color := $2020A0;
243 end;
244 end;
245 end;
246 end;
247end;
248
249
250
251procedure TForm_Meta.VSTGetPopupMenu(Sender: TBaseVirtualTree;
252 Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
253 var AskParent: Boolean; var PopupMenu: TPopupMenu);
254var
255 data: PNodeData;
256begin
257 inherited;
258 AskParent := False;
259 if Assigned(Node) then
260 begin
261 Sender.Selected[Node] := True;
262 Sender.FocusedNode := Node;
263 data := Sender.GetNodeData(Node);
264 if Column = 0 then
265 begin
266 if TTreeElement(data.Field).GetChildCount > 0 then
267 PopupMenu := vst_popup
268 else
269 PopupMenu := nil;
270 end;
271 end;
272end;
273
274procedure TForm_Meta.vst_setRootClick(Sender: TObject);
275var
276 data: PNodeData;
277begin
278 inherited;
279 data := VST.GetNodeData(VST.FocusedNode);
280 SetRoot(data.Field);
281end;
282
283procedure TForm_Meta.FormClose(Sender: TObject; var Action: TCloseAction);
284begin
285// Meta.Free;
286 inherited;
287end;
288
289procedure TForm_Meta.FormCreate(Sender: TObject);
290begin
291 inherited;
292 OnNewConnection := NewCon;
293
294 VST.NodeDataSize := SizeOf(TNodeData);
295 VST.Font.Charset := AppSettings.CharSet;
296 VST.Clear;
297
298 UpdateConList;
299end;
300
301end.
Note: See TracBrowser for help on using the repository browser.