В меню ББ есть пункты поиска по всяким местам, однако я заметил, что часто надо найти ключевую фразу в документах из каталога Rsrc или других. Модифицировал стандартный перебор каталогов внутри DevSearch, может кому пригодится.
Код:
(* выполняет поиск во всех текстовых документах внутри каталога ББ *)
PROCEDURE SearchEverywhere*;
VAR pat: Pattern; t, log: TextModels.Model; v: Views.View; title: Views.Title; c: Containers.Controller;
files: Files.FileInfo; dirs, subs: Files.LocInfo;
loc, sloc: Files.Locator; path, p: Files.Name; list: Text;
BEGIN
(*TextCmds.InitFindDialog; *)
pat := TextCmds.find.find$;
IF pat # "" THEN
Dialog.ShowStatus(searchingKey);
TextCmds.find.find := pat$;
log := TextModels.dir.New();
w.ConnectTo(log); w.SetPos(0);
list := NIL;
loc := Files.dir.This("");
subs:=Files.dir.LocList(loc);
WHILE subs#NIL DO
path := subs.name$;
sloc:=loc.This(subs.name);
files := Files.dir.FileList(sloc);
WHILE files # NIL DO
IF files.type = Kernel.docType THEN
p := path + "/" + files.name;
t := ThisText(sloc, files.name);
IF t # NIL THEN
Find(t, pat, p, list, TRUE)
END
END;
files := files.next
END;
subs:=subs.next
END;
loc := Files.dir.This("");
dirs := Files.dir.LocList(loc);
WHILE dirs # NIL DO
loc := Files.dir.This(dirs.name);
subs:=Files.dir.LocList(loc);
WHILE subs#NIL DO
path := dirs.name + "/"+subs.name;
sloc:=loc.This(subs.name);
files := Files.dir.FileList(sloc);
WHILE files # NIL DO
IF files.type = Kernel.docType THEN
p := path + "/" + files.name;
t := ThisText(sloc, files.name);
IF t # NIL THEN
Find(t, pat, p, list, TRUE)
END
END;
files := files.next
END;
subs:=subs.next;
END;
dirs := dirs.next
END;
List(list, pat, TRUE, TRUE);
v := TextViews.dir.New(log);
title := 'Search for "' + pat + '"';
v(TextViews.View).SetDefaults(NewRuler(), TextViews.dir.defAttr);
Views.OpenAux(v, title);
c := v(Containers.View).ThisController();
c.SetOpts(c.opts + {Containers.noCaret});
w.ConnectTo(NIL);
Dialog.ShowStatus("")
END
END SearchEverywhere;