diff --git a/packages/ide/fpsymbol.pas b/packages/ide/fpsymbol.pas index ec60306f49..4f91452af8 100644 --- a/packages/ide/fpsymbol.pas +++ b/packages/ide/fpsymbol.pas @@ -80,6 +80,22 @@ type end; + PFilteredSym = ^TFilteredSym; + TFilteredSym = Object(TObject) + constructor Init(AItemSym:Sw_Integer;ASym : PSymbol); + function GetText:String; + destructor Done;virtual; + private + Sym:PSymbol; + ItemSym : Sw_Integer; + end; + + PFilteredSymCollection=^TFilteredSymCollection; + TFilteredSymCollection = Object(TCollection) + function At(Index: sw_Integer): PFilteredSym; + end; + + PSymbolView = ^TSymbolView; TSymbolView = object(TLocalMenuListBox) constructor Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar); @@ -107,6 +123,7 @@ type constructor Init(var Bounds: TRect; ASymbols: PSymbolCollection; AHScrollBar, AVScrollBar: PScrollBar); destructor Done; virtual; procedure SetGDBCol; + procedure FilterSymbols(AFilter:boolean); function GetText(Item,MaxLen: Sw_Integer): String; virtual; procedure HandleEvent(var Event: TEvent); virtual; procedure Draw; virtual; @@ -114,6 +131,7 @@ type function GotoItem(Item: sw_integer): boolean; virtual; function TrackItem(Item: sw_integer; AutoTrack: boolean): boolean; virtual; private + FilteredSym: PFilteredSymCollection; Symbols: PSymbolCollection; SymbolsValue : PGDBValueCollection; LookupStr: string; @@ -604,6 +622,35 @@ function TGDBValueCollection.At(Index: sw_Integer): PGDBValue; begin At:= Inherited At(Index); end; + +{**************************************************************************** + TFilteredSym +****************************************************************************} +constructor TFilteredSym.Init(AItemSym:Sw_Integer;ASym : PSymbol); +begin + inherited Init; + ItemSym:=AItemSym; + Sym:=ASym; +end; + +function TFilteredSym.GetText:String; +begin + GetText:=Sym^.GetText; +end; + +destructor TFilteredSym.Done; +begin + inherited Done; +end; + +{**************************************************************************** + TFilteredSymCollection +****************************************************************************} +function TFilteredSymCollection.At(Index: sw_Integer): PFilteredSym; +begin + At:= Inherited At(Index); +end; + {**************************************************************************** TSymbolView ****************************************************************************} @@ -849,9 +896,11 @@ constructor TSymbolScopeView.Init(var Bounds: TRect; ASymbols: PSymbolCollection begin inherited Init(Bounds,AHScrollBar, AVScrollBar); Symbols:=ASymbols; - NewList(ASymbols); New(SymbolsValue,Init(50,50)); - SetRange(Symbols^.Count); + New(FilteredSym,Init(50,50)); + FilterSymbols(false); {select all} + NewList(FilteredSym); + SetRange(FilteredSym^.Count); end; destructor TSymbolScopeView.Done; @@ -867,6 +916,11 @@ begin Dispose(SymbolsValue,Done); SymbolsValue:=nil; end; + if Assigned(FilteredSym) then + begin + Dispose(FilteredSym,Done); + FilteredSym:=nil; + end; Inherited Done; end; @@ -905,18 +959,54 @@ begin end; procedure TSymbolScopeView.LookUp(S: string); -var Idx,Slength: Sw_integer; +var LookUpS : String; + + function GetFilteredLookUpIdx(Item:Sw_Integer):Sw_Integer; + var I, Count : Sw_Integer; + F : PFilteredSym; + UpS,LeftS : String; + begin + GetFilteredLookUpIdx:=-1; + Count:=FilteredSym^.Count; + if Count > 0 then + for I:=0 to Count-1 do + begin + F:=FilteredSym^.At(I); + if F^.ItemSym = Item then {perfect match} + begin + GetFilteredLookUpIdx:=I; + break; + end; + if F^.ItemSym > Item then { test next item if perfect match is missing} + begin + LeftS:=UpcaseStr(F^.Sym^.GetName); + UpS:=UpcaseStr(LookUpS); + if copy(LeftS,1,length(UpS))=UpS then {perfect match} + GetFilteredLookUpIdx:=I; + break; {all you get is one second chance, it wont be any better from here} + end; + end; + end; + +var Idx,Slength,I: Sw_integer; NS: string; begin NS:=LookUpStr; Slength:=Length(S); + LookUpS:=S; if (Symbols=nil) or (S='') then NS:='' else begin S:=Symbols^.LookUp(S,Idx); if Idx<>-1 then begin - NS:=S; - FocusItem(Idx); + { Have found, but get filtered list index first + Some entries might be missing if need then look up agin } + Idx:=GetFilteredLookUpIdx(Idx); + if Idx<>-1 then + begin + NS:=S; + FocusItem(Idx); + end; end; end; LookUpStr:=Copy(NS,1,Slength); @@ -927,11 +1017,13 @@ end; function TSymbolScopeView.GotoItem(Item: sw_integer): boolean; var S: PSymbol; OK: boolean; + F : PFilteredSym; begin OK:=Range>0; if OK then begin - S:=List^.At(Item); + F:=List^.At(Item); + S:=F^.Sym; OK:=(S^.References<>nil) and (S^.References^.Count>0); if OK then OK:=GotoReference(S^.References^.At(0)); @@ -942,11 +1034,13 @@ end; function TSymbolScopeView.TrackItem(Item: sw_integer; AutoTrack: boolean): boolean; var S: PSymbol; OK: boolean; + F: PFilteredSym; begin OK:=Range>0; if OK then begin - S:=List^.At(Item); + F:=List^.At(Item); + S:=F^.Sym; OK:=(S^.References<>nil) and (S^.References^.Count>0); if OK then OK:=TrackReference(S^.References^.At(0),AutoTrack); @@ -968,11 +1062,52 @@ begin end; end; +procedure TSymbolScopeView.FilterSymbols(AFilter:boolean); +var S : PSymbol; + I : sw_integer; + Flags : Longint; + bUni, bLab, bcon, btyp, bvar, bprc, binh: boolean; +begin + Flags:=0; + if assigned(MyBW) then + Flags:=MyBW^.GetFlags; + bUni:=(Flags and bfUnits)<>0; + bLab:=(Flags and bfLabels)<>0; + bCon:=(Flags and bfConstants)<>0; + bTyp:=(Flags and bfTypes)<>0; + bVar:=(Flags and bfVariables)<>0; + bPrc:=(Flags and bfProcedures)<>0; + bInh:=(Flags and bfInherited)<>0; + FilteredSym^.FreeAll; + if Symbols^.Count = 0 then exit; + For i:=0 to Symbols^.Count-1 do + begin + S:=Symbols^.At(I); + if AFilter then begin + {---------- only selected ones ----------} + case S^.typ of + labelsym: if not bLab then continue; + namespacesym,staticvarsym,localvarsym,paravarsym, + fieldvarsym,absolutevarsym,programparasym: if not bVar then continue; + procsym,propertysym,syssym : if not bPrc then continue; + typesym : if not bTyp then continue; + constsym,enumsym : if not bCon then continue; + unitsym : if not bUni then continue; + errorsym,macrosym,undefinedsym: ; {accepted anyway} + end; + end; + FilteredSym^.Insert(New(PFilteredSym,Init(I,S))); + end; +end; + function TSymbolScopeView.GetText(Item,MaxLen: Sw_Integer): String; var S1: string; S : PSymbol; SG : PGDBValue; + F : PFilteredSym; begin + F:=FilteredSym^.At(Item); + Item:=F^.ItemSym; S:=Symbols^.At(Item); if Assigned(SymbolsValue) and (SymbolsValue^.Count>Item) then SG:=SymbolsValue^.At(Item) @@ -1652,6 +1787,8 @@ begin Insert(ScopeView); ScopeView^.MyBW:=@Self; ScopeView^.SetGDBCol; + ScopeView^.FilterSymbols(true); + ScopeView^.SetRange(ScopeView^.FilteredSym^.Count); end; if assigned(AReferences) and (AReferences^.Count>0) then begin @@ -1771,8 +1908,9 @@ begin PageTab^.GrowMode:=gfGrowHiX; Insert(PageTab); - if assigned(ScopeView) then - SelectTab(btScope) + if assigned(ScopeView) {Scope assinged and chosen to be selected by default} + and ((DefaultBrowserPane=0) or not assigned(ReferenceView)) then + SelectTab(btScope) else if assigned(ReferenceView) then SelectTab(btReferences) else if assigned(MemInfoView) then @@ -1833,7 +1971,7 @@ begin S:=nil; if (Event.InfoPtr=ScopeView) then begin - S:=ScopeView^.Symbols^.At(ScopeView^.Focused); + S:=ScopeView^.FilteredSym^.At(ScopeView^.Focused)^.Sym; MakeGlobal(ScopeView^.Origin,P); Desktop^.MakeLocal(P,P); Inc(P.Y,ScopeView^.Focused-ScopeView^.TopItem); Inc(P.Y); @@ -1940,6 +2078,12 @@ end; procedure TBrowserWindow.SetFlags(AFlags: longint); begin BrowserFlags:=AFlags; + if assigned(ScopeView) then + begin + ScopeView^.FilterSymbols(true); + ScopeView^.SetRange(ScopeView^.FilteredSym^.Count); + ScopeView^.DrawView; + end; end; procedure TBrowserWindow.SetState(AState: Word; Enable: Boolean);