ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Tools/BinEdit.pas
(Generate patch)

Comparing oup/current/Tools/BinEdit.pas (file contents):
Revision 111 by alloc, Wed Feb 21 03:28:48 2007 UTC vs.
Revision 248 by alloc, Mon Nov 26 11:02:28 2007 UTC

# Line 1 | Line 1
1   unit BinEdit;
2 +
3   interface
4 +
5   uses
6    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 <  Dialogs, Template, StdCtrls, ExtCtrls, VirtualTrees, Grids, Wrapgrid,
8 <  MPHexEditor, VTHeaderPopup, Menus, StrUtils, Clipbrd,
9 <  Data, TypeDefs, ConnectionManager, Buttons;
7 >  Dialogs, VirtualTrees, Grids, Wrapgrid, MPHexEditor,
8 >  StdCtrls, Menus, ExtCtrls, Buttons,
9 >  Data, TypeDefs, ConnectionManager,
10 >  _TemplateFileList, VTHeaderPopup, ComCtrls;
11  
12   type
13 <  TForm_BinEdit = class(TForm_ToolTemplate)
13 >  TForm_BinEdit = class(TForm_TemplateFileList)
14 >    panel_imexport: TPanel;
15 >    btn_export: TButton;
16 >    btn_import: TButton;
17      hex: TMPHexEditor;
18      Splitter2: TSplitter;
19      value_viewer: TWrapGrid;
14    VST: TVirtualStringTree;
20      Splitter3: TSplitter;
21 +    VST: TVirtualStringTree;
22 +    VTHPopup: TVTHeaderPopupMenu;
23      value_viewer_context: TPopupMenu;
24      value_viewer_context_copy: TMenuItem;
25      value_viewer_context_copyasdec: TMenuItem;
# Line 20 | Line 27 | type
27      value_viewer_context_copyasbitset: TMenuItem;
28      value_viewer_context_copyasstring: TMenuItem;
29      value_viewer_context_copyashex: TMenuItem;
23    VTHPopup: TVTHeaderPopupMenu;
24    procedure FormCreate(Sender: TObject);
30      procedure NewFile(fileinfo: TFileInfo);
31  
27    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
28    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
29
30    procedure hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
31    procedure hexSelectionChanged(Sender: TObject);
32    procedure hexChange(Sender: TObject);
33
34    procedure LoadDat(_fileid: Integer);
32      function Save: Boolean;
33      function GetValue(datatype: Word; offset: Integer): String;
34      procedure SetNewValue(datatype: Word; offset: Integer; Value: String);
35  
36      procedure WriteStructureInfos;
37      procedure ClearStructViewer;
41    procedure VSTDblClick(Sender: TObject);
42    procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
43      Column: TColumnIndex);
44    procedure VTHPopupColumnChange(const Sender: TBaseVirtualTree;
45      const Column: TColumnIndex; Visible: Boolean);
46    procedure VSTHeaderDragged(Sender: TVTHeader; Column: TColumnIndex;
47      OldPosition: Integer);
48    procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
49      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
38  
39      procedure ClearValues;
40      procedure WriteValues;
41 +
42 +    procedure FormCreate(Sender: TObject);
43 +    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
44 +    procedure hexChange(Sender: TObject);
45 +    procedure hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
46 +    procedure hexSelectionChanged(Sender: TObject);
47      procedure value_viewerDblClick(Sender: TObject);
48 <    procedure value_viewer_context_copyClick(Sender: TObject);
48 >    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
49 >    procedure value_viewer_contextPopup(Sender: TObject);
50      procedure value_viewerMouseDown(Sender: TObject; Button: TMouseButton;
51        Shift: TShiftState; X, Y: Integer);
52 <    procedure value_viewer_contextPopup(Sender: TObject);
52 >    procedure value_viewer_context_copyClick(Sender: TObject);
53 >    procedure VSTDblClick(Sender: TObject);
54 >    procedure VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
55 >      Column: TColumnIndex);
56 >    procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
57 >      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
58 >    procedure VSTHeaderDragged(Sender: TVTHeader; Column: TColumnIndex;
59 >      OldPosition: Integer);
60 >    procedure VTHPopupColumnChange(const Sender: TBaseVirtualTree;
61 >      const Column: TColumnIndex; Visible: Boolean);
62    private
63      fileid: Integer;
64      ConID: Integer;
65 +    rawlist: TRawDataList;
66    public
67    end;
68  
64 var
65  Form_BinEdit: TForm_BinEdit;
66
69   implementation
68
69 uses ValueEdit, Main, Functions, DatStructureLoader{, RawEdit};
70   {$R *.dfm}
71 + uses ValueEdit, Main, Functions, DatStructureLoader, RawEdit, RawList,
72 +  StrUtils, Clipbrd, _TemplateFile;
73 +
74  
75   type
76    PNodeData = ^TNodeData;
# Line 114 | Line 117 | begin
117    //
118   end;
119  
117 procedure TForm_BinEdit.NewFile(fileinfo: TFileInfo);
118 begin
119  LoadDat(fileinfo.ID);
120 end;
121
122
123
120  
121 < function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
126 <  ARecord: TNodeData): PVirtualNode;
127 < var
128 <  Data: PNodeData;
129 < begin
130 <  Result := AVST.AddChild(ANode);
131 <  Data   := AVST.GetNodeData(Result);
132 <  AVST.ValidateNode(Result, False);
133 <  Data^ := ARecord;
134 < end;
135 <
136 <
137 <
138 <
139 < procedure TForm_BinEdit.LoadDat(_fileid: Integer);
121 > procedure TForm_BinEdit.NewFile(fileinfo: TFileInfo);
122   var
123    mem:  TMemoryStream;
142  Data: TByteData;
124   begin
125    if ConID <> -1 then
126    begin
# Line 152 | Line 133 | begin
133        end;
134      end;
135    end;
136 <  if _fileid >= 0 then
136 >  if fileinfo.ID >= 0 then
137    begin
138 <    fileid := _fileid;
138 >    fileid := fileinfo.ID;
139      ConID := ConnectionID;
140 <    if ConManager.Connection[ConID].ExtractFileIDOfName(filelist.Items.Strings[filelist.ItemIndex]) <> fileid then
141 <      Self.SelectFileID(ConnectionID, fileid);
140 > //    if ConManager.Connection[ConID].ExtractFileIDOfName(filelist.Items.Strings[filelist.ItemIndex]) <> fileid then
141 > //      Self.SelectFileID(ConnectionID, fileid);
142      Self.ClearStructViewer;
162    mem := nil;
163    ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem));
164    hex.LoadFromStream(mem);
165    mem.Free;
143      ClearValues;
144 <    WriteStructureInfos;
144 >    mem := nil;
145 >    hex.DataSize := 0;
146 >    if fileinfo.Size > 0 then
147 >    begin
148 >      ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem));
149 >      rawlist := ConManager.Connection[ConID].GetRawList(fileid);
150 >      hex.LoadFromStream(mem);
151 >      mem.Free;
152 >      WriteStructureInfos;
153 >    end;
154    end
155    else
156    begin
157 <    fileid := _fileid;
157 >    fileid := -1;
158      ConID := -1;
159      Self.ClearStructViewer;
160      ClearValues;
161      hex.DataSize := 0;
162 +    SetLength(rawlist, 0);
163    end;
164   end;
165  
166  
167  
168 +
169 + function AddVSTEntry(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
170 +  ARecord: TNodeData): PVirtualNode;
171 + var
172 +  Data: PNodeData;
173 + begin
174 +  Result := AVST.AddChild(ANode);
175 +  Data   := AVST.GetNodeData(Result);
176 +  AVST.ValidateNode(Result, False);
177 +  Data^ := ARecord;
178 + end;
179 +
180 +
181 +
182 +
183 +
184   function TForm_BinEdit.GetValue(datatype: Word; offset: Integer): String;
185   var
186    Data: TByteData;
187 <  i:    Word;
187 >  i:    Integer;
188    floatformat: TFormatSettings;
189   begin
190    floatformat.DecimalSeparator := '.';
# Line 217 | Line 220 | begin
220      10:
221        Result := IntToBin(hex.Data[offset]);
222      11:
223 <      Result := '0x' + IntToHex(ConManager.Connection[ConID].GetRawInfo(fileid, offset).RawAddr, 8);
223 >    begin
224 >      if Length(rawlist) > 0 then
225 >      begin
226 >        for i := 0 to High(rawlist) do
227 >          if rawlist[i].SrcOffset = offset then
228 >          begin
229 >            if rawlist[i].RawAddr > 0 then
230 >              Result := '0x' + IntToHex(rawlist[i].RawAddr, 8)
231 >            else
232 >              Result := 'unused';
233 >            Break;
234 >          end;
235 >        if i > High(rawlist) then
236 >          Result := 'unused';
237 >      end;
238 >    end;
239      12:
240 <      Result := FormatNumber(hex.Data[offset + 1] + hex.Data[offset + 2] * 256 +
241 <        hex.Data[offset + 3] * 256 * 256, 5, '0');
240 >      if hex.Data[offset] = 1 then
241 >        Result := FormatNumber(hex.Data[offset + 1] + hex.Data[offset + 2] * 256 +
242 >          hex.Data[offset + 3] * 256 * 256, 5, '0')
243 >      else
244 >        Result := 'no link';
245      13:
246        Result := IntToStr(hex.Data[offset]);
247      14:
# Line 307 | Line 328 | begin
328              begin
329                if Pos('#', SubName) > 0 then
330                begin
331 <                Data.Offset  := HexToLong(MidStr(SubName, Pos('#', SubName) + 1, 8));
332 <                Data.Value   :=
331 >                Data.Offset  := StrToInt('$'+MidStr(SubName, Pos('#', SubName) + 1, 8));
332 >                Data.Value   := '$' +
333                    MidStr(SubName, PosEx('#', SubName, Pos('#', SubName) + 1) + 1, 8);
334                  Data.Caption := MidStr(SubName, 1, Pos('#', SubName) - 1);
335                  Data.Description := SubDesc;
# Line 458 | Line 479 | begin
479        str := '';
480        if hex.SelCount = 0 then
481        begin
482 <        while (hex.Data[hex.SelStart + j] > 0) and ((hex.SelStart + j) < hex.DataSize) do
482 >        while (hex.SelStart + j) < hex.DataSize do
483          begin
484 +          if hex.Data[hex.SelStart + j] = 0 then
485 +            Break;
486            if hex.Data[hex.selstart + j] >= 32 then
487              str := str + Char(hex.Data[hex.SelStart + j])
488            else
# Line 733 | Line 756 | procedure TForm_BinEdit.VSTDblClick(Send
756   var
757    node: PVirtualNode;
758    nodedata: PNodeData;
759 <  form: TForm_ToolTemplate;
759 >  rawinfo: TRawDataInfo;
760 >  form: TForm_TemplateFileList;
761   begin
762    if VST.FocusedColumn = 3 then
763    begin
# Line 748 | Line 772 | begin
772      end
773      else
774      begin
775 <      if nodedata.DataType = 11 then
775 >      if (nodedata.DataType = 11) and (nodedata.Value <> 'unused') then
776        begin
777 <        if ConManager.Connection[ConID].GetRawInfo(fileid, nodedata.offset).RawSize > 0 then
778 <          Form_Main.open_child('rawedit', ConID, fileid);
777 >        rawinfo := ConManager.Connection[ConID].GetRawInfo(fileid, nodedata.offset);
778 >        if rawinfo.RawSize > 0 then
779 >        begin
780 >          form := nil;
781 >          form := TForm_TemplateFileList(Form_Main.open_child('rawedit', ConID, fileid));
782 >          if Assigned(form) then
783 >            TForm_RawEdit(form).LoadRaw(rawinfo);
784 >        end;
785        end;
786 <      if nodedata.DataType = 12 then
786 >      if (nodedata.DataType = 12) and (nodedata.Value <> 'no link') then
787        begin
788          if (StrToInt(nodedata.Value) < ConManager.Connection[ConID].GetFileCount) and
789            (StrToInt(nodedata.Value) > 0) and
# Line 767 | Line 797 | begin
797        end;
798        if (nodedata.DataType >= 100) and (nodedata.DataType <= 300) then
799        begin
800 <        form := Form_Main.open_child('binedit', ConID, -1);
800 >        form := TForm_TemplateFileList(Form_Main.open_child('binedit', ConID));
801          if Assigned(form) then
802            form.SetFileFilters(nodedata.Value, '', False);
803        end;
# Line 793 | Line 823 | begin
823    else
824    begin
825      hex.SelStart := Data.Offset;
826 <    hex.SelEnd   := Data.Offset + HexToLong(Data.Value) - 1;
826 >    hex.SelEnd   := Data.Offset + StrToInt(Data.Value) - 1;
827    end;
828   end;
829  
# Line 824 | Line 854 | begin
854          if Data.DataType > 0 then
855            CellText := Data.Value //GetValue(data.DataType, data.Offset)
856          else if Length(Data.Value) > 0 then
857 <          CellText := IntToStr(HexToLong(Data.Value)) + ' Bytes';
857 >          CellText := IntToStr(StrToInt(Data.Value)) + ' Bytes';
858        4:
859          CellText := Data.Description;
860      end;
# Line 957 | Line 987 | end;
987  
988  
989  
960
990   procedure TForm_BinEdit.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
991   begin
992    if (Shift = [ssCtrl]) and (Key = 83) then

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)