source: cprs/branches/foia-cprs/CPRS-Chart/fSurgery.pas@ 459

Last change on this file since 459 was 459, checked in by Kevin Toppenberg, 16 years ago

Adding foia-cprs branch

File size: 93.1 KB
Line 
1unit fSurgery;
2
3interface
4
5uses
6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 fHSplit, StdCtrls, ExtCtrls, Menus, ComCtrls, ORCtrls, ORFn, uConst, ORDtTm,
8 uPCE, ORClasses, fDrawers, ImgList, fSurgeryView, rSurgery, uSurgery,
9 uCaseTree, uTIU;
10
11type
12 TfrmSurgery = class(TfrmHSplit)
13 mnuNotes: TMainMenu;
14 mnuView: TMenuItem;
15 mnuViewChart: TMenuItem;
16 mnuChartReports: TMenuItem;
17 mnuChartLabs: TMenuItem;
18 mnuChartDCSumm: TMenuItem;
19 mnuChartCslts: TMenuItem;
20 mnuChartNotes: TMenuItem;
21 mnuChartOrders: TMenuItem;
22 mnuChartMeds: TMenuItem;
23 mnuChartProbs: TMenuItem;
24 mnuChartCover: TMenuItem;
25 Z1: TMenuItem;
26 mnuViewDetail: TMenuItem;
27 mnuAct: TMenuItem;
28 mnuActNew: TMenuItem;
29 Z2: TMenuItem;
30 mnuActSave: TMenuItem;
31 mnuActDelete: TMenuItem;
32 mnuActEdit: TMenuItem;
33 mnuActSign: TMenuItem;
34 mnuActAddend: TMenuItem;
35 lblCases: TOROffsetLabel;
36 pnlRead: TPanel;
37 lblTitle: TOROffsetLabel;
38 memSurgery: TRichEdit;
39 pnlWrite: TPanel;
40 memNewNote: TRichEdit;
41 Z3: TMenuItem;
42 mnuViewAll: TMenuItem;
43 mnuViewBySurgeon: TMenuItem;
44 mnuViewByDate: TMenuItem;
45 mnuViewUncosigned: TMenuItem;
46 mnuViewUnsigned: TMenuItem;
47 mnuActSignList: TMenuItem;
48 cmdNewNote: TORAlignButton;
49 lblSpace1: TLabel;
50 popNoteMemo: TPopupMenu;
51 popNoteMemoCut: TMenuItem;
52 popNoteMemoCopy: TMenuItem;
53 popNoteMemoPaste: TMenuItem;
54 Z10: TMenuItem;
55 popNoteMemoSignList: TMenuItem;
56 popNoteMemoDelete: TMenuItem;
57 popNoteMemoEdit: TMenuItem;
58 popNoteMemoSave: TMenuItem;
59 popNoteMemoSign: TMenuItem;
60 popNoteList: TPopupMenu;
61 popNoteListAll: TMenuItem;
62 popNoteListByDate: TMenuItem;
63 mnuActIdentifyAddlSigners: TMenuItem;
64 popNoteMemoAddlSign: TMenuItem;
65 Z11: TMenuItem;
66 popNoteMemoSpell: TMenuItem;
67 popNoteMemoGrammar: TMenuItem;
68 mnuViewCustom: TMenuItem;
69 N1: TMenuItem;
70 mnuViewSaveAsDefault: TMenuItem;
71 ReturntoDefault1: TMenuItem;
72 pnlDrawers: TPanel;
73 splDrawers: TSplitter;
74 popNoteMemoTemplate: TMenuItem;
75 Z12: TMenuItem;
76 mnuOptions: TMenuItem;
77 mnuEditTemplates: TMenuItem;
78 mnuNewTemplate: TMenuItem;
79 N2: TMenuItem;
80 mnuEditSharedTemplates: TMenuItem;
81 mnuNewSharedTemplate: TMenuItem;
82 popNoteMemoAddend: TMenuItem;
83 pnlFields: TPanel;
84 lblNewTitle: TLabel;
85 lblRefDate: TLabel;
86 lblAuthor: TLabel;
87 lblVisit: TLabel;
88 lblCosigner: TLabel;
89 cmdChange: TButton;
90 lblSubject: TLabel;
91 txtSubject: TCaptionEdit;
92 timAutoSave: TTimer;
93 popNoteMemoPaste2: TMenuItem;
94 popNoteMemoReformat: TMenuItem;
95 Z4: TMenuItem;
96 mnuActChange: TMenuItem;
97 mnuActLoadBoiler: TMenuItem;
98 bvlNewTitle: TBevel;
99 popNoteMemoSaveContinue: TMenuItem;
100 N3: TMenuItem;
101 mnuEditDialgFields: TMenuItem;
102 N4: TMenuItem;
103 popNoteListExpandSelected: TMenuItem;
104 popNoteListExpandAll: TMenuItem;
105 popNoteListCollapseSelected: TMenuItem;
106 popNoteListCollapseAll: TMenuItem;
107 popNoteListCustom: TMenuItem;
108 mnuActDetachFromIDParent: TMenuItem;
109 N5: TMenuItem;
110 popNoteListDetachFromIDParent: TMenuItem;
111 popNoteListAddIDEntry: TMenuItem;
112 mnuActAddIDEntry: TMenuItem;
113 mnuIconLegend: TMenuItem;
114 N6: TMenuItem;
115 popNoteMemoFind: TMenuItem;
116 dlgFindText: TFindDialog;
117 dlgReplaceText: TReplaceDialog;
118 popNoteMemoReplace: TMenuItem;
119 N7: TMenuItem;
120 tvSurgery: TORTreeView;
121 mnuChartSurgery: TMenuItem;
122 lstNotes: TORListBox;
123 sptVert: TSplitter;
124 memPCEShow: TRichEdit;
125 cmdPCE: TORAlignButton;
126 popNoteListBySurgeon: TMenuItem;
127 popNoteListUnsigned: TMenuItem;
128 popNoteListUncosigned: TMenuItem;
129 N8: TMenuItem;
130 popNoteMemoPreview: TMenuItem;
131 popNoteMemoInsTemplate: TMenuItem;
132 popNoteMemoEncounter: TMenuItem;
133 procedure mnuChartTabClick(Sender: TObject);
134 procedure pnlRightResize(Sender: TObject);
135 procedure cmdNewNoteClick(Sender: TObject);
136 procedure mnuActNewClick(Sender: TObject);
137 procedure mnuActSaveClick(Sender: TObject);
138 procedure mnuViewClick(Sender: TObject);
139 procedure mnuActAddendClick(Sender: TObject);
140 procedure mnuActSignListClick(Sender: TObject);
141 procedure mnuActDeleteClick(Sender: TObject);
142 procedure mnuActEditClick(Sender: TObject);
143 procedure mnuActSignClick(Sender: TObject);
144 procedure cmdPCEClick(Sender: TObject);
145 procedure popNoteMemoCutClick(Sender: TObject);
146 procedure popNoteMemoCopyClick(Sender: TObject);
147 procedure popNoteMemoPasteClick(Sender: TObject);
148 procedure popNoteMemoPopup(Sender: TObject);
149 procedure pnlWriteResize(Sender: TObject);
150 procedure FormCreate(Sender: TObject);
151 procedure mnuViewDetailClick(Sender: TObject);
152 procedure FormClose(Sender: TObject; var Action: TCloseAction);
153 procedure mnuActIdentifyAddlSignersClick(Sender: TObject);
154 procedure popNoteMemoAddlSignClick(Sender: TObject);
155 procedure popNoteMemoSpellClick(Sender: TObject);
156 procedure popNoteMemoGrammarClick(Sender: TObject);
157 procedure mnuViewSaveAsDefaultClick(Sender: TObject);
158 procedure mnuViewReturntoDefaultClick(Sender: TObject);
159 procedure popNoteMemoTemplateClick(Sender: TObject);
160 procedure mnuEditTemplatesClick(Sender: TObject);
161 procedure mnuNewTemplateClick(Sender: TObject);
162 procedure mnuEditSharedTemplatesClick(Sender: TObject);
163 procedure mnuNewSharedTemplateClick(Sender: TObject);
164 procedure mnuOptionsClick(Sender: TObject);
165 procedure FormDestroy(Sender: TObject);
166 procedure cmdChangeClick(Sender: TObject);
167 procedure pnlFieldsResize(Sender: TObject);
168 procedure timAutoSaveTimer(Sender: TObject);
169 procedure memNewNoteChange(Sender: TObject);
170 procedure popNoteMemoReformatClick(Sender: TObject);
171 procedure mnuActChangeClick(Sender: TObject);
172 procedure mnuActLoadBoilerClick(Sender: TObject);
173 procedure popNoteMemoSaveContinueClick(Sender: TObject);
174 procedure mnuEditDialgFieldsClick(Sender: TObject);
175 procedure popNoteListExpandAllClick(Sender: TObject);
176 procedure popNoteListCollapseAllClick(Sender: TObject);
177 procedure popNoteListExpandSelectedClick(Sender: TObject);
178 procedure popNoteListCollapseSelectedClick(Sender: TObject);
179 procedure popNoteListPopup(Sender: TObject);
180 procedure mnuIconLegendClick(Sender: TObject);
181 procedure popNoteMemoFindClick(Sender: TObject);
182 procedure dlgFindTextFind(Sender: TObject);
183 procedure popNoteMemoReplaceClick(Sender: TObject);
184 procedure dlgReplaceTextReplace(Sender: TObject);
185 procedure dlgReplaceTextFind(Sender: TObject);
186 procedure tvSurgeryClick(Sender: TObject);
187 procedure tvSurgeryChange(Sender: TObject; Node: TTreeNode);
188 procedure tvSurgeryExpanded(Sender: TObject; Node: TTreeNode);
189 procedure tvSurgeryCollapsed(Sender: TObject; Node: TTreeNode);
190 procedure lstNotesClick(Sender: TObject);
191 procedure memNewNoteKeyDown(Sender: TObject; var Key: Word;
192 Shift: TShiftState);
193 procedure sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
194 procedure popNoteMemoPreviewClick(Sender: TObject);
195 procedure popNoteMemoInsTemplateClick(Sender: TObject);
196 procedure tvSurgeryAddition(Sender: TObject; Node: TTreeNode);
197 procedure tvSurgeryDeletion(Sender: TObject; Node: TTreeNode);
198 private
199 FEditingIndex: Integer; // index of note being currently edited
200 FCurrentContext: TSurgCaseContext;
201 FDefaultContext: TSurgCaseContext;
202 FImageFlag: TBitmap;
203 FCaseList: TStringList;
204 FChanged: Boolean; // true if any text has changed in the note
205 FEditCtrl: TCustomEdit;
206 FSilent: Boolean;
207 FEditNote: TEditNoteRec;
208 FVerifyNoteTitle: Integer;
209 FConfirmed: boolean;
210 FLastNoteID: string;
211 FEditingNotePCEObj: boolean;
212 FDeleted: boolean;
213 procedure ClearEditControls;
214 procedure DoAutoSave;
215 function GetTitleText(AnIndex: Integer): string;
216 procedure InsertAddendum;
217 procedure InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
218 function LacksRequiredForCreate: Boolean;
219 procedure LoadForEdit;
220 procedure LoadSurgeryCases;
221 procedure UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
222 procedure SetViewContext(AContext: TSurgCaseContext);
223 function GetDrawers: TFrmDrawers;
224 procedure SetEditingIndex(const Value: Integer);
225 property EditingIndex: Integer read FEditingIndex write SetEditingIndex;
226 procedure ProcessNotifications;
227 function SetSurgTreeLabel(AContext: TSurgCaseContext): string;
228 procedure RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
229 procedure SaveEditedNote(var Saved: Boolean);
230 procedure SaveCurrentNote(var Saved: Boolean);
231 procedure SetSubjectVisible(ShouldShow: Boolean);
232 procedure ShowPCEControls(ShouldShow: Boolean);
233 function StartNewEdit(NewNoteType: integer): Boolean;
234 //function CanFinishReminder: boolean;
235 procedure DisplayPCE;
236 function VerifyNoteTitle: Boolean;
237 procedure ShowPCEButtons(Editing: boolean);
238 procedure EnableDisableMenus(IsTIUDocument: boolean);
239 public
240 function AllowContextChange(var WhyNot: string): Boolean; override;
241 procedure ClearPtData; override;
242 procedure DisplayPage; override;
243 procedure RequestPrint; override;
244 procedure SetFontSize(NewFontSize: Integer); override;
245 procedure SaveSignItem(const ItemID, ESCode: string);
246 procedure AssignRemForm;
247 published
248 property Drawers: TFrmDrawers read GetDrawers; // Keep Drawers published
249 end;
250
251var
252 frmSurgery: TfrmSurgery;
253 uSurgeryContext: TSurgCaseContext;
254
255implementation
256
257{$R *.DFM}
258
259uses fFrame, fVisit, fEncnt, rCore, uCore, fNoteBA, fNoteBD, fSignItem, fEncounterFrame,
260 rPCE, Clipbrd, fNoteCslt, fNotePrt, rVitals, fAddlSigners, fNoteDR, fConsults, uSpell,
261 fTIUView, fTemplateEditor, uReminders, fReminderDialog, uOrders, rConsults, fReminderTree,
262 fNoteProps, fNotesBP, fTemplateFieldEditor, uTemplates, dShared, rTemplates,
263 FIconLegend, fPCEEdit, rTIU, fRptBox, uAccessibleTreeView,
264 uAccessibleTreeNode, fTemplateDialog;
265
266const
267 CT_SURGERY = 11; // chart tab - surgery
268
269 NT_NEW_NOTE = -10; // Holder IEN for a new note
270 NT_ADDENDUM = -20; // Holder IEN for a new addendum
271
272 NT_ACT_NEW_NOTE = 2;
273 NT_ACT_ADDENDUM = 3;
274 NT_ACT_EDIT_NOTE = 4;
275 NT_ACT_ID_ENTRY = 5;
276
277 TX_NEED_VISIT = 'A visit is required before creating a new surgery report.';
278 TX_CREATE_ERR = 'Error Creating Report';
279 TX_UPDATE_ERR = 'Error Updating Report';
280 TX_NO_NOTE = 'No surgery report is currently being edited';
281 TX_SAVE_NOTE = 'Save Surgery Report';
282 TX_ADDEND_NO = 'Cannot make an addendum to a report that is being edited';
283 TX_DEL_OK = CRLF + CRLF + 'Delete this surgery report?';
284 TX_DEL_ERR = 'Unable to Delete Report';
285 TX_SIGN = 'Sign Report';
286 TX_COSIGN = 'Cosign Report';
287 TX_SIGN_ERR = 'Unable to Sign Report';
288// TX_SCREQD = 'This progress note title requires the service connected questions to be '+
289// 'answered. The Encounter form will now be opened. Please answer all '+
290// 'service connected questions.';
291// TX_SCREQD_T = 'Response required for SC questions.';
292 TX_NONOTE = 'No surgery report is currently selected.';
293 TX_NONOTE_CAP = 'No Report Selected';
294 TX_NOPRT_NEW = 'This surgery report may not be printed until it is saved';
295 TX_NOPRT_NEW_CAP = 'Save Surgery Report';
296 TX_NO_ALERT = 'There is insufficient information to process this alert.' + CRLF +
297 'Either the alert has already been deleted, or it contained invalid data.' + CRLF + CRLF +
298 'Click the NEXT button if you wish to continue processing more alerts.';
299 TX_CAP_NO_ALERT = 'Unable to Process Alert';
300 //TX_ORDER_LOCKED = 'This record is locked by an action underway on the Consults tab';
301 //TC_ORDER_LOCKED = 'Unable to access record';
302 //TX_NO_ORD_CHG = 'The note is still associated with the previously selected request.' + CRLF +
303 // 'Finish the pending action on the consults tab, then try again.';
304 //TC_NO_ORD_CHG = 'Locked Consult Request';
305 TX_NEW_SAVE1 = 'You are currently editing:' + CRLF + CRLF;
306 TX_NEW_SAVE2 = CRLF + CRLF + 'Do you wish to save this report and begin a new one?';
307 TX_NEW_SAVE3 = CRLF + CRLF + 'Do you wish to save this report and begin a new addendum?';
308 TX_NEW_SAVE4 = CRLF + CRLF + 'Do you wish to save this report and edit the one selected?';
309 //TX_NEW_SAVE5 = CRLF + CRLF + 'Do you wish to save this report and begin a new Interdisciplinary entry?';
310 TC_NEW_SAVE2 = 'Create New Report';
311 TC_NEW_SAVE3 = 'Create New Addendum';
312 TC_NEW_SAVE4 = 'Edit Different Report';
313 //TC_NEW_SAVE5 = 'Create New Interdisciplinary Entry';
314 TX_EMPTY_NOTE = CRLF + CRLF + 'This report contains no text and will not be saved.' + CRLF +
315 'Do you wish to delete this report?';
316 TC_EMPTY_NOTE = 'Empty Report';
317 TX_EMPTY_NOTE1 = 'This report contains no text and can not be signed.';
318 TC_NO_LOCK = 'Unable to Lock Report';
319 TX_ABSAVE = 'It appears the session terminated abnormally when this' + CRLF +
320 'report was last edited. Some text may not have been saved.' + CRLF + CRLF +
321 'Do you wish to continue and sign the report?';
322 TC_ABSAVE = 'Possible Missing Text';
323 TX_NO_BOIL = 'There is no boilerplate text associated with this title.';
324 TC_NO_BOIL = 'Load Boilerplate Text';
325 TX_BLR_CLEAR = 'Do you want to clear the previously loaded boilerplate text?';
326 TC_BLR_CLEAR = 'Clear Previous Boilerplate Text';
327 TX_DETACH_CNF = 'Confirm Detachment';
328 TX_DETACH_FAILURE = 'Detach failed';
329 TX_RETRACT_CAP = 'Retraction Notice';
330 TX_RETRACT = 'This document will now be RETRACTED. As Such, it has been removed' +CRLF +
331 ' from public view, and from typical Releases of Information,' +CRLF +
332 ' but will remain indefinitely discoverable to HIMS.' +CRLF +CRLF;
333
334var
335 uPCEShow, uPCEEdit: TPCEData;
336 ViewContext: Integer;
337 frmDrawers: TfrmDrawers;
338 uChanging: Boolean;
339
340{ TPage common methods --------------------------------------------------------------------- }
341
342function TfrmSurgery.AllowContextChange(var WhyNot: string): Boolean;
343begin
344 dlgFindText.CloseDialog;
345 Result := inherited AllowContextChange(WhyNot); // sets result = true
346 if Assigned(frmTemplateDialog) then
347 if Screen.ActiveForm = frmTemplateDialog then
348 //if (fsModal in frmTemplateDialog.FormState) then
349 case BOOLCHAR[frmFrame.CCOWContextChanging] of
350 '1': begin
351 WhyNot := 'A template in progress will be aborted. ';
352 Result := False;
353 end;
354 '0': begin
355 if WhyNot = 'COMMIT' then
356 begin
357 FSilent := True;
358 frmTemplateDialog.Silent := True;
359 frmTemplateDialog.ModalResult := mrCancel;
360 end;
361 end;
362 end;
363 if EditingIndex <> -1 then
364 case BOOLCHAR[frmFrame.CCOWContextChanging] of
365 '1': begin
366 if memNewNote.GetTextLen > 0 then
367 WhyNot := 'A report in progress will be saved as unsigned. '
368 else
369 WhyNot := 'An empty report in progress will be deleted. ';
370 Result := False;
371 end;
372 '0': begin
373 if WhyNot = 'COMMIT' then FSilent := True;
374 SaveCurrentNote(Result)
375 end;
376 end;
377 if Assigned(frmEncounterFrame) then
378 if Screen.ActiveForm = frmEncounterFrame then
379 //if (fsModal in frmEncounterFrame.FormState) then
380 case BOOLCHAR[frmFrame.CCOWContextChanging] of
381 '1': begin
382 WhyNot := WhyNot + 'Encounter information being edited will not be saved';
383 Result := False;
384 end;
385 '0': begin
386 if WhyNot = 'COMMIT' then
387 begin
388 FSilent := True;
389 frmEncounterFrame.Abort := False;
390 frmEncounterFrame.Cancel := True;
391 end;
392 end;
393 end;
394end;
395
396procedure TfrmSurgery.ClearPtData;
397{ clear all controls that contain patient specific information }
398begin
399 inherited ClearPtData;
400 ClearEditControls;
401 uChanging := True;
402 tvSurgery.Items.BeginUpdate;
403 KillCaseTreeObjects(tvSurgery);
404 tvSurgery.Items.Clear;
405 tvSurgery.Items.EndUpdate;
406 lstNotes.Clear;
407 uChanging := False;
408 memSurgery.Clear;
409 uPCEShow.Clear;
410 uPCEEdit.Clear;
411 frmDrawers.ResetTemplates;
412end;
413
414procedure TfrmSurgery.DisplayPage;
415{ causes page to be visible and conditionally executes initialization code }
416begin
417 inherited DisplayPage;
418 frmFrame.ShowHideChartTabMenus(mnuViewChart);
419 frmFrame.mnuFilePrint.Tag := CT_SURGERY;
420 frmFrame.mnuFilePrint.Enabled := True;
421 frmFrame.mnuFilePrintSetup.Enabled := True;
422 if InitPage then
423 begin
424 FDefaultContext := GetCurrentSurgCaseContext;
425 FCurrentContext := FDefaultContext;
426 popNoteMemoSpell.Visible := SpellCheckAvailable;
427 popNoteMemoGrammar.Visible := popNoteMemoSpell.Visible;
428 Z11.Visible := popNoteMemoSpell.Visible;
429 timAutoSave.Interval := User.AutoSave * 1000; // convert seconds to milliseconds
430 SetEqualTabStops(memNewNote);
431 end;
432 // to indent the right margin need to set Paragraph.RightIndent for each paragraph?
433 if InitPatient and not (CallingContext = CC_NOTIFICATION) then
434 begin
435 SetViewContext(FDefaultContext);
436 end;
437 case CallingContext of
438 CC_INIT_PATIENT: if not InitPatient then
439 begin
440 SetViewContext(FDefaultContext);
441 end;
442 CC_NOTIFICATION: ProcessNotifications;
443 end;
444end;
445
446{ Form events ------------------------------------------------------------------------------ }
447
448procedure TfrmSurgery.FormCreate(Sender: TObject);
449begin
450 inherited;
451 PageID := CT_SURGERY;
452 memSurgery.Color := ReadOnlyColor;
453 memPCEShow.Color := ReadOnlyColor;
454 lblNewTitle.Color := ReadOnlyColor;
455 EditingIndex := -1;
456 FEditNote.LastCosigner := 0;
457 FEditNote.LastCosignerName := '';
458 FLastNoteID := '';
459 frmDrawers := TfrmDrawers.CreateDrawers(Self, pnlDrawers, [],[]);
460 frmDrawers.Align := alBottom;
461 frmDrawers.RichEditControl := memNewNote;
462 frmDrawers.NewNoteButton := cmdNewNote;
463 frmDrawers.Splitter := splDrawers;
464 frmDrawers.DefTempPiece := 1;
465 tvSurgery.Images := dmodShared.imgSurgery;
466 tvSurgery.StateImages := dmodShared.imgImages;
467 FImageFlag := TBitmap.Create;
468 FCaseList := TStringList.Create;
469 TAccessibleTreeView.WrapControl(tvSurgery);
470end;
471
472procedure TfrmSurgery.pnlRightResize(Sender: TObject);
473{ memSurgery (TRichEdit) doesn't repaint appropriately unless it's parent panel is refreshed }
474begin
475 inherited;
476 pnlRight.Refresh;
477 memSurgery.Repaint;
478end;
479
480procedure TfrmSurgery.pnlWriteResize(Sender: TObject);
481const
482 LEFT_MARGIN = 4;
483begin
484 inherited;
485 LimitEditWidth(memNewNote, MAX_ENTRY_WIDTH - 1);
486 memNewNote.Constraints.MinWidth := TextWidthByFont(memNewNote.Font.Handle, StringOfChar('X', MAX_ENTRY_WIDTH)) + (LEFT_MARGIN * 2) + ScrollBarWidth;
487 pnlLeft.Width := self.ClientWidth - pnlWrite.Width - sptHorz.Width;
488end;
489
490procedure TfrmSurgery.SetViewContext(AContext: TSurgCaseContext);
491var
492 Saved: boolean;
493begin
494 inherited;
495 if EditingIndex <> -1 then
496 begin
497 SaveCurrentNote(Saved);
498 if not Saved then Exit;
499 end;
500 FCurrentContext := AContext;
501 EditingIndex := -1;
502 tvSurgery.Enabled := True ;
503 pnlRead.BringToFront ;
504 with uSurgeryContext do
505 begin
506 Changed := True;
507 OpProc := FCurrentContext.OpProc;
508 BeginDate := FCurrentContext.BeginDate;
509 EndDate := FCurrentContext.EndDate;
510 FMBeginDate := FCurrentContext.FMBeginDate;
511 FMEndDate := FCurrentContext.FMEndDate;
512 MaxDocs := FCurrentContext.MaxDocs;
513 Status := FCurrentContext.Status;
514 GroupBy := FCurrentContext.GroupBy;
515 TreeAscending := FCurrentContext.TreeAscending;
516 mnuViewClick(Self);
517 end;
518end;
519
520procedure TfrmSurgery.FormDestroy(Sender: TObject);
521begin
522 TAccessibleTreeView.UnwrapControl(tvSurgery);
523 FCaseList.Free;
524 FImageFlag.Free;
525 KillCaseTreeObjects(tvSurgery);
526 inherited;
527end;
528
529function TfrmSurgery.GetDrawers: TFrmDrawers;
530begin
531 Result := frmDrawers ;
532end;
533
534procedure TfrmSurgery.UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
535var
536 i: integer;
537begin
538 with Tree do
539 begin
540 uChanging := True;
541 Items.BeginUpdate;
542 for i := 0 to DocList.Count - 1 do
543 begin
544 if Piece(DocList[i], U, 10) <> '' then
545 lstNotes.Items.Add(DocList[i]);
546 end;
547 BuildCaseTree(DocList, '0', Tree, nil, uSurgeryContext);
548 Items.EndUpdate;
549 uChanging := False;
550 end;
551end;
552
553procedure TfrmSurgery.RequestPrint;
554var
555 Saved: Boolean;
556begin
557 with lstNotes do
558 begin
559 if ItemIndex = EditingIndex then
560 begin
561 SaveCurrentNote(Saved);
562 if not Saved then Exit;
563 end;
564 if ItemIEN > 0 then PrintNote(ItemIEN, MakeNoteDisplayText(Items[ItemIndex])) else
565 begin
566 if ItemIEN = 0 then InfoBox(TX_NONOTE, TX_NONOTE_CAP, MB_OK);
567 if ItemIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK);
568 end;
569 end;
570end;
571
572procedure TfrmSurgery.mnuChartTabClick(Sender: TObject);
573{ reroute to Chart Tab menu of the parent form: frmFrame }
574begin
575 inherited;
576 frmFrame.mnuChartTabClick(Sender);
577end;
578
579procedure TfrmSurgery.SetFontSize(NewFontSize: Integer);
580{ adjusts the font size of any controls that don't have ParentFont = True }
581begin
582 inherited SetFontSize(NewFontSize);
583 pnlLeft.Width := pnlLeft.Constraints.MinWidth;
584 sptHorz.Left := pnlLeft.Width;
585 memSurgery.Font.Size := NewFontSize;
586 memNewNote.Font.Size := NewFontSize;
587 lblTitle.Font.Size := NewFontSize;
588 frmDrawers.Font.Size := NewFontSize;
589 SetEqualTabStops(memNewNote);
590 // adjust heights of pnlAction, pnlFields, and lstEncntShow
591end;
592
593procedure TfrmSurgery.mnuViewClick(Sender: TObject);
594{ changes the list of notes available for viewing }
595var
596 //AuthCtxt: TAuthorContext;
597 //DateRange: TNoteDateRange;
598 AContext: TSurgCaseContext;
599 Saved: Boolean;
600begin
601 inherited;
602 // save note at EditingIndex?
603 if EditingIndex <> -1 then
604 begin
605 SaveCurrentNote(Saved);
606 if not Saved then Exit;
607 end;
608 FLastNoteID := lstNotes.ItemID;
609 mnuViewDetail.Checked := False;
610 uChanging := True;
611 AContext := GetCurrentSurgCaseContext;
612 StatusText('Retrieving surgery case list...');
613 if Sender is TMenuItem then ViewContext := TMenuItem(Sender).Tag
614 else with AContext do
615 begin
616 if ((BeginDate + EndDate + Status + GroupBy + IntToStr(MaxDocs)) <> '0') then
617 ViewContext := SR_CUSTOM
618 else
619 ViewContext := SR_ALL;
620 end;
621 with tvSurgery do if (Selected <> nil) and (Piece(TORTreeNode(Selected).StringData, U, 10) <> '') then
622 FLastNoteID := Piece(TORTreeNode(Selected).StringData, U, 1);
623 case ViewContext of
624 SR_RECENT, SR_ALL: begin
625 FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
626 FillChar(uSurgeryContext, SizeOf(uSurgeryContext), 0);
627 //FCurrentContext.MaxDocs := uSurgeryContext.MaxDocs;
628 FCurrentContext.Status := IntToStr(ViewContext);
629 LoadSurgeryCases;
630 end;
631 SR_CUSTOM: begin
632 if Sender is TMenuItem then
633 begin
634 SelectSurgeryView(Font.Size, True, FCurrentContext, uSurgeryContext);
635 end;
636 with uSurgeryContext do (*if Changed then*)
637 begin
638 FCurrentContext.OpProc := OpProc;
639 FCurrentContext.BeginDate := BeginDate;
640 FCurrentContext.EndDate := EndDate;
641 FCurrentContext.FMBeginDate := FMBeginDate;
642 FCurrentContext.FMEndDate := FMEndDate;
643 if (FMBeginDate > 0) and (FMEndDate > 0) then
644 FCurrentContext.Status := IntToStr(SR_BY_DATE)
645 else
646 FCurrentContext.Status := Status;
647 FCurrentContext.MaxDocs := MaxDocs;
648 FCurrentContext.GroupBy := GroupBy;
649 FCurrentContext.TreeAscending := TreeAscending;
650 LoadSurgeryCases;
651 end;
652 end;
653 end; {case}
654 lblCases.Caption := SetSurgTreeLabel(FCurrentContext);
655 tvSurgery.Caption := lblCases.Caption;
656 StatusText('');
657end;
658
659procedure TfrmSurgery.popNoteMemoFindClick(Sender: TObject);
660begin
661 inherited;
662 SendMessage(TRichEdit(popNoteMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0);
663 with dlgFindText do
664 begin
665 Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top);
666 FindText := '';
667 Options := [frDown, frHideUpDown];
668 Execute;
669 end;
670end;
671
672procedure TfrmSurgery.dlgFindTextFind(Sender: TObject);
673begin
674 dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
675end;
676
677{ General procedures ----------------------------------------------------------------------- }
678
679procedure TfrmSurgery.ClearEditControls;
680{ resets controls used for entering a new progress note }
681begin
682 // clear FEditNote (should FEditNote be an object with a clear method?)
683 with FEditNote do
684 begin
685 DocType := 0;
686 Title := 0;
687 TitleName := '';
688 DateTime := 0;
689 Author := 0;
690 AuthorName := '';
691 Cosigner := 0;
692 CosignerName := '';
693 Subject := '';
694 Location := 0;
695 LocationName := '';
696 PkgRef := '';
697 PkgIEN := 0;
698 PkgPtr := '';
699 NeedCPT := False;
700 Addend := 0;
701 {LastCosigner & LastCosignerName aren't cleared because they're used as default for next note.}
702 Lines := nil;
703 end;
704 // clear the editing controls (also clear the new labels?)
705 txtSubject.Text := '';
706 memNewNote.Clear;
707 timAutoSave.Enabled := False;
708 // clear the PCE object for editing
709 uPCEEdit.Clear;
710 // set the tracking variables to initial state
711 EditingIndex := -1;
712 FChanged := False;
713end;
714
715procedure TfrmSurgery.ShowPCEControls(ShouldShow: Boolean);
716begin
717 sptVert.Visible := ShouldShow;
718 memPCEShow.Visible := ShouldShow;
719 if(ShouldShow) then
720 sptVert.Top := memPCEShow.Top - sptVert.Height;
721 memSurgery.Invalidate;
722end;
723
724procedure TfrmSurgery.DisplayPCE;
725{ displays PCE information if appropriate & enables/disabled editing of PCE data }
726var
727 EnableList, ShowList: TDrawers;
728 VitalStr: TStringlist;
729 NoPCE: boolean;
730 ActionSts: TActionRec;
731 AnIEN: integer;
732
733begin
734 memPCEShow.Clear;
735 with lstNotes do if ItemIndex = -1 then
736 begin
737 ShowPCEControls(FALSE);
738 frmDrawers.DisplayDrawers(FALSE);
739 end
740 else if ItemIndex = EditingIndex then
741 begin
742 with uPCEEdit do
743 begin
744 AddStrData(memPCEShow.Lines);
745 NoPCE := (memPCEShow.Lines.Count = 0);
746 VitalStr := TStringList.create;
747 try
748 GetVitalsFromDate(VitalStr, uPCEEdit);
749 AddVitalData(VitalStr, memPCEShow.Lines);
750 finally
751 VitalStr.free;
752 end;
753 ShowPCEButtons(TRUE);
754 ShowPCEControls(cmdPCE.Enabled or (memPCEShow.Lines.Count > 0));
755 if(NoPCE and memPCEShow.Visible) then
756 memPCEShow.Lines.Insert(0, TX_NOPCE);
757
758 if(InteractiveRemindersActive) then
759 begin
760 if(GetReminderStatus = rsNone) then
761 EnableList := [odTemplates]
762 else
763 EnableList := [odTemplates, odReminders];
764 ShowList := [odTemplates, odReminders];
765 end
766 else
767 begin
768 EnableList := [odTemplates];
769 ShowList := [odTemplates];
770 end;
771 frmDrawers.DisplayDrawers(TRUE, EnableList, ShowList);
772 end;
773 end else
774 begin
775 ShowPCEButtons(FALSE);
776 frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]);
777 AnIEN := lstNotes.ItemIEN;
778 ActOnDocument(ActionSts, AnIEN, 'VIEW');
779 if ActionSts.Success then
780 begin
781 StatusText('Retrieving encounter information...');
782 with uPCEShow do
783 begin
784 NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
785 PCEForNote(AnIEN, uPCEEdit);
786 AddStrData(memPCEShow.Lines);
787 NoPCE := (memPCEShow.Lines.Count = 0);
788 VitalStr := TStringList.create;
789 try
790 GetVitalsFromNote(VitalStr, uPCEShow, AnIEN);
791 AddVitalData(VitalStr, memPCEShow.Lines);
792 finally
793 VitalStr.free;
794 end;
795 ShowPCEControls(memPCEShow.Lines.Count > 0);
796 if(NoPCE and memPCEShow.Visible) then
797 memPCEShow.Lines.Insert(0, TX_NOPCE);
798 end;
799 StatusText('');
800 end
801 else
802 ShowPCEControls(FALSE);
803 end; {if ItemIndex}
804end;
805
806{ supporting calls for writing notes }
807
808function TfrmSurgery.GetTitleText(AnIndex: Integer): string;
809{ returns non-tabbed text for the title of a note given the ItemIndex in lstNotes }
810begin
811 with lstNotes do if ItemIndex > -1 then
812 Result := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(Piece(Items[AnIndex], U, 3))) +
813 ' ' + Piece(Items[AnIndex], U, 2) + ', ' + Piece(Items[AnIndex], U, 6) + ', ' +
814 Piece(Piece(Items[AnIndex], U, 5), ';', 2)
815end;
816
817function TfrmSurgery.LacksRequiredForCreate: Boolean;
818{ determines if the fields required to create the note are present }
819var
820 CurTitle: Integer;
821begin
822 Result := False;
823 with FEditNote do
824 begin
825 if Title <= 0 then Result := True;
826 if Author <= 0 then Result := True;
827 if DateTime <= 0 then Result := True;
828 if (DocType = TYP_ADDENDUM) then
829 begin
830 if AskCosignerForDocument(Addend, Author) and (Cosigner <= 0) then Result := True;
831 end else
832 begin
833 if Title > 0 then CurTitle := Title else CurTitle := DocType;
834 if AskCosignerForTitle(CurTitle, Author) and (Cosigner <= 0) then Result := True;
835 end;
836 end;
837end;
838
839function TfrmSurgery.VerifyNoteTitle: Boolean;
840const
841 VNT_UNKNOWN = 0;
842 VNT_NO = 1;
843 VNT_YES = 2;
844var
845 AParam: string;
846begin
847 if FVerifyNoteTitle = VNT_UNKNOWN then
848 begin
849 AParam := GetUserParam('ORWOR VERIFY NOTE TITLE');
850 if AParam = '1' then FVerifyNoteTitle := VNT_YES else FVerifyNoteTitle := VNT_NO;
851 end;
852 Result := FVerifyNoteTitle = VNT_YES;
853end;
854
855procedure TfrmSurgery.SetSubjectVisible(ShouldShow: Boolean);
856{ hide/show subject & resize panel accordingly - leave 6 pixel margin above memNewNote }
857begin
858 if ShouldShow then
859 begin
860 lblSubject.Visible := True;
861 txtSubject.Visible := True;
862 pnlFields.Height := txtSubject.Top + txtSubject.Height + 6;
863 end else
864 begin
865 lblSubject.Visible := False;
866 txtSubject.Visible := False;
867 pnlFields.Height := lblVisit.Top + lblVisit.Height + 6;
868 end;
869end;
870
871
872{ create, edit & save notes }
873
874procedure TfrmSurgery.InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
875{ creates the editing context for a new progress note & inserts stub into top of view list }
876const
877 IS_ID_CHILD = False;
878var
879 EnableAutosave, HaveRequired: Boolean;
880 CreatedNote: TCreatedDoc;
881 TmpBoilerPlate: TStringList;
882 tmpNode: TTreeNode;
883 x, AClassName: string;
884 DocInfo: string;
885begin
886 if tvSurgery.Selected = nil then exit;
887 if PCaseTreeObject(tvSurgery.Selected.Data)^.OperativeProc = '' then
888 begin
889 InfoBox('You must first select the case to which this document will apply', 'Select a case', 0);
890 exit;
891 end;
892 EnableAutosave := FALSE;
893 TmpBoilerPlate := nil;
894 try
895 ClearEditControls;
896 FillChar(FEditNote, SizeOf(FEditNote), 0); //v15.7
897 with FEditNote do
898 begin
899 DocType := TYP_PROGRESS_NOTE;
900 Title := DfltNoteTitle;
901 TitleName := DfltNoteTitleName;
902 DateTime := FMNow;
903 Author := User.DUZ;
904 AuthorName := User.Name;
905 Location := Encounter.Location;
906 LocationName := Encounter.LocationName;
907 VisitDate := Encounter.DateTime;
908 if IsIDChild then
909 IDParent := AnIDParent
910 else
911 IDParent := 0;
912 // Cosigner & PkgRef, if needed, will be set by fNoteProps
913 end;
914 // check to see if interaction necessary to get required fields
915 if PCaseTreeObject(tvSurgery.Selected.Data)^.IsNonORProc then AClassName := DCL_SURG_NON_OR else AClassName := DCL_SURG_OR;
916 if LacksRequiredForCreate or VerifyNoteTitle
917 then HaveRequired := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, IS_ID_CHILD, AClassName, 0)
918 else HaveRequired := True;
919 if HaveRequired then
920 begin
921 // set up uPCEEdit for entry of new note
922 uPCEEdit.UseEncounter := True;
923 uPCEEdit.NoteDateTime := FEditNote.DateTime;
924 uPCEEdit.PCEForNote(USE_CURRENT_VISITSTR, uPCEShow);
925 FEditNote.NeedCPT := uPCEEdit.CPTRequired;
926 // create the note
927 PutNewNote(CreatedNote, FEditNote);
928 uPCEEdit.NoteIEN := CreatedNote.IEN;
929 if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
930 if CreatedNote.ErrorText = '' then
931 begin
932 //x := $$RESOLVE^TIUSRVLO formatted string
933 //7348^Note Title^3000913^NERD, YOURA (N0165)^1329;Rich Vertigan;VERTIGAN,RICH^8E REHAB MED^complete^Adm: 11/05/98;2981105.095547^ ;^^0^^^2
934 with FEditNote do
935 begin
936 x := IntToStr(CreatedNote.IEN) + U + TitleName + U + FloatToStr(FEditNote.DateTime) + U +
937 Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
938 U + U + U + U + U + U + U;
939 end;
940
941 lstNotes.Items.Insert(0, x);
942 uChanging := True;
943 tvSurgery.Items.BeginUpdate;
944(* if IsIDChild then
945 begin
946 tmpNode := tvSurgery.FindPieceNode(IntToStr(AnIDParent), 1, U, tvSurgery.Items.GetFirstNode);
947 tmpNode.ImageIndex := IMG_IDNOTE_OPEN;
948 tmpNode.SelectedIndex := IMG_IDNOTE_OPEN;
949 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
950 tmpNode.ImageIndex := IMG_ID_CHILD;
951 tmpNode.SelectedIndex := IMG_ID_CHILD;
952 end
953 else*)
954 begin
955 tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'New Note in Progress',
956 MakeCaseTreeObject('NEW^New Note in Progress^^^^^^^^^^^%^0'));
957 TORTreeNode(tmpNode).StringData := 'NEW^New Note in Progress^^^^^^^^^^^%^0';
958 tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
959 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
960 tmpNode.ImageIndex := IMG_SURG_RPT_SINGLE;
961 tmpNode.SelectedIndex := IMG_SURG_RPT_SINGLE;
962 end;
963 tmpNode.StateIndex := IMG_NO_IMAGES;
964 TORTreeNode(tmpNode).StringData := x;
965 tvSurgery.Selected := tmpNode;
966 tvSurgery.Items.EndUpdate;
967 uChanging := False;
968 Changes.Add(CH_SUR, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
969 lstNotes.ItemIndex := 0;
970 EditingIndex := 0;
971 SetSubjectVisible(AskSubjectForNotes);
972 if not assigned(TmpBoilerPlate) then
973 TmpBoilerPlate := TStringList.Create;
974 LoadBoilerPlate(TmpBoilerPlate, FEditNote.Title);
975 FChanged := False;
976 cmdChangeClick(Self); // will set captions, sign state for Changes
977 lstNotesClick(Self); // will make pnlWrite visible
978 if timAutoSave.Interval <> 0 then EnableAutosave := TRUE;
979 if txtSubject.Visible then txtSubject.SetFocus else memNewNote.SetFocus;
980 end else
981 begin
982 // if note creation failed or failed to get note lock (both unlikely), unlock consult
983 InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
984 HaveRequired := False;
985 end; {if CreatedNote.IEN}
986 end; {if HaveRequired}
987 if not HaveRequired then ClearEditControls;
988 finally
989 if assigned(TmpBoilerPlate) then
990 begin
991 DocInfo := MakeXMLParamTIU(IntToStr(CreatedNote.IEN), FEditNote);
992 ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
993 memNewNote.Lines.Assign(TmpBoilerPlate);
994 TmpBoilerPlate.Free;
995 end;
996 if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved
997 timAutoSave.Enabled := True;
998 end;
999end;
1000
1001procedure TfrmSurgery.InsertAddendum;
1002{ sets up fields of pnlWrite to write an addendum for the selected note }
1003const
1004 AS_ADDENDUM = True;
1005 IS_ID_CHILD = False;
1006var
1007 HaveRequired: Boolean;
1008 CreatedNote: TCreatedDoc;
1009 tmpNode: TTreeNode;
1010 x: string;
1011begin
1012 ClearEditControls;
1013 with FEditNote do
1014 begin
1015 DocType := TYP_ADDENDUM;
1016 Title := TitleForNote(lstNotes.ItemIEN);
1017 TitleName := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
1018 if Copy(TitleName,1,1) = '+' then TitleName := Copy(TitleName, 3, 199);
1019 DateTime := FMNow;
1020 Author := User.DUZ;
1021 AuthorName := User.Name;
1022 Addend := lstNotes.ItemIEN;
1023 x := GetPackageRefForNote(lstNotes.ItemIEN);
1024 if Piece(x, U, 1) <> '-1' then
1025 begin
1026 PkgRef := GetPackageRefForNote(lstNotes.ItemIEN);
1027 PkgIEN := StrToIntDef(Piece(PkgRef, ';', 1), 0);
1028 PkgPtr := Piece(PkgRef, ';', 2);
1029 end;
1030 //Lines := memNewNote.Lines;
1031 // Cosigner, if needed, will be set by fNoteProps
1032 // Location info will be set after the encounter is loaded
1033 end;
1034 // check to see if interaction necessary to get required fields
1035 if LacksRequiredForCreate
1036 then HaveRequired := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, False, '', 0)
1037 else HaveRequired := True;
1038 if HaveRequired then
1039 begin
1040 uPCEEdit.NoteDateTime := FEditNote.DateTime;
1041 uPCEEdit.PCEForNote(FEditNote.Addend, uPCEShow);
1042 FEditNote.Location := uPCEEdit.Location;
1043 FEditNote.LocationName := ExternalName(uPCEEdit.Location, 44);
1044 FEditNote.VisitDate := uPCEEdit.DateTime;
1045 PutAddendum(CreatedNote, FEditNote, FEditNote.Addend);
1046 uPCEEdit.NoteIEN := CreatedNote.IEN;
1047 if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
1048 if CreatedNote.ErrorText = '' then
1049 begin
1050 with FEditNote do
1051 begin
1052 x := IntToStr(CreatedNote.IEN) + U + 'Addendum to ' + TitleName + U + FloatToStr(DateTime) + U +
1053 Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
1054 U + U + PkgRef + U + U + U + U + U;
1055 end;
1056
1057
1058 lstNotes.Items.Insert(0, x);
1059 uChanging := True;
1060 tvSurgery.Items.BeginUpdate;
1061 tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'New Addendum in Progress',
1062 MakeCaseTreeObject('ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0'));
1063 TORTreeNode(tmpNode).StringData := 'ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0';
1064 tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
1065 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
1066 TORTreeNode(tmpNode).StringData := x;
1067
1068 tmpNode.ImageIndex := IMG_SURG_ADDENDUM;
1069 tmpNode.SelectedIndex := IMG_SURG_ADDENDUM;
1070 tvSurgery.Selected := tmpNode;
1071 tvSurgery.Items.EndUpdate;
1072 uChanging := False;
1073 Changes.Add(CH_SUR, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
1074 lstNotes.ItemIndex := 0;
1075 EditingIndex := 0;
1076 SetSubjectVisible(AskSubjectForNotes);
1077 cmdChangeClick(Self); // will set captions, sign state for Changes
1078 lstNotesClick(Self); // will make pnlWrite visible
1079 if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
1080 memNewNote.SetFocus;
1081 end else
1082 begin
1083 // if note creation failed or failed to get note lock (both unlikely), unlock consult
1084 InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
1085 HaveRequired := False;
1086 end; {if CreatedNote.IEN}
1087 end; {if HaveRequired}
1088 if not HaveRequired then ClearEditControls;
1089end;
1090
1091procedure TfrmSurgery.LoadForEdit;
1092{ retrieves an existing note and places the data in the fields of pnlWrite }
1093var
1094 tmpNode: TTreeNode;
1095 x: string;
1096begin
1097 ClearEditControls;
1098 EditingIndex := lstNotes.ItemIndex;
1099 Changes.Add(CH_SUR, lstNotes.ItemID, GetTitleText(EditingIndex), '', CH_SIGN_YES);
1100 GetNoteForEdit(FEditNote, lstNotes.ItemIEN);
1101 memNewNote.Lines.Assign(FEditNote.Lines);
1102 FChanged := False;
1103 if FEditNote.Title = TYP_ADDENDUM then
1104 begin
1105 FEditNote.DocType := TYP_ADDENDUM;
1106 FEditNote.TitleName := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
1107 if Copy(FEditNote.TitleName,1,1) = '+' then FEditNote.TitleName := Copy(FEditNote.TitleName, 3, 199);
1108 if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0
1109 then FEditNote.TitleName := FEditNote.TitleName + 'Addendum to ';
1110 end;
1111
1112 uChanging := True;
1113 tvSurgery.Items.BeginUpdate;
1114
1115 tmpNode := tvSurgery.FindPieceNode('EDIT', 1, U, nil);
1116 if tmpNode = nil then
1117 begin
1118 tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'Note being edited',
1119 MakeCaseTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
1120 TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
1121 end
1122 else
1123 tmpNode.DeleteChildren;
1124 x := lstNotes.Items[lstNotes.ItemIndex];
1125 tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
1126 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
1127 TORTreeNode(tmpNode).StringData := x;
1128 if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0 then
1129 tmpNode.ImageIndex := IMG_SURG_RPT_SINGLE
1130 else
1131 tmpNode.ImageIndex := IMG_SURG_ADDENDUM;
1132 tmpNode.SelectedIndex := tmpNode.ImageIndex;
1133 tvSurgery.Selected := tmpNode;
1134 tvSurgery.Items.EndUpdate;
1135 uChanging := False;
1136
1137 uPCEEdit.NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
1138 uPCEEdit.PCEForNote(lstNotes.ItemIEN, uPCEShow);
1139 FEditNote.NeedCPT := uPCEEdit.CPTRequired;
1140 txtSubject.Text := FEditNote.Subject;
1141 SetSubjectVisible(AskSubjectForNotes);
1142 cmdChangeClick(Self); // will set captions, sign state for Changes
1143 lstNotesClick(Self); // will make pnlWrite visible
1144 if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
1145 memNewNote.SetFocus;
1146end;
1147
1148procedure TfrmSurgery.SaveEditedNote(var Saved: Boolean);
1149{ validates fields and sends the updated note to the server }
1150var
1151 UpdatedNote: TCreatedDoc;
1152 x: string;
1153begin
1154 Saved := False;
1155 if (memNewNote.GetTextLen = 0) or (not ContainsVisibleChar(memNewNote.Text)) then
1156 begin
1157 lstNotes.ItemIndex := EditingIndex;
1158 x := lstNotes.ItemID;
1159 uChanging := True;
1160 with tvSurgery do Selected := FindPieceNode(x, 1, U, Items.GetFirstNode);
1161 uChanging := False;
1162 tvSurgeryChange(Self, tvSurgery.Selected);
1163 if FSilent or
1164 ((not FSilent) and
1165 (InfoBox(GetTitleText(EditingIndex) + TX_EMPTY_NOTE, TC_EMPTY_NOTE, MB_YESNO) = IDYES))
1166 then
1167 begin
1168 FConfirmed := True;
1169 mnuActDeleteClick(Self);
1170 Saved := True;
1171 FDeleted := True;
1172 end
1173 else
1174 FConfirmed := False;
1175 Exit;
1176 end;
1177 //ExpandTabsFilter(memNewNote.Lines, TAB_STOP_CHARS);
1178 FEditNote.Lines := memNewNote.Lines;
1179 FEditNote.Subject := txtSubject.Text;
1180 FEditNote.NeedCPT := uPCEEdit.CPTRequired;
1181 timAutoSave.Enabled := False;
1182 try
1183 PutEditedNote(UpdatedNote, FEditNote, lstNotes.GetIEN(EditingIndex));
1184 finally
1185 timAutoSave.Enabled := True;
1186 end;
1187 // there's no unlocking here since the note is still in Changes after a save
1188 if UpdatedNote.IEN > 0 then
1189 begin
1190 if lstNotes.ItemIndex = EditingIndex then
1191 begin
1192 EditingIndex := -1;
1193 lstNotesClick(Self);
1194 end;
1195 EditingIndex := -1; // make sure EditingIndex reset even if not viewing edited note
1196 Saved := True;
1197 FChanged := False;
1198 end else
1199 begin
1200 if not FSilent then
1201 InfoBox(TX_SAVE_ERROR1 + UpdatedNote.ErrorText + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING);
1202 end;
1203end;
1204
1205procedure TfrmSurgery.SaveCurrentNote(var Saved: Boolean);
1206{ called whenever a note should be saved - uses IEN to call appropriate save logic }
1207begin
1208 if EditingIndex < 0 then Exit;
1209 SaveEditedNote(Saved);
1210end;
1211
1212{ Left panel (selector) events ------------------------------------------------------------- }
1213
1214procedure TfrmSurgery.cmdNewNoteClick(Sender: TObject);
1215{ maps 'New Note' button to the New Progress Note menu item }
1216begin
1217 inherited;
1218 mnuActNewClick(Self);
1219end;
1220
1221procedure TfrmSurgery.cmdPCEClick(Sender: TObject);
1222var
1223 Refresh: boolean;
1224 ActionSts: TActionRec;
1225 AnIEN: integer;
1226 PCEObj: TPCEData;
1227
1228begin
1229 inherited;
1230 cmdPCE.Enabled := False;
1231 if not FEditingNotePCEObj then
1232 begin
1233 PCEObj := nil;
1234 AnIEN := lstNotes.ItemIEN;
1235 if (AnIEN <> 0) and (memSurgery.Lines.Count > 0) then
1236 begin
1237 ActOnDocument(ActionSts, AnIEN, 'VIEW');
1238 if ActionSts.Success then
1239 begin
1240 uPCEShow.CopyPCEData(uPCEEdit);
1241 PCEObj := uPCEEdit;
1242 end;
1243 end;
1244 Refresh := EditPCEData(PCEObj);
1245 end
1246 else
1247 begin
1248 UpdatePCE(uPCEEdit);
1249 Refresh := TRUE;
1250 end;
1251 cmdPCE.Enabled := True;
1252 if Refresh and (not frmFrame.Closing) then
1253 DisplayPCE;
1254end;
1255
1256{ Right panel (editor) events -------------------------------------------------------------- }
1257
1258procedure TfrmSurgery.mnuActChangeClick(Sender: TObject);
1259begin
1260 inherited;
1261 if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
1262 cmdChangeClick(Sender);
1263end;
1264
1265procedure TfrmSurgery.mnuActLoadBoilerClick(Sender: TObject);
1266var
1267 NoteEmpty: Boolean;
1268 BoilerText: TStringList;
1269 DocInfo: string;
1270
1271 procedure AssignBoilerText;
1272 begin
1273 ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
1274 memNewNote.Lines.Assign(BoilerText);
1275 FChanged := False;
1276 end;
1277
1278begin
1279 inherited;
1280 if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
1281 BoilerText := TStringList.Create;
1282 try
1283 NoteEmpty := memNewNote.Text = '';
1284 LoadBoilerPlate(BoilerText, FEditNote.Title);
1285 if (BoilerText.Text <> '') or
1286 assigned(GetLinkedTemplate(IntToStr(FEditNote.Title), ltTitle)) then
1287 begin
1288 if NoteEmpty then AssignBoilerText else
1289 begin
1290 DocInfo := MakeXMLParamTIU(IntToStr(lstNotes.ItemIEN), FEditNote);
1291 case QueryBoilerPlate(BoilerText) of
1292 0: { do nothing } ; // ignore
1293 1: begin
1294 ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
1295 memNewNote.Lines.AddStrings(BoilerText); // append
1296 end;
1297 2: AssignBoilerText; // replace
1298 end;
1299 end;
1300 end else
1301 begin
1302 if Sender = mnuActLoadBoiler
1303 then InfoBox(TX_NO_BOIL, TC_NO_BOIL, MB_OK)
1304 else
1305 begin
1306 if not NoteEmpty then
1307 if not FChanged and (InfoBox(TX_BLR_CLEAR, TC_BLR_CLEAR, MB_YESNO) = ID_YES)
1308 then memNewNote.Lines.Clear;
1309 end;
1310 end; {if BoilerText.Text <> ''}
1311 finally
1312 BoilerText.Free;
1313 end;
1314end;
1315
1316procedure TfrmSurgery.cmdChangeClick(Sender: TObject);
1317const
1318 IS_ID_CHILD = False;
1319var
1320 LastTitle: Integer;
1321 OKPressed: boolean;
1322 x, AClassName: string;
1323begin
1324 inherited;
1325 LastTitle := FEditNote.Title;
1326 if IsNonORProcedure(FEditNote.PkgIEN) then AClassName := DCL_SURG_NON_OR else AClassName := DCL_SURG_OR;
1327 if Sender <> Self then OKPressed := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, IS_ID_CHILD, AClassName, 0)
1328 else OKPressed := True;
1329 if not OKPressed then Exit;
1330 // update display fields & uPCEEdit
1331 lblNewTitle.Caption := ' ' + FEditNote.TitleName + ' ';
1332 if (FEditNote.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), 'Addendum') <> 0)
1333 then lblNewTitle.Caption := ' Addendum to:' + lblNewTitle.Caption;
1334 with lblNewTitle do bvlNewTitle.SetBounds(Left - 1, Top - 1, Width + 2, Height + 2);
1335 lblRefDate.Caption := FormatFMDateTime('mmm dd,yyyy@hh:nn', FEditNote.DateTime);
1336 lblAuthor.Caption := FEditNote.AuthorName;
1337 if uPCEEdit.Inpatient then x := 'Adm: ' else x := 'Vst: ';
1338 x := x + FormatFMDateTime('mm/dd/yy', FEditNote.VisitDate) + ' ' + FEditNote.LocationName;
1339 lblVisit.Caption := x;
1340 if Length(FEditNote.CosignerName) > 0
1341 then lblCosigner.Caption := 'Expected Cosigner: ' + FEditNote.CosignerName
1342 else lblCosigner.Caption := '';
1343 uPCEEdit.NoteTitle := FEditNote.Title;
1344 // modify signature requirements if author or cosigner changed
1345 if (User.DUZ <> FEditNote.Author) and (User.DUZ <> FEditNote.Cosigner)
1346 then Changes.ReplaceSignState(CH_SUR, lstNotes.ItemID, CH_SIGN_NA)
1347 else Changes.ReplaceSignState(CH_SUR, lstNotes.ItemID, CH_SIGN_YES);
1348 x := lstNotes.Items[EditingIndex];
1349 SetPiece(x, U, 2, lblNewTitle.Caption);
1350 SetPiece(x, U, 3, FloatToStr(FEditNote.DateTime));
1351 tvSurgery.Selected.Text := MakeNoteDisplayText(x);
1352 TORTreeNode(tvSurgery.Selected).StringData := x;
1353 lstNotes.Items[EditingIndex] := x;
1354 Changes.ReplaceText(CH_SUR, lstNotes.ItemID, GetTitleText(EditingIndex));
1355 if LastTitle <> FEditNote.Title then mnuActLoadBoilerClick(Self);
1356end;
1357
1358procedure TfrmSurgery.memNewNoteChange(Sender: TObject);
1359begin
1360 inherited;
1361 FChanged := True;
1362end;
1363
1364procedure TfrmSurgery.pnlFieldsResize(Sender: TObject);
1365{ center the reference date on the panel }
1366begin
1367 inherited;
1368 lblRefDate.Left := (pnlFields.Width - lblRefDate.Width) div 2;
1369 if lblRefDate.Left < (lblNewTitle.Left + lblNewTitle.Width + 6)
1370 then lblRefDate.Left := (lblNewTitle.Left + lblNewTitle.Width);
1371end;
1372
1373procedure TfrmSurgery.DoAutoSave;
1374var
1375 ErrMsg: string;
1376begin
1377 if (EditingIndex > -1) and FChanged then
1378 begin
1379 StatusText('Autosaving note...');
1380 //PutTextOnly(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex));
1381 timAutoSave.Enabled := False;
1382 try
1383 SetText(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex),1);
1384 finally
1385 timAutoSave.Enabled := True;
1386 end;
1387 FChanged := False;
1388 StatusText('');
1389 end;
1390 if ErrMsg <> '' then
1391 InfoBox(TX_SAVE_ERROR1 + ErrMsg + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING);
1392 //Assert(ErrMsg = '', 'AutoSave: ' + ErrMsg);
1393end;
1394
1395procedure TfrmSurgery.timAutoSaveTimer(Sender: TObject);
1396begin
1397 inherited;
1398 DoAutoSave;
1399end;
1400
1401{ Action menu events ----------------------------------------------------------------------- }
1402
1403function TfrmSurgery.StartNewEdit(NewNoteType: integer): Boolean;
1404{ if currently editing a note, returns TRUE if the user wants to start a new one }
1405var
1406 Saved: Boolean;
1407 Msg, CapMsg: string;
1408begin
1409 Result := True;
1410 if EditingIndex > -1 then
1411 begin
1412 case NewNoteType of
1413 NT_ACT_ADDENDUM: begin
1414 Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE3;
1415 CapMsg := TC_NEW_SAVE3;
1416 end;
1417 NT_ACT_EDIT_NOTE: begin
1418 Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE4;
1419 CapMsg := TC_NEW_SAVE4;
1420 end;
1421 else
1422 begin
1423 Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE2;
1424 CapMsg := TC_NEW_SAVE2;
1425 end;
1426 end;
1427 if InfoBox(Msg, CapMsg, MB_YESNO) = IDNO then Result := False
1428 else
1429 begin
1430 SaveCurrentNote(Saved);
1431 if not Saved then Result := False else LoadSurgeryCases;
1432 end;
1433 end;
1434end;
1435
1436procedure TfrmSurgery.mnuActNewClick(Sender: TObject);
1437const
1438 IS_ID_CHILD = False;
1439{ switches to current new note or creates a new note if none is being edited already }
1440begin
1441 inherited;
1442 if not StartNewEdit(NT_ACT_NEW_NOTE) then Exit;
1443 //LoadNotes;
1444 // make sure a visit (time & location) is available before creating the note
1445 if Encounter.NeedVisit then
1446 begin
1447 UpdateVisit(Font.Size, DfltTIULocation);
1448 frmFrame.DisplayEncounterText;
1449 end;
1450 if Encounter.NeedVisit then
1451 begin
1452 InfoBox(TX_NEED_VISIT, TX_NO_VISIT, MB_OK or MB_ICONWARNING);
1453 Exit;
1454 end;
1455 InsertNewNote(IS_ID_CHILD, 0);
1456end;
1457
1458
1459procedure TfrmSurgery.mnuActAddendClick(Sender: TObject);
1460{ make an addendum to an existing note }
1461var
1462 ActionSts: TActionRec;
1463 ANoteID: string;
1464begin
1465 inherited;
1466 if lstNotes.ItemIEN <= 0 then Exit;
1467 ANoteID := lstNotes.ItemID;
1468 if not StartNewEdit(NT_ACT_ADDENDUM) then Exit;
1469 //LoadNotes;
1470 with tvSurgery do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
1471 if lstNotes.ItemIndex = EditingIndex then
1472 begin
1473 InfoBox(TX_ADDEND_NO, TX_ADDEND_MK, MB_OK);
1474 Exit;
1475 end;
1476 ActOnDocument(ActionSts, lstNotes.ItemIEN, 'MAKE ADDENDUM');
1477 if not ActionSts.Success then
1478 begin
1479 InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
1480 Exit;
1481 end;
1482 with lstNotes do if TitleForNote(lstNotes.ItemIEN) = TYP_ADDENDUM then
1483 begin
1484 InfoBox(TX_ADDEND_AD, TX_ADDEND_MK, MB_OK);
1485 Exit;
1486 end;
1487 InsertAddendum;
1488end;
1489
1490
1491procedure TfrmSurgery.mnuActSignListClick(Sender: TObject);
1492{ add the note to the Encounter object, see mnuActSignClick - copied}
1493const
1494 SIG_COSIGN = 'COSIGNATURE';
1495 SIG_SIGN = 'SIGNATURE';
1496var
1497 ActionType, SignTitle: string;
1498 ActionSts: TActionRec;
1499begin
1500 inherited;
1501 if lstNotes.ItemIEN = 0 then Exit;
1502 if lstNotes.ItemIndex = EditingIndex then Exit; // already in signature list
1503 if not NoteHasText(lstNotes.ItemIEN) then
1504 begin
1505 InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
1506 Exit;
1507 end;
1508 if not LastSaveClean(lstNotes.ItemIEN) and
1509 (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
1510 if CosignDocument(lstNotes.ItemIEN) then
1511 begin
1512 SignTitle := TX_COSIGN;
1513 ActionType := SIG_COSIGN;
1514 end else
1515 begin
1516 SignTitle := TX_SIGN;
1517 ActionType := SIG_SIGN;
1518 end;
1519 ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
1520 if not ActionSts.Success then
1521 begin
1522 InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
1523 Exit;
1524 end;
1525 with lstNotes do Changes.Add(CH_SUR, ItemID, GetTitleText(ItemIndex), '', CH_SIGN_YES);
1526end;
1527
1528procedure TfrmSurgery.RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
1529begin
1530 if IEN = NT_ADDENDUM then Exit; // no PCE information entered for an addendum
1531 // do we need to call DeletePCE(AVisitStr), as was done with NT_NEW_NOTE (ien=-10)???
1532 if AVisitStr = '' then AVisitStr := VisitStrForNote(IEN);
1533 Changes.Remove(CH_PCE, 'V' + AVisitStr);
1534 Changes.Remove(CH_PCE, 'P' + AVisitStr);
1535 Changes.Remove(CH_PCE, 'D' + AVisitStr);
1536 Changes.Remove(CH_PCE, 'I' + AVisitStr);
1537 Changes.Remove(CH_PCE, 'S' + AVisitStr);
1538 Changes.Remove(CH_PCE, 'A' + AVisitStr);
1539 Changes.Remove(CH_PCE, 'H' + AVisitStr);
1540 Changes.Remove(CH_PCE, 'E' + AVisitStr);
1541 Changes.Remove(CH_PCE, 'T' + AVisitStr);
1542end;
1543
1544procedure TfrmSurgery.mnuActDeleteClick(Sender: TObject);
1545{ delete the selected progress note & remove from the Encounter object if necessary }
1546var
1547 DeleteSts, ActionSts: TActionRec;
1548 SavedDocIEN: Integer;
1549 ReasonForDelete, AVisitStr, SavedDocID, ErrMsg: string;
1550 Saved: boolean;
1551begin
1552 inherited;
1553 if lstNotes.ItemIEN = 0 then Exit;
1554 ActOnDocument(ActionSts, lstNotes.ItemIEN, 'DELETE RECORD');
1555 if ShowMsgOn(not ActionSts.Success, ActionSts.Reason, TX_IN_AUTH) then Exit;
1556 ReasonForDelete := SelectDeleteReason(lstNotes.ItemIEN);
1557 if ReasonForDelete = DR_CANCEL then Exit;
1558 // suppress prompt for deletion when called from SaveEditedNote (Sender = Self)
1559 if (Sender <> Self) and (InfoBox(MakeNoteDisplayText(lstNotes.Items[lstNotes.ItemIndex]) + TX_DEL_OK,
1560 TX_DEL_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit;
1561 // do the appropriate locking
1562 ErrMsg := '';
1563 LockDocument(lstNotes.ItemIEN, ErrMsg);
1564 if ErrMsg <> '' then
1565 begin
1566 InfoBox(ErrMsg, TC_NO_LOCK, MB_OK);
1567 Exit;
1568 end;
1569 // retraction notification message
1570 if JustifyDocumentDelete(lstNotes.ItemIEN) then
1571 InfoBox(TX_RETRACT, TX_RETRACT_CAP, MB_OK);
1572 SavedDocID := lstNotes.ItemID;
1573 SavedDocIEN := lstNotes.ItemIEN;
1574 if (EditingIndex > -1) and (not FConfirmed) and (lstNotes.ItemIndex <> EditingIndex) and (memNewNote.GetTextLen > 0) then
1575 begin
1576 SaveCurrentNote(Saved);
1577 if not Saved then Exit;
1578 end;
1579 EditingIndex := -1;
1580 FConfirmed := False;
1581 // remove the note
1582 DeleteSts.Success := True;
1583 AVisitStr := VisitStrForNote(SavedDocIEN);
1584 RemovePCEFromChanges(SavedDocIEN, AVisitStr);
1585 if (SavedDocIEN > 0) and (lstNotes.ItemIEN = SavedDocIEN) then DeleteDocument(DeleteSts, SavedDocIEN, ReasonForDelete);
1586 if not Changes.Exist(CH_SUR, SavedDocID) then UnlockDocument(SavedDocIEN);
1587 Changes.Remove(CH_SUR, SavedDocID); // this will unlock the document if in Changes
1588 // reset the display now that the note is gone
1589 if DeleteSts.Success then
1590 begin
1591 DeletePCE(AVisitStr); // removes PCE data if this was the only note pointing to it
1592 ClearEditControls;
1593 LoadSurgeryCases;
1594 pnlWrite.Visible := False;
1595 pnlRead.Visible := True;
1596 UpdateReminderFinish;
1597 ShowPCEControls(False);
1598 frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
1599 ShowPCEButtons(FALSE);
1600 //end; {if ItemIndex}
1601 end {if DeleteSts}
1602 else InfoBox(DeleteSts.Reason, TX_DEL_ERR, MB_OK or MB_ICONWARNING);
1603end;
1604
1605procedure TfrmSurgery.mnuActEditClick(Sender: TObject);
1606{ load the selected progress note for editing }
1607var
1608 ActionSts: TActionRec;
1609 ANoteID: string;
1610begin
1611 inherited;
1612 if lstNotes.ItemIndex = EditingIndex then Exit;
1613 ANoteID := lstNotes.ItemID;
1614 if not StartNewEdit(NT_ACT_EDIT_NOTE) then Exit;
1615 //LoadNotes;
1616 with tvSurgery do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
1617 ActOnDocument(ActionSts, lstNotes.ItemIEN, 'EDIT RECORD');
1618 if not ActionSts.Success then
1619 begin
1620 InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
1621 Exit;
1622 end;
1623 LoadForEdit;
1624end;
1625
1626procedure TfrmSurgery.mnuActSaveClick(Sender: TObject);
1627{ saves the note that is currently being edited }
1628var
1629 Saved: Boolean;
1630 SavedDocID: string;
1631begin
1632 inherited;
1633 if EditingIndex > -1 then
1634 begin
1635 SavedDocID := Piece(lstNotes.Items[EditingIndex], U, 1);
1636 FLastNoteID := SavedDocID;
1637 SaveCurrentNote(Saved);
1638 if Saved and (EditingIndex < 0) and (not FDeleted) then
1639 //if Saved then
1640 begin
1641 LoadSurgeryCases;
1642 with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
1643 end;
1644 end
1645 else InfoBox(TX_NO_NOTE, TX_SAVE_NOTE, MB_OK or MB_ICONWARNING);
1646end;
1647
1648procedure TfrmSurgery.mnuActSignClick(Sender: TObject);
1649{ sign the currently selected note, save first if necessary }
1650const
1651 SIG_COSIGN = 'COSIGNATURE';
1652 SIG_SIGN = 'SIGNATURE';
1653var
1654 Saved, NoteUnlocked: Boolean;
1655 ActionType, ESCode, SignTitle: string;
1656 ActionSts, SignSts: TActionRec;
1657 OK: boolean;
1658 SavedDocID, tmpItem: string;
1659 EditingID: string; //v22.12 - RV
1660 tmpNode: TTreeNode;
1661begin
1662 inherited;
1663(* if lstNotes.ItemIndex = EditingIndex then //v22.12 - RV
1664 begin //v22.12 - RV
1665 SaveCurrentNote(Saved); //v22.12 - RV
1666 if (not Saved) or FDeleted then Exit; //v22.12 - RV
1667 end //v22.12 - RV
1668 else if EditingIndex > -1 then //v22.12 - RV
1669 tmpItem := lstNotes.Items[EditingIndex]; //v22.12 - RV
1670 SavedDocID := lstNotes.ItemID;*) //v22.12 - RV
1671 SavedDocID := lstNotes.ItemID; //v22.12 - RV
1672 FLastNoteID := SavedDocID; //v22.12 - RV
1673 if lstNotes.ItemIndex = EditingIndex then //v22.12 - RV
1674 begin //v22.12 - RV
1675 SaveCurrentNote(Saved); //v22.12 - RV
1676 if (not Saved) or FDeleted then Exit; //v22.12 - RV
1677 end //v22.12 - RV
1678 else if EditingIndex > -1 then //v22.12 - RV
1679 begin //v22.12 - RV
1680 tmpItem := lstNotes.Items[EditingIndex]; //v22.12 - RV
1681 EditingID := Piece(tmpItem, U, 1); //v22.12 - RV
1682 end; //v22.12 - RV
1683 if not NoteHasText(lstNotes.ItemIEN) then
1684 begin
1685 InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
1686 Exit;
1687 end;
1688 if not LastSaveClean(lstNotes.ItemIEN) and
1689 (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
1690 if CosignDocument(lstNotes.ItemIEN) then
1691 begin
1692 SignTitle := TX_COSIGN;
1693 ActionType := SIG_COSIGN;
1694 end else
1695 begin
1696 SignTitle := TX_SIGN;
1697 ActionType := SIG_SIGN;
1698 end;
1699 // no exits after things are locked
1700 NoteUnlocked := False;
1701 ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
1702 if ActionSts.Success then
1703 begin
1704 OK := IsOK2Sign(uPCEShow, lstNotes.ItemIEN);
1705 if frmFrame.Closing then exit;
1706 if(uPCEShow.Updated) then
1707 begin
1708 uPCEShow.CopyPCEData(uPCEEdit);
1709 uPCEShow.Updated := FALSE;
1710 lstNotesClick(Self);
1711 end;
1712 if(OK) then
1713 begin
1714 //DisplayOpTop(lstNotes.ItemIEN); v24.2 - RV
1715 with lstNotes do SignatureForItem(Font.Size, MakeNoteDisplayText(Items[ItemIndex]), SignTitle, ESCode);
1716 if Length(ESCode) > 0 then
1717 begin
1718 SignDocument(SignSts, lstNotes.ItemIEN, ESCode);
1719 RemovePCEFromChanges(lstNotes.ItemIEN);
1720 NoteUnlocked := Changes.Exist(CH_SUR, lstNotes.ItemID);
1721 Changes.Remove(CH_SUR, lstNotes.ItemID); // this will unlock if in Changes
1722 if SignSts.Success then
1723 begin
1724 SendMessage(frmConsults.Handle, UM_NEWORDER, ORDER_SIGN, 0); {*REV*}
1725 lstNotesClick(Self);
1726 end
1727 else InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK);
1728 end; {if Length(ESCode)}
1729 end;
1730 end
1731 else InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
1732 if not NoteUnlocked then UnlockDocument(lstNotes.ItemIEN);
1733 LoadSurgeryCases;
1734 //if EditingIndex > -1 then //v22.12 - RV
1735 if (EditingID <> '') then //v22.12 - RV
1736 begin
1737 lstNotes.Items.Insert(0, tmpItem);
1738 tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'Note being edited',
1739 MakeCaseTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
1740 TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
1741 tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
1742 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(tmpItem), MakeCaseTreeObject(tmpItem));
1743 TORTreeNode(tmpNode).StringData := tmpItem;
1744 SetCaseTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext);
1745 EditingIndex := lstNotes.SelectByID(EditingID); //v22.12 - RV
1746 end;
1747 //with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); //v22.12 - RV
1748 with tvSurgery do //v22.12 - RV
1749 begin //v22.12 - RV
1750 Selected := FindPieceNode(FLastNoteID, U, Items.GetFirstNode); //v22.12 - RV
1751 if Selected <> nil then tvSurgeryChange(Self, Selected); //v22.12 - RV
1752 end; //v22.12 - RV
1753end;
1754
1755procedure TfrmSurgery.SaveSignItem(const ItemID, ESCode: string);
1756{ saves and optionally signs a progress note or addendum }
1757var
1758 AnIndex, IEN, i: Integer;
1759 Saved, ContinueSign: Boolean; {*RAB* 8/26/99}
1760 SignSts: TActionRec;
1761 APCEObject: TPCEData;
1762 OK: boolean;
1763
1764begin
1765 AnIndex := -1;
1766 IEN := StrToIntDef(ItemID, 0);
1767 if IEN = 0 then Exit;
1768 if frmFrame.TimedOut and (EditingIndex <> -1) then FSilent := True;
1769 with lstNotes do for i := 0 to Items.Count - 1 do if lstNotes.GetIEN(i) = IEN then
1770 begin
1771 AnIndex := i;
1772 break;
1773 end;
1774 if (AnIndex > -1) and (AnIndex = EditingIndex) then
1775 begin
1776 SaveCurrentNote(Saved);
1777 if not Saved then Exit;
1778 if FDeleted then
1779 begin
1780 FDeleted := False;
1781 Exit;
1782 end;
1783 AnIndex := lstNotes.SelectByIEN(IEN);
1784 //IEN := lstNotes.GetIEN(AnIndex); // saving will change IEN
1785 end;
1786 if Length(ESCode) > 0 then
1787 begin
1788 if not NoteHasText(IEN) then
1789 begin
1790 InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
1791 ContinueSign := False;
1792 end
1793 else if not LastSaveClean(IEN) and
1794 (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES)
1795 then ContinueSign := False
1796 else ContinueSign := True;
1797 if ContinueSign then
1798 begin
1799 if (AnIndex >= 0) and (AnIndex = lstNotes.ItemIndex) then
1800 APCEObject := uPCEShow
1801 else
1802 APCEObject := nil;
1803 OK := IsOK2Sign(APCEObject, IEN);
1804 if frmFrame.Closing then exit;
1805 if(assigned(APCEObject)) and (uPCEShow.Updated) then
1806 begin
1807 uPCEShow.CopyPCEData(uPCEEdit);
1808 uPCEShow.Updated := FALSE;
1809 lstNotesClick(Self);
1810 end
1811 else
1812 uPCEEdit.Clear;
1813 if(OK) then
1814 begin
1815 //if not FSilent then DisplayOpTop(IEN);
1816 SignDocument(SignSts, IEN, ESCode);
1817 if not SignSts.Success then InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK);
1818 end; {if OK}
1819 end; {if ContinueSign}
1820 end; {if Length(ESCode)}
1821
1822 if (AnIndex = lstNotes.ItemIndex) and (not frmFrame.ContextChanging) then
1823 begin
1824 LoadSurgeryCases; //????????????????
1825 with tvSurgery do Selected := FindPieceNode(IntToStr(IEN), U, Items.GetFirstNode);
1826 end;
1827end;
1828
1829procedure TfrmSurgery.popNoteMemoPopup(Sender: TObject);
1830begin
1831 inherited;
1832 if PopupComponent(Sender, popNoteMemo) is TCustomEdit
1833 then FEditCtrl := TCustomEdit(PopupComponent(Sender, popNoteMemo))
1834 else FEditCtrl := nil;
1835 if FEditCtrl <> nil then
1836 begin
1837 popNoteMemoCut.Enabled := FEditCtrl.SelLength > 0;
1838 popNoteMemoCopy.Enabled := popNoteMemoCut.Enabled;
1839 popNoteMemoPaste.Enabled := (not TORExposedCustomEdit(FEditCtrl).ReadOnly) and
1840 Clipboard.HasFormat(CF_TEXT);
1841 popNoteMemoTemplate.Enabled := frmDrawers.CanEditTemplates and popNoteMemoCut.Enabled;
1842 popNoteMemoFind.Enabled := FEditCtrl.GetTextLen > 0;
1843 end else
1844 begin
1845 popNoteMemoCut.Enabled := False;
1846 popNoteMemoCopy.Enabled := False;
1847 popNoteMemoPaste.Enabled := False;
1848 popNoteMemoTemplate.Enabled := False;
1849 end;
1850 if pnlWrite.Visible then
1851 begin
1852 popNoteMemoSpell.Enabled := True;
1853 popNoteMemoGrammar.Enabled := True;
1854 popNoteMemoReformat.Enabled := True;
1855 popNoteMemoReplace.Enabled := (FEditCtrl.GetTextLen > 0);
1856 popNoteMemoPreview.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
1857 popNoteMemoInsTemplate.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
1858 end else
1859 begin
1860 popNoteMemoSpell.Enabled := False;
1861 popNoteMemoGrammar.Enabled := False;
1862 popNoteMemoReformat.Enabled := False;
1863 popNoteMemoReplace.Enabled := False;
1864 popNoteMemoPreview.Enabled := False;
1865 popNoteMemoInsTemplate.Enabled := False;
1866 end;
1867end;
1868
1869procedure TfrmSurgery.popNoteMemoCutClick(Sender: TObject);
1870begin
1871 inherited;
1872 FEditCtrl.CutToClipboard;
1873end;
1874
1875procedure TfrmSurgery.popNoteMemoCopyClick(Sender: TObject);
1876begin
1877 inherited;
1878 FEditCtrl.CopyToClipboard;
1879end;
1880
1881procedure TfrmSurgery.popNoteMemoPasteClick(Sender: TObject);
1882begin
1883 inherited;
1884 FEditCtrl.SelText := Clipboard.AsText; {*KCM*}
1885 //FEditCtrl.PasteFromClipboard; // use AsText to prevent formatting
1886end;
1887
1888procedure TfrmSurgery.popNoteMemoReformatClick(Sender: TObject);
1889begin
1890 inherited;
1891 if Screen.ActiveControl <> memNewNote then Exit;
1892 ReformatMemoParagraph(memNewNote);
1893end;
1894
1895procedure TfrmSurgery.popNoteMemoSaveContinueClick(Sender: TObject);
1896begin
1897 inherited;
1898 FChanged := True;
1899 DoAutoSave;
1900end;
1901
1902procedure TfrmSurgery.popNoteMemoReplaceClick(Sender: TObject);
1903begin
1904 inherited;
1905 SendMessage(TRichEdit(popNoteMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0);
1906 with dlgReplaceText do
1907 begin
1908 Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top);
1909 FindText := '';
1910 ReplaceText := '';
1911 Options := [frDown, frHideUpDown];
1912 Execute;
1913 end;
1914end;
1915
1916procedure TfrmSurgery.dlgReplaceTextFind(Sender: TObject);
1917begin
1918 inherited;
1919 dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
1920end;
1921
1922procedure TfrmSurgery.dlgReplaceTextReplace(Sender: TObject);
1923begin
1924 inherited;
1925 dmodShared.ReplaceRichEditText(dlgReplaceText, TRichEdit(popNoteMemo.PopupComponent));
1926end;
1927
1928procedure TfrmSurgery.popNoteMemoSpellClick(Sender: TObject);
1929begin
1930 inherited;
1931 DoAutoSave;
1932 timAutoSave.Enabled := False;
1933 try
1934 SpellCheckForControl(memNewNote);
1935 finally
1936 timAutoSave.Enabled := True;
1937 end;
1938end;
1939
1940procedure TfrmSurgery.popNoteMemoGrammarClick(Sender: TObject);
1941begin
1942 inherited;
1943 DoAutoSave;
1944 timAutoSave.Enabled := False;
1945 try
1946 GrammarCheckForControl(memNewNote);
1947 finally
1948 timAutoSave.Enabled := True;
1949 end;
1950end;
1951
1952procedure TfrmSurgery.mnuViewDetailClick(Sender: TObject);
1953var
1954 x: string;
1955begin
1956 inherited;
1957 with tvSurgery do
1958 begin
1959 if Selected = nil then exit;
1960 if not (Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_SHUT, IMG_SURG_GROUP_OPEN,
1961 IMG_SURG_NON_OR_CASE_EMPTY, IMG_SURG_NON_OR_CASE_SHUT, IMG_SURG_NON_OR_CASE_OPEN,
1962 IMG_SURG_CASE_EMPTY, IMG_SURG_CASE_SHUT, IMG_SURG_CASE_OPEN]) then
1963 begin
1964 mnuViewDetail.Checked := not mnuViewDetail.Checked;
1965 if mnuViewDetail.Checked then
1966 begin
1967 x := TORTreeNode(Selected).StringData;
1968 StatusText('Retrieving selected surgery report details...');
1969 pnlRead.Visible := True;
1970 pnlWrite.Visible := False;
1971 Screen.Cursor := crHourGlass;
1972 LoadSurgReportDetail(memSurgery.Lines, StrToIntDef(Piece(x, U, 1), 0));
1973 Screen.Cursor := crDefault;
1974 StatusText('');
1975 memSurgery.SelStart := 0;
1976 memSurgery.Repaint;
1977 end
1978 else
1979 tvSurgeryChange(Self, Selected);
1980 end;
1981 end;
1982 SendMessage(memSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
1983end;
1984
1985procedure TfrmSurgery.FormClose(Sender: TObject; var Action: TCloseAction);
1986var
1987 Saved: Boolean;
1988 IEN: Int64;
1989 ErrMsg: string;
1990 DeleteSts: TActionRec;
1991begin
1992 inherited;
1993 if frmFrame.TimedOut and (EditingIndex <> -1) then
1994 begin
1995 FSilent := True;
1996 if memNewNote.GetTextLen > 0 then SaveCurrentNote(Saved)
1997 else
1998 begin
1999 IEN := lstNotes.GetIEN(EditingIndex);
2000 if not LastSaveClean(IEN) then // means note hasn't been committed yet
2001 begin
2002 LockDocument(IEN, ErrMsg);
2003 if ErrMsg = '' then
2004 begin
2005 DeleteDocument(DeleteSts, IEN, '');
2006 UnlockDocument(IEN);
2007 end; {if ErrMsg}
2008 end; {if not LastSaveClean}
2009 end; {else}
2010 end; {if frmFrame}
2011end;
2012
2013procedure TfrmSurgery.mnuActIdentifyAddlSignersClick(Sender: TObject);
2014var
2015 Exclusions: TStrings;
2016 Saved, x, y: boolean;
2017 SignerList: TSignerList;
2018 ActionSts: TActionRec;
2019 SigAction: integer;
2020 SavedDocID: string;
2021begin
2022 inherited;
2023 if lstNotes.ItemIEN = 0 then exit;
2024 SavedDocID := lstNotes.ItemID;
2025 if lstNotes.ItemIndex = EditingIndex then
2026 begin
2027 SaveCurrentNote(Saved);
2028 if not Saved then Exit;
2029 LoadSurgeryCases;
2030 with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
2031 end;
2032 x := CanChangeCosigner(lstNotes.ItemIEN);
2033 ActOnDocument(ActionSts, lstNotes.ItemIEN, 'IDENTIFY SIGNERS');
2034 y := ActionSts.Success;
2035 if x and not y then
2036 begin
2037 if InfoBox(ActionSts.Reason + CRLF + CRLF +
2038 'Would you like to change the cosigner?',
2039 TX_IN_AUTH, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) = ID_YES then
2040 SigAction := SG_COSIGNER
2041 else
2042 Exit;
2043 end
2044 else if y and not x then SigAction := SG_ADDITIONAL
2045 else if x and y then SigAction := SG_BOTH
2046 else
2047 begin
2048 InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
2049 Exit;
2050 end;
2051
2052 Exclusions := GetCurrentSigners(lstNotes.ItemIEN);
2053 SelectAdditionalSigners(Font.Size, lstNotes.ItemIEN, SigAction, Exclusions, SignerList, CT_NOTES);
2054 with SignerList do
2055 begin
2056 case SigAction of
2057 SG_ADDITIONAL: if Changed and (Signers <> nil) and (Signers.Count > 0) then
2058 UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
2059 SG_COSIGNER: if Changed then ChangeCosigner(lstNotes.ItemIEN, Cosigner);
2060 SG_BOTH: if Changed then
2061 begin
2062 if (Signers <> nil) and (Signers.Count > 0) then
2063 UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
2064 ChangeCosigner(lstNotes.ItemIEN, Cosigner);
2065 end;
2066 end;
2067 lstNotesClick(Self);
2068 end;
2069 UnlockDocument(lstNotes.ItemIEN);
2070end;
2071
2072procedure TfrmSurgery.popNoteMemoAddlSignClick(Sender: TObject);
2073begin
2074 inherited;
2075 mnuActIdentifyAddlSignersClick(Self);
2076end;
2077
2078procedure TfrmSurgery.ProcessNotifications;
2079var
2080 x: string;
2081 Saved: boolean;
2082 //tmpNode: TTreeNode;
2083 //AnObject: PCaseTreeObject;
2084 tmpList: TStringList;
2085begin
2086 if EditingIndex <> -1 then
2087 begin
2088 SaveCurrentNote(Saved);
2089 if not Saved then Exit;
2090 end;
2091 lblCases.Caption := Notifications.Text;
2092 tvSurgery.Caption := lblCases.Caption;
2093 EditingIndex := -1;
2094 lstNotes.Enabled := True ;
2095 pnlRead.BringToFront ;
2096 // show ALL unsigned/uncosigned for a patient, not just the alerted one
2097 // what about cosignature? How to get correct list? ORB FOLLOWUP TYPE = OR alerts only
2098 x := Notifications.AlertData;
2099 if StrToIntDef(Piece(x, U, 1), 0) = 0 then
2100 begin
2101 InfoBox(TX_NO_ALERT, TX_CAP_NO_ALERT, MB_OK);
2102 Exit;
2103 end;
2104 tmpList := TStringList.Create;
2105 try
2106 FCaseList.Clear;
2107 uChanging := True;
2108 tvSurgery.Items.BeginUpdate;
2109 lstNotes.Clear;
2110 KillCaseTreeObjects(tvSurgery);
2111 tvSurgery.Items.Clear;
2112 GetSingleCaseListItemWithDocs(tmpList, StrToIntDef(Piece(x, U, 1), 0));
2113 with FCurrentContext do CreateListItemsForCaseTree(FCaseList, tmpList, SR_ALL, GroupBy, TreeAscending);
2114 UpdateTreeView(FCaseList, tvSurgery);
2115 with tvSurgery do Selected := FindPieceNode(Piece(x, U, 1), 1, U, Items.GetFirstNode);
2116 (* lstNotes.Items.Add(x);
2117 AnObject := MakeCaseTreeObject('ALERT^Alerted Note^^^^^^^^^^^%^0');
2118 tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, AnObject.NodeText, AnObject);
2119 TORTreeNode(tmpNode).StringData := 'ALERT^Alerted Note^^^^^^^^^^^%^0';
2120 tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
2121 AnObject := MakeCaseTreeObject(x);
2122 tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, AnObject.NodeText, AnObject);
2123 TORTreeNode(tmpNode).StringData := x;
2124 SetCaseTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext);
2125 tvSurgery.Selected := tmpNode;*)
2126 tvSurgery.Items.EndUpdate;
2127 uChanging := False;
2128 tvSurgeryChange(Self, tvSurgery.Selected);
2129 case Notifications.Followup of
2130 NF_SURGERY_UNSIGNED_NOTE: ; //Automatically deleted by sig action!!!
2131 end;
2132 if Copy(Piece(Notifications.RecordID, U, 2), 1, 6) = 'TIUADD' then Notifications.Delete;
2133 if Copy(Piece(Notifications.RecordID, U, 2), 1, 5) = 'TIUID' then Notifications.Delete;
2134 finally
2135 tmpList.Free;
2136 end;
2137end;
2138
2139procedure TfrmSurgery.mnuViewSaveAsDefaultClick(Sender: TObject);
2140begin
2141 inherited;
2142 if InfoBox('Replace current defaults?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = IDYES then
2143 begin
2144 SaveCurrentSurgCaseContext(FCurrentContext);
2145 FDefaultContext := FCurrentContext;
2146 lblCases.Caption := 'Default List';
2147 tvSurgery.Caption := lblCases.Caption;
2148 end;
2149end;
2150
2151procedure TfrmSurgery.mnuViewReturntoDefaultClick(Sender: TObject);
2152begin
2153 inherited;
2154 SetViewContext(FDefaultContext);
2155end;
2156
2157procedure TfrmSurgery.popNoteMemoTemplateClick(Sender: TObject);
2158begin
2159 inherited;
2160 EditTemplates(Self, TRUE, FEditCtrl.SelText);
2161end;
2162
2163procedure TfrmSurgery.popNoteListPopup(Sender: TObject);
2164begin
2165 inherited;
2166 N4.Visible := (popNoteList.PopupComponent is TORTreeView);
2167 popNoteListExpandAll.Visible := N4.Visible;
2168 popNoteListExpandSelected.Visible := N4.Visible;
2169 popNoteListCollapseAll.Visible := N4.Visible;
2170 popNoteListCollapseSelected.Visible := N4.Visible;
2171end;
2172
2173procedure TfrmSurgery.popNoteListExpandAllClick(Sender: TObject);
2174begin
2175 inherited;
2176 tvSurgery.FullExpand;
2177end;
2178
2179procedure TfrmSurgery.popNoteListCollapseAllClick(Sender: TObject);
2180begin
2181 inherited;
2182 tvSurgery.Selected := nil;
2183 memSurgery.Clear;
2184 tvSurgery.FullCollapse;
2185 tvSurgery.Selected := tvSurgery.TopItem;
2186end;
2187
2188procedure TfrmSurgery.popNoteListExpandSelectedClick(Sender: TObject);
2189begin
2190 inherited;
2191 if tvSurgery.Selected = nil then exit;
2192 with tvSurgery.Selected do if HasChildren then Expand(True);
2193end;
2194
2195procedure TfrmSurgery.popNoteListCollapseSelectedClick(Sender: TObject);
2196begin
2197 inherited;
2198 if tvSurgery.Selected = nil then exit;
2199 with tvSurgery.Selected do if HasChildren then Collapse(True);
2200end;
2201
2202procedure TfrmSurgery.mnuEditTemplatesClick(Sender: TObject);
2203begin
2204 inherited;
2205 EditTemplates(Self);
2206end;
2207
2208procedure TfrmSurgery.mnuNewTemplateClick(Sender: TObject);
2209begin
2210 inherited;
2211 EditTemplates(Self, TRUE);
2212end;
2213
2214procedure TfrmSurgery.mnuEditSharedTemplatesClick(Sender: TObject);
2215begin
2216 inherited;
2217 EditTemplates(Self, FALSE, '', TRUE);
2218end;
2219
2220procedure TfrmSurgery.mnuNewSharedTemplateClick(Sender: TObject);
2221begin
2222 inherited;
2223 EditTemplates(Self, TRUE, '', TRUE);
2224end;
2225
2226procedure TfrmSurgery.mnuOptionsClick(Sender: TObject);
2227begin
2228 inherited;
2229 mnuEditTemplates.Enabled := frmDrawers.CanEditTemplates;
2230 mnuNewTemplate.Enabled := frmDrawers.CanEditTemplates;
2231 mnuEditSharedTemplates.Enabled := frmDrawers.CanEditShared;
2232 mnuNewSharedTemplate.Enabled := frmDrawers.CanEditShared;
2233 mnuEditDialgFields.Enabled := CanEditTemplateFields;
2234end;
2235
2236procedure TfrmSurgery.SetEditingIndex(const Value: Integer);
2237begin
2238 FEditingIndex := Value;
2239 if(FEditingIndex < 0) then
2240 KillReminderDialog(Self);
2241 if(assigned(frmReminderTree)) then
2242 frmReminderTree.EnableActions;
2243end;
2244
2245(*function TfrmSurgery.CanFinishReminder: boolean;
2246begin
2247 Result := False;
2248 if(EditingIndex < 0) then
2249 Result := FALSE
2250 else
2251 Result := (lstNotes.ItemIndex = EditingIndex);
2252end;*)
2253
2254procedure TfrmSurgery.AssignRemForm;
2255begin
2256(* with RemForm do
2257 begin
2258 Form := Self;
2259 PCEObj := uPCEEdit;
2260 RightPanel := pnlRight;
2261 CanFinishProc := CanFinishReminder;
2262 DisplayPCEProc := DisplayPCE;
2263 Drawers := frmDrawers;
2264 NewNoteRE := memNewNote;
2265 NoteList := lstNotes;
2266 end;*)
2267end;
2268
2269procedure TfrmSurgery.mnuEditDialgFieldsClick(Sender: TObject);
2270begin
2271 inherited;
2272 EditDialogFields;
2273end;
2274
2275
2276procedure TfrmSurgery.tvSurgeryClick(Sender: TObject);
2277begin
2278 if tvSurgery.Selected = nil then exit;
2279 if (tvSurgery.Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_OPEN, IMG_SURG_GROUP_SHUT]) then
2280 memSurgery.Clear;
2281end;
2282
2283procedure TfrmSurgery.ShowPCEButtons(Editing: boolean);
2284begin
2285 FEditingNotePCEObj := Editing;
2286 if Editing or AnytimeEncounters then
2287 begin
2288 cmdPCE.Visible := TRUE;
2289 if Editing then
2290 begin
2291 cmdPCE.Enabled := CanEditPCE(uPCEEdit);
2292{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
2293 //cmdNewNote.Visible := AnytimeEncounters;
2294 //cmdNewNote.Enabled := FALSE;
2295 end
2296 else
2297 begin
2298 cmdPCE.Enabled := (GetAskPCE(0) <> apDisable);
2299{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
2300 //cmdNewNote.Visible := TRUE;
2301 //cmdNewNote.Enabled := TRUE;
2302 end;
2303 if cmdNewNote.Visible then
2304 cmdPCE.Top := cmdNewNote.Top-cmdPCE.Height;
2305 end
2306 else
2307 begin
2308 cmdPCE.Enabled := FALSE;
2309 cmdPCE.Visible := FALSE;
2310{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
2311 //cmdNewNote.Visible := TRUE;
2312 //cmdNewNote.Enabled := TRUE;
2313 end;
2314 if cmdPCE.Visible then
2315 lblSpace1.Top := cmdPCE.Top - lblSpace1.Height
2316 else
2317 lblSpace1.Top := cmdNewNote.Top - lblSpace1.Height;
2318 popNoteMemoEncounter.Enabled := cmdPCE.Enabled;
2319 popNoteMemoEncounter.Visible := cmdPCE.Visible;
2320end;
2321
2322procedure TfrmSurgery.mnuIconLegendClick(Sender: TObject);
2323begin
2324 inherited;
2325 ShowIconLegend(ilSurgery);
2326end;
2327
2328procedure TfrmSurgery.tvSurgeryChange(Sender: TObject;
2329 Node: TTreeNode);
2330var
2331 x: string;
2332 IsTIUDocument: boolean;
2333 //ShowReport: boolean;
2334begin
2335 if uChanging then Exit;
2336 //This gives the change a chance to occur when keyboarding, so that WindowEyes
2337 //doesn't use the old value.
2338 Application.ProcessMessages;
2339 //ShowReport := True;
2340 with tvSurgery do
2341 begin
2342 if Selected = nil then Exit;
2343 popNoteListExpandSelected.Enabled := Selected.HasChildren;
2344 popNoteListCollapseSelected.Enabled := Selected.HasChildren;
2345 RedrawSuspend(memSurgery.Handle);
2346 memSurgery.Clear;
2347 if not (Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_OPEN, IMG_SURG_GROUP_SHUT]) then
2348 begin
2349 x := TORTreeNode(Selected).StringData;
2350 memSurgery.Clear;
2351 StatusText('Retrieving selected surgery report...');
2352 Screen.Cursor := crHourGlass;
2353 pnlRead.Visible := True;
2354 pnlWrite.Visible := False;
2355 //UpdateReminderFinish;
2356 IsTIUDocument := PCaseTreeObject(Selected.Data)^.PkgRef <> '';
2357 EnableDisableMenus(IsTIUDocument);
2358 if not IsTIUDocument then
2359 begin
2360 lblTitle.Caption := MakeSurgeryCaseDisplayText(x);
2361 lblTitle.Hint := lblTitle.Caption;
2362 //LoadOpTop(memSurgery.Lines, StrToIntDef(Piece(x, U, 1), 0), PCaseTreeObject(Selected.Data)^.IsNonORProc, ShowReport);
2363 NotifyOtherApps(NAE_REPORT, 'SUR^' + Piece(x, U, 1));
2364 lstNotes.ItemIndex := -1;
2365 end
2366 else
2367 begin
2368 lstNotes.SelectByID(Piece(x, U, 1));
2369 lstNotesClick(Self);
2370 end;
2371 Screen.Cursor := crDefault;
2372 StatusText('');
2373 SendMessage(memSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
2374 end
2375 else
2376 begin
2377 lblTitle.Caption := '';
2378 lblTitle.Hint := lblTitle.Caption;
2379 pnlWrite.Visible := False;
2380 pnlRead.Visible := True;
2381 //UpdateReminderFinish;
2382 ShowPCEControls(False);
2383 frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
2384 ShowPCEButtons(FALSE);
2385 memSurgery.Clear;
2386 end;
2387 if(assigned(frmReminderTree)) then
2388 frmReminderTree.EnableActions;
2389 DisplayPCE;
2390 pnlRight.Refresh;
2391 memNewNote.Repaint;
2392 memSurgery.Repaint;
2393 SendMessage(tvSurgery.Handle, WM_HSCROLL, SB_THUMBTRACK, 0);
2394 RedrawActivate(memSurgery.Handle);
2395 end;
2396end;
2397
2398procedure TfrmSurgery.tvSurgeryExpanded(Sender: TObject;
2399 Node: TTreeNode);
2400begin
2401 with Node do
2402 begin
2403 if (ImageIndex in [IMG_SURG_GROUP_SHUT, IMG_SURG_CASE_SHUT, IMG_SURG_NON_OR_CASE_SHUT]) then
2404 ImageIndex := ImageIndex + 1;
2405 if (SelectedIndex in [IMG_SURG_GROUP_SHUT, IMG_SURG_CASE_SHUT, IMG_SURG_NON_OR_CASE_SHUT]) then
2406 SelectedIndex := SelectedIndex + 1;
2407 end;
2408 SendMessage(tvSurgery.Handle, WM_HSCROLL, SB_THUMBTRACK, 0);
2409end;
2410
2411procedure TfrmSurgery.tvSurgeryCollapsed(Sender: TObject;
2412 Node: TTreeNode);
2413begin
2414 with Node do
2415 begin
2416 if (ImageIndex in [IMG_SURG_GROUP_OPEN, IMG_SURG_CASE_OPEN, IMG_SURG_NON_OR_CASE_OPEN]) then
2417 ImageIndex := ImageIndex - 1;
2418 if (SelectedIndex in [IMG_SURG_GROUP_OPEN, IMG_SURG_CASE_OPEN, IMG_SURG_NON_OR_CASE_OPEN]) then
2419 SelectedIndex := SelectedIndex - 1;
2420 end;
2421end;
2422
2423procedure TfrmSurgery.LoadSurgeryCases;
2424var
2425 tmpList: TStringList;
2426 ANode: TORTreeNode;
2427begin
2428 tmpList := TStringList.Create;
2429 try
2430 FCaseList.Clear;
2431 uChanging := True;
2432 RedrawSuspend(memSurgery.Handle);
2433 tvSurgery.Items.BeginUpdate;
2434 KillCaseTreeObjects(tvSurgery);
2435 tvSurgery.Items.Clear;
2436 tvSurgery.Items.EndUpdate;
2437 lstNotes.Items.Clear;
2438 memSurgery.Clear;
2439 memSurgery.Invalidate;
2440 lblTitle.Caption := '';
2441 lblTitle.Hint := lblTitle.Caption;
2442 ShowPCEControls(FALSE);
2443 with FCurrentContext do
2444 begin
2445 GetSurgCaseList(tmpList, FMBeginDate, FMEndDate, SR_ALL, MaxDocs);
2446 CreateListItemsForCaseTree(FCaseList, tmpList, SR_ALL, GroupBy, TreeAscending);
2447 UpdateTreeView(FCaseList, tvSurgery);
2448 end;
2449 tmpList.Clear;
2450 FCaseList.Clear;
2451 with tvSurgery do
2452 begin
2453 uChanging := True;
2454 tvSurgery.Items.BeginUpdate;
2455 if FLastNoteID <> '' then
2456 Selected := FindPieceNode(FLastNoteID, 1, U, nil);
2457 if Selected = nil then
2458 begin
2459 if (uSurgeryContext.GroupBy <> '') then
2460 begin
2461 ANode := TORTreeNode(Items.GetFirstNode);
2462 while ANode <> nil do
2463 begin
2464 ANode.Expand(False);
2465 Selected := ANode;
2466 ANode := TORTreeNode(ANode.GetNextSibling);
2467 end;
2468 end
2469 else
2470 begin
2471 ANode := tvSurgery.FindPieceNode(IntToStr(SR_ALL), 1, U, nil);
2472 if ANode <> nil then Selected := ANode.getFirstChild;
2473 end;
2474 end;
2475 memSurgery.Clear;
2476 RemoveParentsWithNoChildren(tvSurgery, uSurgeryContext);
2477 tvSurgery.Items.EndUpdate;
2478 uChanging := False;
2479 lblCases.Caption := SetSurgTreeLabel(FCurrentContext);
2480 tvSurgery.Caption := lblCases.Caption;
2481 SendMessage(tvSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
2482 if Selected <> nil then tvSurgeryChange(Self, Selected);
2483 end;
2484 finally
2485 RedrawActivate(memSurgery.Handle);
2486 tmpList.Free;
2487 end;
2488end;
2489
2490function TfrmSurgery.SetSurgTreeLabel(AContext: TSurgCaseContext): string;
2491var
2492 x: string;
2493
2494 function SetDateRangeText(AContext: TSurgCaseContext): string;
2495 var
2496 x1: string;
2497 begin
2498 with AContext do
2499 if BeginDate <> '' then
2500 begin
2501 x1 := 'from ' + UpperCase(BeginDate);
2502 if EndDate <> '' then x1 := x1 + ' to ' + UpperCase(EndDate)
2503 else x1 := x1 + ' to TODAY';
2504 end;
2505 Result := x1;
2506 end;
2507
2508begin
2509 with AContext do
2510 begin
2511 if MaxDocs > 0 then x := 'Last ' + IntToStr(MaxDocs) + ' ' else x := 'All ';
2512 case StrToIntDef(Status, 0) of
2513 SR_RECENT : x := x + 'Surgery Cases';
2514 SR_ALL : x := x + 'Surgery Cases';
2515 //SG_BY_SURGEON : x := x + 'Surgery Cases for ' + ExternalName(Surgeon, 200) + SetDateRangeText(AContext);
2516 SR_BY_DATE : x := x + 'Surgery Cases ' + SetDateRangeText(AContext);
2517 else
2518 x := 'Custom List';
2519 end;
2520 end;
2521 Result := x;
2522end;
2523
2524procedure TfrmSurgery.lstNotesClick(Sender: TObject);
2525{ loads the text for the selected note or displays the editing panel for the selected note }
2526begin
2527 inherited;
2528 with lstNotes do if ItemIndex = -1 then Exit
2529 else if ItemIndex = EditingIndex then
2530 begin
2531 pnlWrite.Visible := True;
2532 pnlRead.Visible := False;
2533 mnuViewDetail.Enabled := False;
2534 mnuActChange.Enabled := True;
2535 mnuActLoadBoiler.Enabled := True;
2536 //UpdateReminderFinish;
2537 end else
2538 begin
2539 StatusText('Retrieving selected surgery report...');
2540 Screen.Cursor := crHourGlass;
2541 pnlRead.Visible := True;
2542 pnlWrite.Visible := False;
2543 //UpdateReminderFinish;
2544 lblTitle.Caption := MakeSurgeryReportDisplayText(Items[ItemIndex]);
2545 lblTitle.Hint := lblTitle.Caption;
2546 LoadSurgReportText(memSurgery.Lines, ItemIEN);
2547 mnuViewDetail.Enabled := True;
2548 mnuViewDetail.Checked := False;
2549 mnuActChange.Enabled := False;
2550 mnuActLoadBoiler.Enabled := False;
2551 Screen.Cursor := crDefault;
2552 StatusText('');
2553 end;
2554 if(assigned(frmReminderTree)) then
2555 frmReminderTree.EnableActions;
2556 DisplayPCE;
2557 pnlRight.Refresh;
2558 memNewNote.Repaint;
2559 memSurgery.Repaint;
2560 NotifyOtherApps(NAE_REPORT, 'TIU^' + lstNotes.ItemID);
2561end;
2562
2563procedure TfrmSurgery.EnableDisableMenus(IsTIUDocument: boolean);
2564begin
2565{ TODO -oRich V. -cSurgery/TIU : Reset NewNoteMenu enabled if allow new notes from Surgery tab }
2566 mnuActNew.Enabled := False;
2567 mnuActAddend.Enabled := IsTIUDocument;
2568 mnuActAddIDEntry.Enabled := False;
2569 mnuActDetachFromIDParent.Enabled := False;
2570 mnuActEdit.Enabled := IsTIUDocument;
2571 mnuActDelete.Enabled := IsTIUDocument;
2572 mnuActSign.Enabled := IsTIUDocument;
2573 mnuActSignList.Enabled := IsTIUDocument;
2574 mnuActSave.Enabled := IsTIUDocument;
2575 mnuActIdentifyAddlSigners.Enabled := IsTIUDocument;
2576 mnuActChange.Enabled := IsTIUDocument;
2577 mnuActLoadBoiler.Enabled := IsTIUDocument;
2578 popNoteMemoSignList.Enabled := IsTIUDocument;
2579 popNoteMemoSign.Enabled := IsTIUDocument;
2580 popNoteMemoSave.Enabled := IsTIUDocument;
2581 popNoteMemoEdit.Enabled := IsTIUDocument;
2582 popNoteMemoDelete.Enabled := IsTIUDocument;
2583 popNoteMemoAddlSign.Enabled := IsTIUDocument;
2584 popNoteMemoAddend.Enabled := IsTIUDocument;
2585 mnuViewDetail.Enabled := IsTIUDocument;
2586 popNoteMemoPreview.Enabled := IsTIUDocument and Assigned(frmDrawers.tvTemplates.Selected);
2587 popNoteMemoInsTemplate.Enabled := IsTIUDocument and Assigned(frmDrawers.tvTemplates.Selected);
2588 if not IsTIUDocument then mnuViewDetail.Checked := False;
2589 frmFrame.mnuFilePrint.Enabled := IsTIUDocument;
2590end;
2591
2592procedure TfrmSurgery.memNewNoteKeyDown(Sender: TObject; var Key: Word;
2593 Shift: TShiftState);
2594begin
2595 inherited;
2596 if (Key = VK_TAB) then
2597 begin
2598 if ssShift in Shift then
2599 begin
2600 FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
2601 Key := 0;
2602 end
2603 else if ssCtrl in Shift then
2604 begin
2605 FindNextControl(Sender as TWinControl, True, True, False).SetFocus; //next control
2606 Key := 0;
2607 end;
2608 end;
2609 if (key = VK_ESCAPE) then begin
2610 FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
2611 key := 0;
2612 end;
2613end;
2614
2615procedure TfrmSurgery.sptHorzCanResize(Sender: TObject; var NewSize: Integer;
2616 var Accept: Boolean);
2617begin
2618 inherited;
2619 if pnlWrite.Visible then
2620 if NewSize > frmSurgery.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width then
2621 NewSize := frmSurgery.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width;
2622end;
2623
2624procedure TfrmSurgery.popNoteMemoPreviewClick(Sender: TObject);
2625begin
2626 frmDrawers.mnuPreviewTemplateClick(Sender);
2627end;
2628
2629procedure TfrmSurgery.popNoteMemoInsTemplateClick(Sender: TObject);
2630begin
2631 frmDrawers.mnuInsertTemplateClick(Sender);
2632end;
2633
2634procedure TfrmSurgery.tvSurgeryAddition(Sender: TObject; Node: TTreeNode);
2635begin
2636 inherited;
2637 TAccessibleTreeNode.WrapControl(Node as TORTreeNode);
2638end;
2639
2640procedure TfrmSurgery.tvSurgeryDeletion(Sender: TObject; Node: TTreeNode);
2641begin
2642 TAccessibleTreeNode.UnwrapControl(Node as TORTreeNode);
2643 inherited;
2644end;
2645
2646initialization
2647 uPCEEdit := TPCEData.Create;
2648 uPCEShow := TPCEData.Create;
2649
2650finalization
2651 uPCEEdit.Free;
2652 uPCEShow.Free;
2653
2654end.
2655
Note: See TracBrowser for help on using the repository browser.