fpc/ide/text/fpcodtmp.pas
2000-01-04 10:14:10 +00:00

148 lines
3.6 KiB
ObjectPascal

unit FPCodTmp; { Code Templates }
interface
uses Objects,
WUtils;
type
PCodeTemplate = ^TCodeTemplate;
TCodeTemplate = object(TObject)
constructor Init(const AShortCut: string; AText: PUnsortedStringCollection);
function GetShortCut: string;
procedure GetText(AList: PUnsortedStringCollection);
destructor Done; virtual;
private
ShortCut: PString;
Text: PUnsortedStringCollection;
end;
PCodeTemplateCollection = ^TCodeTemplateCollection;
TCodeTemplateCollection = object(TSortedCollection)
function Compare(Key1, Key2: Pointer): sw_Integer; virtual;
function SearchByShortCut(const ShortCut: string): PCodeTemplate; virtual;
end;
const CodeTemplates : PCodeTemplateCollection = nil;
function FPTranslateCodeTemplate(const Shortcut: string; ALines: PUnsortedStringCollection): boolean;
procedure InitCodeTemplates;
procedure DoneCodeTemplates;
implementation
constructor TCodeTemplate.Init(const AShortCut: string; AText: PUnsortedStringCollection);
procedure CopyIt(P: PString); {$ifndef FPC}far;{$endif}
begin
Text^.Insert(NewStr(GetStr(P)));
end;
begin
inherited Init;
ShortCut:=NewStr(AShortCut);
New(Text, Init(10,10));
if Assigned(AText) then
AText^.ForEach(@CopyIt);
end;
function TCodeTemplate.GetShortCut: string;
begin
GetShortCut:=GetStr(ShortCut);
end;
procedure TCodeTemplate.GetText(AList: PUnsortedStringCollection);
procedure CopyIt(P: PString); {$ifndef FPC}far;{$endif}
begin
AList^.Insert(NewStr(GetStr(P)));
end;
begin
if Assigned(AList) then
Text^.ForEach(@CopyIt);
end;
destructor TCodeTemplate.Done;
begin
if Assigned(ShortCut) then DisposeStr(ShortCut); ShortCut:=nil;
if Assigned(Text) then Dispose(Text, Done); Text:=nil;
inherited Done;
end;
function TCodeTemplateCollection.Compare(Key1, Key2: Pointer): sw_Integer;
var K1: PCodeTemplate absolute Key1;
K2: PCodeTemplate absolute Key2;
R: Sw_integer;
S1,S2: string;
begin
S1:=UpCaseStr(K1^.GetShortCut);
S2:=UpCaseStr(K2^.GetShortCut);
if S1<S2 then R:=-1 else
if S1>S2 then R:=1 else
R:=0;
Compare:=R;
end;
function TCodeTemplateCollection.SearchByShortCut(const ShortCut: string): PCodeTemplate;
var T: TCodeTemplate;
Index: sw_integer;
P: PCodeTemplate;
begin
T.Init(ShortCut,nil);
if Search(@T,Index)=false then P:=nil else
P:=At(Index);
T.Done;
SearchByShortCut:=P;
end;
function FPTranslateCodeTemplate(const Shortcut: string; ALines: PUnsortedStringCollection): boolean;
var OK: boolean;
P: PCodeTemplate;
begin
OK:=Assigned(CodeTemplates);
if OK then
begin
P:=CodeTemplates^.SearchByShortCut(ShortCut);
OK:=Assigned(P);
if OK then
P^.GetText(ALines);
end;
{$ifdef GABOR}
{
this is for testing purposes only. once the user front-end for defining
CodeTemplates is implemented, this can be removed - Gabor
}
if (OK=false) and (UpCaseStr(ShortCut)='CASES') then
begin
OK:=true;
ALines^.Insert(NewStr('case of'));
ALines^.Insert(NewStr(' : ;'));
ALines^.Insert(NewStr(' : ;'));
ALines^.Insert(NewStr('end;'));
end else
if (OK=false) and (UpCaseStr(ShortCut)='CASEE') then
begin
OK:=true;
ALines^.Insert(NewStr('case of'));
ALines^.Insert(NewStr(' : ;'));
ALines^.Insert(NewStr(' : ;'));
ALines^.Insert(NewStr('else ;'));
ALines^.Insert(NewStr('end;'));
end else
;
{$endif}
FPTranslateCodeTemplate:=OK;
end;
procedure InitCodeTemplates;
begin
if Assigned(CodeTemplates) then Exit;
New(CodeTemplates, Init(10,10));
end;
procedure DoneCodeTemplates;
begin
if Assigned(CodeTemplates) then Dispose(CodeTemplates, Done);
CodeTemplates:=nil;
end;
END.