implemented incremental search in codeexplorer

git-svn-id: trunk@8310 -
This commit is contained in:
mattias 2005-12-14 01:34:07 +00:00
parent 4cff1317ab
commit ad436d2657
5 changed files with 151 additions and 42 deletions

View File

@ -1,4 +1,5 @@
object CodeExplorerView: TCodeExplorerView object CodeExplorerView: TCodeExplorerView
ActiveControl = RefreshButton
Caption = 'CodeExplorerView' Caption = 'CodeExplorerView'
ClientHeight = 505 ClientHeight = 505
ClientWidth = 206 ClientWidth = 206
@ -15,7 +16,7 @@ object CodeExplorerView: TCodeExplorerView
Top = 175 Top = 175
Width = 206 Width = 206
object RefreshButton: TButton object RefreshButton: TButton
BorderSpacing.OnChange = nil BorderSpacing.InnerBorder = 2
Caption = 'Refresh' Caption = 'Refresh'
OnClick = RefreshButtonCLICK OnClick = RefreshButtonCLICK
TabOrder = 0 TabOrder = 0
@ -23,7 +24,7 @@ object CodeExplorerView: TCodeExplorerView
Width = 96 Width = 96
end end
object OptionsButton: TButton object OptionsButton: TButton
BorderSpacing.OnChange = nil BorderSpacing.InnerBorder = 2
Caption = 'Options' Caption = 'Options'
OnClick = OptionsButtonClick OnClick = OptionsButtonClick
TabOrder = 1 TabOrder = 1
@ -33,7 +34,8 @@ object CodeExplorerView: TCodeExplorerView
end end
object CodeTreeview: TTreeView object CodeTreeview: TTreeView
Align = alBottom Align = alBottom
BorderSpacing.OnChange = nil Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 1
DefaultItemHeight = 16 DefaultItemHeight = 16
HideSelection = False HideSelection = False
Images = Imagelist1 Images = Imagelist1
@ -45,7 +47,22 @@ object CodeExplorerView: TCodeExplorerView
OnDeletion = CodeTreeviewDELETION OnDeletion = CodeTreeviewDELETION
OnKeyUp = CodeTreeviewKeyUp OnKeyUp = CodeTreeviewKeyUp
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips] Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips]
Height = 480 AnchorSideTop.Control = FilterEdit
Height = 456
Top = 49
Width = 206
end
object FilterEdit: TEdit
Anchors = [akTop, akLeft, akRight]
OnChange = FilterEditChange
TabOrder = 3
Text = 'FilterEdit'
AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrTop
AnchorSideTop.Control = RefreshButton
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Height = 23
Top = 25 Top = 25
Width = 206 Width = 206
end end

View File

@ -1,25 +1,32 @@
{ This is an automatically generated lazarus resource file } { This is an automatically generated lazarus resource file }
LazarusResources.Add('TCodeExplorerView','FORMDATA',[ LazarusResources.Add('TCodeExplorerView','FORMDATA',[
'TPF0'#17'TCodeExplorerView'#16'CodeExplorerView'#7'Caption'#6#16'CodeExplore' 'TPF0'#17'TCodeExplorerView'#16'CodeExplorerView'#13'ActiveControl'#7#13'Refr'
+'rView'#12'ClientHeight'#3#249#1#11'ClientWidth'#3#206#0#10'KeyPreview'#9#7 +'eshButton'#7'Caption'#6#16'CodeExplorerView'#12'ClientHeight'#3#249#1#11'Cl'
+'OnClose'#7#21'CodeExplorerViewCLOSE'#8'OnCreate'#7#22'CodeExplorerViewCREAT' +'ientWidth'#3#206#0#10'KeyPreview'#9#7'OnClose'#7#21'CodeExplorerViewCLOSE'#8
+'E'#9'OnDestroy'#7#23'CodeExplorerViewDestroy'#8'OnResize'#7#22'CodeExplorer' +'OnCreate'#7#22'CodeExplorerViewCREATE'#9'OnDestroy'#7#23'CodeExplorerViewDe'
+'ViewRESIZE'#13'PixelsPerInch'#2'p'#18'HorzScrollBar.Page'#3#205#0#18'VertSc' +'stroy'#8'OnResize'#7#22'CodeExplorerViewRESIZE'#13'PixelsPerInch'#2'p'#18'H'
+'rollBar.Page'#3#248#1#4'Left'#3'z'#1#6'Height'#3#249#1#3'Top'#3#175#0#5'Wid' +'orzScrollBar.Page'#3#205#0#18'VertScrollBar.Page'#3#248#1#4'Left'#3'z'#1#6
+'th'#3#206#0#0#7'TButton'#13'RefreshButton'#22'BorderSpacing.OnChange'#13#7 +'Height'#3#249#1#3'Top'#3#175#0#5'Width'#3#206#0#0#7'TButton'#13'RefreshButt'
+'Caption'#6#7'Refresh'#7'OnClick'#7#18'RefreshButtonCLICK'#8'TabOrder'#2#0#6 +'on'#25'BorderSpacing.InnerBorder'#2#2#7'Caption'#6#7'Refresh'#7'OnClick'#7
+'Height'#2#25#5'Width'#2'`'#0#0#7'TButton'#13'OptionsButton'#22'BorderSpacin' +#18'RefreshButtonCLICK'#8'TabOrder'#2#0#6'Height'#2#25#5'Width'#2'`'#0#0#7'T'
+'g.OnChange'#13#7'Caption'#6#7'Options'#7'OnClick'#7#18'OptionsButtonClick'#8 +'Button'#13'OptionsButton'#25'BorderSpacing.InnerBorder'#2#2#7'Caption'#6#7
+'TabOrder'#2#1#4'Left'#2'n'#6'Height'#2#25#5'Width'#2'`'#0#0#9'TTreeView'#12 +'Options'#7'OnClick'#7#18'OptionsButtonClick'#8'TabOrder'#2#1#4'Left'#2'n'#6
+'CodeTreeview'#5'Align'#7#8'alBottom'#22'BorderSpacing.OnChange'#13#17'Defau' +'Height'#2#25#5'Width'#2'`'#0#0#9'TTreeView'#12'CodeTreeview'#5'Align'#7#8'a'
+'ltItemHeight'#2#16#13'HideSelection'#8#6'Images'#7#10'Imagelist1'#11'Parent' +'lBottom'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#17'Borde'
+'Ctl3D'#8#9'PopupMenu'#7#13'TreePopupmenu'#16'RightClickSelect'#9#8'TabOrder' +'rSpacing.Top'#2#1#17'DefaultItemHeight'#2#16#13'HideSelection'#8#6'Images'#7
+#2#2#10'OnDblClick'#7#20'CodeTreeviewDBLCLICK'#10'OnDeletion'#7#20'CodeTreev' +#10'Imagelist1'#11'ParentCtl3D'#8#9'PopupMenu'#7#13'TreePopupmenu'#16'RightC'
+'iewDELETION'#7'OnKeyUp'#7#17'CodeTreeviewKeyUp'#7'Options'#11#17'tvoAutoIte' +'lickSelect'#9#8'TabOrder'#2#2#10'OnDblClick'#7#20'CodeTreeviewDBLCLICK'#10
+'mHeight'#21'tvoKeepCollapsedNodes'#19'tvoRightClickSelect'#14'tvoShowButton' +'OnDeletion'#7#20'CodeTreeviewDELETION'#7'OnKeyUp'#7#17'CodeTreeviewKeyUp'#7
+'s'#12'tvoShowLines'#11'tvoShowRoot'#11'tvoToolTips'#0#6'Height'#3#224#1#3'T' +'Options'#11#17'tvoAutoItemHeight'#21'tvoKeepCollapsedNodes'#19'tvoRightClic'
+'op'#2#25#5'Width'#3#206#0#0#0#10'TImageList'#10'Imagelist1'#4'left'#2'@'#3 +'kSelect'#14'tvoShowButtons'#12'tvoShowLines'#11'tvoShowRoot'#11'tvoToolTips'
+#0#21'AnchorSideTop.Control'#7#10'FilterEdit'#6'Height'#3#200#1#3'Top'#2'1'#5
+'Width'#3#206#0#0#0#5'TEdit'#10'FilterEdit'#7'Anchors'#11#5'akTop'#6'akLeft'
+#7'akRight'#0#8'OnChange'#7#16'FilterEditChange'#8'TabOrder'#2#3#4'Text'#6#10
+'FilterEdit'#22'AnchorSideLeft.Control'#7#5'Owner'#19'AnchorSideLeft.Side'#7
+#6'asrTop'#21'AnchorSideTop.Control'#7#13'RefreshButton'#23'AnchorSideRight.'
+'Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#6'Height'#2#23#3
+'Top'#2#25#5'Width'#3#206#0#0#0#10'TImageList'#10'Imagelist1'#4'left'#2'@'#3
+'top'#2' '#0#0#10'TPopupMenu'#13'TreePopupmenu'#4'left'#2'@'#3'top'#2'H'#0#0 +'top'#2' '#0#0#10'TPopupMenu'#13'TreePopupmenu'#4'left'#2'@'#3'top'#2'H'#0#0
+#0 +#0
]); ]);

View File

@ -37,11 +37,12 @@ uses
Dialogs, Buttons, ComCtrls, Menus, Dialogs, Buttons, ComCtrls, Menus,
// CodeTools // CodeTools
CodeToolManager, CodeAtom, CodeCache, CodeTree, PascalParserTool, CodeToolManager, CodeAtom, CodeCache, CodeTree, PascalParserTool,
KeywordFuncLists,
// IDE Intf // IDE Intf
IDECommands, MenuIntf, IDECommands, MenuIntf,
// IDE // IDE
LazarusIDEStrConsts, EnvironmentOpts, IDEOptionDefs, InputHistory, IDEProcs, LazarusIDEStrConsts, EnvironmentOpts, IDEOptionDefs, InputHistory, IDEProcs,
CodeExplOpts; CodeExplOpts, StdCtrls;
type type
TCodeExplorerView = class; TCodeExplorerView = class;
@ -60,6 +61,7 @@ type
{ TCodeExplorerView } { TCodeExplorerView }
TCodeExplorerView = class(TForm) TCodeExplorerView = class(TForm)
FilterEdit: TEdit;
Imagelist1: TImageList; Imagelist1: TImageList;
TreePopupmenu: TPopupMenu; TreePopupmenu: TPopupMenu;
RefreshButton: TButton; RefreshButton: TButton;
@ -74,6 +76,7 @@ type
procedure CodeTreeviewDeletion(Sender: TObject; Node: TTreeNode); procedure CodeTreeviewDeletion(Sender: TObject; Node: TTreeNode);
procedure CodeTreeviewKeyUp(Sender: TObject; var Key: Word; procedure CodeTreeviewKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState); Shift: TShiftState);
procedure FilterEditChange(Sender: TObject);
procedure JumpToMenuitemClick(Sender: TObject); procedure JumpToMenuitemClick(Sender: TObject);
procedure OptionsButtonClick(Sender: TObject); procedure OptionsButtonClick(Sender: TObject);
procedure RefreshButtonClick(Sender: TObject); procedure RefreshButtonClick(Sender: TObject);
@ -100,11 +103,14 @@ type
ImgIDClass: Integer; ImgIDClass: Integer;
ImgIDProc: Integer; ImgIDProc: Integer;
ImgIDProperty: Integer; ImgIDProperty: Integer;
FLastFilter: string;
function GetFilter: string;
function GetNodeDescription(ACodeTool: TCodeTool; function GetNodeDescription(ACodeTool: TCodeTool;
CodeNode: TCodeTreeNode): string; CodeNode: TCodeTreeNode): string;
function GetNodeImage(CodeNode: TCodeTreeNode): integer; function GetNodeImage(CodeNode: TCodeTreeNode): integer;
procedure CreateNodes(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode; procedure CreateNodes(ACodeTool: TCodeTool; CodeNode: TCodeTreeNode;
ParentViewNode, InFrontViewNode: TTreeNode; CreateSiblings: boolean); ParentViewNode, InFrontViewNode: TTreeNode; CreateSiblings: boolean);
procedure SetFilter(const AValue: string);
protected protected
procedure KeyUp(var Key: Word; Shift: TShiftState); override; procedure KeyUp(var Key: Word; Shift: TShiftState); override;
public public
@ -113,11 +119,15 @@ type
procedure Refresh; procedure Refresh;
procedure JumpToSelection; procedure JumpToSelection;
procedure CurrentCodeBufferChanged; procedure CurrentCodeBufferChanged;
procedure FilterChanged;
function FilterNode(ANode: TTreeNode; const TheFilter: string): boolean;
function FilterFits(const NodeText, TheFilter: string): boolean; virtual;
public public
property OnGetCodeTree: TOnGetCodeTree read FOnGetCodeTree property OnGetCodeTree: TOnGetCodeTree read FOnGetCodeTree
write FOnGetCodeTree; write FOnGetCodeTree;
property OnJumpToCode: TOnJumpToCode read FOnJumpToCode write FOnJumpToCode; property OnJumpToCode: TOnJumpToCode read FOnJumpToCode write FOnJumpToCode;
property MainFilename: string read FMainFilename; property MainFilename: string read FMainFilename;
property Filter: string read GetFilter write SetFilter;
end; end;
const const
@ -210,6 +220,7 @@ begin
RefreshButton.Caption:=dlgUnitDepRefresh; RefreshButton.Caption:=dlgUnitDepRefresh;
OptionsButton.Caption:=dlgFROpts; OptionsButton.Caption:=dlgFROpts;
FilterEdit.Text:=lisCEFilter;
ImgIDDefault:=0; ImgIDDefault:=0;
AddResImg(Imagelist1,'ce_default'); AddResImg(Imagelist1,'ce_default');
@ -259,16 +270,11 @@ begin
end; end;
procedure TCodeExplorerView.CodeExplorerViewRESIZE(Sender: TObject); procedure TCodeExplorerView.CodeExplorerViewRESIZE(Sender: TObject);
var
y: Integer;
begin begin
RefreshButton.Width:=ClientWidth div 2; RefreshButton.Width:=ClientWidth div 2;
with OptionsButton do with OptionsButton do
SetBounds(RefreshButton.Width,Top, SetBounds(RefreshButton.Width,Top,
Parent.ClientWidth-RefreshButton.Width,Height); Parent.ClientWidth-RefreshButton.Width,Height);
y:=RefreshButton.Top+RefreshButton.Height;
with CodeTreeview do
SetBounds(0,y,Parent.ClientWidth,Parent.ClientHeight-y);
end; end;
procedure TCodeExplorerView.CodeTreeviewDBLCLICK(Sender: TObject); procedure TCodeExplorerView.CodeTreeviewDBLCLICK(Sender: TObject);
@ -290,6 +296,12 @@ begin
JumpToSelection; JumpToSelection;
end; end;
procedure TCodeExplorerView.FilterEditChange(Sender: TObject);
begin
if Sender=nil then ;
FilterChanged;
end;
procedure TCodeExplorerView.CodeExplorerViewCLOSE(Sender: TObject; procedure TCodeExplorerView.CodeExplorerViewCLOSE(Sender: TObject;
var CloseAction: TCloseAction); var CloseAction: TCloseAction);
begin begin
@ -348,6 +360,12 @@ begin
end; end;
end; end;
function TCodeExplorerView.GetFilter: string;
begin
Result:=FilterEdit.Text;
if Result=lisCEFilter then Result:='';
end;
function TCodeExplorerView.GetNodeImage(CodeNode: TCodeTreeNode): integer; function TCodeExplorerView.GetNodeImage(CodeNode: TCodeTreeNode): integer;
begin begin
case CodeNode.Desc of case CodeNode.Desc of
@ -454,6 +472,13 @@ begin
end; end;
end; end;
procedure TCodeExplorerView.SetFilter(const AValue: string);
begin
if Filter=AValue then exit;
FilterEdit.Text:=AValue;
FilterChanged;
end;
procedure TCodeExplorerView.KeyUp(var Key: Word; Shift: TShiftState); procedure TCodeExplorerView.KeyUp(var Key: Word; Shift: TShiftState);
begin begin
inherited KeyUp(Key, Shift); inherited KeyUp(Key, Shift);
@ -547,6 +572,78 @@ begin
Refresh; Refresh;
end; end;
procedure TCodeExplorerView.FilterChanged;
var
TheFilter: String;
ANode: TTreeNode;
begin
if FUpdateCount>0 then begin
Include(FFlags,cevRefreshNeeded);
exit;
end;
TheFilter:=FilterEdit.Text;
if FLastFilter=TheFilter then exit;
FLastFilter:=TheFilter;
CodeTreeview.BeginUpdate;
CodeTreeview.Options:=CodeTreeview.Options+[tvoAllowMultiselect];
ANode:=CodeTreeview.Items.GetFirstNode;
while ANode<>nil do begin
FilterNode(ANode,TheFilter);
ANode:=ANode.GetNextSibling;
end;
CodeTreeview.EndUpdate;
end;
function TCodeExplorerView.FilterNode(ANode: TTreeNode; const TheFilter: string
): boolean;
var
ChildNode: TTreeNode;
HasVisibleChilds: Boolean;
begin
if ANode=nil then exit;
ChildNode:=ANode.GetFirstChild;
HasVisibleChilds:=false;
while ChildNode<>nil do begin
if FilterNode(ChildNode,TheFilter) then
HasVisibleChilds:=true;
ChildNode:=ChildNode.GetNextSibling;
end;
ANode.Expanded:=HasVisibleChilds;
ANode.Selected:=FilterFits(ANode.Text,TheFilter);
Result:=ANode.Expanded or ANode.Selected;
end;
function TCodeExplorerView.FilterFits(const NodeText, TheFilter: string
): boolean;
var
Src: PChar;
PFilter: PChar;
c: Char;
i: Integer;
begin
if TheFilter='' then begin
Result:=true;
end else begin
Src:=PChar(NodeText);
PFilter:=PChar(TheFilter);
repeat
c:=Src^;
if c<>#0 then begin
if UpChars[Src^]=UpChars[PFilter^] then begin
i:=1;
while (UpChars[Src[i]]=UpChars[PFilter[i]]) and (PFilter[i]<>#0) do
inc(i);
if PFilter[i]=#0 then begin
exit(true);
end;
end;
end else
exit(false);
inc(Src);
until false;
end;
end;
initialization initialization
{$I codeexplorer.lrs} {$I codeexplorer.lrs}
CodeExplorerView:=nil; CodeExplorerView:=nil;

View File

@ -1130,6 +1130,7 @@ resourcestring
dlgTextToFing = '&Text to Find'; dlgTextToFing = '&Text to Find';
dlgReplaceWith = '&Replace With'; dlgReplaceWith = '&Replace With';
dlgFROpts = 'Options'; dlgFROpts = 'Options';
lisCEFilter = '(Filter)';
dlgCaseSensitive = 'Case Sensitive'; dlgCaseSensitive = 'Case Sensitive';
lisDistinguishBigAndSmallLettersEGAAndA = 'Distinguish big and small ' lisDistinguishBigAndSmallLettersEGAAndA = 'Distinguish big and small '
+'letters e.g. A and a'; +'letters e.g. A and a';

View File

@ -447,21 +447,8 @@ begin
end; end;
function TTreeNode.CompareCount(CompareMe: Integer): Boolean; function TTreeNode.CompareCount(CompareMe: Integer): Boolean;
{var
ACount: integer;
Node: TTreeNode;}
Begin Begin
Result:=(CompareMe=Count); Result:=(CompareMe=Count);
{
ACount := 0;
Result := False;
Node := GetFirstChild;
while Node <> nil do begin
Inc(ACount);
Node := Node.GetNextChild(Node);
if ACount > CompareMe then Exit;
end;
if ACount = CompareMe then Result := True;}
end; end;
function TTreeNode.DoCanExpand(ExpandIt: Boolean): Boolean; function TTreeNode.DoCanExpand(ExpandIt: Boolean): Boolean;