var
  AExtensionMasks: TTntStringList;
  AMasks: WideString;

function Initialize: Boolean;
begin
  // return false to cancel the filter operation

  AExtensionMasks := nil;

  result := False;
  AMasks := ReadFromRegistry('FilterWithSidecars', 'Extensions', '*.*');
  if AskInput('Filter Sidecar', 'Enter the file mask for the sidecar files that should be returned (multiple can be comma separated)', '', AMasks, False, nil) then
  begin
    if Trim(AMasks) = '' then
      AMasks := '*.*';

    WriteToRegistry('FilterWithSidecars', 'Extensions', AMasks);
    result := True;
  end;
end;

procedure Finalize;
begin
  AExtensionMasks.Free;
  AExtensionMasks := nil;
end;

function IsMatchingSidecar(AFileName: WideString): Boolean;
var
  i: Integer;
  AMask: WideString;
begin
  if AExtensionMasks = nil then
  begin
    AExtensionMasks := TTntStringList.Create;
    AExtensionMasks.CommaText := AMasks;
  end;

  result := False;
  for i := 0 to AExtensionMasks.Count - 1 do
  begin
    AMask := AExtensionMasks.Strings[i];
    if WideMatchesMask(AFileName, AMask) then
    begin
      result := True;
      break;
    end;
  end;
end;

function Filter(AItem: TImageItem): Boolean;
var
  AFiles: TTntStringList;
  AFile: WideString;
  i: Integer;
begin
  AItem.Fetch;

  result := False;

  AFiles := TTntStringList.Create;
  SidecarExtensions.EnumSidecarFilesFor(AItem.FileName, AFiles);
  for i := 0 to AFiles.Count - 1 do
  begin
    AFile := AFiles.Strings[i];
    if IsMatchingSidecar(AFile) then
    begin
      result := True;
      break;
    end;
  end;
  AFiles.Free;
end;

