symlist, allow typing to editor after selecting a node and refresh style

This commit is contained in:
Basile Burg 2018-05-14 15:27:36 +02:00
parent c33b16518b
commit 28ba843430
1 changed files with 131 additions and 119 deletions

View File

@ -70,7 +70,6 @@ type
public public
constructor create(aOwner: TCOmponent); override; constructor create(aOwner: TCOmponent); override;
destructor destroy; override; destructor destroy; override;
//
procedure LoadFromTool(str: TStream); procedure LoadFromTool(str: TStream);
end; end;
@ -103,8 +102,6 @@ type
procedure AssignTo(Dest: TPersistent); override; procedure AssignTo(Dest: TPersistent); override;
end; end;
{ TCESymbolListWidget }
TCESymbolListWidget = class(TCEWidget, ICEDocumentObserver, ICEEditableOptions) TCESymbolListWidget = class(TCEWidget, ICEDocumentObserver, ICEEditableOptions)
btnRefresh: TCEToolButton; btnRefresh: TCEToolButton;
Tree: TTreeView; Tree: TTreeView;
@ -151,16 +148,16 @@ type
procedure updateVisibleCat; procedure updateVisibleCat;
procedure clearTree; procedure clearTree;
procedure smartExpand; procedure smartExpand;
//
procedure checkIfHasToolExe; procedure checkIfHasToolExe;
procedure callToolProc; procedure callToolProc;
procedure toolTerminated(sender: TObject); procedure toolTerminated(sender: TObject);
//
procedure docNew(document: TCESynMemo); procedure docNew(document: TCESynMemo);
procedure docClosing(document: TCESynMemo); procedure docClosing(document: TCESynMemo);
procedure docFocused(document: TCESynMemo); procedure docFocused(document: TCESynMemo);
procedure docChanged(document: TCESynMemo); procedure docChanged(document: TCESynMemo);
//
function optionedWantCategory(): string; function optionedWantCategory(): string;
function optionedWantEditorKind: TOptionEditorKind; function optionedWantEditorKind: TOptionEditorKind;
function optionedWantContainer: TPersistent; function optionedWantContainer: TPersistent;
@ -168,11 +165,11 @@ type
function optionedOptionsModified: boolean; function optionedOptionsModified: boolean;
protected protected
procedure updateDelayed; override; procedure updateDelayed; override;
//
function contextName: string; override; function contextName: string; override;
function contextActionCount: integer; override; function contextActionCount: integer; override;
function contextAction(index: integer): TAction; override; function contextAction(index: integer): TAction; override;
//
procedure SetVisible(value: boolean); override; procedure SetVisible(value: boolean); override;
procedure setToolBarFlat(value: boolean); override; procedure setToolBarFlat(value: boolean); override;
published published
@ -277,7 +274,7 @@ begin
if Source is TCESymbolListWidget then if Source is TCESymbolListWidget then
begin begin
widg := TCESymbolListWidget(Source); widg := TCESymbolListWidget(Source);
//
fDeep := widg.fDeep; fDeep := widg.fDeep;
fAutoRefreshDelay := widg.updaterByDelayDuration; fAutoRefreshDelay := widg.updaterByDelayDuration;
fRefreshOnFocus := widg.fRefreshOnFocus; fRefreshOnFocus := widg.fRefreshOnFocus;
@ -499,7 +496,8 @@ end;
procedure TCESymbolListWidget.actRefreshExecute(Sender: TObject); procedure TCESymbolListWidget.actRefreshExecute(Sender: TObject);
begin begin
if Updating then exit; if Updating then
exit;
callToolProc; callToolProc;
end; end;
@ -547,7 +545,8 @@ end;
procedure TCESymbolListWidget.optionedEvent(event: TOptionEditorEvent); procedure TCESymbolListWidget.optionedEvent(event: TOptionEditorEvent);
begin begin
if event <> oeeAccept then exit; if event <> oeeAccept then
exit;
fOptions.AssignTo(self); fOptions.AssignTo(self);
callToolProc; callToolProc;
end; end;
@ -567,7 +566,9 @@ end;
procedure TCESymbolListWidget.docClosing(document: TCESynMemo); procedure TCESymbolListWidget.docClosing(document: TCESynMemo);
begin begin
if fDoc <> document then exit; if fDoc <> document then
exit;
fDoc := nil; fDoc := nil;
clearTree; clearTree;
updateVisibleCat; updateVisibleCat;
@ -575,22 +576,26 @@ end;
procedure TCESymbolListWidget.docFocused(document: TCESynMemo); procedure TCESymbolListWidget.docFocused(document: TCESynMemo);
begin begin
if fDoc = document then exit; if fDoc = document then
exit;
fDoc := document; fDoc := document;
if not Visible then exit; if not Visible then
// exit;
if fAutoRefresh then beginDelayedUpdate if fAutoRefresh then beginDelayedUpdate
else if fRefreshOnFocus then callToolProc; else if fRefreshOnFocus then callToolProc;
end; end;
procedure TCESymbolListWidget.docChanged(document: TCESynMemo); procedure TCESymbolListWidget.docChanged(document: TCESynMemo);
begin begin
if fDoc <> document then exit; if (fDoc <> document) or not Visible then
if not Visible then exit; exit;
//
if fAutoRefresh then beginDelayedUpdate if fAutoRefresh then
else if fRefreshOnChange then callToolProc; beginDelayedUpdate
// else if fRefreshOnChange then
callToolProc;
if fSmartExpander then if fSmartExpander then
smartExpand; smartExpand;
end; end;
@ -679,8 +684,9 @@ end;
function TCESymbolListWidget.TreeFilterEdit1FilterItem(Item: TObject; out function TCESymbolListWidget.TreeFilterEdit1FilterItem(Item: TObject; out
Done: Boolean): Boolean; Done: Boolean): Boolean;
begin begin
if not fSmartFilter then exit(false); if not fSmartFilter then
// exit(false);
if TreeFilterEdit1.Filter.isNotEmpty then if TreeFilterEdit1.Filter.isNotEmpty then
tree.FullExpand tree.FullExpand
else if tree.Selected.isNil then else if tree.Selected.isNil then
@ -691,27 +697,29 @@ end;
procedure TCESymbolListWidget.TreeFilterEdit1MouseEnter(Sender: TObject); procedure TCESymbolListWidget.TreeFilterEdit1MouseEnter(Sender: TObject);
begin begin
if not fSmartFilter then exit; if not fSmartFilter then
// exit;
tree.Selected := nil; tree.Selected := nil;
end; end;
procedure TCESymbolListWidget.TreeKeyPress(Sender: TObject; var Key: char); procedure TCESymbolListWidget.TreeKeyPress(Sender: TObject; var Key: char);
begin begin
if Key = #13 then TreeDblClick(nil); if Key = #13 then
TreeDblClick(nil);
end; end;
procedure TCESymbolListWidget.TreeDblClick(Sender: TObject); procedure TCESymbolListWidget.TreeDblClick(Sender: TObject);
var var
line: NativeUint; line: PtrUInt;
begin begin
if fDoc.isNil then exit; if fDoc.isNil or Tree.Selected.isNil or Tree.Selected.Data.isNil then
if Tree.Selected.isNil then exit; exit;
if Tree.Selected.Data.isNil then exit;
//
{$PUSH}{$WARNINGS OFF}{$HINTS OFF} {$PUSH}{$WARNINGS OFF}{$HINTS OFF}
line := NativeUInt(Tree.Selected.Data); line := NativeUInt(Tree.Selected.Data);
{$POP} {$POP}
fDoc.setFocus;
fDoc.CaretY := line; fDoc.CaretY := line;
fDoc.SelectLine; fDoc.SelectLine;
end; end;
@ -726,15 +734,16 @@ procedure TCESymbolListWidget.callToolProc;
var var
str: string; str: string;
begin begin
if not fHasToolExe then exit; if not fHasToolExe or fDoc.isNil then
if fDoc.isNil then exit; exit;
if (fDoc.Lines.Count = 0) or not fDoc.isDSource then if (fDoc.Lines.Count = 0) or not fDoc.isDSource then
begin begin
clearTree; clearTree;
updateVisibleCat; updateVisibleCat;
exit; exit;
end; end;
//
killProcess(fToolProc); killProcess(fToolProc);
fToolProc := TCEProcess.Create(nil); fToolProc := TCEProcess.Create(nil);
fToolProc.ShowWindow := swoHIDE; fToolProc.ShowWindow := swoHIDE;
@ -752,9 +761,8 @@ begin
end; end;
procedure TCESymbolListWidget.toolTerminated(sender: TObject); procedure TCESymbolListWidget.toolTerminated(sender: TObject);
//
function getCatNode(node: TTreeNode; stype: TSymbolType ): TTreeNode; function getCatNode(node: TTreeNode; stype: TSymbolType ): TTreeNode;
//
function newCat(const aCat: string): TTreeNode; function newCat(const aCat: string): TTreeNode;
begin begin
result := node.FindNode(aCat); result := node.FindNode(aCat);
@ -777,8 +785,8 @@ function getCatNode(node: TTreeNode; stype: TSymbolType ): TTreeNode;
_error : begin result.ImageIndex:=9; result.SelectedIndex:=9; end; _error : begin result.ImageIndex:=9; result.SelectedIndex:=9; end;
end; end;
end; end;
//
begin begin
result := nil; result := nil;
if node.isNil then case stype of if node.isNil then case stype of
_alias : exit(ndAlias); _alias : exit(ndAlias);
@ -811,14 +819,14 @@ begin
_warning: exit(ndWarn); _warning: exit(ndWarn);
_error: exit(ndErr); _error: exit(ndErr);
end; end;
end; end;
//
procedure symbolToTreeNode(origin: TTreenode; sym: TSymbol); procedure symbolToTreeNode(origin: TTreenode; sym: TSymbol);
var var
cat: TTreeNode; cat: TTreeNode;
node: TTreeNode; node: TTreeNode;
i: Integer; i: Integer;
begin begin
cat := getCatNode(origin, sym.symType); cat := getCatNode(origin, sym.symType);
{$PUSH}{$WARNINGS OFF}{$HINTS OFF} {$PUSH}{$WARNINGS OFF}{$HINTS OFF}
node := tree.Items.AddChildObject(cat, sym.name, Pointer(sym.fline)); node := tree.Items.AddChildObject(cat, sym.name, Pointer(sym.fline));
@ -830,23 +838,26 @@ begin
cat.Visible:=true; cat.Visible:=true;
for i := 0 to sym.subs.Count-1 do for i := 0 to sym.subs.Count-1 do
symbolToTreeNode(node, sym.subs[i]); symbolToTreeNode(node, sym.subs[i]);
end; end;
//
var var
i: Integer; i: Integer;
flt: string; flt: string;
begin begin
if ndAlias.isNil then exit; if ndAlias.isNil then
exit;
clearTree; clearTree;
updateVisibleCat; updateVisibleCat;
if fDoc.isNil then exit; if fDoc.isNil then
// exit;
fToolProc.OnTerminate := nil; fToolProc.OnTerminate := nil;
fToolProc.OnReadData := nil; fToolProc.OnReadData := nil;
fToolProc.OutputStack.Position:=0; fToolProc.OutputStack.Position:=0;
if fToolProc.OutputStack.Size = 0 then exit; if fToolProc.OutputStack.Size = 0 then
exit;
fSyms.LoadFromTool(fToolProc.OutputStack); fSyms.LoadFromTool(fToolProc.OutputStack);
//
flt := TreeFilterEdit1.Filter; flt := TreeFilterEdit1.Filter;
TreeFilterEdit1.Text := ''; TreeFilterEdit1.Text := '';
tree.BeginUpdate; tree.BeginUpdate;
@ -906,8 +917,9 @@ var
end; end;
begin begin
if fDoc.isNil then exit; if fDoc.isNil then
// exit;
target := fDoc.CaretY; target := fDoc.CaretY;
for i := 0 to tree.Items.Count-1 do for i := 0 to tree.Items.Count-1 do
look(tree.Items[i]); look(tree.Items[i]);