VistA-cprs/CPRS-Chart/Templates/fFindingTemplates.pas

162 lines
4.1 KiB
Plaintext

unit fFindingTemplates;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DateUtils;
type
TfrmFindingTemplates = class(TForm)
animSearch: TAnimate;
lblFind: TLabel;
Label2: TLabel;
btnCancel: TButton;
procedure FormShow(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
private
FCanceled: boolean;
FSearchString: string;
FStarted: boolean;
FTree: TTreeView;
FStartNode: TTreeNode;
FCurrentNode :TTreeNode;
FIgnoreCase: boolean;
FWholeWords: boolean;
FFoundNode: TTreeNode;
FIsNext: boolean;
{ Private declarations }
procedure Find;
public
end;
function FindTemplate(SearchString: string; Tree: TTreeView; OwningForm: TForm;
StartNode: TTreeNode; IsNext, IgnoreCase, WholeWords: boolean): TTreeNode;
implementation
uses uTemplates, VAUtils, ORNet;
{$R *.dfm}
const
// search for 1 second before showing dialog - note some loading may have already
// taken place before this call.
DELAY_TIME = 1000;
MESSAGE_TIME = 0;
function FindTemplate(SearchString: string; Tree: TTreeView; OwningForm: TForm;
StartNode: TTreeNode; IsNext, IgnoreCase, WholeWords: boolean): TTreeNode;
var
frmFindingTemplates: TfrmFindingTemplates;
msg: string;
begin
Result := nil;
if (SearchString = '') or (not assigned(Tree)) then exit;
frmFindingTemplates := TfrmFindingTemplates.Create(OwningForm);
try
with frmFindingTemplates do
begin
FSearchString := SearchString;
FTree := Tree;
FStartNode := StartNode;
FIgnoreCase := IgnoreCase;
FWholeWords := WholeWords;
FIsNext := IsNext;
if IsNext then
lblFind.Caption := 'Finding Next Template';
Find;
if assigned(FFoundNode) then
begin
Result := FFoundNode;
end
else
begin
if FCanceled then
msg := 'Find Canceled.'
else
msg := 'Text not Found.';
ShowMsg('Search Completed. ' + msg,'Find Template Failed', smiError);
end;
end;
finally
frmFindingTemplates.Free;
end;
end;
procedure TfrmFindingTemplates.btnCancelClick(Sender: TObject);
begin
FCanceled := True;
btnCancel.Enabled := False;
end;
procedure TfrmFindingTemplates.Find;
var
Found : boolean;
Text: String;
WindowList: Pointer;
NeedToShow: boolean;
StartTime: TDateTime;
begin
WindowList := nil;
NeedToShow := True;
StartTime := Now;
try
if(FIgnoreCase) then
FSearchString := UpperCase(FSearchString);
FCurrentNode := FStartNode;
Found := False;
if FIsNext and assigned(FCurrentNode) then
begin
FCurrentNode.Expand(False);
FCurrentNode := FCurrentNode.GetNext;
end;
while (not FCanceled) and (assigned(FCurrentNode) and (not Found)) do
begin
Application.ProcessMessages;
if not FCanceled then
begin
Text := FCurrentNode.Text;
if(FIgnoreCase) then
Text := UpperCase(Text);
Found := SearchMatch(FSearchString, Text, FWholeWords);
if(not Found) then
begin
FCurrentNode.Expand(False);
FCurrentNode := FCurrentNode.GetNext;
end;
if (not Found) and assigned(FCurrentNode) and NeedToShow then
begin
if MilliSecondsBetween(Now, StartTime) > DELAY_TIME then
begin
WindowList := DisableTaskWindows(0);
AppStartedCursorForm := Self;
Show;
NeedToShow := False;
end;
end;
end;
end;
if Found then
FFoundNode := FCurrentNode;
finally
if not NeedToShow then
begin
AppStartedCursorForm := nil;
EnableTaskWindows(WindowList);
Hide;
end;
end;
end;
procedure TfrmFindingTemplates.FormShow(Sender: TObject);
begin
if not FStarted then
begin
FStarted := True;
animSearch.Active := True;
end;
end;
end.