viewwnd.pas

来自「delphi代码格式化,最新汉化版」· PAS 代码 · 共 887 行 · 第 1/2 页

PAS
887
字号
{|----------------------------------------------------------------------
 | Unit:        ViewWnd
 |
 | Author:      Egbert van Nes
 |
 | Description: Edit form for DelFor
 |
 | Copyright (c) 2000  Egbert van Nes
 |   All rights reserved
 |   Disclaimer and licence notes: see license.txt
 |
 |----------------------------------------------------------------------
}
unit ViewWnd;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, mwCustomEdit, mwHighlighter, mwPasSyn, Menus;

type
  TViewForm = class(TForm)
    FindDialog1: TFindDialog;
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Memo1: TmwCustomEdit;
    PopupMenu1: TPopupMenu;
    ClosepageItem: TMenuItem;
    Openneweditwindow1: TMenuItem;
    N1: TMenuItem;
    Formatpage1: TMenuItem;
    mwPasSyn1: TmwPasSyn;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Memo1Change(Sender: TObject);
    procedure Memo1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure TabSheet1Show(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure ClosepageItemClick(Sender: TObject);
    procedure Openneweditwindow1Click(Sender: TObject);
    procedure Formatpage1Click(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure Memo1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    TheList: TList;
    procedure UpdateStatusBar;
    procedure FormatterProgress(Sender: TObject; Progress: Integer);
    procedure FormatPascal(TabNo: Integer);
    function GlobalFindFile(var Item: TObject; NotIndex: Integer;
      FileName: PChar): Boolean;
    procedure MemoReset;
    function GelSelLength: Integer;
    function GetSelStart: Integer;
    procedure SetSelLength(const Value: Integer);
    procedure SetSelStart(const Value: Integer);
    { Private declarations }
  public
    destructor Destroy; override;
    function FindFile(var Item: TObject; NotIndex: Integer;
      FileName: PChar): Boolean;
    procedure LoadFile(AFileName: string);
    function CurrentFileContent: TObject;
    procedure FormatAll;
    procedure FormatFormatted;
    procedure SetCurrentFileName(FileName: string);
    procedure FormatCurrent;
    function SaveCurrent: Boolean;
    function CurrentFormatted: Boolean;
    function AllFormatted: Boolean;
    procedure FormatToFile(FromFile, ToFile: string);
    procedure SaveTo(AFileName: string);
    property SelStart: Integer read GetSelStart write SetSelStart;
    property SelLength: Integer read GelSelLength write SetSelLength;
    { Public declarations }
  end;

var
  ViewForm: TViewForm;

implementation
uses Delfor1, Progr, Main;

{$R *.DFM}
const
  MaxMemoSize = 65535 - 2500;
type
  TFileContent = class
  private
    FList: TStringList;
    FFileName: PChar;
    FModified: Boolean;
    FFormatted: Boolean;
    FTopLine: Integer;
    FCaretX: Integer;
    FCaretY: Integer;
    FBlockStart: TPoint;
    FBlockEnd: TPoint;
    procedure SetFileName(const Value: PChar);
    procedure SetText(const Value: PChar);
    function GetText: PChar;
  public
    constructor Create(AFileName: string);
    destructor Destroy; override;
    procedure Format;
    procedure SaveFile;
    procedure SaveMemoSettings(AMemo: TmwCustomEdit);
    procedure SetMemoSettings(AMemo: TmwCustomEdit);
    property FileName: PChar read FFileName write SetFileName;
    property Text: PChar read GetText write SetText;
    property Modified: Boolean read FModified write FModified;
    property Formatted: Boolean read FFormatted write FFormatted;
    property List: TStringList read FList write FList;
  end;

procedure TViewForm.UpdateStatusBar;
begin
  if Memo1.Modified then
    StatusBar1.Panels[1].Text := 'Modified'
  else if CurrentFormatted then
    StatusBar1.Panels[1].Text := 'Formatted'
  else
    StatusBar1.Panels[1].Text := '';
  StatusBar1.Panels[0].Text := Format('%5d :%5d', [Memo1.CaretY, Memo1.CaretX]);
  if Memo1.InsertMode then
    StatusBar1.Panels[2].Text := 'Insert'
  else
    StatusBar1.Panels[2].Text := 'Overwrite';
end;

function TViewForm.CurrentFormatted: Boolean;
begin
  Result := (TheList <> nil) and TFileContent(CurrentFileContent).Formatted;
end;

procedure TViewForm.LoadFile(AFileName: string);
var
  ATab: TTabSheet;
  Name: string;
  P: PChar;
  FileContent: TFileContent;
  Item: TObject;
  NewList: Boolean;
  FileInList: Boolean;
begin
  if FileExists(AFileName) then
  begin
    NewList := False;
    Name := ExtractFileName(AFileName);
    AFileName := ExpandFileName(AFileName);
    P := StrScan(PChar(Name), '.');
    P^ := #0;
    if TheList <> nil then
    begin
      ATab := TTabSheet.Create(PageControl1);
      ATab.Parent := PageControl1;
      ATab.PageControl := PageControl1;
      ATab.OnShow := TabSheet1Show;
      ATab.Caption := Name;
    end
    else
    begin
      NewList := True;
      TabSheet1.Caption := Name;
      TheList := TList.Create;
    end;
    FileInList := False;
    FileContent := nil;
    if GlobalFindFile(Item, -1, PChar(AFileName)) then
    begin
      FileInList := True;
      FileContent := TFileContent(Item);
    end;
    if not FileInList then
      FileContent := TFileContent.Create(AFileName);
    if FileContent.Text <> nil then
      TheList.Add(FileContent);
    if NewList then TabSheet1Show(TabSheet1);
  end;
  (*
  Formatted := False;
  LargeFile := True;
  Memo1.Lines.Clear;
  if not FileExists(aFileName) then
    Caption := ''
  else
  begin
    Caption := aFileName;
    Memo1.Lines.BeginUpdate;
    try
      MemoryStream := TMemoryStream.Create;
      try
        MemoryStream.LoadFromFile(aFileName);
        SetString(S, PChar(MemoryStream.memory), MemoryStream.Size);
      finally
        MemoryStream.Free;
      end;
      AdjustLineBreaks(S);
      if Strlen(PChar(S)) > MaxMemoSize then
      begin
        LargeFile := True;
        (PChar(S) + MaxMemoSize)^ := #0;
        Memo1.Lines.Text := S;
        Memo1.Lines.Add('{***  FILE TOO LARGE, CAN ONLY VIEW PART OF THIS FILE  ***}');
        Memo1.Lines.Add('{***  BUT STILL POSSIBLE TO FORMAT AND SAVE            ***}');
      end
      else
      begin
        LargeFile := False;
        Memo1.Lines.Text := S;
      end;
    except
      on EInvalidOperation do
      begin
        LargeFile := True;
        Memo1.Lines.Clear;
        Memo1.Lines.Add('{***  FILE TOO LARGE, CAN ONLY VIEW PART OF THIS FILE  ***}');
        Memo1.Lines.Add('{***  BUT STILL POSSIBLE TO FORMAT AND SAVE            ***');
        Memo1.ReadOnly := True;
        AssignFile(InFile, aFileName);
        try
          Reset(InFile);
          while not Eof(InFile) do
          begin
            ReadLn(InFile, S);
            Memo1.Lines.Add(S);
          end;
        finally
          CloseFile(InFile);
        end;
      end;
    end;
    Memo1.Modified := False;
    UpdateStatusBar;
    List:=TList.Create;
    List.Add(Memo1.Lines);
    Memo1.Lines.EndUpdate;
  end;
  end;*)
end;

function StrInsert(Str1, Str2: PChar; I: Integer): PChar;
var
  LenStr2: Integer;
begin
  if I < 0 then I := 0;
  LenStr2 := StrLen(Str2);
  StrMove(Str1 + I + LenStr2, Str1 + I, Integer(StrLen(Str1)) - I + 1);
  StrMove(Str1 + I, Str2, LenStr2);
  StrInsert := Str1;
end;

function MakeBakFile(Dest, FileName: PChar): PChar;
var
  F: file;
  P: PChar;
begin
  if FileExists(FileName) then
  begin
    MakeBakFile := StrCopy(Dest, FileName);
    P := StrRScan(Dest, '.');
    if P = nil then
      StrCat(Dest, '.~')
    else
    begin
      (StrEnd(P) - 1)^ := #0;
      StrInsert(P + 1, '~', 0);
    end;
    if FileExists(Dest) then
    begin
      AssignFile(F, Dest);
      Erase(F);
    end;
    AssignFile(F, FileName);
    try
      Rename(F, Dest);
    except
      on EInOutError do ;
    end;
  end
  else MakeBakFile := StrCopy(Dest, '');
end;

procedure TViewForm.SaveTo(AFileName: string);
var
  BakFile: array[0..255] of Char;
  FromFile: string;
begin
  Screen.Cursor := crHourGlass;
  try
    if CurrentFormatted or  Memo1.Modified then
    begin
      FromFile := Caption;
      if AFileName = '' then
        AFileName := Caption
      else
        Caption := AFileName;
      MakeBakFile(BakFile, PChar(AFileName));
      if (FromFile = Caption) and (StrComp(BakFile, '') <> 0) then
        FromFile := string(BakFile);
      Memo1.Lines.SaveToFile(AFileName);
      Memo1.Modified := False;
      TFileContent(CurrentFileContent).Modified:=False;
    end;
  finally
    Screen.Cursor := crDefault;
  end;
  UpdateStatusBar;
end;

procedure TViewForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ModifiedFile: TFileContent;
  I, Istart: Integer;
  function Modified(var Istart: Integer): Boolean;
  var
    I: Integer;
  begin
    ModifiedFile := nil;
    Result := False;
    with TheList do
    begin
      for I := Istart to Count - 1 do
        if TFileContent(Items[I]).Modified then
        begin
          Result := True;
          Istart := I + 1;
          ModifiedFile := TFileContent(Items[I]);
          Exit;
        end;
      Istart := Count;
    end;
  end;
begin
  Istart := 0;
  if (Memo1 <> nil) and Memo1.Modified then
  begin
    Memo1.Modified := False;
    ModifiedFile := TFileContent(CurrentFileContent);
    if (TheList <> nil) then
      ModifiedFile.Text := PChar(Memo1.Lines.Text);
  end;
  while Modified(Istart) do
  begin
    case (MessageDlg('Do you want to save changes in ' +
      string(ModifiedFile.FileName),
      mtConfirmation, [mbYes, mbNo, mbCancel, mbYesToAll,mbNoToAll], 0)) of
      mrYes: ModifiedFile.SaveFile;
      mrNo: ModifiedFile.Modified := False;
      mrNoToAll:
          with TheList do
          begin
            for I := 0 to Count - 1 do
              TFileContent(Items[I]).Modified:=False;
          end;
      mrYesToAll:
          with TheList do
          begin
            for I := 0 to Count - 1 do
              TFileContent(Items[I]).SaveFile;
          end;
      mrCancel:
        begin
          Action := caNone;
          ModalResult:=mrCancel;
          Exit;
        end;
    end;
  end;
  Action := caFree;
  ModalResult:=mrOK;
end;

procedure TViewForm.FormatToFile(FromFile, ToFile: string);
begin
  with MainForm.Formatter do
  begin
    Clear;
    OnProgress := nil;
    LoadFromFile(PChar(FromFile));
    if Parse then
      WriteToFile(PChar(ToFile));
  end;
  {Formatted := True;}
  UpdateStatusBar;
end;

{procedure TViewForm.FormatPascal;
var
  buff: array[0..400] of char;
  i, k: integer;
  CurLine: integer;
  oldLargeFile:boolean;
begin
  if (not Formatted) and (ProgressDlg <> nil)
     and (ProgressDlg.Visible) then
    with MainForm do
    begin
      OldLargeFile:=LargeFile;
      largeFile:=True;
      Formatter.Clear;
      ProgressDlg.FileLabel.Caption := self.Caption;
      Application.processMessages;
      with memo1.Lines do
        for i := 0 to count - 1 do
        begin
          Formatter.add(strPCopy(buff, memo1.Lines[i]));
          ProgressDlg.ProgressBar1.Position := i * 100 div count div 3;
        end;
      Formatter.Parse;
      ProgressDlg.ProgressBar1.Position := 66;
      Memo1.Lines.BeginUpdate;
      CurLine := SendMessage(Memo1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
      Memo1.Clear;
      Memo1.Lines.Clear;
      i := 0;
      k := 0;
      with Formatter do
        while i < count do
        begin
          GetString(buff, i);
          inc(k);
          Memo1.Lines.add(buff);
          if (i mod 50 = 0) then
            ProgressDlg.ProgressBar1.Position := 66 + i * 100 div count div 3;
        end;
      if k <> Memo1.Lines.Count then
        Memo1.ReadOnly := True
      else
        LargeFile:=OldLargeFile;
      k := memo1.Lines.count - 1;
      while (Memo1.lines[k] = '') do
      begin
        Memo1.Lines.delete(k);
        dec(k);
      end;
      SendMessage(memo1.handle, EM_LINESCROLL, 0, curLine);
      memo1.Modified:=False;
      Memo1.Lines.EndUpdate;
      Formatted := True;
    end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?