lazarus/components/filebrowser/frmfilesearcher.pas
2024-09-27 09:03:04 +02:00

167 lines
3.8 KiB
ObjectPascal

unit frmfilesearcher;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ButtonPanel, ExtCtrls, StdCtrls, FileCtrl, filebrowsertypes,
ctrlfilebrowser, Types, Masks;
type
{ TFileSearcherForm }
TFileSearcherForm = class(TForm)
bpFileSearch: TButtonPanel;
cbFilter: TFilterComboBox;
edtSearch: TEdit;
Label1: TLabel;
LBFiles: TListBox;
procedure cbFilterChange(Sender: TObject);
procedure edtSearchChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LBFilesDblClick(Sender: TObject);
procedure LBFilesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
private
FMask : TMaskList;
FController: TFileBrowserController;
FResults: TFileSearchResults;
procedure DoFilter;
public
Function GetSelectedItems : TFileEntryArray;
end;
var
FileSearcherForm: TFileSearcherForm;
implementation
uses LCLType, LazIDEIntf;
{$R *.lfm}
{ TFileSearcherForm }
procedure TFileSearcherForm.edtSearchChange(Sender: TObject);
begin
DoFilter;
end;
procedure TFileSearcherForm.DoFilter;
var
lMatchOptions : TFilenameMatchOptions;
Idx : Integer;
lMatch : TFileSearchMatch;
begin
if Not Assigned(FController) or (Length(edtSearch.Text)<2) then
exit;
lMatchOptions:=[];
if (fsoMatchOnlyFileName in FController.SearchOptions) then
Include(lMatchOptions,fmoFileNameOnly);
if (fsoUseLetters in FController.SearchOptions) then
Include(lMatchOptions,fmoLetters);
FResults.Clear;
LBFiles.Items.BeginUpdate;
try
LBFiles.Items.Clear;
FController.FindFiles(edtSearch.Text,FResults,lMatchOptions,FMask);
for Idx:=0 to FResults.Count-1 do
begin
lMatch:=FResults[Idx];
LBFiles.Items.AddObject(lMatch.FileName,lMatch);
end;
finally
LBFiles.Items.EndUpdate;
end;
end;
function TFileSearcherForm.GetSelectedItems: TFileEntryArray;
var
Idx,I: Integer;
begin
Result:=[];
SetLength(Result,LBFiles.SelCount);
idx:=0;
For I:=0 to LBFiles.Count-1 do
if LBFiles.Selected[I] then
begin
Result[Idx]:=TFileEntry(LBFiles.Items.Objects[i]);
Inc(Idx);
end;
end;
procedure TFileSearcherForm.cbFilterChange(Sender: TObject);
begin
FreeAndNil(FMask);
if cBFilter.Text<>'' then
FMask:=TMaskList.Create(cbFilter.Mask);
DoFilter;
end;
procedure TFileSearcherForm.FormCreate(Sender: TObject);
begin
FController:=LazarusIDE.OwningComponent.FindComponent('IDEFileBrowserController') as TFileBrowserController;
if cbFilter.Mask<>'' then
FMask:=TMaskList.Create(cbFilter.Mask);
FResults:=TFileSearchResults.Create;
end;
procedure TFileSearcherForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(FMask);
FreeAndNil(FResults);
end;
procedure TFileSearcherForm.LBFilesDblClick(Sender: TObject);
begin
Modalresult:=mrOK;
end;
procedure TFileSearcherForm.LBFilesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
Var
W,L : Integer;
lRect : TRect;
C : TColor;
S,Term : String;
lCanvas : TCanvas;
lMatch : TFileSearchMatch;
lPos : TMatchPosition;
begin
lCanvas:=LBFiles.Canvas;
lMatch:=fResults[Index];
S:=lMatch.FileName;
lRect:=aRect;
if not (odSelected in State) then
begin
c:=lCanvas.Brush.Color;
lCanvas.Brush.Color:=clHighlight;
for lPos in lMatch.MatchPositions do
begin
Term:=Copy(S,lPos.Pos,lPos.Len);
W:=lCanvas.TextWidth(Term);
L:=lCanvas.TextWidth(Copy(S,1,lPos.Pos-1));
lRect.Left:=aRect.Left+L;
lRect.Right:=aRect.Left+L+W;
if lrect.Right>aRect.Right then
lrect.Right:=aRect.Right;
lCanvas.FillRect(lRect);
end;
lCanvas.Brush.Color:=C;
end;
lCanvas.TextRect(aRect,aRect.Left,aRect.Top,S);
end;
end.