📄 skyemain.pas
字号:
unit SkyEMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SkyEdit, StdCtrls, ComCtrls, Menus, ShellApi,
ExtCtrls, StdActns, ActnList, Clipbrd, SkyParser, SkyManager;
type
TSkyForm = class(TForm)
Label1: TLabel;
OpenDialog1: TOpenDialog;
PopupMenu1: TPopupMenu;
test11: TMenuItem;
test21: TMenuItem;
test31: TMenuItem;
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
ActionList1: TActionList;
actFileOpen: TAction;
mnuFile: TMenuItem;
mnuFileOpen: TMenuItem;
mnuEdit: TMenuItem;
mnuTool: TMenuItem;
mnuHelp: TMenuItem;
actFileNew: TAction;
actFileClose: TAction;
actFileSave: TAction;
actFileSaveAs: TAction;
mnuFileNew: TMenuItem;
mnuFileClose: TMenuItem;
N2: TMenuItem;
mnuFileSave: TMenuItem;
mnuFileSaveAs: TMenuItem;
N3: TMenuItem;
actFileExit: TAction;
mnuFileExit: TMenuItem;
actEditUndo: TAction;
actEditCopy: TAction;
actEditCut: TAction;
actEditPaste: TAction;
actEditDel: TAction;
actEditSelectAll: TAction;
actToolShowLineNum: TAction;
actHelpAbout: TAction;
mnuEditUndo: TMenuItem;
N4: TMenuItem;
mnuEditCut: TMenuItem;
mnuEditCopy: TMenuItem;
mnuEditPaste: TMenuItem;
mnuEditDel: TMenuItem;
N5: TMenuItem;
mnuEditSelectAll: TMenuItem;
mnuToolShowLineNum: TMenuItem;
mnuHelpAbout: TMenuItem;
SaveDialog1: TSaveDialog;
SkyEdit2: TSkyEdit;
PascalSkyParser: TSkyParser;
actSkyParser: TAction;
mnuPascalSkyParser: TMenuItem;
FontDialog1: TFontDialog;
actFontSet: TAction;
N1: TMenuItem;
mnuFontSet: TMenuItem;
N6: TMenuItem;
D1: TMenuItem;
D2: TMenuItem;
N7: TMenuItem;
A1: TMenuItem;
N8: TMenuItem;
ab21: TMenuItem;
mnuToolReloadParserFile: TMenuItem;
mnuIncGutterWidth: TMenuItem;
mnuDecGutterWidth: TMenuItem;
actGotoALine: TAction;
N9: TMenuItem;
mnuGotoALine: TMenuItem;
N10: TMenuItem;
mnuHighLightFileType: TMenuItem;
mnuNoHighlighting: TMenuItem;
ab1: TMenuItem;
N11: TMenuItem;
mnuUseSpaceReplaceTab: TMenuItem;
actReadOnly: TAction;
N12: TMenuItem;
mnuReadOnly: TMenuItem;
actUpperCase: TAction;
actLowerCase: TAction;
N13: TMenuItem;
L1: TMenuItem;
U1: TMenuItem;
N14: TMenuItem;
mnuHelpTopic: TMenuItem;
actEditRedo: TAction;
mnuEditRedo: TMenuItem;
R2: TMenuItem;
actFind: TAction;
mnuSearch: TMenuItem;
mnuSearchFindFirst: TMenuItem;
actFindNext: TAction;
actFindPrev: TAction;
actReplace: TAction;
N15: TMenuItem;
V1: TMenuItem;
R3: TMenuItem;
actFindFirst: TAction;
actRepAll: TAction;
actCount: TAction;
actStatusBar: TAction;
mnuToolStatusBar: TMenuItem;
actAskSaveOfExit: TAction;
mnuToolAskSaveOfExit: TMenuItem;
procedure SkyEdit2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SkyEdit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure SkyEdit2KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure SkyEdit2Change(Sender: TObject);
procedure actFileOpenExecute(Sender: TObject);
procedure actFileNewExecute(Sender: TObject);
procedure actFileCloseExecute(Sender: TObject);
procedure actFileSaveExecute(Sender: TObject);
procedure actFileSaveAsExecute(Sender: TObject);
procedure actFileExitExecute(Sender: TObject);
procedure actEditUndoExecute(Sender: TObject);
procedure actEditCutExecute(Sender: TObject);
procedure actEditCopyExecute(Sender: TObject);
procedure actEditPasteExecute(Sender: TObject);
procedure actEditDelExecute(Sender: TObject);
procedure actEditSelectAllExecute(Sender: TObject);
procedure actToolShowLineNumExecute(Sender: TObject);
procedure SkyEdit2SelectionChanged(Sender: TObject);
procedure actHelpAboutExecute(Sender: TObject);
procedure actSkyParserExecute(Sender: TObject);
procedure actFontSetExecute(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ab21Click(Sender: TObject);
procedure mnuToolReloadParserFileClick(Sender: TObject);
procedure mnuIncGutterWidthClick(Sender: TObject);
procedure mnuDecGutterWidthClick(Sender: TObject);
procedure actGotoALineExecute(Sender: TObject);
procedure SkyEdit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ab1Click(Sender: TObject);
procedure mnuUseSpaceReplaceTabClick(Sender: TObject);
procedure SaveDialog1TypeChange(Sender: TObject);
procedure actReadOnlyExecute(Sender: TObject);
procedure actLowerCaseExecute(Sender: TObject);
procedure actUpperCaseExecute(Sender: TObject);
procedure mnuHelpTopicClick(Sender: TObject);
procedure actEditRedoExecute(Sender: TObject);
procedure actFindExecute(Sender: TObject);
procedure actFindNextExecute(Sender: TObject);
procedure actFindPrevExecute(Sender: TObject);
procedure actFindFirstExecute(Sender: TObject);
procedure actRepAllExecute(Sender: TObject);
procedure actCountExecute(Sender: TObject);
procedure actStatusBarExecute(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure actAskSaveOfExitExecute(Sender: TObject);
private
{ Private declarations }
m_bMatchCase, m_bWholeWord, m_bBackWard, m_bGlobal, m_bEntire: Boolean;
m_sCapInfo: String;
m_sFileName: String;
m_smrParser: TSkyManager; //SkyParser 管理器
m_iOldLeft, m_iOldTop, m_iOldHeight, m_iOldWidth: Integer;
m_sktSearch: TSkySearchTypes;
m_sCurFindStr, m_sCurRepStr: String;
m_slFindStr, m_slRepStr: TStrings;
m_SearchForm: TCustomForm; //Application.CreateForm之第二参数要求完全一致!
m_iSearchLeft, m_iSearchTop: Integer; //搜索窗口之坐标
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
procedure LoadConfigInfo;
procedure CreateMenuItemOfParser;
procedure UpdateCaretInfo;
function AskToSaveWhenModified: Boolean;
procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
function LoadFileToSkyEdit(const sFileName: String): Boolean;
procedure SetSkyParser; overload;
procedure SetSkyParser(const sFileName: String); overload;
procedure mnuHighlightingClick(Sender: TObject);
procedure UpdateReadOnlyInsertModeInfo;
function GetFileReadOnlyProperty(const sFileName: String): Boolean;
function MsgBox(const sTip: String; const sTitle: String = 'Sky Editor';
iFlags: Longint = MB_OK): Integer;
function FindFormFromScreen(const sFormName: String): TCustomForm;
function CreateForm(const sFormName: String; AFormClass: TCustomFormClass;
var AForm: TCustomForm; bShow: Boolean = True): Boolean;
procedure UpdateSearchInfo(Sender: TObject);
function GetAppBuildTimeStr: String;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
property SearchLeft: Integer read m_iSearchLeft write m_iSearchLeft;
property SearchTop: Integer read m_iSearchTop write m_iSearchTop;
end;
var
SkyForm: TSkyForm;
implementation
uses Input, SearchE;
{$R *.dfm}
procedure TSkyForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
DroppedFilename : string;
FileIndex : integer;
QtyDroppedFiles : integer;
pDroppedFilename : array [0..MAX_PATH-1] of Char;
begin
if Msg.Message = WM_DROPFILES then //接受文件拖放
begin
FileIndex := not 0;//not 0 不受integer字长的限制 $FFFFFFFF;
QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex,
pDroppedFilename, MAX_PATH);
if(QtyDroppedFiles=0)then exit;
for FileIndex := 0 to (QtyDroppedFiles - 1) do
if(DragQueryFile(Msg.WParam, FileIndex,pDroppedFilename, MAX_PATH)<=MAX_PATH)then
begin
DroppedFilename := StrPas(pDroppedFilename);
if FileExists(DroppedFileName) then
begin
//if not CreateNewPage(ExtractFileName(DroppedFileName),
// DroppedFileName) then break;
if SkyEdit2.Modified and AskToSaveWhenModified then
actFileSaveExecute(actFileSave);
LoadFileToSkyEdit(DroppedFileName);
Break;
end;
end;
Application.BringToFront;
DragFinish(Msg.WParam);
Handled := true;
end;
end;
procedure TSkyForm.LoadConfigInfo;
var //载入配置信息(窗体位置等)
bIsPas: Boolean;
idx, k: Integer;
sCfgFile: String;
slCfg: TStringList;
begin
sCfgFile := ChangeFileExt(Application.ExeName, '.sky');
if FileExists(sCfgFile) then
begin
slCfg := TStringList.Create;
try
slCfg.LoadFromFile(sCfgFile);
idx := slCfg.IndexOfName('WinLeft');
if idx >= 0 then
Left := StrToIntDef(slCfg.Values['WinLeft'], 20);
idx := slCfg.IndexOfName('WinTop');
if idx >= 0 then
Top := StrToIntDef(slCfg.Values['WinTop'], 80);
idx := slCfg.IndexOfName('WinHeight');
if idx >= 0 then
Height := StrToIntDef(slCfg.Values['WinHeight'], 600);
idx := slCfg.IndexOfName('WinWidth');
if idx >= 0 then
Width := StrToIntDef(slCfg.Values['WinWidth'], 800);
idx := slCfg.IndexOfName('Maximized');
if idx >= 0 then
if StrToIntDef(slCfg.Values['Maximized'], 0) > 0 then
Self.WindowState := wsMaximized;
idx := slCfg.IndexOfName('SkyParser');
if idx >= 0 then
bIsPas := Boolean(StrToIntDef(slCfg.Values['SkyParser'], 0))
else
bIsPas := False;
if bIsPas then //载入语法解析器
actSkyParser.Checked := True;
//actSkyParserExecute(actSkyParser);
idx := slCfg.IndexOfName('StatusBar');
if idx >= 0 then
begin
actStatusBar.Checked :=
Boolean(StrToIntDef(slCfg.Values['StatusBar'],1));
StatusBar1.Visible := actStatusBar.Checked;
end;
idx := slCfg.IndexOfName('UseTabKey');
if idx >= 0 then
SkyEdit2.UseTabKey := Boolean(StrToIntDef(slCfg.Values['UseTabKey'], 1))
else
SkyEdit2.UseTabKey := True;
mnuUseSpaceReplaceTab.Checked := not SkyEdit2.UseTabKey;
idx := slCfg.IndexOfName('TabSpaces');
if idx >= 0 then
SkyEdit2.TabSpaces := StrToIntDef(slCfg.Values['TabSpaces'], 8);
idx := slCfg.IndexOfName('GutterWidth');
if idx >= 0 then
SkyEdit2.GutterWidth := StrToIntDef(slCfg.Values['GutterWidth'], 30);
idx := slCfg.IndexOfName('MatchCase');
if idx >= 0 then
m_bMatchCase := Boolean(StrToIntDef(slCfg.Values['MatchCase'], 1))
else
m_bMatchCase := True;
idx := slCfg.IndexOfName('WholeWord');
if idx >= 0 then
m_bWholeWord := Boolean(StrToIntDef(slCfg.Values['WholeWord'], 0));
idx := slCfg.IndexOfName('BackWard');
if idx >= 0 then
m_bBackWard := Boolean(StrToIntDef(slCfg.Values['BackWard'], 0));
idx := slCfg.IndexOfName('Global');
if idx >= 0 then
m_bGlobal := Boolean(StrToIntDef(slCfg.Values['Global'], 1))
else
m_bGlobal := True;
idx := slCfg.IndexOfName('Entire');
if idx >= 0 then
m_bEntire := Boolean(StrToIntDef(slCfg.Values['Entire'], 0));
idx := slCfg.IndexOfName('CurFindStr');
if idx >= 0 then
m_sCurFindStr := slCfg.Values['CurFindStr'];
idx := slCfg.IndexOfName('CurRepStr');
if idx >= 0 then
m_sCurRepStr := slCfg.Values['CurRepStr'];
k := 0;
idx := slCfg.IndexOfName('FindStr0');
while idx >= 0 do
begin
m_slFindStr.Append(slCfg.Values['FindStr' + IntToStr(k)]);
Inc(k);
idx := slCfg.IndexOfName('FindStr' + IntToStr(k));
end;
k := 0;
idx := slCfg.IndexOfName('RepStr0');
while idx >= 0 do
begin
m_slRepStr.Append(slCfg.Values['RepStr' + IntToStr(k)]);
Inc(k);
idx := slCfg.IndexOfName('RepStr' + IntToStr(k));
end;
idx := slCfg.IndexOfName('SearchLeft');
if idx >= 0 then
m_iSearchLeft := StrToIntDef(slCfg.Values['SearchLeft'], 200)
else
m_iSearchLeft := 200;
idx := slCfg.IndexOfName('SearchTop');
if idx >= 0 then
m_iSearchTop := StrToIntDef(slCfg.Values['SearchTop'], 200)
else
m_iSearchTop := 200;
idx := slCfg.IndexOfName('AskSaveOfExit');
if idx >= 0 then
actAskSaveOfExit.Checked :=
Boolean(StrToIntDef(slCfg.Values['AskSaveOfExit'], 1))
else
actAskSaveOfExit.Checked := True;
m_iOldLeft := Left;
m_iOldTop := Top;
m_iOldHeight := Height;
m_iOldWidth := Width;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -