361 lines
8.0 KiB
ObjectPascal

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ShellCtrls, ComCtrls,
LclIntf, LclType,
ATSynEdit,
ATStringProc,
ATSynEdit_Adapter_EControl,
ATSynEdit_Carets,
ATSynEdit_Export_HTML,
ecSyntAnal,
proc_lexer;
type
{ TfmMain }
TfmMain = class(TForm)
bOpen: TButton;
bComment: TButton;
bUncomment: TButton;
bExport: TButton;
chkDyn: TCheckBox;
chkFullHilite: TCheckBox;
chkFullSel: TCheckBox;
chkLexer: TCheckBox;
chkShowCur: TCheckBox;
chkUnpri: TCheckBox;
chkWrap: TCheckBox;
edLexer: TComboBox;
files: TShellListView;
ImageListTree: TImageList;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
PanelText: TPanel;
Splitter1: TSplitter;
Tree: TTreeView;
procedure AdapterParseBegin(Sender: TObject);
procedure AdapterParseDone(Sender: TObject);
procedure bCommentClick(Sender: TObject);
procedure bExportClick(Sender: TObject);
procedure bOpenClick(Sender: TObject);
procedure bUncommentClick(Sender: TObject);
procedure chkDynChange(Sender: TObject);
procedure chkFullHiliteChange(Sender: TObject);
procedure chkFullSelChange(Sender: TObject);
procedure chkLexerChange(Sender: TObject);
procedure chkShowCurChange(Sender: TObject);
procedure chkUnpriChange(Sender: TObject);
procedure chkWrapChange(Sender: TObject);
procedure EditorChangeCaretPos(Sender: TObject);
procedure edLexerChange(Sender: TObject);
procedure filesClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TreeClick(Sender: TObject);
private
{ private declarations }
ed: TATSynEdit;
FDir: string;
FFilename: string;
procedure DoCommentAct(Act: TATCommentAction);
procedure DoLexer(const aname: string);
procedure DoOpenFile(const fn: string);
procedure EditCalcStaple(Sender: TObject; ALine, AIndent: integer; var AColor: TColor);
procedure EditClickGutter(Sender: TObject; ABand: integer; ALine: integer);
function GetComment: string;
procedure UpdateLexList;
public
{ public declarations }
end;
var
fmMain: TfmMain;
implementation
{$R *.lfm}
var
manager: TecSyntaxManager;
adapter: TATAdapterEControl;
{ TfmMain }
procedure TfmMain.UpdateLexList;
var
i: integer;
sl: tstringlist;
begin
sl:= tstringlist.create;
try
for i:= 0 to manager.AnalyzerCount-1 do
sl.Add(manager.Analyzers[i].LexerName);
sl.sort;
edLexer.Items.AddStrings(sl);
finally
sl.free;
end;
end;
procedure TfmMain.DoOpenFile(const fn: string);
var
an: TecSyntAnalyzer;
begin
FFilename:= fn;
adapter.Lexer:= nil;
Tree.Items.Clear;
ed.LoadFromFile(fn);
ed.SetFocus;
an:= DoFindLexerForFilename(manager, fn);
adapter.Lexer:= an;
if Assigned(an) then
edLexer.ItemIndex:= edLexer.Items.IndexOf(an.LexerName);
end;
procedure TfmMain.FormCreate(Sender: TObject);
var
fname_lxl: string;
begin
FDir:= ExtractFileDir(ExtractFileDir(ExtractFileDir(Application.ExeName)))+'/test_syntax_files/';
fname_lxl:= ExtractFilePath(Application.ExeName)+'lib.lxl';
manager:= TecSyntaxManager.Create(Self);
manager.LoadFromFile(fname_lxl);
UpdateLexList;
ed:= TATSynEdit.Create(Self);
ed.Font.Name:= 'Courier New';
ed.Parent:= PanelText;
ed.Align:= alClient;
ed.OptUnprintedVisible:= false;
ed.OptRulerVisible:= false;
ed.Colors.TextBG:= $e0f0f0;
ed.Colors.CurrentLineBG:= clTeal;
ed.Gutter[ed.GutterBandNum].Visible:= false;
ed.Gutter.Update;
ed.OnClickGutter:= @EditClickGutter;
ed.OnCalcStaple:= @EditCalcStaple;
ed.OnChangeCaretPos:=@EditorChangeCaretPos;
adapter:= TATAdapterEControl.Create(Self);
adapter.OnParseBegin:=@AdapterParseBegin;
adapter.OnParseDone:=@AdapterParseDone;
ed.AdapterHilite:= adapter;
chkWrap.Checked:= ed.OptWrapMode=cWrapOn;
chkFullSel.Checked:= ed.OptShowFullSel;
chkFullHilite.Checked:= ed.OptShowFullHilite;
chkUnpri.Checked:= ed.OptUnprintedVisible;
chkShowCur.Checked:= ed.OptShowCurLine;
chkDyn.Checked:= adapter.DynamicHiliteEnabled;
end;
procedure TfmMain.FormShow(Sender: TObject);
begin
if DirectoryExists(FDir) then
files.Root:= FDir;
end;
procedure TfmMain.TreeClick(Sender: TObject);
var
R: TecTextRange;
P: TPoint;
begin
if adapter.TreeBusy then exit;
if Tree.Selected=nil then exit;
if Tree.Selected.Data=nil then exit;
R:= TecTextRange(Tree.Selected.Data);
P:= adapter.TreeGetPositionOfRange(R);
ed.DoGotoPos_AndUnfold(P, 5, 5);
ed.SetFocus;
end;
procedure TfmMain.chkWrapChange(Sender: TObject);
begin
if chkWrap.checked then
ed.OptWrapMode:= cWrapOn
else
ed.OptWrapMode:= cWrapOff;
end;
procedure TfmMain.EditorChangeCaretPos(Sender: TObject);
begin
adapter.TreeShowItemForCaret(Tree, Point(ed.Carets[0].PosX, ed.Carets[0].PosY));
end;
procedure TfmMain.chkFullSelChange(Sender: TObject);
begin
ed.OptShowFullSel:= chkFullSel.Checked;
ed.Update;
end;
procedure TfmMain.chkLexerChange(Sender: TObject);
begin
adapter.Lexer:= nil;
ed.Fold.Clear;
if chkLexer.Checked then
adapter.Lexer:= DoFindLexerForFilename(manager, FFilename);
ed.Update;
end;
procedure TfmMain.chkShowCurChange(Sender: TObject);
begin
ed.OptShowCurLine:= chkShowCur.Checked;
ed.Update;
end;
procedure TfmMain.chkUnpriChange(Sender: TObject);
begin
ed.OptUnprintedVisible:= chkUnpri.Checked;
ed.Update;
end;
procedure TfmMain.chkFullHiliteChange(Sender: TObject);
begin
ed.OptShowFullHilite:= chkFullHilite.Checked;
ed.Update;
end;
procedure TfmMain.bOpenClick(Sender: TObject);
begin
with OpenDialog1 do
begin
Filename:= '';
InitialDir:= FDir;
if not Execute then exit;
DoOpenFile(Filename);
end;
end;
function TfmMain.GetComment: string;
var
an: TecSyntAnalyzer;
begin
Result:= '';
an:= adapter.Lexer;
if Assigned(an) then
Result:= an.LineComment;
end;
procedure TfmMain.DoCommentAct(Act: TATCommentAction);
var
Str: string;
begin
Str:= GetComment;
if Str='' then
Showmessage('No line comment defined for lexer')
else
Ed.DoCommentSelectionLines(Act, Str);
end;
procedure TfmMain.bCommentClick(Sender: TObject);
begin
DoCommentAct(cCommentAdd_AtNonespace_IfNone);
end;
procedure TfmMain.bExportClick(Sender: TObject);
var
fn: string;
begin
fn:= GetTempDir+DirectorySeparator+'_export.html';
DoEditorExportToHTML(Ed, fn, 'Export test',
'Courier New', 12, false,
clWhite, clMedGray);
if FileExists(fn) then
OpenDocument(fn);
end;
procedure TfmMain.AdapterParseDone(Sender: TObject);
begin
adapter.TreeFill(Tree);
EditorChangeCaretPos(Self);
end;
procedure TfmMain.AdapterParseBegin(Sender: TObject);
begin
Tree.Items.Clear;
end;
procedure TfmMain.bUncommentClick(Sender: TObject);
begin
DoCommentAct(cCommentRemove);
end;
procedure TfmMain.chkDynChange(Sender: TObject);
begin
adapter.DynamicHiliteEnabled:= chkDyn.Checked;
Ed.Update;
end;
procedure TfmMain.DoLexer(const aname: string);
begin
adapter.Lexer:= manager.FindAnalyzer(aname);
ed.Update;
end;
procedure TfmMain.edLexerChange(Sender: TObject);
begin
DoLexer(edLexer.Text);
end;
procedure TfmMain.filesClick(Sender: TObject);
var
fn: string;
begin
if files.Selected=nil then exit;
//while adapter.TreeBusy do Application.ProcessMessages;
fn:= files.GetPathFromItem(files.Selected);
if FileExistsUTF8(fn) then
DoOpenFile(fn);
end;
procedure TfmMain.EditClickGutter(Sender: TObject; ABand: integer; ALine: integer);
begin
if ABand=ed.GutterBandBm then
begin
if ed.Strings.LinesBm[ALine]<>0 then
ed.Strings.LinesBm[ALine]:= 0
else
ed.Strings.LinesBm[ALine]:= 1;
ed.Update;
end;
end;
procedure TfmMain.EditCalcStaple(Sender: TObject; ALine, AIndent: integer; var AColor: TColor);
const
nColors = 10;
cl: array[0..nColors-1] of TColor = (
clGray,
clBlue,
clRed,
clGreen,
clOlive,
clMaroon,
clLime,
clMoneyGreen,
clNavy,
clTeal
);
begin
AColor:= cl[AIndent div 2 mod nColors];
end;
end.