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

Comparing:
oup/rewrite/Tools/RawEdit.pas (file contents), Revision 104 by alloc, Tue Feb 20 22:03:11 2007 UTC vs.
oup/current/Tools/RawEdit.pas (file contents), Revision 245 by alloc, Sat Aug 18 15:51:42 2007 UTC

# Line 1 | Line 1
1   unit RawEdit;
2 +
3   interface
4 +
5   uses
6    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 <  Dialogs, Template, StdCtrls, ExtCtrls, Menus, Grids, Wrapgrid,
8 <  MPHexEditor, Clipbrd, StrUtils, TypeDefs,
7 <  Data, Functions, DatStructureLoader, ConnectionManager, Buttons;
7 >  Dialogs, _TemplateFileList, Menus, StdCtrls, ExtCtrls, Buttons, ComCtrls,
8 >  TypeDefs, Grids, Wrapgrid, MPHexEditor, VirtualTrees;
9  
10   type
11 <  TForm_RawEdit = class(TForm_ToolTemplate)
11 <    Splitter4: TSplitter;
11 >  TForm_RawEdit = class(TForm_TemplateFileList)
12      panel_imexport: TPanel;
13      btn_export: TButton;
14      btn_import: TButton;
15      GroupBox1: TGroupBox;
16      list_offset: TListBox;
17 +    Splitter4: TSplitter;
18 +    opend: TOpenDialog;
19 +    saved: TSaveDialog;
20      hex: TMPHexEditor;
18    Splitter2: TSplitter;
21      value_viewer: TWrapGrid;
22 +    Splitter2: TSplitter;
23      value_viewer_context: TPopupMenu;
24      value_viewer_context_copy: TMenuItem;
25      value_viewer_context_copyasdec: TMenuItem;
# Line 24 | Line 27 | type
27      value_viewer_context_copyasbitset: TMenuItem;
28      value_viewer_context_copyasstring: TMenuItem;
29      value_viewer_context_copyashex: TMenuItem;
27    opend: TOpenDialog;
28    saved: TSaveDialog;
30      procedure list_offsetClick(Sender: TObject);
31      procedure NewFile(fileinfo: TFileInfo);
32      procedure LoadRaw(raw_info: TRawDataInfo);
# Line 38 | Line 39 | type
39      procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
40      procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
41  
42 <    function GetValue(datatype: Word; offset: LongWord): String;
42 >    function GetValue(datatype: Word; offset: Integer): String;
43      procedure ClearValues;
44      procedure WriteValues;
45 <    procedure SetNewValue(datatype: Word; offset: LongWord; Value: String);
45 >    procedure SetNewValue(datatype: Word; offset: Integer; Value: String);
46  
47      procedure value_viewerDblClick(Sender: TObject);
48      procedure value_viewer_context_copyClick(Sender: TObject);
# Line 53 | Line 54 | type
54      procedure hexSelectionChanged(Sender: TObject);
55      procedure hexChange(Sender: TObject);
56    private
57 <    ConID, fileid, datoffset: Integer;
57 >    fileid, datoffset: Integer;
58    public
59    end;
60  
60 var
61  Form_RawEdit: TForm_RawEdit;
61  
62   implementation
63   {$R *.dfm}
64 < uses Main, ValueEdit;
64 > uses
65 >  _TemplateFile, ValueEdit, ConnectionManager, StrUtils, Functions, RawList,
66 >  Data, Clipbrd;
67  
68   procedure TForm_RawEdit.NewFile(fileinfo: TFileInfo);
69   var
# Line 100 | Line 101 | end;
101  
102   procedure TForm_RawEdit.LoadRaw(raw_info: TRawDataInfo);
103   var
104 <  i:    LongWord;
104 <  mem: TMemoryStream;
104 >  i:    Integer;
105   begin
106    if hex.Modified then
107    begin
# Line 110 | Line 110 | begin
110        Exit;
111      end;
112    end;
113 <  if list_offset.Count = 0 then
113 >  for i := 0 to filelist.Count - 1 do
114    begin
115 <    for i := 0 to filelist.Count - 1 do
115 >    if ConManager.Connection[ConnectionID].ExtractFileIDOfName(filelist.Items.Strings[i]) = Raw_Info.SrcID then
116      begin
117 <      if ConManager.Connection[ConID].ExtractFileIDOfName(filelist.Items.Strings[i]) = RawInfo.SrcID then
118 <      begin
119 <        filelist.ItemIndex := i;
120 <        listClick(Self);
121 <        Break;
122 <      end;
117 >      filelist.ItemIndex := i;
118 >      listClick(Self);
119 >      Break;
120      end;
121 <    for i := 0 to list_offset.Count - 1 do
121 >  end;
122 >  for i := 0 to list_offset.Count - 1 do
123 >  begin
124 >    if MidStr(list_offset.Items.Strings[i], 3, 8) = IntToHex(raw_info.SrcOffset, 8) then
125      begin
126 <      if MidStr(list_offset.Items.Strings[i], 3, 8) = IntToHex(raw_info.SrcOffset, 8) then
127 <      begin
128 <        list_offset.ItemIndex := i;
129 <        Break;
130 <      end;
126 >      list_offset.ItemIndex := i;
127 >      list_offsetClick(Self);
128 >      Break;
129      end;
130    end;
133  mem := nil;
134  ConManager.Connection[ConID].LoadRawFile(raw_info.SrcID, raw_info.SrcOffset, mem);
135  hex.LoadFromStream(mem);
136  ClearValues;
137  hexSelectionChanged(Self);
131   end;
132  
133  
# Line 143 | Line 136 | end;
136  
137  
138   procedure TForm_RawEdit.list_offsetClick(Sender: TObject);
139 + var
140 +  mem: TMemoryStream;
141 +  rawinfo: TRawDataInfo;
142   begin
143 <  ClearValues;
148 <  dat_offset := StrToInt('$' + MidStr(
143 >  datoffset := StrToInt('$' + MidStr(
144      list_offset.Items.Strings[list_offset.ItemIndex], 3, 8));
150  LoadRaw(Connection.GetRawInfo(fileid, dat_offset));
151 end;
145  
146 +  rawinfo := ConManager.Connection[ConnectionID].GetRawInfo(fileid, datoffset);
147  
148 <
155 <
156 < function IntToBin(Value: Byte): String;
157 < var
158 <  i: Byte;
159 < begin
160 <  Result := '';
161 <  for i := 7 downto 0 do
148 >  if rawinfo.RawSize > 0 then
149    begin
150 <    Result := Result + IntToStr((Value shr i) and $01);
150 >    mem := nil;
151 >    ConManager.Connection[ConnectionID].LoadRawFile(rawinfo.SrcID, rawinfo.SrcOffset, TStream(mem));
152 >    hex.LoadFromStream(mem);
153 >    ClearValues;
154 >    hexSelectionChanged(Self);
155 >  end
156 >  else
157 >  begin
158 >    hex.DataSize := 0;
159 >    ClearValues;
160    end;
161   end;
162  
163  
164  
165  
166 < function TForm_RawEdit.GetValue(datatype: Word; offset: LongWord): String;
166 > function TForm_RawEdit.GetValue(datatype: Word; offset: Integer): String;
167   var
168 <  Data: Tdata;
168 >  Data: TByteData;
169    i:    Word;
170    floatformat: TFormatSettings;
171   begin
# Line 230 | Line 226 | var
226    i: Byte;
227   begin
228    for i := 1 to value_viewer.RowCount - 1 do
233  begin
229      value_viewer.Cells[1, i] := '';
235  end;
230   end;
231  
232  
# Line 241 | Line 235 | end;
235   procedure TForm_RawEdit.WriteValues;
236   var
237    i, j:  Integer;
238 <  Data:  Tdata;
238 >  Data:  TByteData;
239    str:   String;
240 <  Value: LongWord;
240 >  Value: Integer;
241    floatformat: TFormatSettings;
242   begin
243    floatformat.DecimalSeparator := '.';
# Line 326 | Line 320 | begin
320        str := '';
321        if hex.SelCount = 0 then
322        begin
323 <        while (hex.Data[hex.SelStart + j] > 0) and ((hex.SelStart + j) < hex.DataSize) do
323 >        while (hex.SelStart + j) < hex.DataSize do
324          begin
325 +          if hex.Data[hex.SelStart + j] = 0 then
326 +            Break;
327            if hex.Data[hex.selstart + j] >= 32 then
328              str := str + Char(hex.Data[hex.SelStart + j])
329            else
# Line 355 | Line 351 | end;
351  
352   procedure TForm_RawEdit.FormCreate(Sender: TObject);
353   var
354 <  i:     LongWord;
354 >  i:     Integer;
355    exts: String;
356   begin
357    inherited;
358    Self.OnNewFileSelected := Self.NewFile;
359  
360    exts := '';
361 <  if Length(RawListHandlers) > 0 then
361 >  if Length(RawLists.RawListHandlers) > 0 then
362    begin
363 <    for i := 0 to High(RawListHandlers) do
363 >    for i := 0 to High(RawLists.RawListHandlers) do
364        if Length(exts) > 0 then
365 <        exts := exts + ',' + RawListHandlers[i].Ext
365 >        exts := exts + ',' + RawLists.RawListHandlers[i].Ext
366        else
367 <        exts := RawListHandlers[i].Ext;
367 >        exts := RawLists.RawListHandlers[i].Ext;
368    end;
369    Self.AllowedExts := exts;
370  
# Line 403 | Line 399 | end;
399   function TForm_RawEdit.Save: Boolean;
400   var
401    mem:  TMemoryStream;
402 <  Data: Tdata;
407 <  i:    LongWord;
402 >  i:    Integer;
403   begin
404    case MessageBox(Self.Handle, PChar('Save changes to .raw-part of file ' +
405 <      Connection.GetFileInfo(fileid).FileName + '?'), PChar('Data changed...'),
405 >      ConManager.Connection[ConnectionID].GetFileInfo(fileid).Name + '?'), PChar('Data changed...'),
406        MB_YESNOCANCEL) of
407      idYes:
408      begin
409        mem := TMemoryStream.Create;
410        hex.SaveToStream(mem);
411        mem.Seek(0, soFromBeginning);
412 <      SetLength(Data, mem.Size);
418 <      mem.Read(Data[0], mem.Size);
412 >      ConManager.Connection[ConnectionID].UpdateRawFile(fileid, datoffset, mem);
413        mem.Free;
420      Connection.UpdateRawFile(fileid_opened, dat_offset_opened,
421        Length(Data), @Data[0]);
414        hex.Modified := False;
415        for i := 0 to hex.Datasize - 1 do
416          hex.ByteChanged[i] := False;
# Line 427 | Line 419 | begin
419      idNo:
420        Result := True;
421      idCancel:
430    begin
422        Result := False;
432    end;
423    end;
424   end;
425  
# Line 439 | Line 429 | end;
429   procedure TForm_RawEdit.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
430   begin
431    if hex.Modified then
442  begin
432      if not Save then
433        CanClose := False;
445  end;
434   end;
435  
436  
# Line 528 | Line 516 | procedure TForm_RawEdit.btn_exportClick(
516   var
517    fs: TFileStream;
518   begin
519 <  saved.Filter     := 'Files of matching extension (*.' + Connection.GetFileInfo(
520 <    fileid).Extension + ')|*.' + Connection.GetFileInfo(fileid).Extension +
519 >  saved.Filter     := 'Files of matching extension (*.' +
520 >    ConManager.Connection[ConnectionID].GetFileInfo(fileid).Extension + ')|*.' +
521 >    ConManager.Connection[ConnectionID].GetFileInfo(fileid).Extension +
522      '|All files|*.*';
523 <  saved.DefaultExt := Connection.GetFileInfo(fileid).Extension;
523 >  saved.DefaultExt := ConManager.Connection[ConnectionID].GetFileInfo(fileid).Extension;
524    if saved.Execute then
525    begin
526      fs := TFileStream.Create(saved.FileName, fmCreate);
# Line 547 | Line 536 | procedure TForm_RawEdit.btn_importClick(
536   var
537   //  Data: Tdata;
538    fs:   TFileStream;
539 +  i: Integer;
540 +  rawinfo: TRawDataInfo;
541   begin
542 <  opend.Filter := 'Files of matching extension (*.' + Connection.GetFileInfo(
543 <    fileid).Extension + ')|*.' + Connection.GetFileInfo(fileid).Extension +
542 >  opend.Filter := 'Files of matching extension (*.' +
543 >    ConManager.Connection[ConnectionID].GetFileInfo(fileid).Extension + ')|*.' +
544 >    ConManager.Connection[ConnectionID].GetFileInfo(fileid).Extension +
545      '|All files|*.*';
546    if opend.Execute then
547    begin
548      fs := TFileStream.Create(opend.FileName, fmOpenRead);
549      if fs.Size <> hex.DataSize then
550      begin
551 <      ShowMessage('Can''t import ' + ExtractFilename(opend.FileName) +
552 <        ', file has to have same size as file in .dat.' + CrLf +
553 <        'Size of file in .dat: ' + FormatFileSize(hex.datasize) + CrLf +
554 <        'Size of chosen file: ' + FormatFileSize(fs.Size));
555 <    end
556 <    else
557 <    begin
558 <      hex.LoadFromStream(fs);
559 <      hex.Modified := True;
560 <    end;
551 >      if
552 >        (not (CR_ResizeRaw in ConManager.Connection[ConnectionID].ChangeRights))
553 >        and (not (CR_AppendRaw in ConManager.Connection[ConnectionID].ChangeRights))
554 >        then
555 >      begin
556 >        ShowMessage('Can''t import ' + ExtractFilename(importd.FileName) +
557 >            ', file has to have same size as file in .raw with this backend.' + CrLf +
558 >            'Size of file in .raw: ' + FormatFileSize(hex.DataSize) + CrLf +
559 >            'Size of chosen file: ' + FormatFileSize(fs.Size));
560 >        Exit;
561 >      end else begin
562 >        if MessageBox(Self.Handle,
563 >              PChar('File has different size from the file in the .raw.' + CrLf +
564 >                    'Size of file in .dat: ' + FormatFileSize(hex.DataSize) + CrLf +
565 >                    'Size of chosen file: ' + FormatFileSize(fs.Size) + CrLf +
566 >                    'Replace anyway?' + CrLf +
567 >                    'WARNING: This only replaces the raw-data. It doesn''t' + CrLf +
568 >                    'do the according changes in the .dat. Oni probably' + CrLf +
569 >                    'won''t be able to use the data correctly!'), PChar('Different size'), MB_YESNO + MB_ICONWARNING) = ID_NO then
570 >        begin
571 >          Exit;
572 >        end;
573 >      end;
574 >      rawinfo := ConManager.Connection[ConnectionID].GetRawInfo(fileid, datoffset);
575 >      if CR_ResizeRaw in ConManager.Connection[ConnectionID].ChangeRights then
576 >        ConManager.Connection[ConnectionID].UpdateRawFile(fileid, datoffset, fs)
577 >      else if CR_AppendRaw in ConManager.Connection[ConnectionID].ChangeRights then
578 >        i := ConManager.Connection[ConnectionID].AppendRawFile(rawinfo.LocSep, fs);
579 >        ConManager.Connection[ConnectionID].UpdateDatFilePart(fileid, datoffset, 4, @i);
580 >    end else begin
581 >      ConManager.Connection[ConnectionID].UpdateRawFile(fileid, datoffset, fs);
582 >    end;
583 >    fs.Seek(0, soFromBeginning);
584 >    hex.LoadFromStream(fs);
585 >    hex.Modified := False;
586 >    for i := 0 to hex.Datasize - 1 do
587 >      hex.ByteChanged[i] := False;
588      fs.Free;
589    end;
590   end;
# Line 629 | Line 648 | procedure TForm_RawEdit.value_viewer_con
648   var
649   //  i:     Byte;
650    Name:  String;
651 <  Value: LongWord;
651 >  Value: Integer;
652   begin
653    Name := TMenuItem(Sender).Name;
654    if Pos('asstring', Name) > 0 then
# Line 688 | Line 707 | end;
707  
708  
709  
710 < procedure TForm_RawEdit.SetNewValue(datatype: Word; offset: LongWord; Value: String);
710 > procedure TForm_RawEdit.SetNewValue(datatype: Word; offset: Integer; Value: String);
711   var
712 <  Data: Tdata;
712 >  Data: TByteData;
713    value_int: LongWord;
714    value_float: Single;
715    i: Word;
# Line 755 | Line 774 | end;
774  
775   procedure TForm_RawEdit.value_viewerDblClick(Sender: TObject);
776   var
777 <  offset:     LongWord;
777 >  offset:     Integer;
778    datatype:   Word;
779    objectname: String;
780    Value:      String;
# Line 801 | Line 820 | end;
820  
821   begin
822    AddToolListEntry('rawedit', 'Binary .raw-Editor', '');
823 < end.
823 > end.
824 >
825 >

Diff Legend

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