added editable symbol list option

This commit is contained in:
Basile Burg 2015-02-25 12:50:39 +01:00
parent 2c8182223f
commit 3bf6ba9264
3 changed files with 212 additions and 91 deletions

View File

@ -167,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);
} }
@ -208,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 cant be displayed. // the template might be implemented in another module so its members cant be displayed.
} }
final override void visit(const StructDeclaration decl) final override void visit(const StructDeclaration decl)

View File

@ -40,17 +40,17 @@ inherited CESymbolListWidget: TCESymbolListWidget
Items.Data = { Items.Data = {
F9FFFFFF02000B000000000000000000000000000000FFFFFFFF000000000000 F9FFFFFF02000B000000000000000000000000000000FFFFFFFF000000000000
00000005000000416C696173010000000100000001000000FFFFFFFF00000000 00000005000000416C696173010000000100000001000000FFFFFFFF00000000
000000000007000000436C6173736573020000000200000002000000FFFFFFFF 000000000005000000436C617373020000000200000002000000FFFFFFFF0000
00000000000000000005000000456E756D73030000000300000003000000FFFF 0000000000000004000000456E756D030000000300000003000000FFFFFFFF00
FFFF0000000000000000000800000046756E6374696F6E040000000400000004 00000000000000000800000046756E6374696F6E040000000400000004000000
000000FFFFFFFF00000000000000000007000000496D706F7274730500000005 FFFFFFFF00000000000000000006000000496D706F7274050000000500000005
00000005000000FFFFFFFF00000000000000000009000000496E746572666163 000000FFFFFFFF00000000000000000009000000496E74657266616365060000
65060000000600000006000000FFFFFFFF000000000000000000050000004D69 000600000006000000FFFFFFFF000000000000000000050000004D6978696E07
78696E070000000700000007000000FFFFFFFF00000000000000000007000000 0000000700000007000000FFFFFFFF0000000000000000000600000053747275
53747275637473080000000800000008000000FFFFFFFF000000000000000000 6374080000000800000008000000FFFFFFFF0000000000000000000800000054
0900000054656D706C61746573000000000000000000000000FFFFFFFF000000 656D706C617465000000000000000000000000FFFFFFFF000000000000000000
00000000000005000000556E696F6E010000000100000001000000FFFFFFFF00 05000000556E696F6E010000000100000001000000FFFFFFFF00000000000000
0000000000000000080000005661726961626C65 0000080000005661726961626C65
} }
TreeLineColor = 14671839 TreeLineColor = 14671839
TreeLinePenStyle = psSolid TreeLinePenStyle = psSolid
@ -103,7 +103,7 @@ inherited CESymbolListWidget: TCESymbolListWidget
top = 48 top = 48
end end
object imgList: TImageList[2] object imgList: TImageList[2]
left = 80 left = 152
top = 48 top = 48
Bitmap = { Bitmap = {
4C69090000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 4C69090000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF

View File

@ -6,8 +6,8 @@ interface
uses uses
Classes, SysUtils, TreeFilterEdit, Forms, Controls, Graphics, ExtCtrls, Menus, Classes, SysUtils, TreeFilterEdit, Forms, Controls, Graphics, ExtCtrls, Menus,
ComCtrls, ce_widget, jsonparser, process, actnlist, Buttons, Clipbrd, ComCtrls, ce_widget, jsonparser, process, actnlist, Buttons, Clipbrd, LCLProc,
ce_common, ce_observer, ce_synmemo, ce_interfaces, LCLProc; ce_common, ce_observer, ce_synmemo, ce_interfaces, ce_writableComponent;
type type
@ -70,7 +70,26 @@ type
procedure LoadFromTool(str: TStream); procedure LoadFromTool(str: TStream);
end; end;
TCESymbolListWidget = class(TCEWidget, ICEMultiDocObserver) TCESymbolListOptions = class(TWritableLfmTextComponent)
private
fAutoRefresh: boolean;
fRefreshOnChange: boolean;
fRefreshOnFocus: boolean;
fShowChildCategories: boolean;
fAutoRefreshDelay: Integer;
published
property autoRefresh: boolean read fAutoRefresh write fAutoRefresh;
property refreshOnChange: boolean read fRefreshOnChange write fRefreshOnChange;
property refreshOnFocus: boolean read fRefreshOnFocus write fRefreshOnFocus default true;
property showChildCategories: boolean read fShowChildCategories write fShowChildCategories default true;
property autoRefreshDelay: Integer read fAutoRefreshDelay write fAutoRefreshDelay default 1500;
public
constructor Create(AOwner: TComponent); override;
procedure Assign(Source: TPersistent); override;
procedure AssignTo(Dest: TPersistent); override;
end;
TCESymbolListWidget = class(TCEWidget, ICEMultiDocObserver, ICEEditableOptions)
btnRefresh: TBitBtn; btnRefresh: TBitBtn;
imgList: TImageList; imgList: TImageList;
Panel1: TPanel; Panel1: TPanel;
@ -81,6 +100,7 @@ type
procedure TreeFilterEdit1AfterFilter(Sender: TObject); procedure TreeFilterEdit1AfterFilter(Sender: TObject);
procedure TreeKeyPress(Sender: TObject; var Key: char); procedure TreeKeyPress(Sender: TObject; var Key: char);
private private
fOptions: TCESymbolListOptions;
fSyms: TSymbolList; fSyms: TSymbolList;
fMsgs: ICEMessagesDisplay; fMsgs: ICEMessagesDisplay;
fToolProc: TCheckedAsyncProcess; fToolProc: TCheckedAsyncProcess;
@ -94,6 +114,7 @@ type
fAutoRefresh: boolean; fAutoRefresh: boolean;
fRefreshOnChange: boolean; fRefreshOnChange: boolean;
fRefreshOnFocus: boolean; fRefreshOnFocus: boolean;
fShowChildCategories: boolean;
fToolOutput: TMemoryStream; 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;
@ -110,22 +131,18 @@ type
procedure toolOutputData(sender: TObject); procedure toolOutputData(sender: TObject);
procedure toolTerminated(sender: TObject); procedure toolTerminated(sender: TObject);
// //
procedure optget_AutoRefresh(aWriter: TWriter);
procedure optset_AutoRefresh(aReader: TReader);
procedure optget_RefreshOnChange(aWriter: TWriter);
procedure optset_RefreshOnChange(aReader: TReader);
procedure optget_RefreshOnFocus(aWriter: TWriter);
procedure optset_RefreshOnFocus(aReader: TReader);
//
procedure docNew(aDoc: TCESynMemo); procedure docNew(aDoc: TCESynMemo);
procedure docClosing(aDoc: TCESynMemo); procedure docClosing(aDoc: TCESynMemo);
procedure docFocused(aDoc: TCESynMemo); procedure docFocused(aDoc: TCESynMemo);
procedure docChanged(aDoc: TCESynMemo); procedure docChanged(aDoc: TCESynMemo);
//
function optionedWantCategory(): string;
function optionedWantEditorKind: TOptionEditorKind;
function optionedWantContainer: TPersistent;
procedure optionedEvent(anEvent: TOptionEditorEvent);
protected protected
procedure UpdateByDelay; override; procedure UpdateByDelay; override;
// //
procedure sesoptDeclareProperties(aFiler: TFiler); 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;
@ -143,6 +160,9 @@ type
implementation implementation
{$R *.lfm} {$R *.lfm}
const
OptsFname = 'symbollist.txt';
{$REGION Serializable symbols---------------------------------------------------} {$REGION Serializable symbols---------------------------------------------------}
constructor TSymbol.create(ACollection: TCollection); constructor TSymbol.create(ACollection: TCollection);
begin begin
@ -204,10 +224,59 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION TCESymbolListOptions --------------------------------------------------}
constructor TCESymbolListOptions.Create(AOwner: TComponent);
begin
inherited;
fRefreshOnFocus := true;
fShowChildCategories := true;
fAutoRefreshDelay := 1500;
end;
procedure TCESymbolListOptions.Assign(Source: TPersistent);
var
widg: TCESymbolListWidget;
begin
if Source is TCESymbolListWidget then
begin
widg := TCESymbolListWidget(Source);
//
fAutoRefreshDelay := widg.updaterByDelayDuration;
fRefreshOnFocus := widg.fRefreshOnFocus;
fRefreshOnChange := widg.fRefreshOnChange;
fAutoRefresh := widg.fAutoRefresh;
fShowChildCategories := widg.fShowChildCategories;
end
else inherited;
end;
procedure TCESymbolListOptions.AssignTo(Dest: TPersistent);
var
widg: TCESymbolListWidget;
begin
if Dest is TCESymbolListWidget then
begin
widg := TCESymbolListWidget(Dest);
//
widg.updaterByDelayDuration := fAutoRefreshDelay;
widg.fRefreshOnFocus := fRefreshOnFocus;
widg.fRefreshOnChange := fRefreshOnChange;
widg.fAutoRefresh := fAutoRefresh;
widg.fShowChildCategories := fShowChildCategories;
//
widg.fActAutoRefresh.Checked := fAutoRefresh;
widg.fActRefreshOnChange.Checked:= fRefreshOnChange;
widg.fActRefreshOnFocus.Checked := fRefreshOnFocus;
end
else inherited;
end;
{$ENDREGIOn}
{$REGION Standard Comp/Obj------------------------------------------------------} {$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCESymbolListWidget.create(aOwner: TComponent); constructor TCESymbolListWidget.create(aOwner: TComponent);
var var
png: TPortableNetworkGraphic; png: TPortableNetworkGraphic;
fname: string;
begin begin
fAutoRefresh := false; fAutoRefresh := false;
fRefreshOnFocus := true; fRefreshOnFocus := true;
@ -243,6 +312,12 @@ begin
fSyms := TSymbolList.create(nil); fSyms := TSymbolList.create(nil);
fToolOutput := TMemoryStream.create; fToolOutput := TMemoryStream.create;
// //
fOptions := TCESymbolListOptions.Create(nil);
fname := getCoeditDocPath + OptsFname;
if FileExists(fname) then
fOptions.loadFromFile(fname);
fOptions.AssignTo(self);
//
ndAlias := Tree.Items[0]; ndAlias := Tree.Items[0];
ndClass := Tree.Items[1]; ndClass := Tree.Items[1];
ndEnum := Tree.Items[2]; ndEnum := Tree.Items[2];
@ -276,6 +351,10 @@ begin
killProcess(fToolProc); killProcess(fToolProc);
fToolOutput.free; fToolOutput.free;
fSyms.Free; fSyms.Free;
//
fOptions.saveToFile(getCoeditDocPath + OptsFname);
fOptions.Free;
//
inherited; inherited;
end; end;
@ -288,49 +367,6 @@ begin
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION ICESessionOptionsObserver ---------------------------------------------}
procedure TCESymbolListWidget.optget_AutoRefresh(aWriter: TWriter);
begin
aWriter.WriteBoolean(fAutoRefresh);
end;
procedure TCESymbolListWidget.optset_AutoRefresh(aReader: TReader);
begin
fAutoRefresh := aReader.ReadBoolean;
fActAutoRefresh.Checked := fAutoRefresh;
end;
procedure TCESymbolListWidget.optget_RefreshOnChange(aWriter: TWriter);
begin
aWriter.WriteBoolean(fRefreshOnChange);
end;
procedure TCESymbolListWidget.optset_RefreshOnChange(aReader: TReader);
begin
fRefreshOnChange := aReader.ReadBoolean;
fActRefreshOnChange.Checked := fRefreshOnChange;
end;
procedure TCESymbolListWidget.optget_RefreshOnFocus(aWriter: TWriter);
begin
aWriter.WriteBoolean(fRefreshOnFocus);
end;
procedure TCESymbolListWidget.optset_RefreshOnFocus(aReader: TReader);
begin
fRefreshOnFocus := aReader.ReadBoolean;
fActRefreshOnFocus.Checked := fRefreshOnFocus;
end;
procedure TCESymbolListWidget.sesoptDeclareProperties(aFiler: TFiler);
begin
inherited;
aFiler.DefineProperty(Name + '_AutoRefresh', @optset_AutoRefresh, @optget_AutoRefresh, true);
aFiler.DefineProperty(Name + '_RefreshOnChange', @optset_RefreshOnChange, @optget_RefreshOnChange, true);
aFiler.DefineProperty(Name + '_RefreshOnFocus', @optset_RefreshOnFocus, @optget_RefreshOnFocus, true);
end;
{$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------} {$REGION ICEContextualActions---------------------------------------------------}
function TCESymbolListWidget.contextName: string; function TCESymbolListWidget.contextName: string;
begin begin
@ -381,7 +417,31 @@ begin
if Tree.Selected = nil then exit; if Tree.Selected = nil then exit;
Clipboard.AsText:= Tree.Selected.Text; Clipboard.AsText:= Tree.Selected.Text;
end; end;
{$ENDREGION}
{$REGION ICEEditableOptions ----------------------------------------------------}
function TCESymbolListWidget.optionedWantCategory(): string;
begin
exit('Symbol list');
end;
function TCESymbolListWidget.optionedWantEditorKind: TOptionEditorKind;
begin
exit(oekGeneric);
end;
function TCESymbolListWidget.optionedWantContainer: TPersistent;
begin
fOptions.Assign(self);
exit(fOptions);
end;
procedure TCESymbolListWidget.optionedEvent(anEvent: TOptionEditorEvent);
begin
if anEvent <> oeeAccept then exit;
fOptions.AssignTo(self);
callToolProc;
end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEMultiDocObserver ---------------------------------------------------} {$REGION ICEMultiDocObserver ---------------------------------------------------}
@ -397,7 +457,6 @@ begin
fDoc := nil; fDoc := nil;
clearTree; clearTree;
updateVisibleCat; updateVisibleCat;
beginUpdateByDelay;
end; end;
procedure TCESymbolListWidget.docFocused(aDoc: TCESynMemo); procedure TCESymbolListWidget.docFocused(aDoc: TCESynMemo);
@ -541,37 +600,99 @@ begin
end; end;
procedure TCESymbolListWidget.toolTerminated(sender: TObject); procedure TCESymbolListWidget.toolTerminated(sender: TObject);
var
i: Integer;
// //
procedure symbolToTreeNode(sym: TSymbol); function getCatNode(node: TTreeNode; stype: TSymbolType ): TTreeNode;
begin
if node = nil then case stype of
_alias : exit(ndAlias);
_class : exit(ndClass);
_enum : exit(ndEnum);
_function : exit(ndFunc);
_import : exit(ndImp);
_interface: exit(ndIntf);
_mixin : exit(ndMix);
_struct : exit(ndStruct);
_template : exit(ndTmp);
_union : exit(ndUni);
_variable : exit(ndVar);
end else case stype of
_alias:
begin
result := node.FindNode('Alias');
if result = nil then result := node.TreeNodes.AddChild(node, 'Alias');
end;
_class:
begin
result := node.FindNode('Class');
if result = nil then result := node.TreeNodes.AddChild(node, 'Class');
end;
_enum:
begin
result := node.FindNode('Enum');
if result = nil then result := node.TreeNodes.AddChild(node, 'Enum');
end;
_function:
begin
result := node.FindNode('Function');
if result = nil then result := node.TreeNodes.AddChild(node, 'Function');
end;
_import:
begin
result := node.FindNode('Import');
if result = nil then result := node.TreeNodes.AddChild(node, 'Import');
end;
_interface:
begin
result := node.FindNode('Interface');
if result = nil then result := node.TreeNodes.AddChild(node, 'Interface');
end;
_mixin:
begin
result := node.FindNode('Mixin');
if result = nil then result := node.TreeNodes.AddChild(node, 'Mixin');
end;
_struct:
begin
result := node.FindNode('Struct');
if result = nil then result := node.TreeNodes.AddChild(node, 'Struct');
end;
_template:
begin
result := node.FindNode('Template');
if result = nil then result := node.TreeNodes.AddChild(node, 'Template');
end;
_union:
begin
result := node.FindNode('Union');
if result = nil then result := node.TreeNodes.AddChild(node, 'Union');
end;
_variable:
begin
result := node.FindNode('Variable');
if result = nil then result := node.TreeNodes.AddChild(node, 'Variable');
end;
end;
end;
//
procedure symbolToTreeNode(origin: TTreenode; sym: TSymbol);
var var
data: PInt64; data: PInt64;
cat: TTreeNode; cat: TTreeNode;
node: TTreeNode;
i: Integer; i: Integer;
begin begin
case sym.symType of cat := getCatNode(origin, sym.symType);
_alias : cat := ndAlias;
_class : cat := ndClass;
_enum : cat := ndEnum;
_function : cat := ndFunc;
_import : cat := ndImp;
_interface: cat := ndIntf;
_mixin : cat := ndMix;
_struct : cat := ndStruct;
_template : cat := ndTmp;
_union : cat := ndUni;
_variable : cat := ndVar;
end;
data := new(PInt64); data := new(PInt64);
data^ := sym.fline; data^ := sym.fline;
tree.Items.AddChildObject(cat, sym.name, data); node := tree.Items.AddChildObject(cat, sym.name, data);
if not fShowChildCategories then node := nil;
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(sym.subs[i]); symbolToTreeNode(node, sym.subs[i]);
end; end;
// //
var
i: Integer;
begin begin
if ndAlias = nil then exit; if ndAlias = nil then exit;
clearTree; clearTree;
@ -587,7 +708,7 @@ begin
// //
tree.BeginUpdate; tree.BeginUpdate;
for i := 0 to fSyms.symbols.Count-1 do for i := 0 to fSyms.symbols.Count-1 do
symbolToTreeNode(fSyms.symbols[i]); symbolToTreeNode(nil, fSyms.symbols[i]);
tree.EndUpdate; tree.EndUpdate;
end; end;
{$ENDREGION --------------------------------------------------------------------} {$ENDREGION --------------------------------------------------------------------}