mirror of https://gitlab.com/basile.b/dexed.git
Merge branch 'a12_2_a13'
This commit is contained in:
commit
30400b865e
|
|
@ -2,36 +2,6 @@ module cesyms;
|
||||||
|
|
||||||
import std.stdio, std.path, std.file, std.array, std.string;
|
import std.stdio, std.path, std.file, std.array, std.string;
|
||||||
import std.d.lexer, std.d.ast, std.d.parser;
|
import std.d.lexer, std.d.ast, std.d.parser;
|
||||||
static import std.conv;
|
|
||||||
|
|
||||||
interface I{}
|
|
||||||
|
|
||||||
alias Int32 = int;
|
|
||||||
//alias long Int64;
|
|
||||||
|
|
||||||
enum E
|
|
||||||
{
|
|
||||||
e1,
|
|
||||||
e2,
|
|
||||||
e3,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {opt1,opt2}
|
|
||||||
|
|
||||||
class A
|
|
||||||
{
|
|
||||||
class AA
|
|
||||||
{
|
|
||||||
class AA1{}
|
|
||||||
class AA2{}
|
|
||||||
}
|
|
||||||
|
|
||||||
class BB
|
|
||||||
{
|
|
||||||
class BB1{}
|
|
||||||
class BB2{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum SymbolType
|
enum SymbolType
|
||||||
{
|
{
|
||||||
|
|
@ -58,18 +28,18 @@ struct Symbol
|
||||||
|
|
||||||
void serialize(ref Appender!string lfmApp)
|
void serialize(ref Appender!string lfmApp)
|
||||||
{
|
{
|
||||||
lfmApp.put(" \r item\r");
|
lfmApp.put("\ritem\r");
|
||||||
|
|
||||||
lfmApp.put(format(" line = %d\r", line));
|
lfmApp.put(format("line = %d\r", line));
|
||||||
lfmApp.put(format(" col = %d\r", col));
|
lfmApp.put(format("col = %d\r", col));
|
||||||
lfmApp.put(format(" name = '%s'\r", name));
|
lfmApp.put(format("name = '%s'\r", name));
|
||||||
lfmApp.put(format(" symType = %s\r", type));
|
lfmApp.put(format("symType = %s\r", type));
|
||||||
|
|
||||||
lfmApp.put(" subs = <");
|
lfmApp.put("subs = <");
|
||||||
if (subs.length) foreach(Symbol * sub; subs)
|
if (subs.length) foreach(Symbol * sub; subs)
|
||||||
sub.serialize(lfmApp);
|
sub.serialize(lfmApp);
|
||||||
lfmApp.put(">\r");
|
lfmApp.put(">\r");
|
||||||
lfmApp.put(" end\r");
|
lfmApp.put("end\r");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,28 +63,25 @@ void main(string[] args)
|
||||||
slb.visit(decl);
|
slb.visit(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version(none)
|
||||||
// TODO-cfeature: Outputs the symbol tree in a format handlable by a Coedit widget
|
|
||||||
|
|
||||||
int level = -1;
|
|
||||||
void print(Symbol * s)
|
|
||||||
{
|
{
|
||||||
foreach(i; 0 .. level) write(".");
|
int level = -1;
|
||||||
level++;
|
void print(Symbol * s)
|
||||||
write(s.name, '\r');
|
{
|
||||||
foreach(ss; s.subs)
|
foreach(i; 0 .. level) write(".");
|
||||||
print(ss);
|
level++;
|
||||||
|
write(s.name, '\r');
|
||||||
|
foreach(ss; s.subs)
|
||||||
|
print(ss);
|
||||||
|
|
||||||
level--;
|
level--;
|
||||||
|
}
|
||||||
|
print(&slb.root);
|
||||||
}
|
}
|
||||||
//print(&slb.root);
|
|
||||||
|
|
||||||
auto str = slb.serialize;
|
auto str = slb.serialize;
|
||||||
|
//std.file.write(r"C:\tool.txt",cast(ubyte[])str);
|
||||||
//std.file.write(r"C:\too.txt",cast(ubyte[])str);
|
|
||||||
|
|
||||||
write(str);
|
write(str);
|
||||||
stdout.flush;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class SymbolListBuilder : ASTVisitor
|
class SymbolListBuilder : ASTVisitor
|
||||||
|
|
@ -134,12 +101,11 @@ class SymbolListBuilder : ASTVisitor
|
||||||
Appender!string lfmApp;
|
Appender!string lfmApp;
|
||||||
lfmApp.reserve(count * 64);
|
lfmApp.reserve(count * 64);
|
||||||
|
|
||||||
lfmApp.put("object TSymbolList\r symbols = <");
|
lfmApp.put("object TSymbolList\rsymbols = <");
|
||||||
foreach(Symbol * sym; root.subs) sym.serialize(lfmApp);
|
foreach(Symbol * sym; root.subs) sym.serialize(lfmApp);
|
||||||
lfmApp.put(">\rend\r\n");
|
lfmApp.put(">\rend\r\n");
|
||||||
|
|
||||||
return lfmApp.data;
|
return lfmApp.data;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// returns a new symbol if the declarator is based on a Token named "name".
|
/// returns a new symbol if the declarator is based on a Token named "name".
|
||||||
|
|
@ -161,7 +127,7 @@ class SymbolListBuilder : ASTVisitor
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
auto result = new Symbol;
|
auto result = new Symbol;
|
||||||
result.name = adt.name.text.idup;
|
result.name = adt.name.text;
|
||||||
result.line = adt.name.line;
|
result.line = adt.name.line;
|
||||||
result.col = adt.name.column;
|
result.col = adt.name.column;
|
||||||
parent.subs ~= result;
|
parent.subs ~= result;
|
||||||
|
|
@ -201,7 +167,7 @@ class SymbolListBuilder : ASTVisitor
|
||||||
|
|
||||||
final override void visit(const EnumDeclaration decl)
|
final override void visit(const EnumDeclaration decl)
|
||||||
{
|
{
|
||||||
// TODO-ctest: try to see if what dmd outputs as , "enum member" is handled.
|
//TODO-ctest: try to see if what dmd outputs as , "enum member" is handled.
|
||||||
namedVisitorImpl!(EnumDeclaration, SymbolType._class)(decl);
|
namedVisitorImpl!(EnumDeclaration, SymbolType._class)(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -242,7 +208,7 @@ class SymbolListBuilder : ASTVisitor
|
||||||
final override void visit(const MixinDeclaration decl)
|
final override void visit(const MixinDeclaration decl)
|
||||||
{
|
{
|
||||||
// TODO-cfeature: MixinDeclaration, just display the name of the mixed template.
|
// TODO-cfeature: MixinDeclaration, just display the name of the mixed template.
|
||||||
// the template might be implemented in another module so their ùeùbrs cant be displayed.
|
// the template might be implemented in another module so their cant be displayed.
|
||||||
}
|
}
|
||||||
|
|
||||||
final override void visit(const StructDeclaration decl)
|
final override void visit(const StructDeclaration decl)
|
||||||
|
|
|
||||||
|
|
@ -225,6 +225,7 @@ void main(string[] args)
|
||||||
|
|
||||||
// samples for testing the program as a runnable ('Compile and runfile ...') with '<CFF>'
|
// samples for testing the program as a runnable ('Compile and runfile ...') with '<CFF>'
|
||||||
|
|
||||||
|
// fixme-p8: èuèuuè``u`èuùè
|
||||||
// fixme-p8: fixme also handled
|
// fixme-p8: fixme also handled
|
||||||
// TODO-cINVALID_because_no_content:
|
// TODO-cINVALID_because_no_content:
|
||||||
// TODO: set this property as const() to set it read only.
|
// TODO: set this property as const() to set it read only.
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,11 @@ type
|
||||||
*)
|
*)
|
||||||
procedure processOutputToStrings(aProcess: TProcess; var aList: TStringList);
|
procedure processOutputToStrings(aProcess: TProcess; var aList: TStringList);
|
||||||
|
|
||||||
|
(**
|
||||||
|
* Copy available process output to a stream.
|
||||||
|
*)
|
||||||
|
procedure processOutputToStream(aProcess: TProcess; output: TMemoryStream);
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* Terminates and frees aProcess;
|
* Terminates and frees aProcess;
|
||||||
*)
|
*)
|
||||||
|
|
@ -810,6 +815,25 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure processOutputToStream(aProcess: TProcess; output: TMemoryStream);
|
||||||
|
var
|
||||||
|
sum, cnt: Integer;
|
||||||
|
const
|
||||||
|
buffSz = 2048;
|
||||||
|
begin
|
||||||
|
if not (poUsePipes in aProcess.Options) then
|
||||||
|
exit;
|
||||||
|
//
|
||||||
|
sum := output.Size;
|
||||||
|
while aProcess.Output.NumBytesAvailable <> 0 do begin
|
||||||
|
output.SetSize(sum + buffSz);
|
||||||
|
cnt := aProcess.Output.Read((output.Memory + sum)^, buffSz);
|
||||||
|
sum += cnt;
|
||||||
|
end;
|
||||||
|
output.SetSize(sum);
|
||||||
|
output.Position := sum;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure killProcess(var aProcess: TAsyncProcess);
|
procedure killProcess(var aProcess: TAsyncProcess);
|
||||||
begin
|
begin
|
||||||
if aProcess = nil then
|
if aProcess = nil then
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,7 @@ type
|
||||||
fAutoRefresh: boolean;
|
fAutoRefresh: boolean;
|
||||||
fRefreshOnChange: boolean;
|
fRefreshOnChange: boolean;
|
||||||
fRefreshOnFocus: boolean;
|
fRefreshOnFocus: boolean;
|
||||||
|
fToolOutput: TMemoryStream;
|
||||||
ndAlias, ndClass, ndEnum, ndFunc, ndUni: TTreeNode;
|
ndAlias, ndClass, ndEnum, ndFunc, ndUni: TTreeNode;
|
||||||
ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
|
ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
|
||||||
procedure TreeDblClick(Sender: TObject);
|
procedure TreeDblClick(Sender: TObject);
|
||||||
|
|
@ -106,7 +107,8 @@ type
|
||||||
procedure clearTree;
|
procedure clearTree;
|
||||||
//
|
//
|
||||||
procedure callToolProc;
|
procedure callToolProc;
|
||||||
procedure symbolListProduced(sender: TObject);
|
procedure toolOutputData(sender: TObject);
|
||||||
|
procedure toolTerminated(sender: TObject);
|
||||||
//
|
//
|
||||||
procedure optget_AutoRefresh(aWriter: TWriter);
|
procedure optget_AutoRefresh(aWriter: TWriter);
|
||||||
procedure optset_AutoRefresh(aReader: TReader);
|
procedure optset_AutoRefresh(aReader: TReader);
|
||||||
|
|
@ -239,6 +241,7 @@ begin
|
||||||
inherited;
|
inherited;
|
||||||
// allow empty name if owner is nil
|
// allow empty name if owner is nil
|
||||||
fSyms := TSymbolList.create(nil);
|
fSyms := TSymbolList.create(nil);
|
||||||
|
fToolOutput := TMemoryStream.create;
|
||||||
//
|
//
|
||||||
ndAlias := Tree.Items[0];
|
ndAlias := Tree.Items[0];
|
||||||
ndClass := Tree.Items[1];
|
ndClass := Tree.Items[1];
|
||||||
|
|
@ -271,6 +274,7 @@ begin
|
||||||
EntitiesConnector.removeObserver(self);
|
EntitiesConnector.removeObserver(self);
|
||||||
//
|
//
|
||||||
killProcess(fToolProc);
|
killProcess(fToolProc);
|
||||||
|
fToolOutput.free;
|
||||||
fSyms.Free;
|
fSyms.Free;
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
@ -517,8 +521,8 @@ begin
|
||||||
fToolProc.ShowWindow := swoHIDE;
|
fToolProc.ShowWindow := swoHIDE;
|
||||||
fToolProc.Options := [poUsePipes];
|
fToolProc.Options := [poUsePipes];
|
||||||
fToolProc.Executable := 'cesyms';
|
fToolProc.Executable := 'cesyms';
|
||||||
fToolProc.OnTerminate := @symbolListProduced;
|
fToolProc.OnTerminate := @toolTerminated;
|
||||||
fToolProc.OnReadData := @symbolListProduced;
|
fToolProc.OnReadData := @toolOutputData;
|
||||||
fToolProc.CurrentDirectory := ExtractFileDir(Application.ExeName);
|
fToolProc.CurrentDirectory := ExtractFileDir(Application.ExeName);
|
||||||
|
|
||||||
// focused source
|
// focused source
|
||||||
|
|
@ -531,13 +535,14 @@ begin
|
||||||
fToolProc.Execute;
|
fToolProc.Execute;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCESymbolListWidget.symbolListProduced(sender: TObject);
|
procedure TCESymbolListWidget.toolOutputData(sender: TObject);
|
||||||
|
begin
|
||||||
|
processOutputToStream(TProcess(sender), fToolOutput);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCESymbolListWidget.toolTerminated(sender: TObject);
|
||||||
var
|
var
|
||||||
cnt, sum: Integer;
|
|
||||||
str: TmemoryStream;
|
|
||||||
i: Integer;
|
i: Integer;
|
||||||
const
|
|
||||||
buffSz = 1024;
|
|
||||||
//
|
//
|
||||||
procedure symbolToTreeNode(sym: TSymbol);
|
procedure symbolToTreeNode(sym: TSymbol);
|
||||||
var
|
var
|
||||||
|
|
@ -573,23 +578,12 @@ begin
|
||||||
updateVisibleCat;
|
updateVisibleCat;
|
||||||
if fDoc = nil then exit;
|
if fDoc = nil then exit;
|
||||||
//
|
//
|
||||||
sum := 0;
|
processOutputToStream(TProcess(sender), fToolOutput);
|
||||||
str := TMemoryStream.Create;
|
fToolOutput.Position := 0;
|
||||||
try
|
fSyms.LoadFromTool(fToolOutput);
|
||||||
while fToolProc.Output.NumBytesAvailable <> 0 do begin
|
|
||||||
str.SetSize(sum + buffSz);
|
|
||||||
cnt := fToolProc.Output.Read((str.Memory + sum)^, buffSz);
|
|
||||||
sum += cnt;
|
|
||||||
end;
|
|
||||||
str.SetSize(sum);
|
|
||||||
str.Position := 0;
|
|
||||||
//str.SaveToFile('C:\symlist.txt');
|
|
||||||
fSyms.LoadFromTool(str);
|
|
||||||
finally
|
|
||||||
str.Free;
|
|
||||||
end;
|
|
||||||
fToolProc.OnTerminate := nil;
|
fToolProc.OnTerminate := nil;
|
||||||
fToolProc.OnReadData := nil;
|
fToolProc.OnReadData := nil;
|
||||||
|
fToolOutput.Clear;
|
||||||
//
|
//
|
||||||
tree.BeginUpdate;
|
tree.BeginUpdate;
|
||||||
for i := 0 to fSyms.symbols.Count-1 do
|
for i := 0 to fSyms.symbols.Count-1 do
|
||||||
|
|
|
||||||
|
|
@ -79,11 +79,12 @@ type
|
||||||
procedure handleListClick(Sender: TObject);
|
procedure handleListClick(Sender: TObject);
|
||||||
procedure mnuAutoRefreshClick(Sender: TObject);
|
procedure mnuAutoRefreshClick(Sender: TObject);
|
||||||
private
|
private
|
||||||
|
fToolOutput: TMemoryStream;
|
||||||
fAutoRefresh: Boolean;
|
fAutoRefresh: Boolean;
|
||||||
fSingleClick: Boolean;
|
fSingleClick: Boolean;
|
||||||
fProj: TCEProject;
|
fProj: TCEProject;
|
||||||
fDoc: TCESynMemo;
|
fDoc: TCESynMemo;
|
||||||
fToolProcess: TCheckedAsyncProcess;
|
fToolProc: TCheckedAsyncProcess;
|
||||||
fTodos: TTodoItems;
|
fTodos: TTodoItems;
|
||||||
fMsgs: ICEMessagesDisplay;
|
fMsgs: ICEMessagesDisplay;
|
||||||
fOptions: TCETodoOptions;
|
fOptions: TCETodoOptions;
|
||||||
|
|
@ -107,7 +108,8 @@ type
|
||||||
function getContext: TTodoContext;
|
function getContext: TTodoContext;
|
||||||
procedure killToolProcess;
|
procedure killToolProcess;
|
||||||
procedure callToolProcess;
|
procedure callToolProcess;
|
||||||
procedure procOutput(sender: TObject);
|
procedure toolTerminated(sender: TObject);
|
||||||
|
procedure toolOutputData(sender: TObject);
|
||||||
procedure procOutputDbg(sender: TObject);
|
procedure procOutputDbg(sender: TObject);
|
||||||
procedure clearTodoList;
|
procedure clearTodoList;
|
||||||
procedure fillTodoList;
|
procedure fillTodoList;
|
||||||
|
|
@ -193,6 +195,7 @@ var
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
//
|
//
|
||||||
|
fToolOutput := TMemoryStream.Create;
|
||||||
fOptions := TCETodoOptions.Create(self);
|
fOptions := TCETodoOptions.Create(self);
|
||||||
fOptions.autoRefresh := true;
|
fOptions.autoRefresh := true;
|
||||||
fOptions.Name := 'todolistOptions';
|
fOptions.Name := 'todolistOptions';
|
||||||
|
|
@ -230,6 +233,7 @@ destructor TCETodoListWidget.destroy;
|
||||||
begin
|
begin
|
||||||
fOptions.saveToFile(getCoeditDocPath + OptFname);
|
fOptions.saveToFile(getCoeditDocPath + OptFname);
|
||||||
killToolProcess;
|
killToolProcess;
|
||||||
|
fToolOutput.Free;
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -364,11 +368,11 @@ end;
|
||||||
|
|
||||||
procedure TCETodoListWidget.killToolProcess;
|
procedure TCETodoListWidget.killToolProcess;
|
||||||
begin
|
begin
|
||||||
if fToolProcess = nil then exit;
|
if fToolProc = nil then exit;
|
||||||
//
|
//
|
||||||
fToolProcess.Terminate(0);
|
fToolProc.Terminate(0);
|
||||||
fToolProcess.Free;
|
fToolProc.Free;
|
||||||
fToolProcess := nil;
|
fToolProc := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCETodoListWidget.callToolProcess;
|
procedure TCETodoListWidget.callToolProcess;
|
||||||
|
|
@ -382,26 +386,19 @@ begin
|
||||||
//
|
//
|
||||||
killToolProcess;
|
killToolProcess;
|
||||||
// process parameter
|
// process parameter
|
||||||
fToolProcess := TCheckedAsyncProcess.Create(nil);
|
fToolProc := TCheckedAsyncProcess.Create(nil);
|
||||||
fToolProcess.Executable := ToolExeName;
|
fToolProc.Executable := ToolExeName;
|
||||||
fToolProcess.Options := [poUsePipes];
|
fToolProc.Options := [poUsePipes];
|
||||||
fToolProcess.ShowWindow := swoHIDE;
|
fToolProc.ShowWindow := swoHIDE;
|
||||||
fToolProcess.CurrentDirectory := ExtractFileDir(Application.ExeName);
|
fToolProc.CurrentDirectory := ExtractFileDir(Application.ExeName);
|
||||||
|
fToolProc.OnTerminate := @toolTerminated;
|
||||||
// Something not quite clear:
|
fToolProc.OnReadData := @toolOutputData;
|
||||||
// --------------------------
|
|
||||||
// actually the two events can be called, depending
|
|
||||||
// on the amount of data in the output.
|
|
||||||
// many: OnReadData is called.
|
|
||||||
// few: OnTerminate is called.
|
|
||||||
fToolProcess.OnTerminate := @procOutput;
|
|
||||||
fToolProcess.OnReadData := @procOutput;
|
|
||||||
|
|
||||||
// files passed to the tool argument
|
// files passed to the tool argument
|
||||||
if ctxt = tcProject then fToolProcess.Parameters.AddText(symbolExpander.get('<CPFS>'))
|
if ctxt = tcProject then fToolProc.Parameters.AddText(symbolExpander.get('<CPFS>'))
|
||||||
else fToolProcess.Parameters.Add(symbolExpander.get('<CFF>'));
|
else fToolProc.Parameters.Add(symbolExpander.get('<CFF>'));
|
||||||
//
|
//
|
||||||
fToolProcess.Execute;
|
fToolProc.Execute;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCETodoListWidget.procOutputDbg(sender: TObject);
|
procedure TCETodoListWidget.procOutputDbg(sender: TObject);
|
||||||
|
|
@ -413,7 +410,7 @@ begin
|
||||||
getMessageDisplay(fMsgs);
|
getMessageDisplay(fMsgs);
|
||||||
str := TStringList.Create;
|
str := TStringList.Create;
|
||||||
try
|
try
|
||||||
processOutputToStrings(fToolProcess, str);
|
processOutputToStrings(fToolProc, str);
|
||||||
ctxt := getContext;
|
ctxt := getContext;
|
||||||
for msg in str do case ctxt of
|
for msg in str do case ctxt of
|
||||||
tcNone: fMsgs.message(msg, nil, amcMisc, amkAuto);
|
tcNone: fMsgs.message(msg, nil, amcMisc, amkAuto);
|
||||||
|
|
@ -425,29 +422,22 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCETodoListWidget.procOutput(sender: TObject);
|
procedure TCETodoListWidget.toolOutputData(sender: TObject);
|
||||||
var
|
|
||||||
str: TMemoryStream;
|
|
||||||
cnt: Integer;
|
|
||||||
sum: Integer;
|
|
||||||
const
|
|
||||||
buffSz = 1024;
|
|
||||||
begin
|
begin
|
||||||
sum := 0;
|
processOutputToStream(fToolProc, fToolOutput);
|
||||||
str := TMemoryStream.Create;
|
end;
|
||||||
try
|
|
||||||
while fToolProcess.Output.NumBytesAvailable <> 0 do begin
|
procedure TCETodoListWidget.toolTerminated(sender: TObject);
|
||||||
str.SetSize(sum + buffSz);
|
begin
|
||||||
cnt := fToolProcess.Output.Read((str.Memory + sum)^, buffSz);
|
processOutputToStream(fToolProc, fToolOutput);
|
||||||
sum += cnt;
|
fToolOutput.Position := 0;
|
||||||
end;
|
//TODO-cbugfix: UTF chars in TODO comments bug either in the widget or the tool, symptom: empty todo list, conditions: to determine.
|
||||||
str.SetSize(sum);
|
//fToolOutput.SaveToFile('C:\cetodo_widgetside.txt');
|
||||||
str.Position := 0;
|
fTodos.loadFromTxtStream(fToolOutput);
|
||||||
fTodos.loadFromTxtStream(str);
|
fillTodoList;
|
||||||
fillTodoList;
|
fToolProc.OnTerminate := nil;
|
||||||
finally
|
fToolProc.OnReadData := nil;
|
||||||
str.Free;
|
fToolOutput.Clear;
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCETodoListWidget.clearTodoList;
|
procedure TCETodoListWidget.clearTodoList;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue