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

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