VistA-cprs/CPRS-Chart/Orders/fOCSession.pas

355 lines
11 KiB
Plaintext

unit fOCSession;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
fAutoSz, StdCtrls, ORFn, uConst, ORCtrls, ExtCtrls, VA508AccessibilityManager;
type
TfrmOCSession = class(TfrmAutoSz)
lstChecks: TCaptionListBox;
pnlBottom: TPanel;
lblJustify: TLabel;
txtJustify: TCaptionEdit;
cmdCancelOrder: TButton;
cmdContinue: TButton;
btnReturn: TButton;
memNote: TMemo;
procedure cmdCancelOrderClick(Sender: TObject);
procedure cmdContinueClick(Sender: TObject);
procedure lstChecksMeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
procedure lstChecksDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure txtJustifyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure btnReturnClick(Sender: TObject);
procedure memNoteEnter(Sender: TObject);
private
FCritical: Boolean;
FCancelSignProcess : Boolean;
FCheckList: TStringList;
FOrderList: TStringList;
procedure SetReqJustify;
procedure SetReturn(const Value: Boolean);
public
{ Public declarations }
property CancelSignProcess : Boolean read FCancelSignProcess write SetReturn default false;
end;
procedure ExecuteReleaseOrderChecks(SelectList: TList);
function ExecuteSessionOrderChecks(OrderList: TStringList) : Boolean;
implementation
{$R *.DFM}
uses rOrders, uCore, rMisc, fFrame;
type
TOCRec = class
OrderID: string;
OrderText: string;
Checks: TStringList;
constructor Create(const AnID: string);
destructor Destroy; override;
end;
var
uCheckedOrders: TList;
FOldHintHidePause: integer;
constructor TOCRec.Create(const AnID: string);
begin
OrderID := AnID;
Checks := TStringList.Create;
FOldHintHidePause := Application.HintHidePause;
end;
destructor TOCRec.Destroy;
begin
Application.HintHidePause := FOldHintHidePause;
Checks.Free;
inherited Destroy;
end;
procedure ExecuteReleaseOrderChecks(SelectList: TList);
var
i: Integer;
AnOrder: TOrder;
OrderIDList: TStringList;
begin
OrderIDList := TStringList.Create;
try
for i := 0 to SelectList.Count - 1 do
begin
AnOrder := TOrder(SelectList.Items[i]);
OrderIDList.Add(AnOrder.ID + '^^1'); // 3rd pce = 1 means releasing order
end;
if ExecuteSessionOrderChecks(OrderIDList) then
for i := SelectList.Count - 1 downto 0 do
begin
AnOrder := TOrder(SelectList.Items[i]);
if OrderIDList.IndexOf(AnOrder.ID + '^^1') < 0 then
begin
Changes.Remove(CH_ORD, AnOrder.ID);
SelectList.Delete(i);
end;
end
else
SelectList.Clear;
finally
OrderIDList.Free;
end;
end;
{Returns True if the Signature process should proceed.
Clears OrderList If False. }
function ExecuteSessionOrderChecks(OrderList: TStringList) : Boolean;
var
i, j: Integer;
LastID, NewID: string;
CheckList: TStringList;
OCRec: TOCRec;
//AChangeItem: TChangeItem;
frmOCSession: TfrmOCSession;
x: string;
begin
Result := True;
CheckList := TStringList.Create;
try
StatusText('Order Checking...');
OrderChecksForSession(CheckList, OrderList);
StatusText('');
if CheckList.Count > 0 then
begin
frmOCSession := TfrmOCSession.Create(Application);
try
ResizeFormToFont(TForm(frmOCSession));
uCheckedOrders := TList.Create;
LastID := '';
for i := 0 to CheckList.Count - 1 do
begin
NewID := Piece(CheckList[i], U, 1);
if NewID <> LastID then
begin
OCRec := TOCRec.Create(NewID);
uCheckedOrders.Add(OCRec);
LastID := NewID;
end; {if NewID}
end; {for i}
with uCheckedOrders do for i := 0 to Count - 1 do
begin
OCRec := TOCRec(Items[i]);
x := TextForOrder(OCRec.OrderID);
OCRec.OrderText := x;
for j := 0 to CheckList.Count - 1 do
if Piece(CheckList[j], U, 1) = OCRec.OrderID then
begin
OCRec.Checks.Add(Pieces(CheckList[j], U, 2, 4));
x := x + CRLF + Piece(CheckList[j], U, 4);
end;
//AChangeItem := Changes.Locate(CH_ORD, OCRec.OrderID);
//if AChangeItem <> nil then OCRec.OrderText := AChangeItem.Text;
frmOCSession.lstChecks.Items.Add(x);
end; {with...for i}
frmOCSession.FOrderList := OrderList;
frmOCSession.FCheckList := CheckList;
frmOCSession.SetReqJustify;
MessageBeep(MB_ICONASTERISK);
if frmOCSession.Visible then frmOCSession.SetFocus;
frmOCSession.ShowModal;
Result := not frmOCSession.CancelSignProcess;
if frmOCSession.CancelSignProcess then begin
OrderList.Clear;
if Assigned(frmFrame) then
frmFrame.SetActiveTab(CT_ORDERS);
end;
finally
with uCheckedOrders do for i := 0 to Count - 1 do TOCRec(Items[i]).Free;
frmOCSession.Free;
end; {try}
end; {if CheckList}
finally
CheckList.Free;
end;
end;
procedure TfrmOCSession.SetReqJustify;
var
i, j: Integer;
OCRec: TOCRec;
begin
FCritical := False;
with uCheckedOrders do for i := 0 to Count - 1 do
begin
OCRec := TOCRec(Items[i]);
for j := 0 to OCRec.Checks.Count - 1 do
if Piece(OCRec.Checks[j], U, 2) = '1' then FCritical := True;
end;
lblJustify.Visible := FCritical;
txtJustify.Visible := FCritical;
memNote.Visible := FCritical;
end;
procedure TfrmOCSession.lstChecksMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
var
i, AHt, TotalHt: Integer;
x: string;
ARect: TRect;
OCRec: TOCRec;
begin
inherited;
with lstChecks do
begin
if Index >= uCheckedOrders.Count then Exit;
OCRec := TOCRec(uCheckedOrders.Items[Index]);
ARect := ItemRect(Index);
ARect.Left := ARect.Left + 2;
AHt := DrawText(Canvas.Handle, PChar(OCRec.OrderText), Length(OCRec.OrderText), ARect, DT_CALCRECT or DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_EXTERNALLEADING) + 2; //CQ7178: added DT_EXTERNALLEADING
TotalHt := AHt;
for i := 0 to OCRec.Checks.Count - 1 do
begin
ARect := ItemRect(Index);
ARect.Left := ARect.Left + 10;
x := Piece(OCRec.Checks[i], U, 3);
AHt := DrawText(Canvas.Handle, PChar(x), Length(x), ARect, DT_CALCRECT or DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_EXTERNALLEADING); //CQ7178: added DT_EXTERNALLEADING
TotalHt := TotalHt + AHt;
end;
end;
Height := TotalHt + 2; // add 2 for focus rectangle
if Height > 255 then Height := 255; //CQ7178
end;
procedure TfrmOCSession.lstChecksDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
i, AHt: Integer;
x: string;
ARect: TRect;
OCRec: TOCRec;
begin
inherited;
with lstChecks do
begin
if Index >= uCheckedOrders.Count then Exit;
OCRec := TOCRec(uCheckedOrders.Items[Index]);
ARect := ItemRect(Index);
AHt := DrawText(Canvas.Handle, PChar(OCRec.OrderText), Length(OCRec.OrderText), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_EXTERNALLEADING) + 2; //CQ7178: added DT_EXTERNALLEADING
ARect.Left := ARect.Left + 10;
ARect.Top := ARect.Top + AHt;
for i := 0 to OCRec.Checks.Count - 1 do
begin
x := Piece(OCRec.Checks[i], U, 3);
if not (odSelected in State) then
begin
if (Piece(OCRec.Checks[i], U, 2) = '1') then
begin
Canvas.Font.Color := Get508CompliantColor(clBlue);
Canvas.Font.Style := [fsUnderline];
end
else Canvas.Font.Color := clWindowText;
end;
AHt := DrawText(Canvas.Handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_EXTERNALLEADING); //CQ7178: added DT_EXTERNALLEADING
ARect.Top := ARect.Top + AHt;
end;
end;
end;
procedure TfrmOCSession.cmdCancelOrderClick(Sender: TObject);
var
i, j: Integer;
AnOrderID: string;
OCRec: TOCRec;
begin
inherited;
for i := lstChecks.Items.Count - 1 downto 0 do if lstChecks.Selected[i] then
begin
OCRec := TOCRec(uCheckedOrders.Items[i]);
AnOrderID := OCRec.OrderID;
if DeleteCheckedOrder(AnOrderID) then
begin
for j := FCheckList.Count - 1 downto 0 do
if Piece(FCheckList[j], U, 1) = AnOrderID then FCheckList.Delete(j);
for j := FOrderList.Count - 1 downto 0 do
if Piece(FOrderList[j], U, 1) = AnOrderID then FOrderList.Delete(j);
OCRec.Free;
uCheckedOrders.Delete(i);
lstChecks.Items.Delete(i);
end;
end;
if uCheckedOrders.Count = 0 then Close;
end;
procedure TfrmOCSession.cmdContinueClick(Sender: TObject);
begin
inherited;
if FCritical and ((Length(txtJustify.Text) < 2) or not ContainsVisibleChar(txtJustify.Text)) then
begin
InfoBox('A justification for overriding critical order checks is required.',
'Justification Required', MB_OK);
Exit;
end;
StatusText('Saving Order Checks...');
SaveOrderChecksForSession(txtJustify.Text, FCheckList);
StatusText('');
Close;
end;
procedure TfrmOCSession.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
inherited;
SaveUserBounds(Self); //Save Position & Size of Form
end;
procedure TfrmOCSession.FormShow(Sender: TObject);
begin
inherited;
SetFormPosition(Self); //Get Saved Position & Size of Form
FCancelSignProcess := False;
end;
procedure TfrmOCSession.FormResize(Sender: TObject);
begin
//TfrmAutoSz has defect must call inherited Resize for the resize to function.
inherited;
end;
procedure TfrmOCSession.txtJustifyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
//GE CQ9540 activate Return key, behave as "Continue" buttom clicked.
if Key = VK_RETURN then cmdContinueClick(self);
end;
procedure TfrmOCSession.btnReturnClick(Sender: TObject);
begin
inherited;
FCancelSignProcess := True;
Close;
end;
procedure TfrmOCSession.SetReturn(const Value: Boolean);
begin
FCancelSignProcess := Value;
end;
procedure TfrmOCSession.memNoteEnter(Sender: TObject);
begin
inherited;
memNote.SelStart := 0;
end;
end.