main.pas

来自「著名的Handle」· PAS 代码 · 共 742 行 · 第 1/2 页

PAS
742
字号
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdActns, ActnList, ImgList, Menus, ToolWin, ComCtrls, ExtCtrls,
  wmPHPSyn, wmMultiSyn, mwDmlSyn, nhAsmSyn, dmBatSyn, dmDfmSyn,
  mwHtmlExport, mwExport, mwRtfExport, mkGalaxySyn, odPythonBehaviour,
  odPySyn, lbVBSSyn, hkAWKSyn, hkHTMLSyn, siTCLTKSyn, wmSQLSyn, cwCACSyn,
  DcjJavaSyn, cbHPSyn, mwGeneralSyn, DcjPerlSyn, DcjCppSyn, mwHighlighter,
  mwPasSyn, mwCustomEdit, StdCtrls;

type
  TMyMwCustomEdit = class(TmwCustomEdit)
  public
    Filename : string;
  end;

  TMainForm = class(TForm)
    MainMenu: TMainMenu;
    ControlBar1: TControlBar;
    tbMenu: TToolBar;
    File1: TMenuItem;
    Exit1: TMenuItem;
    N1: TMenuItem;
    PrintSetup1: TMenuItem;
    Print1: TMenuItem;
    N2: TMenuItem;
    SaveAs1: TMenuItem;
    Save1: TMenuItem;
    N3: TMenuItem;
    Close1: TMenuItem;
    Open1: TMenuItem;
    New1: TMenuItem;
    Edit1: TMenuItem;
    GoTo1: TMenuItem;
    Replace1: TMenuItem;
    Find1: TMenuItem;
    Paste1: TMenuItem;
    Copy1: TMenuItem;
    Cut1: TMenuItem;
    N6: TMenuItem;
    Repeatcommand1: TMenuItem;
    Undo1: TMenuItem;
    ActionList: TActionList;
    ImageList: TImageList;
    EditCopy1: TEditCopy;
    EditCut1: TEditCut;
    EditPaste1: TEditPaste;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    tbMain: TToolBar;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    ToolButton10: TToolButton;
    FileNew: TAction;
    FileOpen: TAction;
    FileSave: TAction;
    FileSaveAs: TAction;
    PageControl: TPageControl;
    StatusBar: TStatusBar;
    View1: TMenuItem;
    Toolbar1: TMenuItem;
    Statusbar2: TMenuItem;
    ToolButton11: TToolButton;
    mwPasSyn1: TmwPasSyn;
    DcjCppSyn1: TDcjCppSyn;
    DcjPerlSyn1: TDcjPerlSyn;
    mwGeneralSyn1: TmwGeneralSyn;
    cbHPSyn1: TcbHPSyn;
    DcjJavaSyn1: TDcjJavaSyn;
    cwCACSyn1: TcwCACSyn;
    wmSQLSyn1: TwmSQLSyn;
    siTCLTKSyn1: TsiTCLTKSyn;
    hkHTMLSyn1: ThkHTMLSyn;
    hkAWKSyn1: ThkAWKSyn;
    lbVbsSyn1: TlbVbsSyn;
    odPySyn1: TodPySyn;
    odPythonBehaviour1: TodPythonBehaviour;
    mkGalaxySyn1: TmkGalaxySyn;
    mwRtfExport1: TmwRtfExport;
    mwHtmlExport1: TmwHtmlExport;
    dmDfmSyn1: TdmDfmSyn;
    dmBatSyn1: TdmBatSyn;
    nhAsmSyn1: TnhAsmSyn;
    mwDmlSyn1: TmwDmlSyn;
    wmPHPSyn1: TwmPHPSyn;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    Toolbars1: TMenuItem;
    EnvironmentOptions1: TMenuItem;
    FileClose: TAction;
    EditorPopup: TPopupMenu;
    Cut2: TMenuItem;
    Copy2: TMenuItem;
    Paste2: TMenuItem;
    Close2: TMenuItem;
    N7: TMenuItem;
    EditSelectAll: TAction;
    SelectAll1: TMenuItem;
    N8: TMenuItem;
    tbHighlighter: TToolBar;
    cbxHighlighter: TComboBox;
    ToolButton12: TToolButton;
    ToolButton13: TToolButton;
    ToolButton14: TToolButton;
    ToolButton15: TToolButton;
    EditUndo: TAction;
    EditRedo: TAction;
    EditFind: TAction;
    SelectAll2: TMenuItem;
    EditSearchAgain: TAction;
    SearchAgain1: TMenuItem;
    PrinterSetupDialog: TPrinterSetupDialog;
    wmMultiSyn1: TwmMultiSyn;
    procedure FormShow(Sender: TObject);
    procedure FileNewExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FileOpenExecute(Sender: TObject);
    procedure mwCustomEdit1StatusChange(Sender: TObject;
      Changes: TmwStatusChanges);
    procedure FileSaveExecute(Sender: TObject);
    procedure FileSaveAsExecute(Sender: TObject);
    procedure EditCopy1Execute(Sender: TObject);
    procedure EditCopy1Update(Sender: TObject);
    procedure EditCut1Execute(Sender: TObject);
    procedure EditCut1Update(Sender: TObject);
    procedure EditPaste1Execute(Sender: TObject);
    procedure EditPaste1Update(Sender: TObject);
    procedure EnvironmentOptions1Click(Sender: TObject);
    procedure FileCloseExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure PageControlChange(Sender: TObject);
    procedure cbxHighlighterChange(Sender: TObject);
    procedure mwCustomEdit1DropFiles(Sender: TObject; X, Y: Integer;
      Files: TStrings);
    procedure EditSelectAllExecute(Sender: TObject);
    procedure EditUndoUpdate(Sender: TObject);
    procedure EditRedoUpdate(Sender: TObject);
    procedure EditUndoExecute(Sender: TObject);
    procedure EditRedoExecute(Sender: TObject);
    procedure EditFindExecute(Sender: TObject);
    procedure EditFindUpdate(Sender: TObject);
    procedure EditSearchAgainUpdate(Sender: TObject);
    procedure EditSearchAgainExecute(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure PrintSetup1Click(Sender: TObject);
  private
    SearchOptions: TmwSearchOptions;
    function GetEditor(Index: integer): TMyMwCustomEdit;
    function GetEditorCount : integer;
    { Private declarations }
  public
    procedure OpenFile( aFileName : string );
    procedure EnumerateHighlighters;
    function CurrentEdit : TMyMwCustomEdit;

    procedure StoreSettings;
    procedure LoadSettings;
    property Editor[Index:integer] : TMyMwCustomEdit read GetEditor;
    property EditorCount : integer read GetEditorCount;
  end;

var
  MainForm: TMainForm;

implementation

uses env_opt, inifiles, find;

{$R *.DFM}

procedure TMainForm.FormShow(Sender: TObject);
begin
  LoadSettings;
  FileNew.Execute;
end;

procedure TMainForm.OpenFile(aFileName: string);
var
  Page : TTabSheet;
  Edit : TMyMwCustomEdit;

  procedure LoadFile(const FileName: string);
  (* This bit is stolen from EditU2.pas *)
    function MatchesExtension(ext: string; light: TmwCustomHighlighter): boolean;
      var
      fext  : string;
//      idx   : integer;
      ucext : string;
      filter: string;
      p     : integer;
    begin
      Result := false;
      ucext := UpperCase(ext);
      p := Pos('.',ucext);
      if p > 0 then ucext := Copy(ucext,p+1,Length(ucext)-p);
      p := Pos('|',light.DefaultFilter);
      if p > 0 then begin
        filter := Copy(light.DefaultFilter,p+1,Length(light.DefaultFilter)-p);
        while filter <> '' do begin
          p := Pos(';',filter);
          if p = 0 then p := Length(filter)+1;
          fext := Copy(filter,1,p-1);
          filter := Copy(filter,p+1,Length(filter)-p);
          p := Pos('.',fext);
          if p > 0 then fext := Copy(fext,p+1,Length(fext)-p);
          if UpperCase(fext) = ucext then begin
(*
            idx := cbxHighlighterSelect.Items.IndexOf(light.LanguageName);
            if idx >= 0 then cbxHighlighterSelect.ItemIndex := idx;
            cbxHighlighterSelectChange(Self);
*)
            Edit.Highlighter := light;
            Result := true;
          end;
        end; //while
      end
    end; { MatchesExtension }

  var
    i  : integer;
    ext: string;
    bWasText: boolean;                                                            //mh 1999-10-04
    backCursor: TCursor;
  begin
    backCursor := Cursor;
    try
      Cursor := crHourGlass;
      Windows.SetCursor(Screen.Cursors[crHourGlass]);
      ext := UpperCase(ExtractFileExt(aFileName));
      for i := 0 to ComponentCount-1 do
        if Components[i] is TmwCustomHighLighter then begin
          if MatchesExtension(ext,Components[i] as TmwCustomHighlighter) then break;
        end;
      if Edit.HighLighter = dmDfmSyn1 then
        LoadDFMFile2Strings(aFileName, Edit.Lines, bWasText)                        //mh 1999-10-04
      else
        Edit.Lines.LoadFromFile(aFileName);
    finally
      Cursor := backCursor;
    end;
  end;

begin
  Page := TTabSheet.Create(self);
  try
    Page.PageControl := PageControl;
    Edit := TMyMwCustomEdit.Create(Page);
    Edit.Parent := Page;
    Edit.Align  := alClient;
    if (aFileName<>'') then begin
      Page.Caption := ExtractFileName(aFileName);
      Edit.FileName := aFileName;
      LoadFile( aFileName );
    end
    else
      Page.Caption := 'Untitled';
    PageControl.ActivePage := Page;
    Edit.Modified := false;
    Edit.ClearUndo;
    Edit.Options := Edit.Options - [mweoShowScrollHint];
    frmEnvOpts.AssignOptions(Edit);

    Edit.OnStatusChange := mwCustomEdit1StatusChange;
    Edit.OnDropFiles    := mwCustomEdit1DropFiles;
    Edit.PopupMenu      := EditorPopup;
    mwCustomEdit1StatusChange( Edit, [] );

    Edit.SetFocus;
    PageControlChange(self);
  except
    on exception do
      Page.Free;
  end;
end;

procedure TMainForm.FileNewExecute(Sender: TObject);
begin
  OpenFile('');
end;

procedure TMainForm.EnumerateHighlighters;
var
  i: integer;
  f, s: string;
begin
  OpenDialog.Filter := '';
  s := '';
  cbxHighlighter.Items.Clear;
  cbxHighlighter.Items.Add( 'None' );
  for i := 0 to ComponentCount-1 do
    if Components[i] is TmwCustomHighLighter then begin
      if (Components[i] as TmwCustomHighLighter).DefaultFilter <> '' then begin
        cbxHighlighter.Items.AddObject((Components[i] as TmwCustomHighLighter).LanguageName,
         Components[i]);
        if OpenDialog.Filter <> '' then
          OpenDialog.Filter := OpenDialog.Filter + '|';
        OpenDialog.Filter := OpenDialog.Filter + (Components[i] as TmwCustomHighLighter).DefaultFilter;
        f := (Components[i] as TmwCustomHighLighter).DefaultFilter;
        s := s + copy(f, pos('|',f)+1, length(f)) + ';';
      end;
    end;
  if OpenDialog.Filter <> '' then
    OpenDialog.Filter := OpenDialog.Filter + '|';
  OpenDialog.Filter := 'All known files|'+s+'|'+OpenDialog.Filter + 'All files (*.*)|*.*';
  SaveDialog.Filter := OpenDialog.Filter;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  EnumerateHighlighters;
end;

procedure TMainForm.FileOpenExecute(Sender: TObject);
var
  I : integer;
begin
  if OpenDialog.Execute then
    for I := 0 to OpenDialog.Files.Count-1 do
      OpenFile(OpenDialog.Files[I]);
end;

procedure TMainForm.mwCustomEdit1StatusChange(Sender: TObject;
  Changes: TmwStatusChanges);
begin
  with Sender as TmwCustomEdit do begin
    StatusBar.Panels[0].Text := Format('%d:%d', [CaretY, CaretX]);
    if Modified then
      StatusBar.Panels[1].Text := 'Modified'
    else
      StatusBar.Panels[1].Text := '';
    if InsertMode then
      StatusBar.Panels[2].Text := 'Insert'
    else
      StatusBar.Panels[2].Text := 'Overwrite';
  end;
end;

procedure TMainForm.FileSaveExecute(Sender: TObject);
var
  Edit : TMyMwCustomEdit;
begin
  Edit := CurrentEdit;
  if assigned(Edit) then begin
    if Edit.Filename = '' then
      FileSaveAs.Execute
    else begin
      Edit.Lines.SaveToFile( Edit.FileName );
      Edit.Modified := false;
    end;
  end;

end;

function TMainForm.CurrentEdit: TMyMwCustomEdit;
begin
  Result := Editor[PageControl.ActivePage.PageIndex];
end;

procedure TMainForm.FileSaveAsExecute(Sender: TObject);
var
  Edit : TMyMwCustomEdit;
begin
  Edit := CurrentEdit;

⌨️ 快捷键说明

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