⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas.svn-base

📁 支持自定义语法高亮显示的编辑器控件
💻 SVN-BASE
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdActns, ActnList, ImgList, ComCtrls, ToolWin, ExtCtrls,
  EasyEditor, StdCtrls;

type
  TMainForm = class(TForm)
    ActionList1: TActionList;
    FileNewAction: TAction;
    FileOpenAction: TAction;
    FileCloseAction: TWindowClose;
    FileSaveAction: TAction;
    FileSaveAsAction: TAction;
    FileSaveAllAction: TAction;
    FilePrintAction: TAction;
    FileCloseAllFiles: TAction;
    FileExplorer: TAction;
    WindowCascadeAction: TWindowCascade;
    WindowTileHorizontalAction: TWindowTileHorizontal;
    FileExitAction: TAction;
    WindowTileVerticalAction: TWindowTileVertical;
    WindowMinimizeAllAction: TWindowMinimizeAll;
    WindowArrangeAllAction: TWindowArrange;
    HelpAboutAction: TAction;
    FindAction: TAction;
    ReplaceAction: TAction;
    GotoLineAction: TAction;
    ToolEnvOptions: TAction;
    EditUndo: TAction;
    EditRedo: TAction;
    EditCut: TAction;
    EditCopy: TAction;
    EditPaste: TAction;
    EditDelete: TAction;
    EditSelectAll: TAction;
    FindAgainAction: TAction;
    Separator: TAction;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    FileNewItem: TMenuItem;
    FileOpenItem: TMenuItem;
    FileCloseItem: TMenuItem;
    FileSaveItem: TMenuItem;
    FileSaveAsItem: TMenuItem;
    SaveAllItem: TMenuItem;
    Print1: TMenuItem;
    CloseAllFiles1: TMenuItem;
    N1: TMenuItem;
    FileExitItem: TMenuItem;
    Edit1: TMenuItem;
    Undo1: TMenuItem;
    Redo1: TMenuItem;
    N5: TMenuItem;
    Cut1: TMenuItem;
    Copy1: TMenuItem;
    Paste1: TMenuItem;
    Delete1: TMenuItem;
    SelectAll1: TMenuItem;
    Search1: TMenuItem;
    Find1: TMenuItem;
    Replace1: TMenuItem;
    SearchAgain1: TMenuItem;
    GotoLine1: TMenuItem;
    Window1: TMenuItem;
    WindowCascadeItem: TMenuItem;
    WindowTileItem: TMenuItem;
    WindowTileItem2: TMenuItem;
    WindowMinimizeItem: TMenuItem;
    WindowArrangeItem: TMenuItem;
    miTools: TMenuItem;
    EviromentOptions1: TMenuItem;
    Help1: TMenuItem;
    HelpAboutItem: TMenuItem;
    Images: TImageList;
    TabPanel: TPanel;
    TabControl: TTabControl;
    ToolBar1: TToolBar;
    btnBackward: TToolButton;
    btnForward: TToolButton;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    LeftPanel: TPanel;
    LeftSplitter: TSplitter;
    CodeExplorer1: TMenuItem;
    ToolBar: TToolBar;
    ToolButton9: TToolButton;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton12: TToolButton;
    ToolButton3: TToolButton;
    ToolButton28: TToolButton;
    ToolButton32: TToolButton;
    ToolButton22: TToolButton;
    ToolButton25: TToolButton;
    ToolButton26: TToolButton;
    ToolButton27: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton10: TToolButton;
    ToolButton11: TToolButton;
    ToolButton24: TToolButton;
    ToolButton23: TToolButton;
    ToolButton30: TToolButton;
    ToolButton31: TToolButton;
    ToolButton4: TToolButton;
    ToolButton35: TToolButton;
    ToolButton5: TToolButton;
    ToolButton29: TToolButton;
    StatusBar1: TStatusBar;
    procedure EditUndoExecute(Sender: TObject);
    procedure EditUndoUpdate(Sender: TObject);
    procedure EditRedoExecute(Sender: TObject);
    procedure EditRedoUpdate(Sender: TObject);
    procedure EditCutExecute(Sender: TObject);
    procedure EditCutUpdate(Sender: TObject);
    procedure EditCopyExecute(Sender: TObject);
    procedure EditPasteExecute(Sender: TObject);
    procedure EditPasteUpdate(Sender: TObject);
    procedure EditDeleteExecute(Sender: TObject);
    procedure EditSelectAllExecute(Sender: TObject);
    procedure EditSelectAllUpdate(Sender: TObject);
    procedure FileNewActionExecute(Sender: TObject);
    procedure FileOpenActionExecute(Sender: TObject);
    procedure FileCloseActionExecute(Sender: TObject);
    procedure FileSaveActionExecute(Sender: TObject);
    procedure FileSaveActionUpdate(Sender: TObject);
    procedure FileSaveAsActionExecute(Sender: TObject);
    procedure FileSaveAllActionExecute(Sender: TObject);
    procedure FileCloseAllFilesExecute(Sender: TObject);
    procedure FileExplorerExecute(Sender: TObject);
    procedure LeftPanelDockDrop(Sender: TObject; Source: TDragDockObject;
      X, Y: Integer);
    procedure LeftPanelDockOver(Sender: TObject; Source: TDragDockObject;
      X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure LeftPanelUnDock(Sender: TObject; Client: TControl;
      NewTarget: TWinControl; var Allow: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FileExitActionExecute(Sender: TObject);
    procedure FindActionExecute(Sender: TObject);
    procedure ReplaceActionExecute(Sender: TObject);
    procedure GotoLineActionExecute(Sender: TObject);
    procedure FindAgainActionExecute(Sender: TObject);
    procedure HelpAboutActionExecute(Sender: TObject);
    procedure ToolEnvOptionsExecute(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TabControlChange(Sender: TObject);
  private
    FInDestroying : boolean;
    procedure SaveToFile(Editor : TCustomEasyEdit; const FileName : string);
    procedure AddTab(Form : TCustomForm; const FileName : string);
    { Private declarations }
  public
    function  CreateEditor(const FileName : string) : TCustomForm;
    function  OpenEditor(const FileName : string) : TCustomForm;
    function  SaveEditor(Form : TForm; SaveEmpty : boolean) : boolean;
    procedure ActivateTab(Form : TCustomForm);
    function  GetEditForm(const FileName : string) : TCustomForm;
    function  CloseQuery : boolean; override;
    procedure RemoveTab(Form : TCustomForm);
    property InDestroying : boolean read FInDestroying;
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

uses
  editunit, expl,
  EasyKeyMap, EasySearchDlg, EasyReplDlg, EasyGotoDlg, EasyCustomDlg;
const
  sNoname = 'Noname';
  sErrorMessage = 'Cat''t create form. System resources are low';
{$R *.DFM}

function TMainForm.CloseQuery : boolean;
begin
  FInDestroying := true;
  result := inherited CloseQuery;
end;

function TMainForm.CreateEditor(const FileName : string) : TCustomForm;
begin
  try
    if MDIChildCount >= 200 then
      raise Exception.Create(sErrorMessage);

    ExplorerFrm.UpdateExplorer(FileName);

    result := TEditForm.Create(Application);
    result.Caption := FileName;
    with TEditForm(result) do
    begin
      if FileExists(FileName) then
        EasyEdit.Lines.LoadFromFile(FileName);
      AfterCreate;  
    end;
    AddTab(result, FileName);
  except
    ShowMessage(sErrorMessage);
    result := nil;
  end;
end;

procedure TMainForm.ActivateTab(Form : TCustomForm);
begin
  with TabControl do
    TabIndex := Tabs.IndexOfObject(ActiveMdiChild);
end;

procedure TMainForm.AddTab(Form : TCustomForm; const FileName : string);
begin
  with TabControl do
  begin
    Tabs.AddObject(ExtractFileName(FileName), Form);
    TabIndex := Tabs.Count - 1;
    TabPanel.Visible := Tabs.Count > 0;
  end;
end;

procedure TMainForm.RemoveTab(Form : TCustomForm);
var
  i : integer;
begin
  with TabControl do
  begin
    i := Tabs.IndexOfObject(Form);
    if i >= 0 then
      Tabs.Delete(i);
    TabPanel.Visible := Tabs.Count > 0;
  end;
end;


function TMainForm.GetEditForm(const FileName : string) : TCustomForm;
var
  i : integer;
begin
  result := nil;
  for i := 0 to MDIChildCount - 1 do
    if CompareText(MDIChildren[i].Caption, FileName) =  0then
    begin
      result := MDIChildren[i];
      Exit;
    end;
end;

function TMainForm.OpenEditor(const FileName : string) : TCustomForm;
begin
  result := GetEditForm(FileName);
  if result <> nil then
  begin
    SendMessage(ClientHandle, WM_MDIACTIVATE, TForm(result).Handle, 0);
    Exit;
  end;
  if FileExists(FileName) then
    result := CreateEditor(FileName);
end;

procedure TMainForm.SaveToFile(Editor : TCustomEasyEdit; const FileName : string);
begin
  if FileExists(FileName) then
    Editor.Lines.SaveToFile(FileName);
end;

function TMainForm.SaveEditor(Form : TForm; SaveEmpty : boolean) : boolean;
var
  i : integer;
begin
  result := true;
  if not (Form is TEditForm) then
     Exit;
  with TEditForm(Form) do
  begin
    if CompareText(Copy(Caption, 1, Length(sNoname)), sNoname) = 0 then
    begin
      if not SaveEmpty then
        Exit;
      if not SaveDialog.Execute then
      begin
        result := false;
        Exit;
      end;
      Caption := SaveDialog.FileName;
    end;

    SaveToFile(EasyEdit, Caption);
    with TabControl do
    begin
      i := Tabs.IndexOfObject(Form);
      if i >= 0 then
        Tabs[i] := ExtractFileName(Caption);
    end;

    with EasyEdit.EditSource do
      begin
        UndoList.Clear;
        RedoList.Clear;
        Modified := false;
      end;
  end;
end;

procedure TMainForm.EditUndoExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.Undo;
end;

procedure TMainForm.EditUndoUpdate(Sender: TObject);
begin
  EditUndo.Enabled := (ActiveMdiChild is TEditForm) and TEditForm(ActiveMdiChild).EasyEdit.EditSource.UndoAvailable;
end;

procedure TMainForm.EditRedoExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.Redo;
end;

procedure TMainForm.EditRedoUpdate(Sender: TObject);
begin
  EditRedo.Enabled := (ActiveMdiChild is TEditForm) and TEditForm(ActiveMdiChild).EasyEdit.EditSource.RedoAvailable;
end;

procedure TMainForm.EditCutExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.CutBlock;
end;

procedure TMainForm.EditCutUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (ActiveMdiChild is TEditForm) and TEditForm(ActiveMdiChild).EasyEdit.CanCopy;
end;

procedure TMainForm.EditCopyExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.CopyBlock;
end;

procedure TMainForm.EditPasteExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.PasteBlock;
end;

procedure TMainForm.EditPasteUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (ActiveMdiChild is TEditForm) and TEditForm(ActiveMdiChild).EasyEdit.CanPaste;
end;

procedure TMainForm.EditDeleteExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm (ActiveMdiChild).EasyEdit.DeleteBlock;
end;

procedure TMainForm.EditSelectAllExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm(ActiveMdiChild).EasyEdit.SelectAll;
end;

procedure TMainForm.EditSelectAllUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (ActiveMdiChild is TEditForm);
end;

procedure TMainForm.FileNewActionExecute(Sender: TObject);
begin
  CreateEditor(sNoname + IntToStr(MDIChildCount + 1));
end;

procedure TMainForm.FileOpenActionExecute(Sender: TObject);
begin
  with OpenDialog do
    if Execute then
      OpenEditor(FileName);
end;

procedure TMainForm.FileCloseActionExecute(Sender: TObject);
begin
  if ActiveMdiChild is TEditForm then
    TEditForm(ActiveMdiChild).Close;
end;

procedure TMainForm.FileSaveActionExecute(Sender: TObject);
begin
  if (ActiveMDIChild is TEditForm) then
    SaveEditor(ActiveMDIChild, true);
end;

procedure TMainForm.FileSaveActionUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := (ActiveMdiChild is TEditForm) and TEditForm(ActiveMdiChild).EasyEdit.Modified;
end;

procedure TMainForm.FileSaveAsActionExecute(Sender: TObject);
var
  OldName : string;
begin
  if ActiveMdiChild is TEditForm then
    with SaveDialog do
    begin
      FileName := ActiveMDIChild.Caption;
      if Execute then
      begin
        OldName := ActiveMDIChild.Caption;
        ActiveMDIChild.Caption := FileName;
        SaveEditor(ActiveMDIChild, true);
        if CompareText(OldName, FileName) <> 0 then
          ExplorerFrm.FileNameChanged(OldName, FileName);
      end;
    end;
end;

procedure TMainForm.FileSaveAllActionExecute(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to MDIChildCount - 1 do
    if (MDIChildren[i] is TEditForm) and TEditForm(MDIChildren[i]).EasyEdit.Modified then
      SaveEditor(MDIChildren[i], true);
end;

procedure TMainForm.FileCloseAllFilesExecute(Sender: TObject);
var
  i : integer;
begin
  for i :=  MDIChildCount - 1 downto 0  do
    MDIChildren[i].Close;
end;

procedure TMainForm.FileExplorerExecute(Sender: TObject);
begin
  with ExplorerFrm do
  begin
    if not Visible then
      ManualDock(LeftPanel);
    Show;
  end;
end;

procedure TMainForm.LeftPanelDockDrop(Sender: TObject;
  Source: TDragDockObject; X, Y: Integer);
begin
  LeftPanel.Width := Source.Control.LRDockWidth;
  LeftSplitter.Show;
end;

procedure TMainForm.LeftPanelDockOver(Sender: TObject;
  Source: TDragDockObject; X, Y: Integer; State: TDragState;
  var Accept: Boolean);
begin
  Accept := (Source <> nil) and (Source.Control is TExplorerFrm);
end;

procedure TMainForm.LeftPanelUnDock(Sender: TObject; Client: TControl;
  NewTarget: TWinControl; var Allow: Boolean);
begin
  LeftPanel.Width := 1;
  LeftSplitter.Hide;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  LeftPanel.Width := 1;
end;

procedure TMainForm.FileExitActionExecute(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.FindActionExecute(Sender: TObject);
begin
  if (ActiveMDIChild is TEditForm) then
    TEditForm(ActiveMDIChild).EasyEdit.ExecuteDialog(cFind);
end;

procedure TMainForm.ReplaceActionExecute(Sender: TObject);
begin
  if (ActiveMDIChild is TEditForm) then
    TEditForm(ActiveMDIChild).EasyEdit.ExecuteDialog(cReplace);
end;

procedure TMainForm.GotoLineActionExecute(Sender: TObject);
begin
  if (ActiveMDIChild is TEditForm) then
    TEditForm(ActiveMDIChild).EasyEdit.ExecuteDialog(cGotoLine);
end;

procedure TMainForm.FindAgainActionExecute(Sender: TObject);
begin
  if (ActiveMDIChild is TEditForm) then
    TEditForm(ActiveMDIChild).EasyEdit.FindNext(cFind);

end;

procedure TMainForm.HelpAboutActionExecute(Sender: TObject);
begin
  ShowMessage('Code Completion Demo'#13#10'Copyright Dream Compay'#13#10'www.dream-com.com');
end;

procedure TMainForm.ToolEnvOptionsExecute(Sender: TObject);
begin
  ShowEditorSettings;
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  FileExplorerExecute(Self);
end;

procedure TMainForm.TabControlChange(Sender: TObject);
begin
  with TabControl do
    if TabIndex >= 0 then
      SendMessage(ClientHandle, WM_MDIACTIVATE, (Tabs.Objects[TabIndex] as TCustomForm).Handle, 0);
end;

end.

⌨️ 快捷键说明

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