unit fDCSumm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fHSplit, StdCtrls, ExtCtrls, Menus, ComCtrls, ORCtrls, ORFn, uConst, ORDtTm, uPCE, ORClasses, fDrawers, rDCSumm, uDocTree, uDCSumm, uTIU, fPrintList, VA508AccessibilityManager, fBase508Form, VA508ImageListLabeler; type TfrmDCSumm = class(TfrmHSplit) mnuSumms: TMainMenu; mnuView: TMenuItem; mnuViewChart: TMenuItem; mnuChartReports: TMenuItem; mnuChartLabs: TMenuItem; mnuChartDCSumm: TMenuItem; mnuChartCslts: TMenuItem; mnuChartSumms: TMenuItem; mnuChartOrders: TMenuItem; mnuChartMeds: TMenuItem; mnuChartProbs: TMenuItem; mnuChartCover: TMenuItem; Z1: TMenuItem; mnuViewDetail: TMenuItem; mnuAct: TMenuItem; mnuActNew: TMenuItem; Z2: TMenuItem; mnuActSave: TMenuItem; mnuActDelete: TMenuItem; mnuActEdit: TMenuItem; mnuActSign: TMenuItem; mnuActAddend: TMenuItem; lblSumms: TOROffsetLabel; pnlRead: TPanel; lblTitle: TOROffsetLabel; memSumm: TRichEdit; pnlWrite: TPanel; memNewSumm: TRichEdit; Z3: TMenuItem; mnuViewAll: TMenuItem; mnuViewByAuthor: TMenuItem; mnuViewByDate: TMenuItem; mnuViewUncosigned: TMenuItem; mnuViewUnsigned: TMenuItem; mnuActSignList: TMenuItem; cmdNewSumm: TORAlignButton; lblSpace1: TLabel; cmdPCE: TORAlignButton; popSummMemo: TPopupMenu; popSummMemoCut: TMenuItem; popSummMemoCopy: TMenuItem; popSummMemoPaste: TMenuItem; Z10: TMenuItem; popSummMemoSignList: TMenuItem; popSummMemoDelete: TMenuItem; popSummMemoEdit: TMenuItem; popSummMemoSave: TMenuItem; popSummMemoSign: TMenuItem; popSummList: TPopupMenu; popSummListAll: TMenuItem; popSummListByAuthor: TMenuItem; popSummListByDate: TMenuItem; popSummListUncosigned: TMenuItem; popSummListUnsigned: TMenuItem; pnlFields: TORAutoPanel; sptVert: TSplitter; memPCEShow: TRichEdit; mnuActIdentifyAddlSigners: TMenuItem; popSummMemoAddlSign: TMenuItem; Z11: TMenuItem; popSummMemoSpell: TMenuItem; popSummMemoGrammar: TMenuItem; mnuViewCustom: TMenuItem; N1: TMenuItem; mnuViewSaveAsDefault: TMenuItem; mnuViewReturnToDefault: TMenuItem; pnlDrawers: TPanel; lstSumms: TORListBox; N2: TMenuItem; popSummMemoTemplate: TMenuItem; mnuOptions: TMenuItem; mnuEditTemplates: TMenuItem; mnuNewTemplate: TMenuItem; splDrawers: TSplitter; N3: TMenuItem; mnuEditSharedTemplates: TMenuItem; mnuNewSharedTemplate: TMenuItem; timAutoSave: TTimer; cmdChange: TButton; lblNewTitle: TStaticText; lblVisit: TStaticText; lblRefDate: TStaticText; lblCosigner: TStaticText; lblDictator: TStaticText; lblDischarge: TStaticText; popSummMemoPaste2: TMenuItem; popSummMemoReformat: TMenuItem; Z4: TMenuItem; mnuActChange: TMenuItem; mnuActLoadBoiler: TMenuItem; bvlNewTitle: TBevel; popSummMemoSaveContinue: TMenuItem; N4: TMenuItem; mnuEditDialgFields: TMenuItem; lvSumms: TCaptionListView; sptList: TSplitter; N5: TMenuItem; popSummListExpandSelected: TMenuItem; popSummListExpandAll: TMenuItem; popSummListCollapseSelected: TMenuItem; popSummListCollapseAll: TMenuItem; tvSumms: TORTreeView; popSummListCustom: TMenuItem; N6: TMenuItem; popSummListDetachFromIDParent: TMenuItem; mnuActDetachFromIDParent: TMenuItem; popSummListAddIDEntry: TMenuItem; mnuActAddIDEntry: TMenuItem; N7: TMenuItem; mnuIconLegend: TMenuItem; dlgFindText: TFindDialog; popSummMemoFind: TMenuItem; dlgReplaceText: TReplaceDialog; N8: TMenuItem; popSummMemoReplace: TMenuItem; mnuChartSurgery: TMenuItem; mnuActAttachtoIDParent: TMenuItem; popSummListAttachtoIDParent: TMenuItem; popSummMemoAddend: TMenuItem; N9: TMenuItem; popSummMemoPreview: TMenuItem; popSummMemoInsTemplate: TMenuItem; popSummMemoEncounter: TMenuItem; mnuViewInformation: TMenuItem; mnuViewDemo: TMenuItem; mnuViewVisits: TMenuItem; mnuViewPrimaryCare: TMenuItem; mnuViewMyHealtheVet: TMenuItem; mnuInsurance: TMenuItem; mnuViewFlags: TMenuItem; mnuViewReminders: TMenuItem; mnuViewRemoteData: TMenuItem; mnuViewPostings: TMenuItem; imgLblNotes: TVA508ImageListLabeler; imgLblImages: TVA508ImageListLabeler; procedure mnuChartTabClick(Sender: TObject); procedure lstSummsClick(Sender: TObject); procedure pnlRightResize(Sender: TObject); procedure cmdNewSummClick(Sender: TObject); procedure memNewSummChange(Sender: TObject); procedure mnuActNewClick(Sender: TObject); procedure mnuActAddIDEntryClick(Sender: TObject); procedure mnuActSaveClick(Sender: TObject); procedure mnuViewClick(Sender: TObject); procedure mnuActAddendClick(Sender: TObject); procedure mnuActDetachFromIDParentClick(Sender: TObject); procedure mnuActSignListClick(Sender: TObject); procedure mnuActDeleteClick(Sender: TObject); procedure mnuActEditClick(Sender: TObject); procedure mnuActSignClick(Sender: TObject); procedure cmdOrdersClick(Sender: TObject); procedure cmdPCEClick(Sender: TObject); procedure popSummMemoCutClick(Sender: TObject); procedure popSummMemoCopyClick(Sender: TObject); procedure popSummMemoPasteClick(Sender: TObject); procedure popSummMemoPopup(Sender: TObject); procedure pnlWriteResize(Sender: TObject); procedure FormCreate(Sender: TObject); procedure mnuViewDetailClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure mnuActIdentifyAddlSignersClick(Sender: TObject); procedure popSummMemoAddlSignClick(Sender: TObject); procedure popSummMemoSpellClick(Sender: TObject); procedure popSummMemoGrammarClick(Sender: TObject); procedure mnuViewSaveAsDefaultClick(Sender: TObject); procedure mnuViewReturntoDefaultClick(Sender: TObject); procedure popSummMemoTemplateClick(Sender: TObject); procedure mnuNewTemplateClick(Sender: TObject); procedure mnuEditTemplatesClick(Sender: TObject); procedure mnuOptionsClick(Sender: TObject); procedure mnuEditSharedTemplatesClick(Sender: TObject); procedure mnuNewSharedTemplateClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure timAutoSaveTimer(Sender: TObject); procedure cmdChangeClick(Sender: TObject); procedure popSummMemoReformatClick(Sender: TObject); procedure mnuActChangeClick(Sender: TObject); procedure mnuActLoadBoilerClick(Sender: TObject); procedure popSummMemoSaveContinueClick(Sender: TObject); procedure mnuEditDialgFieldsClick(Sender: TObject); procedure tvSummsChange(Sender: TObject; Node: TTreeNode); procedure tvSummsClick(Sender: TObject); procedure tvSummsCollapsed(Sender: TObject; Node: TTreeNode); procedure tvSummsExpanded(Sender: TObject; Node: TTreeNode); procedure tvSummsStartDrag(Sender: TObject; var DragObject: TDragObject); procedure tvSummsDragDrop(Sender, Source: TObject; X, Y: Integer); procedure tvSummsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure lvSummsColumnClick(Sender: TObject; Column: TListColumn); procedure lvSummsCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); procedure lvSummsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); procedure popSummListExpandAllClick(Sender: TObject); procedure popSummListCollapseAllClick(Sender: TObject); procedure popSummListExpandSelectedClick(Sender: TObject); procedure popSummListCollapseSelectedClick(Sender: TObject); procedure popSummListPopup(Sender: TObject); procedure lvSummsResize(Sender: TObject); procedure mnuIconLegendClick(Sender: TObject); procedure popSummMemoFindClick(Sender: TObject); procedure dlgFindTextFind(Sender: TObject); procedure dlgReplaceTextReplace(Sender: TObject); procedure dlgReplaceTextFind(Sender: TObject); procedure popSummMemoReplaceClick(Sender: TObject); procedure mnuActAttachtoIDParentClick(Sender: TObject); procedure memNewSummKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); procedure popSummMemoPreviewClick(Sender: TObject); procedure popSummMemoInsTemplateClick(Sender: TObject); procedure ViewInfo(Sender: TObject); procedure mnuViewInformationClick(Sender: TObject); private FEditingIndex: Integer; // index of Summary being currently edited FChanged: Boolean; // true if any text has changed in the Summary FEditCtrl: TCustomEdit; FDischargeDate: TFMDateTime; FSilent: Boolean; FCurrentContext: TTIUContext; FDefaultContext: TTIUContext; FImageFlag: TBitmap; FEditDCSumm: TEditDCSummRec; FShowAdmissions: Boolean; FVerifySummTitle: Integer; FDocList: TStringList; FConfirmed: boolean; FDeleted: boolean; FLastSummID: string; function NoSummSelected : Boolean; procedure ClearEditControls; function StartNewEdit(NewNoteType: integer): Boolean; procedure DoAutoSave(Suppress: integer = 1); function LacksRequiredForCreate: Boolean; function GetTitleText(AnIndex: Integer): string; //function MakeTitleText(IsAddendum: Boolean = False): string; procedure SetEditingIndex(const Value: Integer); procedure DisplayPCE; function LockSumm(AnIEN: Int64): Boolean; procedure InsertAddendum; procedure InsertNewSumm(IsIDChild: boolean; AnIDParent: integer); procedure LoadForEdit(PreserveValues: Boolean); procedure RemovePCEFromChanges(IEN: Int64; AVisitStr: string = ''); procedure SaveEditedSumm(var Saved: Boolean); procedure SaveCurrentSumm(var Saved: Boolean); procedure ShowPCEControls(ShouldShow: Boolean); function TitleText(AnIndex: Integer): string; procedure ProcessNotifications; procedure SetViewContext(AContext: TTIUContext); function GetDrawers: TFrmDrawers; property EditingIndex: Integer read FEditingIndex write SetEditingIndex; function VerifySummTitle: Boolean; // added for treeview - see also uDocTree.pas procedure LoadSumms; procedure UpdateTreeView(DocList: TStringList; Tree: TORTreeView); procedure EnableDisableIDNotes; procedure DoAttachIDChild(AChild, AParent: TORTreeNode); function SetSummTreeLabel(AContext: TTIUContext): string; public function AllowContextChange(var WhyNot: string): Boolean; override; procedure ClearPtData; override; procedure DisplayPage; override; procedure RequestPrint; override; procedure RequestMultiplePrint(AForm: TfrmPrintList); procedure SetFontSize(NewFontSize: Integer); override; procedure SaveSignItem(const ItemID, ESCode: string); procedure LstSummsToPrint; published property Drawers: TFrmDrawers read GetDrawers; // Keep Drawers published end; var frmDCSumm: TfrmDCSumm; implementation {$R *.DFM} uses fFrame, fVisit, fEncnt, rCore, uCore, fNoteBA, fNoteBD, fSignItem, fEncounterFrame, rPCE, Clipbrd, fNotePrt, fAddlSigners, fNoteDR, uSpell, rVitals, fTIUView, fTemplateEditor, rTIU, fDCSummProps, fNotesBP, fTemplateFieldEditor, uTemplates, fReminderDialog, dShared, rTemplates, fIconLegend, fNoteIDParents, fTemplateDialog, uVA508CPRSCompatibility, VA508AccessibilityRouter; const NA_CREATE = 0; // New Summ action - create new Summ NA_SHOW = 1; // New Summ action - show current NA_SAVECREATE = 2; // New Summ action - save current then create TYP_DC_SUMM = 244; DC_NEW_SUMM = -50; // Holder IEN for a new Summary DC_ADDENDUM = -60; // Holder IEN for a new addendum DC_ACT_NEW_SUMM = 2; DC_ACT_ADDENDUM = 3; DC_ACT_EDIT_SUMM = 4; DC_ACT_ID_ENTRY = 5; TX_NEED_VISIT = 'A visit is required before creating a new Discharge Summary.'; TX_NO_VISIT = 'Insufficient Visit Information'; TX_BOILERPLT = 'You have modified the text of this Discharge Summary. Changing the title will' + ' discard the Discharge Summary text.' + CRLF + 'Do you wish to continue?'; TX_NEWTITLE = 'Change Discharge Summary Title'; TX_REQD_SUMM = 'The following information is required to save a Discharge Summary - ' + CRLF; TX_REQD_ADDM = 'The following information is required to save an addendum - ' + CRLF; TX_REQD_COSIG = CRLF + 'Attending Physician'; TX_REQ2 = CRLF + CRLF + 'It is recommended that these fields be entered before continuing' + CRLF + 'to prevent losing the summary should the application time out.'; TX_CREATE_ERR = 'Error Creating Summary'; TX_UPDATE_ERR = 'Error Updating Summary'; TX_NO_NOTE = 'No Discharge Summary is currently being edited'; TX_SAVE_NOTE = 'Save Discharge Summary'; TX_ADDEND_NO = 'Cannot make an addendum to a Summary that is being edited'; TX_DEL_OK = CRLF + CRLF + 'Delete this Discharge Summary?'; TX_DEL_ERR = 'Unable to Delete Summary'; TX_SIGN = 'Sign Summary'; TX_COSIGN = 'Cosign Summary'; TX_SIGN_ERR = 'Unable to Sign Summary'; TX_NOSUMM = 'No Discharge Summary is currently selected.'; TX_NOSUMM_CAP = 'No Summary Selected'; TX_NOPRT_NEW = 'This Discharge Summary may not be printed until it is saved'; TX_NOPRT_NEW_CAP = 'Save Discharge Summary'; TX_NOT_INPATIENT = 'Discharge Summaries are only applicable to hospital admissions.'; TX_NO_ADMISSION_CAP = 'No hospital admission was selected'; TX_NO_ALERT = 'There is insufficient information to process this alert.' + CRLF + 'Either the alert has already been deleted, or it contained invalid data.' + CRLF + CRLF + 'Click the NEXT button if you wish to continue processing more alerts.'; TX_CAP_NO_ALERT = 'Unable to Process Alert'; TX_NO_FUTURE_DT = 'A Reference Date/Time in the future is not allowed.'; TX_RELEASE = 'Do you want to release this summary from DRAFT mode to UNSIGNED' + CRLF + 'status? This does not release the summary as the official,' + CRLF + 'completed Discharge Summary until it is COSIGNED.'; //'Do you want to release this discharge summary?'; TC_RELEASE = 'Release Document'; TX_NEW_SAVE1 = 'You are currently editing:' + CRLF + CRLF; TX_NEW_SAVE2 = CRLF + CRLF + 'Do you wish to save this summary and begin a new one?'; TX_NEW_SAVE3 = CRLF + CRLF + 'Do you wish to save this summary and begin a new addendum?'; TX_NEW_SAVE4 = CRLF + CRLF + 'Do you wish to save this summary and edit the one selected?'; TX_NEW_SAVE5 = CRLF + CRLF + 'Do you wish to save this summary and begin a new Interdisciplinary entry?'; TC_NEW_SAVE2 = 'Create New Summary'; TC_NEW_SAVE3 = 'Create New Addendum'; TC_NEW_SAVE4 = 'Edit Different Summary'; TC_NEW_SAVE5 = 'Create New Interdisciplinary Entry'; TC_NO_LOCK = 'Unable to Lock Summary'; TX_EMPTY_SUMM = CRLF + CRLF + 'This discharge summary contains no text and will not be saved.' + CRLF + 'Do you wish to delete this discharge summary?'; TC_EMPTY_SUMM = 'Empty Note'; TX_EMPTY_SUMM1 = 'This document contains no text and can not be signed.'; TX_ABSAVE = 'It appears the session terminated abnormally when this' + CRLF + 'note was last edited. Some text may not have been saved.' + CRLF + CRLF + 'Do you wish to continue and sign the note?'; TC_ABSAVE = 'Possible Missing Text'; TX_NO_BOIL = 'There is no boilerplate text associated with this title.'; TC_NO_BOIL = 'Load Boilerplate Text'; TX_BLR_CLEAR = 'Do you want to clear the previously loaded boilerplate text?'; TC_BLR_CLEAR = 'Clear Previous Boilerplate Text'; TX_MISSING_FIELDS = 'This document can not be saved. An ATTENDING must first be entered.'; TC_MISSING_FIELDS = 'Unable to save'; TX_DETACH_CNF = 'Confirm Detachment'; TX_DETACH_FAILURE = 'Detach failed'; TX_RETRACT_CAP = 'Retraction Notice'; TX_RETRACT = 'This document will now be RETRACTED. As Such, it has been removed' +CRLF + ' from public view, and from typical Releases of Information,' +CRLF + ' but will remain indefinitely discoverable to HIMS.' +CRLF +CRLF; TX_AUTH_SIGNED = 'Author has not signed, are you SURE you want to sign.' +CRLF; var uPCEShow, uPCEEdit: TPCEData; ViewContext: Integer; frmDrawers: TfrmDrawers; uDCSummContext: TTIUContext; ColumnToSort: Integer; ColumnSortForward: Boolean; uChanging: Boolean; uIDNotesActive: Boolean; { TPage common methods --------------------------------------------------------------------- } function TfrmDCSumm.AllowContextChange(var WhyNot: string): Boolean; begin dlgFindText.CloseDialog; Result := inherited AllowContextChange(WhyNot); // sets result = true if Assigned(frmTemplateDialog) then if Screen.ActiveForm = frmTemplateDialog then //if (fsModal in frmTemplateDialog.FormState) then case BOOLCHAR[frmFrame.CCOWContextChanging] of '1': begin WhyNot := 'A template in progress will be aborted. '; Result := False; end; '0': begin if WhyNot = 'COMMIT' then begin FSilent := True; frmTemplateDialog.Silent := True; frmTemplateDialog.ModalResult := mrCancel; end; end; end; if EditingIndex <> -1 then case BOOLCHAR[frmFrame.CCOWContextChanging] of '1': begin if memNewSumm.GetTextLen > 0 then WhyNot := WhyNot + 'A discharge summary in progress will be saved as unsigned. ' else WhyNot := WhyNot + 'An empty discharge summary in progress will be deleted. '; Result := False; end; '0': begin if WhyNot = 'COMMIT' then FSilent := True; SaveCurrentSumm(Result); end; end; if Assigned(frmEncounterFrame) then if Screen.ActiveForm = frmEncounterFrame then //if (fsModal in frmEncounterFrame.FormState) then case BOOLCHAR[frmFrame.CCOWContextChanging] of '1': begin WhyNot := WhyNot + 'Encounter information being edited will not be saved'; Result := False; end; '0': begin if WhyNot = 'COMMIT' then begin FSilent := True; frmEncounterFrame.Abort := False; frmEncounterFrame.Cancel := True; end; end; end; end; procedure TfrmDCSumm.LstSummsToPrint; var AParentID: string; SavedDocID: string; Saved: boolean; begin inherited; if lstSumms.ItemIEN = 0 then exit; SavedDocID := lstSumms.ItemID; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end; if tvSumms.Selected = nil then exit; AParentID := frmPrintList.SelectParentFromList(tvSumms,CT_DCSUMM); if AParentID = '' then exit; with tvSumms do Selected := FindPieceNode(AParentID, 1, U, Items.GetFirstNode); end; procedure TfrmDCSumm.ClearPtData; { clear all controls that contain patient specific information } begin inherited ClearPtData; ClearEditControls; uChanging := True; tvSumms.Items.BeginUpdate; KillDocTreeObjects(tvSumms); tvSumms.Items.Clear; tvSumms.Items.EndUpdate; uChanging := False; lstSumms.Clear; memSumm.Clear; memPCEShow.Clear; uPCEShow.Clear; uPCEEdit.Clear; frmDrawers.ResetTemplates; end; procedure TfrmDCSumm.DisplayPage; { causes page to be visible and conditionally executes initialization code } begin inherited DisplayPage; frmFrame.ShowHideChartTabMenus(mnuViewChart); frmFrame.mnuFilePrint.Tag := CT_DCSUMM; frmFrame.mnuFilePrint.Enabled := True; frmFrame.mnuFilePrintSetup.Enabled := True; frmFrame.mnuFilePrintSelectedItems.Enabled := True; if InitPage then begin EnableDisableIDNotes; FDefaultContext := GetCurrentDCSummContext; FCurrentContext := FDefaultContext; popSummMemoSpell.Visible := SpellCheckAvailable; popSummMemoGrammar.Visible := popSummMemoSpell.Visible; Z11.Visible := popSummMemoSpell.Visible; timAutoSave.Interval := User.AutoSave * 1000; // convert seconds to milliseconds SetEqualTabStops(memNewSumm); end; // to indent the right margin need to set Paragraph.RightIndent for each paragraph? if InitPatient and not (CallingContext = CC_NOTIFICATION) then begin SetViewContext(FDefaultContext); end; case CallingContext of CC_INIT_PATIENT: if not InitPatient then begin SetViewContext(FDefaultContext); end; CC_NOTIFICATION: ProcessNotifications; end; end; procedure TfrmDCSumm.RequestPrint; var Saved: Boolean; begin with lstSumms do begin if ItemIndex = EditingIndex then //if ItemIEN < 0 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; if ItemIEN > 0 then PrintNote(ItemIEN, MakeDCSummDisplayText(Items[ItemIndex])) else begin if ItemIEN = 0 then InfoBox(TX_NO_NOTE, TX_NOSUMM_CAP, MB_OK); if ItemIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK); end; end; end; procedure TfrmDCSumm.RequestMultiplePrint(AForm: TfrmPrintList); var NoteIEN: int64; i: integer; begin with AForm.lbIDParents do begin for i := 0 to Items.Count - 1 do begin if Selected[i] then begin NoteIEN := ItemIEN; //StrToInt64def(Piece(TStringList(Items.Objects[i])[0],U,1),0); if NoteIEN > 0 then PrintNote(NoteIEN, DisplayText[i], TRUE) else begin if ItemIEN = 0 then InfoBox(TX_NO_NOTE, TX_NOSUMM_CAP, MB_OK); if ItemIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK); end; end; {if selected} end; {for} end {with} end; procedure TfrmDCSumm.SetFontSize(NewFontSize: Integer); { adjusts the font size of any controls that don't have ParentFont = True } begin inherited SetFontSize(NewFontSize); memSumm.Font.Size := NewFontSize; memNewSumm.Font.Size := NewFontSize; lblTitle.Font.Size := NewFontSize; frmDrawers.Font.Size := NewFontSize; SetEqualTabStops(memNewSumm); // adjust heights of pnlAction, pnlFields, and lstEncntShow end; procedure TfrmDCSumm.mnuChartTabClick(Sender: TObject); { reroute to Chart Tab menu of the parent form: frmFrame } begin inherited; frmFrame.mnuChartTabClick(Sender); end; { General procedures ----------------------------------------------------------------------- } procedure TfrmDCSumm.ClearEditControls; { resets controls used for entering a new Discharge Summary } begin // clear FEditDCSumm (should FEditDCSumm be an object with a clear method?) with FEditDCSumm do begin DocType := 0; EditIEN := 0; Title := 0; TitleName := ''; AdmitDateTime := 0; DischargeDateTime := 0; DictDateTime := 0; Dictator := 0; DictatorName := ''; Cosigner := 0; CosignerName := ''; Transcriptionist := 0; TranscriptionistName := ''; Attending := 0; AttendingName := ''; Urgency := ''; UrgencyName := ''; Location := 0; LocationName := ''; Addend := 0; VisitStr := ''; {LastCosigner & LastCosignerName aren't cleared because they're used as default for next note.} Lines := nil; end; // clear the editing controls (also clear the new labels?) memNewSumm.Clear; timAutoSave.Enabled := False; // clear the PCE object for editing uPCEEdit.Clear; // set the tracking variables to initial state EditingIndex := -1; FChanged := False; end; procedure TfrmDCSumm.ShowPCEControls(ShouldShow: Boolean); begin sptVert.Visible := ShouldShow; memPCEShow.Visible := ShouldShow; if(ShouldShow) then sptVert.Top := memPCEShow.Top - sptVert.Height; memSumm.Invalidate; end; procedure TfrmDCSumm.DisplayPCE; { displays PCE information if appropriate & enables/disabled editing of PCE data } var VitalStr: TStringlist; NoPCE: boolean; ActionSts: TActionRec; begin memPCEShow.Clear; with lstSumms do if ItemIndex = EditingIndex then begin with uPCEEdit do begin AddStrData(memPCEShow.Lines); NoPCE := (memPCEShow.Lines.Count = 0); VitalStr := TStringList.create; try GetVitalsFromDate(VitalStr, uPCEEdit); AddVitalData(VitalStr, memPCEShow.Lines); finally VitalStr.free; end; cmdPCE.Enabled := CanEditPCE(uPCEEdit); ShowPCEControls(cmdPCE.Enabled or (memPCEShow.Lines.Count > 0)); if(NoPCE and memPCEShow.Visible) then memPCEShow.Lines.Insert(0, TX_NOPCE); frmDrawers.DisplayDrawers(TRUE, [odTemplates],[odTemplates]); cmdNewSumm.Visible := FALSE; lblSpace1.Top := cmdPCE.Top - lblSpace1.Height; end; end else begin cmdPCE.Enabled := False; frmDrawers.DisplayDrawers(FALSE); cmdNewSumm.Visible := TRUE; lblSpace1.Top := cmdNewSumm.Top - lblSpace1.Height; ActOnDocument(ActionSts, lstSumms.ItemIEN, 'VIEW'); if ActionSts.Success then begin StatusText('Retrieving encounter information...'); with uPCEShow do begin NoteDateTime := MakeFMDateTime(Piece(lstSumms.Items[lstSumms.ItemIndex], U, 3)); PCEForNote(lstSumms.ItemIEN, uPCEEdit); AddStrData(memPCEShow.Lines); NoPCE := (memPCEShow.Lines.Count = 0); VitalStr := TStringList.create; try GetVitalsFromNote(VitalStr, uPCEShow, lstSumms.ItemIEN); AddVitalData(VitalStr, memPCEShow.Lines); finally VitalStr.free; end; ShowPCEControls(memPCEShow.Lines.Count > 0); if(NoPCE and memPCEShow.Visible) then memPCEShow.Lines.Insert(0, TX_NOPCE); end; StatusText(''); end else ShowPCEControls(FALSE); end; {if ItemIndex} memPCEShow.SelStart := 0; popSummMemoEncounter.Enabled := cmdPCE.Enabled; end; procedure TfrmDCSumm.InsertNewSumm(IsIDChild: boolean; AnIDParent: integer); { creates the editing context for a new Discharge Summary & inserts stub into top of view list} const USE_CURRENT_VISITSTR = -2; var EnableAutosave, HaveRequired, Saved: Boolean; CreatedSumm: TCreatedDoc; ListItemForEdit: string; TmpBoilerPlate: TStringList; tmpNode: TTreeNode; x, WhyNot: string; DocInfo: string; begin EnableAutosave := FALSE; TmpBoilerPlate := nil; try ClearEditControls; FShowAdmissions := True; FillChar(FEditDCSumm, SizeOf(FEditDCSumm), 0); //v15.7 with FEditDCSumm do begin EditIEN := 0; DocType := TYP_DC_SUMM; Title := DfltDCSummTitle; TitleName := DfltDCSummTitleName; if IsIDChild and (not CanTitleBeIDChild(Title, WhyNot)) then begin Title := 0; TitleName := ''; end; DictDateTime := FMNow; Dictator := User.DUZ; DictatorName := User.Name; if IsIDChild then IDParent := AnIDParent else IDParent := 0; end; // check to see if interaction necessary to get required fields if LacksRequiredForCreate or VerifySummTitle then HaveRequired := ExecuteDCSummProperties(FEditDCSumm, ListItemForEdit, FShowAdmissions, IsIDChild) else HaveRequired := True; if HaveRequired then begin if ListItemForEdit <> '' then begin lstSumms.ItemIndex := -1; lstSumms.SelectByID(Piece(ListItemForEdit, U, 1)); if lstSumms.ItemIndex < 0 then begin lstSumms.Items.Insert(0, ListItemForEdit); lstSumms.ItemIndex := 0; end; if lstSumms.ItemIndex = EditingIndex then Exit; if EditingIndex > -1 then begin if InfoBox(TX_NEW_SAVE1 + MakeDCSummDisplayText(lstSumms.Items[EditingIndex]) + TX_NEW_SAVE2, TC_NEW_SAVE2, MB_YESNO) = IDNO then exit else begin SaveCurrentSumm(Saved); if not Saved then exit; end; end; //if not StartNewEdit then Exit; lstSummsClick(Self); LoadForEdit(True); Exit; end else begin // set up uPCEEdit for entry of new note uPCEEdit.UseEncounter := True; uPCEEdit.NoteDateTime := FEditDCSumm.DischargeDateTime; uPCEEdit.PCEForNote(USE_CURRENT_VISITSTR, uPCEShow); FEditDCSumm.NeedCPT := uPCEEdit.CPTRequired; // create the note PutNewDCSumm(CreatedSumm, FEditDCSumm); uPCEEdit.NoteIEN := CreatedSumm.IEN; if CreatedSumm.IEN > 0 then LockDocument(CreatedSumm.IEN, CreatedSumm.ErrorText); if CreatedSumm.ErrorText = '' then begin //x := $$RESOLVE^TIUSRVLO formatted string //7348^Discharge Summary^3000913^NERD, YOURA (N0165)^1329;Rich Vertigan;VERTIGAN,RICH^8E REHAB MED^unverified^Adm: 11/05/98;2981105.095547^ ;^^0^^^2 with FEditDCSumm do begin x := IntToStr(CreatedSumm.IEN) + U + TitleName + U + FloatToStr(DischargeDateTime) + U + Patient.Name + U + IntToStr(Dictator) + ';' + DictatorName + U + LocationName + U + 'new' + U + 'Adm: ' + FormatFMDateTime('mmm dd,yyyy', AdmitDateTime) + ';' + FloatToStr(AdmitDateTime) + U + 'Dis: ' + FormatFMDateTime('mmm dd,yyyy', DischargeDateTime) + ';' + FloatToStr(DischargeDateTime) + U + U + U + U + U + U; end; lstSumms.Items.Insert(0, x); uChanging := True; tvSumms.Items.BeginUpdate; if IsIDChild then begin tmpNode := tvSumms.FindPieceNode(IntToStr(AnIDParent), 1, U, tvSumms.Items.GetFirstNode); tmpNode.ImageIndex := IMG_IDNOTE_OPEN; tmpNode.SelectedIndex := IMG_IDNOTE_OPEN; tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, MakeDCSummDisplayText(x), MakeDCSummTreeObject(x)); tmpNode.ImageIndex := IMG_ID_CHILD; tmpNode.SelectedIndex := IMG_ID_CHILD; end else begin tmpNode := tvSumms.Items.AddObjectFirst(tvSumms.Items.GetFirstNode, 'New Summary in Progress', MakeDCSummTreeObject('NEW^New Summary in Progress^^^^^^^^^^^%^0')); TORTreeNode(tmpNode).StringData := 'NEW^New Summary in Progress^^^^^^^^^^^%^0'; tmpNode.ImageIndex := IMG_TOP_LEVEL; tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, MakeDCSummDisplayText(x), MakeDCSummTreeObject(x)); tmpNode.ImageIndex := IMG_SINGLE; tmpNode.SelectedIndex := IMG_SINGLE; end; TORTreeNode(tmpNode).StringData := x; tvSumms.Selected := tmpNode; tvSumms.Items.EndUpdate; uChanging := False; Changes.Add(CH_SUM, IntToStr(CreatedSumm.IEN), GetTitleText(0), '', CH_SIGN_YES); lstSumms.ItemIndex := 0; EditingIndex := 0; if not assigned(TmpBoilerPlate) then TmpBoilerPlate := TStringList.Create; LoadBoilerPlate(TmpBoilerPlate, FEditDCSumm.Title); FChanged := False; cmdChangeClick(Self); // will set captions, sign state for Changes lstSummsClick(Self); // will make pnlWrite visible if timAutoSave.Interval <> 0 then EnableAutosave := TRUE; memNewSumm.SetFocus; end else begin InfoBox(CreatedSumm.ErrorText, TX_CREATE_ERR, MB_OK); HaveRequired := False; end; {if CreatedSumm.IEN} end; {loaded for edit} end; {if HaveRequired} if not HaveRequired then ClearEditControls; finally if assigned(TmpBoilerPlate) then begin DocInfo := MakeXMLParamTIU(IntToStr(CreatedSumm.IEN), FEditDCSumm); ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditDCSumm.Title, ltTitle, Self, 'Title: ' + FEditDCSumm.TitleName, DocInfo); QuickCopyWith508Msg(TmpBoilerPlate, memNewSumm); TmpBoilerPlate.Free; end; if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved timAutoSave.Enabled := True; end; end; procedure TfrmDCSumm.InsertAddendum; { sets up fields of pnlWrite to write an addendum for the selected Summary} const AS_ADDENDUM = True; IS_ID_CHILD = False; var HaveRequired: Boolean; CreatedSumm: TCreatedDoc; ListItemForEdit: string; tmpNode: TTreeNode; x: string; begin ClearEditControls; FShowAdmissions := False; with FEditDCSumm do begin DocType := TYP_ADDENDUM; Title := TitleForNote(lstSumms.ItemIEN); TitleName := Piece(lstSumms.Items[lstSumms.ItemIndex], U, 2); if Copy(TitleName,1,1) = '+' then TitleName := Copy(TitleName, 3, 199); DictDateTime := FMNow; Dictator := User.DUZ; DictatorName := User.Name; Addend := lstSumms.ItemIEN; end; // check to see if interaction necessary to get required fields if LacksRequiredForCreate then HaveRequired := ExecuteDCSummProperties(FEditDCSumm, ListItemForEdit, FShowAdmissions, IS_ID_CHILD) else HaveRequired := True; if HaveRequired then begin with FEditDCSumm do begin uPCEEdit.NoteDateTime := DischargeDateTime; uPCEEdit.PCEForNote(Addend, uPCEShow); Location := uPCEEdit.Location; LocationName := ExternalName(uPCEEdit.Location, 44); AdmitDateTime := uPCEEdit.DateTime; DischargeDateTime := StrToFMDateTime(GetDischargeDate(Patient.DFN, FloatToStr(AdmitDateTime))); if DischargeDateTime <= 0 then DischargeDateTime := FMNow; end; PutDCAddendum(CreatedSumm, FEditDCSumm, FEditDCSumm.Addend); uPCEEdit.NoteIEN := CreatedSumm.IEN; if CreatedSumm.IEN > 0 then LockDocument(CreatedSumm.IEN, CreatedSumm.ErrorText); if CreatedSumm.ErrorText = '' then begin with FEditDCSumm do begin x := IntToStr(CreatedSumm.IEN) + U + 'Addendum to ' + TitleName + U + FloatToStr(DischargeDateTime) + U + Patient.Name + U + IntToStr(Dictator) + ';' + DictatorName + U + LocationName + U + 'new' + U + 'Adm: ' + FormatFMDateTime('mmm dd,yyyy', AdmitDateTime) + ';' + FloatToStr(AdmitDateTime) + U + 'Dis: ' + FormatFMDateTime('mmm dd,yyyy', DischargeDateTime) + ';' + FloatToStr(DischargeDateTime) + U + U + U + U + U + U; end; lstSumms.Items.Insert(0, x); uChanging := True; tvSumms.Items.BeginUpdate; tmpNode := tvSumms.Items.AddObjectFirst(tvSumms.Items.GetFirstNode, 'New Addendum in Progress', MakeDCSummTreeObject('ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0')); TORTreeNode(tmpNode).StringData := 'ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0'; tmpNode.ImageIndex := IMG_TOP_LEVEL; tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, MakeDCSummDisplayText(x), MakeDCSummTreeObject(x)); TORTreeNode(tmpNode).StringData := x; tmpNode.ImageIndex := IMG_ADDENDUM; tmpNode.SelectedIndex := IMG_ADDENDUM; tvSumms.Selected := tmpNode; tvSumms.Items.EndUpdate; uChanging := False; Changes.Add(CH_SUM, IntToStr(CreatedSumm.IEN), GetTitleText(0), '', CH_SIGN_YES); lstSumms.ItemIndex := 0; EditingIndex := 0; cmdChangeClick(Self); // will set captions, sign state for Changes lstSummsClick(Self); // will make pnlWrite visible if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True; memNewSumm.SetFocus; end else begin InfoBox(CreatedSumm.ErrorText, TX_CREATE_ERR, MB_OK); HaveRequired := False; end; {if CreatedNote.IEN} end; {if HaveRequired} if not HaveRequired then ClearEditControls; end; procedure TfrmDCSumm.LoadForEdit(PreserveValues: Boolean); { retrieves an existing Summ and places the data in the fields of pnlWrite } var tmpNode: TTreeNode; x: string; begin if not PreserveValues then ClearEditControls; if not LockSumm(lstSumms.ItemIEN) then Exit; EditingIndex := lstSumms.ItemIndex; Changes.Add(CH_SUM, lstSumms.ItemID, GetTitleText(EditingIndex), '', CH_SIGN_YES); if not PreserveValues then GetDCSummForEdit(FEditDCSumm, lstSumms.ItemIEN); if FEditDCSumm.Lines <> nil then memNewSumm.Lines.Assign(FEditDCSumm.Lines); FChanged := False; if FEditDCSumm.Title = TYP_ADDENDUM then begin FEditDCSumm.DocType := TYP_ADDENDUM; FEditDCSumm.TitleName := Piece(lstSumms.Items[lstSumms.ItemIndex], U, 2); if Copy(FEditDCSumm.TitleName,1,1) = '+' then FEditDCSumm.TitleName := Copy(FEditDCSumm.TitleName, 3, 199); if CompareText(Copy(FEditDCSumm.TitleName, 1, 8), 'Addendum') <> 0 then FEditDCSumm.TitleName := FEditDCSumm.TitleName + 'Addendum to '; end; uChanging := True; tvSumms.Items.BeginUpdate; tmpNode := tvSumms.FindPieceNode('EDIT', 1, U, nil); if tmpNode = nil then begin tmpNode := tvSumms.Items.AddObjectFirst(tvSumms.Items.GetFirstNode, 'Summary being edited', MakeDCSummTreeObject('EDIT^Summary being edited^^^^^^^^^^^%^0')); TORTreeNode(tmpNode).StringData := 'EDIT^Summary being edited^^^^^^^^^^^%^0'; end else tmpNode.DeleteChildren; x := lstSumms.Items[lstSumms.ItemIndex]; tmpNode.ImageIndex := IMG_TOP_LEVEL; tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, MakeDCSummDisplayText(x), MakeDCSummTreeObject(x)); TORTreeNode(tmpNode).StringData := x; if CompareText(Copy(FEditDCSumm.TitleName, 1, 8), 'Addendum') <> 0 then tmpNode.ImageIndex := IMG_SINGLE else tmpNode.ImageIndex := IMG_ADDENDUM; tmpNode.SelectedIndex := tmpNode.ImageIndex; tvSumms.Selected := tmpNode; tvSumms.Items.EndUpdate; uChanging := False; uPCEEdit.NoteDateTime := MakeFMDateTime(Piece(lstSumms.Items[lstSumms.ItemIndex], U, 3)); uPCEEdit.PCEForNote(lstSumms.ItemIEN, uPCEShow); FEditDCSumm.NeedCPT := uPCEEdit.CPTRequired; cmdChangeClick(Self); // will set captions, sign state for Changes lstSummsClick(Self); // will make pnlWrite visible if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True; memNewSumm.SetFocus; end; function TfrmDCSumm.TitleText(AnIndex: Integer): string; { returns non-tabbed text for the title of a Summ given the ItemIndex in lstSumms } begin with lstSumms do Result := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(Piece(Items[AnIndex], U, 3))) + ' ' + Piece(Items[AnIndex], U, 2); end; procedure TfrmDCSumm.SaveEditedSumm(var Saved: Boolean); { validates fields and sends the updated Summ to the server } var UpdatedSumm: TCreatedDoc; x: string; begin Saved := False; if (memNewSumm.GetTextLen = 0) or (not ContainsVisibleChar(memNewSumm.Text)) then begin lstSumms.ItemIndex := EditingIndex; x := lstSumms.ItemID; uChanging := True; tvSumms.Selected := tvSumms.FindPieceNode(x, 1, U, tvSumms.Items.GetFirstNode); uChanging := False; tvSummsChange(Self, tvSumms.Selected); if FSilent or ((not FSilent) and (InfoBox(GetTitleText(EditingIndex) + TX_EMPTY_SUMM, TC_EMPTY_SUMM, MB_YESNO) = IDYES)) then begin FConfirmed := True; mnuActDeleteClick(Self); Saved := True; FDeleted := True; end else FConfirmed := False; Exit; end; //ExpandTabsFilter(memNewSumm.Lines, TAB_STOP_CHARS); with FEditDCSumm do begin if (Attending = 0) and (not FSilent) then begin InfoBox(TX_MISSING_FIELDS, TC_MISSING_FIELDS,MB_OK); cmdChangeClick(mnuActSave); Exit; end; NeedCPT := uPCEEdit.CPTRequired; {*RAB*} Lines := memNewSumm.Lines; if RequireMASVerification(lstSumms.GetIEN(EditingIndex), TYP_DC_SUMM) then Status := TIU_ST_UNVER; (*if (User.DUZ <> Dictator) and (User.DUZ <> Attending) and*) //ALL USERS?? if RequireRelease(lstSumms.GetIEN(EditingIndex), TYP_DC_SUMM) then begin if not FSilent then begin if InfoBox(TX_RELEASE, TC_RELEASE, MB_YESNO) = IDNO then Status := TIU_ST_UNREL; end else // always save as unreleased on timeout Status := TIU_ST_UNREL; end; end; timAutoSave.Enabled := False; try PutEditedDCSumm(UpdatedSumm, FEditDCSumm, lstSumms.GetIEN(EditingIndex)); finally timAutoSave.Enabled := True; end; if UpdatedSumm.IEN > 0 then begin if (FEditDCSumm.Status in [TIU_ST_UNREL, TIU_ST_UNVER]) then begin Changes.Remove(CH_SUM, IntToStr(UpdatedSumm.IEN)); // DON'T REPROMPT ON PATIENT CHANGE UnlockDocument(UpdatedSumm.IEN); // Unlock only if UNRELEASED or UNVERIFIED end; // otherwise, there's no unlocking here since the note is still in Changes after a save if lstSumms.ItemIndex = EditingIndex then begin EditingIndex := -1; lstSummsClick(Self); end; EditingIndex := -1; // make sure EditingIndex reset even if not viewing edited note Saved := True; FChanged := False; end else begin if not FSilent then InfoBox(TX_SAVE_ERROR1 + UpdatedSumm.ErrorText + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING); end; end; procedure TfrmDCSumm.SaveCurrentSumm(var Saved: Boolean); { called whenever a Summ should be saved - uses IEN to call appropriate save logic } begin if EditingIndex < 0 then Exit; SaveEditedSumm(Saved); end; { Form events ------------------------------------------------------------------------------ } procedure TfrmDCSumm.pnlRightResize(Sender: TObject); { memSumm (TRichEdit) doesn't repaint appropriately unless its parent panel is refreshed } begin inherited; pnlRight.Refresh; memSumm.Repaint; end; procedure TfrmDCSumm.pnlWriteResize(Sender: TObject); const LEFT_MARGIN = 4; begin inherited; LimitEditWidth(memNewSumm, MAX_ENTRY_WIDTH - 1); memNewSumm.Constraints.MinWidth := TextWidthByFont(memNewSumm.Font.Handle, StringOfChar('X', MAX_ENTRY_WIDTH)) + (LEFT_MARGIN * 2) + ScrollBarWidth; pnlLeft.Width := self.ClientWidth - pnlWrite.Width - sptHorz.Width; end; { Left panel (selector) events ------------------------------------------------------------- } procedure TfrmDCSumm.lstSummsClick(Sender: TObject); { loads the text for the selected Summ or displays the editing panel for the selected Summ } var x: string; begin inherited; with lstSumms do if ItemIndex = -1 then Exit else if ItemIndex = EditingIndex then begin pnlWrite.Visible := True; pnlRead.Visible := False; mnuViewDetail.Enabled := False; mnuActChange.Enabled := True; mnuActLoadBoiler.Enabled := True; end else begin StatusText('Retrieving selected Discharge Summary...'); Screen.Cursor := crHourGlass; pnlRead.Visible := True; pnlWrite.Visible := False; lblTitle.Caption := MakeDCSummDisplayText(Items[ItemIndex]); lvSumms.Caption := lblTitle.Caption; lblTitle.Hint := lblTitle.Caption; //lblTitle.Caption := Piece(DisplayText[ItemIndex], #9, 1) + ' ' + Piece(DisplayText[ItemIndex], #9, 2); LoadDocumentText(memSumm.Lines, ItemIEN); memSumm.SelStart := 0; mnuViewDetail.Enabled := True; mnuViewDetail.Checked := False; mnuActChange.Enabled := False; mnuActLoadBoiler.Enabled := False; Screen.Cursor := crDefault; StatusText(''); end; DisplayPCE; pnlRight.Refresh; memNewSumm.Repaint; memSumm.Repaint; x := 'TIU^' + lstSumms.ItemID; SetPiece(x, U, 10, Piece(lstSumms.Items[lstSumms.ItemIndex], U, 11)); NotifyOtherApps(NAE_REPORT, x); end; procedure TfrmDCSumm.cmdNewSummClick(Sender: TObject); { maps 'New Summ' button to the New Discharge Summary menu item } begin inherited; mnuActNewClick(Self); end; procedure TfrmDCSumm.cmdPCEClick(Sender: TObject); begin inherited; cmdPCE.Enabled := False; UpdatePCE(uPCEEdit); cmdPCE.Enabled := True; if frmFrame.Closing then exit; DisplayPCE; end; procedure TfrmDCSumm.cmdOrdersClick(Sender: TObject); begin inherited; { call add orders here } end; { Right panel (editor) events -------------------------------------------------------------- } procedure TfrmDCSumm.memNewSummChange(Sender: TObject); { sets FChanged to record that the Summ has really been edited } begin inherited; FChanged := True; end; { View menu events ------------------------------------------------------------------------- } procedure TfrmDCSumm.mnuViewClick(Sender: TObject); { changes the list of Summs available for viewing } var AuthCtxt: TAuthorContext; DateRange: TNoteDateRange; Saved: Boolean; begin inherited; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; FLastSummID := lstSumms.ItemID; StatusText('Retrieving Discharge Summary list...'); mnuViewDetail.Checked := False; if Sender is TMenuItem then ViewContext := TMenuItem(Sender).Tag else if FCurrentContext.Status <> '' then ViewContext := NC_CUSTOM else ViewContext := NC_RECENT; case ViewContext of NC_RECENT: begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := 'Last ' + IntToStr(ReturnMaxDCSumms) + ' Summaries'; FCurrentContext.Status := IntToStr(ViewContext); FCurrentContext.MaxDocs := ReturnMaxDCSumms; LoadSumms; end; NC_ALL: begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := 'All Signed Summaries'; FCurrentContext.Status := IntToStr(ViewContext); LoadSumms; end; NC_UNSIGNED: begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := 'Unsigned Summaries'; FCurrentContext.Status := IntToStr(ViewContext); LoadSumms; end; NC_UNCOSIGNED: begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := 'Uncosigned Summaries'; FCurrentContext.Status := IntToStr(ViewContext); LoadSumms; end; NC_BY_AUTHOR: begin SelectAuthor(Font.Size, FCurrentContext, AuthCtxt); with AuthCtxt do if Changed then begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := AuthorName + ': Signed Summaries'; FCurrentContext.Status := IntToStr(NC_BY_AUTHOR); FCurrentContext.Author := Author; FCurrentContext.TreeAscending := Ascending; LoadSumms; end; end; NC_BY_DATE: begin SelectNoteDateRange(Font.Size, FCurrentContext, DateRange); with DateRange do if Changed then begin FillChar(FCurrentContext, SizeOf(FCurrentContext), 0); lblSumms.Caption := FormatFMDateTime('mmm dd,yy', FMBeginDate) + ' to ' + FormatFMDateTime('mmm dd,yy', FMEndDate) + ': Signed Summaries'; FCurrentContext.BeginDate := BeginDate; FCurrentContext.EndDate := EndDate; FCurrentContext.FMBeginDate := FMBeginDate; FCurrentContext.FMEndDate := FMEndDate; FCurrentContext.TreeAscending := Ascending; FCurrentContext.Status := IntToStr(NC_BY_DATE); LoadSumms; end; end; NC_CUSTOM: begin if Sender is TMenuItem then begin SelectTIUView(Font.Size, True, FCurrentContext, uDCSummContext); //lblSumms.Caption := 'Custom List'; end; with uDCSummContext do if Changed then begin //if not (Sender is TMenuItem) then lblSumms.Caption := 'Default List'; //if MaxDocs = 0 then MaxDocs := ReturnMaxNotes; FCurrentContext.BeginDate := BeginDate; FCurrentContext.EndDate := EndDate; FCurrentContext.FMBeginDate := FMBeginDate; FCurrentContext.FMEndDate := FMEndDate; FCurrentContext.Status := Status; FCurrentContext.Author := Author; FCurrentContext.MaxDocs := MaxDocs; FCurrentContext.ShowSubject := ShowSubject; // NEW PREFERENCES: FCurrentContext.SortBy := SortBy; FCurrentContext.ListAscending := ListAscending; FCurrentContext.GroupBy := GroupBy; FCurrentContext.TreeAscending := TreeAscending; FCurrentContext.SearchField := SearchField; FCurrentContext.Keyword := Keyword; FCurrentContext.Filtered := Filtered; LoadSumms; end; end; end; {case} lblSumms.Caption := SetSummTreeLabel(FCurrentContext); lblSumms.hint := lblSumms.Caption; tvSumms.Caption := lblSumms.Caption; StatusText(''); end; { Action menu events ----------------------------------------------------------------------- } function TfrmDCSumm.StartNewEdit(NewNoteType: integer): Boolean; { if currently editing a note, returns TRUE if the user wants to start a new one } var Saved: Boolean; Msg, CapMsg: string; begin Result := True; if EditingIndex > -1 then begin case NewNoteType of DC_ACT_ADDENDUM: begin Msg := TX_NEW_SAVE1 + MakeDCSummDisplayText(lstSumms.Items[EditingIndex]) + TX_NEW_SAVE3; CapMsg := TC_NEW_SAVE3; end; DC_ACT_EDIT_SUMM: begin Msg := TX_NEW_SAVE1 + MakeDCSummDisplayText(lstSumms.Items[EditingIndex]) + TX_NEW_SAVE4; CapMsg := TC_NEW_SAVE4; end; DC_ACT_ID_ENTRY: begin Msg := TX_NEW_SAVE1 + MakeDCSummDisplayText(lstSumms.Items[EditingIndex]) + TX_NEW_SAVE5; CapMsg := TC_NEW_SAVE5; end; else begin Msg := TX_NEW_SAVE1 + MakeDCSummDisplayText(lstSumms.Items[EditingIndex]) + TX_NEW_SAVE2; CapMsg := TC_NEW_SAVE2; end; end; if InfoBox(Msg, CapMsg, MB_YESNO) = IDNO then Result := False else begin SaveCurrentSumm(Saved); if not Saved then Result := False else LoadSumms; end; end; end; procedure TfrmDCSumm.mnuActNewClick(Sender: TObject); const IS_ID_CHILD = False; { switches to current new Summ or creates a new Summ if none is being edited already } begin inherited; if not StartNewEdit(DC_ACT_NEW_SUMM) then Exit; //LoadSumms; // a visit (time & location) need not be available before creating the summary, // since an admission will be prompted for to link the summary to. (REV - v14d) (* if Encounter.NeedVisit then begin UpdateVisit(Font.Size); frmFrame.DisplayEncounterText; end; if Encounter.NeedVisit then begin InfoBox(TX_NEED_VISIT, TX_NO_VISIT, MB_OK or MB_ICONWARNING); Exit; end;*) InsertNewSumm(IS_ID_CHILD, 0); end; procedure TfrmDCSumm.mnuActAddIDEntryClick(Sender: TObject); const IS_ID_CHILD = True; var AnIDParent: integer; { switches to current new note or creates a new note if none is being edited already } begin inherited; AnIDParent := lstSumms.ItemIEN; if not StartNewEdit(DC_ACT_ID_ENTRY) then Exit; //LoadSumms; with tvSumms do Selected := FindPieceNode(IntToStr(AnIDParent), U, Items.GetFirstNode); // make sure a visit (time & location) is available before creating the note if Encounter.NeedVisit then begin UpdateVisit(Font.Size, DfltTIULocation); frmFrame.DisplayEncounterText; end; if Encounter.NeedVisit then begin InfoBox(TX_NEED_VISIT, TX_NO_VISIT, MB_OK or MB_ICONWARNING); Exit; end; InsertNewSumm(IS_ID_CHILD, AnIDParent); end; procedure TfrmDCSumm.mnuActAddendClick(Sender: TObject); { make an addendum to an existing Summ } var ActionSts: TActionRec; ASummID: string; begin inherited; if NoSummSelected() then Exit; ASummID := lstSumms.ItemID; if not StartNewEdit(DC_ACT_ADDENDUM) then Exit; //LoadSumms; with tvSumms do Selected := FindPieceNode(ASummID, 1, U, Items.GetFirstNode); if lstSumms.ItemIndex = EditingIndex then begin InfoBox(TX_ADDEND_NO, TX_ADDEND_MK, MB_OK); Exit; end; ActOnDCDocument(ActionSts, lstSumms.ItemIEN, 'MAKE ADDENDUM'); if not ActionSts.Success then begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); Exit; end; with lstSumms do if TitleForNote(ItemIEN) = TYP_ADDENDUM then //v17.5 RV //with lstSumms do if Copy(Piece(Items[ItemIndex], U, 2), 1, 8) = 'Addendum' then begin InfoBox(TX_ADDEND_AD, TX_ADDEND_MK, MB_OK); Exit; end; FEditDCSumm.DischargeDateTime := FMNow; InsertAddendum; end; procedure TfrmDCSumm.mnuActDetachFromIDParentClick(Sender: TObject); var DocID, WhyNot: string; Saved: boolean; SavedDocID: string; begin if lstSumms.ItemIEN = 0 then exit; SavedDocID := lstSumms.ItemID; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end; if not CanBeAttached(PDocTreeObject(tvSumms.Selected.Data)^.DocID, WhyNot) then begin WhyNot := StringReplace(WhyNot, 'ATTACH', 'DETACH', [rfIgnoreCase]); WhyNot := StringReplace(WhyNot, 'to an ID', 'from an ID', [rfIgnoreCase]); InfoBox(WhyNot, TX_DETACH_FAILURE, MB_OK); Exit; end; if (InfoBox('DETACH: ' + tvSumms.Selected.Text + CRLF + CRLF + ' FROM: ' + tvSumms.Selected.Parent.Text + CRLF + CRLF + 'Are you sure?', TX_DETACH_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit; DocID := PDocTreeObject(tvSumms.Selected.Data)^.DocID; SavedDocID := PDocTreeObject(tvSumms.Selected.Parent.Data)^.DocID; if DetachEntryFromParent(DocID, WhyNot) then begin LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); if tvSumms.Selected <> nil then tvSumms.Selected.Expand(False); end else begin WhyNot := StringReplace(WhyNot, 'ATTACH', 'DETACH', [rfIgnoreCase]); WhyNot := StringReplace(WhyNot, 'to an ID', 'from an ID', [rfIgnoreCase]); InfoBox(WhyNot, TX_DETACH_FAILURE, MB_OK); end; end; procedure TfrmDCSumm.mnuActSignListClick(Sender: TObject); { add the Summ to the Encounter object, see mnuActSignClick - copied} const SIG_COSIGN = 'COSIGNATURE'; SIG_SIGN = 'SIGNATURE'; var ActionType, SignTitle: string; ActionSts: TActionRec; begin inherited; if NoSummSelected() then Exit; if lstSumms.ItemIndex = EditingIndex then Exit; // already in signature list if not NoteHasText(lstSumms.ItemIEN) then begin InfoBox(TX_EMPTY_SUMM1, TC_EMPTY_SUMM, MB_OK or MB_ICONERROR); Exit; end; if not LastSaveClean(lstSumms.ItemIEN) and (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit; if CosignDocument(lstSumms.ItemIEN) then begin SignTitle := TX_COSIGN; ActionType := SIG_COSIGN; end else begin SignTitle := TX_SIGN; ActionType := SIG_SIGN; end; ActOnDCDocument(ActionSts, lstSumms.ItemIEN, ActionType); if not ActionSts.Success then begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); Exit; end; LockSumm(lstSumms.ItemIEN); with lstSumms do Changes.Add(CH_SUM, ItemID, TitleText(ItemIndex), '', CH_SIGN_YES); end; procedure TfrmDCSumm.RemovePCEFromChanges(IEN: Int64; AVisitStr: string = ''); begin if IEN = DC_ADDENDUM then Exit; // no PCE information entered for an addendum // do we need to call DeletePCE(AVisitStr), as was done with NT_NEW_NOTE (ien=-10)??? if AVisitStr = '' then AVisitStr := VisitStrForNote(IEN); Changes.Remove(CH_PCE, 'V' + AVisitStr); Changes.Remove(CH_PCE, 'P' + AVisitStr); Changes.Remove(CH_PCE, 'D' + AVisitStr); Changes.Remove(CH_PCE, 'I' + AVisitStr); Changes.Remove(CH_PCE, 'S' + AVisitStr); Changes.Remove(CH_PCE, 'A' + AVisitStr); Changes.Remove(CH_PCE, 'H' + AVisitStr); Changes.Remove(CH_PCE, 'E' + AVisitStr); Changes.Remove(CH_PCE, 'T' + AVisitStr); end; procedure TfrmDCSumm.mnuActDeleteClick(Sender: TObject); { delete the selected progress note & remove from the Encounter object if necessary } var DeleteSts, ActionSts: TActionRec; ReasonForDelete, AVisitStr, SavedDocID: string; Saved: boolean; SavedDocIEN: integer; begin inherited; if NoSummSelected() then Exit; ActOnDocument(ActionSts, lstSumms.ItemIEN, 'DELETE RECORD'); if ShowMsgOn(not ActionSts.Success, ActionSts.Reason, TX_IN_AUTH) then Exit; ReasonForDelete := SelectDeleteReason(lstSumms.ItemIEN); if ReasonForDelete = DR_CANCEL then Exit; // suppress prompt for deletion when called from SaveEditedNote (Sender = Self) if (Sender <> Self) and (InfoBox(MakeDCSummDisplayText(lstSumms.Items[lstSumms.ItemIndex]) + TX_DEL_OK, TX_DEL_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit; // do the appropriate locking if not LockSumm(lstSumms.ItemIEN) then Exit; // retraction notification message if JustifyDocumentDelete(lstSumms.ItemIEN) then InfoBox(TX_RETRACT, TX_RETRACT_CAP, MB_OK); SavedDocID := lstSumms.ItemID; SavedDocIEN := lstSumms.ItemIEN; if (EditingIndex > -1) and (not FConfirmed) and (lstSumms.ItemIndex <> EditingIndex) and (memNewSumm.GetTextLen > 0) then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; EditingIndex := -1; FConfirmed := False; (* if Saved then begin EditingIndex := -1; mnuViewClick(Self); with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end;*) // remove the note DeleteSts.Success := True; AVisitStr := VisitStrForNote(SavedDocIEN); RemovePCEFromChanges(SavedDocIEN, AVisitStr); if (SavedDocIEN > 0) and (lstSumms.ItemIEN = SavedDocIEN) then DeleteDocument(DeleteSts, SavedDocIEN, ReasonForDelete); if not Changes.Exist(CH_SUM, SavedDocID) then UnlockDocument(SavedDocIEN); Changes.Remove(CH_SUM, SavedDocID); // this will unlock the document if in Changes // reset the display now that the note is gone if DeleteSts.Success then begin DeletePCE(AVisitStr); // removes PCE data if this was the only note pointing to it ClearEditControls; //ClearPtData; WRONG - fixed in v15.10 - RV LoadSumms; (* with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); if tvSumms.Selected <> nil then tvSummsChange(Self, tvSumms.Selected) else begin*) pnlWrite.Visible := False; pnlRead.Visible := True; UpdateReminderFinish; ShowPCEControls(False); frmDrawers.DisplayDrawers(FALSE); cmdNewSumm.Visible := TRUE; cmdPCE.Visible := FALSE; popSummMemoEncounter.Visible := cmdPCE.Visible; lblSpace1.Top := cmdNewSumm.Top - lblSpace1.Height; // end; {if ItemIndex} end {if DeleteSts} else InfoBox(DeleteSts.Reason, TX_DEL_ERR, MB_OK or MB_ICONWARNING); end; procedure TfrmDCSumm.mnuActEditClick(Sender: TObject); { load the selected Discharge Summary for editing } var ActionSts: TActionRec; ASummID: string; begin inherited; if NoSummSelected() then Exit; if lstSumms.ItemIndex = EditingIndex then Exit; ASummID := lstSumms.ItemID; if not StartNewEdit(DC_ACT_EDIT_SUMM) then Exit; //LoadSumms; with tvSumms do Selected := FindPieceNode(ASummID, 1, U, Items.GetFirstNode); ActOnDCDocument(ActionSts, lstSumms.ItemIEN, 'EDIT RECORD'); if not ActionSts.Success then begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); Exit; end; LoadForEdit(False); end; procedure TfrmDCSumm.mnuActSaveClick(Sender: TObject); { saves the Summ that is currently being edited } var Saved: Boolean; SavedDocID: string; begin inherited; if EditingIndex > -1 then begin SavedDocID := Piece(lstSumms.Items[EditingIndex], U, 1); FLastSummID := SavedDocID; SaveCurrentSumm(Saved); if Saved and (EditingIndex < 0) and (not FDeleted) then //if Saved then begin LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end; end else InfoBox(TX_NO_NOTE, TX_SAVE_NOTE, MB_OK or MB_ICONWARNING); end; procedure TfrmDCSumm.mnuActSignClick(Sender: TObject); { sign the currently selected Summ, save first if necessary } const SIG_COSIGN = 'COSIGNATURE'; SIG_SIGN = 'SIGNATURE'; var Saved, SummUnlocked: Boolean; ActionType, ESCode, SignTitle: string; ActionSts, SignSts: TActionRec; OK: boolean; SavedDocID, tmpItem: string; EditingID: string; //v22.12 - RV tmpNode: TTreeNode; begin inherited; if NoSummSelected() then Exit; (* if lstSumms.ItemIndex = EditingIndex then //v22.12 - RV begin //v22.12 - RV SaveCurrentSumm(Saved); //v22.12 - RV if (not Saved) or FDeleted then Exit; //v22.12 - RV end //v22.12 - RV else if EditingIndex > -1 then //v22.12 - RV tmpItem := lstSumms.Items[EditingIndex]; //v22.12 - RV SavedDocID := lstSumms.ItemID;*) //v22.12 - RV SavedDocID := lstSumms.ItemID; //v22.12 - RV FLastSummID := SavedDocID; //v22.12 - RV if lstSumms.ItemIndex = EditingIndex then //v22.12 - RV begin //v22.12 - RV SaveCurrentSumm(Saved); //v22.12 - RV if (not Saved) or FDeleted then Exit; //v22.12 - RV end //v22.12 - RV else if EditingIndex > -1 then //v22.12 - RV begin //v22.12 - RV tmpItem := lstSumms.Items[EditingIndex]; //v22.12 - RV EditingID := Piece(tmpItem, U, 1); //v22.12 - RV end; //v22.12 - RV if not NoteHasText(lstSumms.ItemIEN) then begin InfoBox(TX_EMPTY_SUMM1, TC_EMPTY_SUMM, MB_OK or MB_ICONERROR); Exit; end; if not LastSaveClean(lstSumms.ItemIEN) and (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit; if CosignDocument(lstSumms.ItemIEN) then begin SignTitle := TX_COSIGN; ActionType := SIG_COSIGN; end else begin SignTitle := TX_SIGN; ActionType := SIG_SIGN; end; if not LockSumm(lstSumms.ItemIEN) then Exit; // no exits after things are locked SummUnlocked := False; ActOnDCDocument(ActionSts, lstSumms.ItemIEN, ActionType); if ActionSts.Success then begin OK := IsOK2Sign(uPCEShow, lstSumms.ItemIEN); if frmFrame.Closing then exit; if(uPCEShow.Updated) then begin uPCEShow.CopyPCEData(uPCEEdit); uPCEShow.Updated := FALSE; lstSummsClick(Self); end; if not AuthorSignedDocument(lstSumms.ItemIEN) then begin if (InfoBox(TX_AUTH_SIGNED + GetTitleText(lstSumms.ItemIndex),TX_SIGN ,MB_YESNO)= ID_NO) then exit; end; if(OK) then begin with lstSumms do SignatureForItem(Font.Size, MakeDCSummDisplayText(Items[ItemIndex]), SignTitle, ESCode); if Length(ESCode) > 0 then begin SignDCDocument(SignSts, lstSumms.ItemIEN, ESCode); RemovePCEFromChanges(lstSumms.ItemIEN); SummUnlocked := Changes.Exist(CH_SUM, lstSumms.ItemID); Changes.Remove(CH_SUM, lstSumms.ItemID); if SignSts.Success then lstSummsClick(Self) else InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK); end {if Length(ESCode)} else SummUnlocked := Changes.Exist(CH_SUM, lstSumms.ItemID); end; end else InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); if not SummUnlocked then UnlockDocument(lstSumms.ItemIEN); //SetViewContext(FCurrentContext); //v22.12 - RV LoadSumms; //v22.12 - RV //if EditingIndex > -1 then //v22.12 - RV if (EditingID <> '') then //v22.12 - RV begin lstSumms.Items.Insert(0, tmpItem); tmpNode := tvSumms.Items.AddObjectFirst(tvSumms.Items.GetFirstNode, 'Summary being edited', MakeDCSummTreeObject('EDIT^Summary being edited^^^^^^^^^^^%^0')); TORTreeNode(tmpNode).StringData := 'EDIT^Summary being edited^^^^^^^^^^^%^0'; tmpNode.ImageIndex := IMG_TOP_LEVEL; tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, MakeDCSummDisplayText(tmpItem), MakeDCSummTreeObject(tmpItem)); TORTreeNode(tmpNode).StringData := tmpItem; SetTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext, CT_DCSUMM); EditingIndex := lstSumms.SelectByID(EditingID); //v22.12 - RV end; //with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); //v22.12 - RV with tvSumms do //v22.12 - RV begin //v22.12 - RV Selected := FindPieceNode(FLastSummID, U, Items.GetFirstNode); //v22.12 - RV if Selected <> nil then tvSummsChange(Self, Selected); //v22.12 - RV end; //v22.12 - RV end; procedure TfrmDCSumm.SaveSignItem(const ItemID, ESCode: string); { saves and optionally signs a Discharge Summary or addendum } const SIG_COSIGN = 'COSIGNATURE'; SIG_SIGN = 'SIGNATURE'; var AnIndex, IEN, i: Integer; Saved, ContinueSign: Boolean; {*RAB* 8/26/99} ActionSts, SignSts: TActionRec; APCEObject: TPCEData; OK: boolean; ActionType, SignTitle: string; begin AnIndex := -1; IEN := StrToIntDef(ItemID, 0); if IEN = 0 then Exit; if frmFrame.TimedOut and (EditingIndex <> -1) then FSilent := True; with lstSumms do for i := 0 to Items.Count - 1 do if lstSumms.GetIEN(i) = IEN then begin AnIndex := i; break; end; if (AnIndex > -1) and (AnIndex = EditingIndex) then begin SaveCurrentSumm(Saved); if not Saved then Exit; if FDeleted then begin FDeleted := False; Exit; end; AnIndex := lstSumms.SelectByIEN(IEN); //IEN := lstNotes.GetIEN(AnIndex); // saving will change IEN end; if Length(ESCode) > 0 then begin if CosignDocument(IEN) then begin SignTitle := TX_COSIGN; ActionType := SIG_COSIGN; end else begin SignTitle := TX_SIGN; ActionType := SIG_SIGN; end; ActOnDocument(ActionSts, IEN, ActionType); if not ActionSts.Success then begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); ContinueSign := False; end else if not NoteHasText(IEN) then begin InfoBox(TX_EMPTY_SUMM1, TC_EMPTY_SUMM, MB_OK or MB_ICONERROR); ContinueSign := False; end else if not LastSaveClean(IEN) and (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then ContinueSign := False else ContinueSign := True; if ContinueSign then begin if (AnIndex >= 0) and (AnIndex = lstSumms.ItemIndex) then APCEObject := uPCEShow else APCEObject := nil; OK := IsOK2Sign(APCEObject, IEN); if frmFrame.Closing then exit; if(assigned(APCEObject)) and (uPCEShow.Updated) then begin uPCEShow.CopyPCEData(uPCEEdit); uPCEShow.Updated := FALSE; lstSummsClick(Self); end else uPCEEdit.Clear; if(OK) then begin SignDocument(SignSts, IEN, ESCode); if not SignSts.Success then InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK); end; {if OK} end; {if ContinueSign} end; {if Length(ESCode)} if (AnIndex = lstSumms.ItemIndex) and (not frmFrame.ContextChanging) then begin LoadSumms; with tvSumms do Selected := FindPieceNode(IntToStr(IEN), U, Items.GetFirstNode); end; end; procedure TfrmDCSumm.popSummMemoPopup(Sender: TObject); begin inherited; if PopupComponent(Sender, popSummMemo) is TCustomEdit then FEditCtrl := TCustomEdit(PopupComponent(Sender, popSummMemo)) else FEditCtrl := nil; if FEditCtrl <> nil then begin popSummMemoCut.Enabled := FEditCtrl.SelLength > 0; popSummMemoCopy.Enabled := popSummMemoCut.Enabled; popSummMemoPaste.Enabled := (not TORExposedCustomEdit(FEditCtrl).ReadOnly) and Clipboard.HasFormat(CF_TEXT); popSummMemoTemplate.Enabled := frmDrawers.CanEditTemplates and popSummMemoCut.Enabled; popSummMemoFind.Enabled := FEditCtrl.GetTextLen > 0; end else begin popSummMemoCut.Enabled := False; popSummMemoCopy.Enabled := False; popSummMemoPaste.Enabled := False; popSummMemoTemplate.Enabled := False; end; if pnlWrite.Visible then begin popSummMemoSpell.Enabled := True; popSummMemoGrammar.Enabled := True; popSummMemoReformat.Enabled := True; popSummMemoReplace.Enabled := (FEditCtrl.GetTextLen > 0); popSummMemoPreview.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected); popSummMemoInsTemplate.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected); end else begin popSummMemoSpell.Enabled := False; popSummMemoGrammar.Enabled := False; popSummMemoReformat.Enabled := False; popSummMemoReplace.Enabled := False; popSummMemoPreview.Enabled := False; popSummMemoInsTemplate.Enabled := False; end; end; procedure TfrmDCSumm.popSummMemoCutClick(Sender: TObject); begin inherited; FEditCtrl.CutToClipboard; end; procedure TfrmDCSumm.popSummMemoCopyClick(Sender: TObject); begin inherited; FEditCtrl.CopyToClipboard; end; procedure TfrmDCSumm.popSummMemoPasteClick(Sender: TObject); begin inherited; FEditCtrl.SelText := Clipboard.AsText; {*KCM*} //FEditCtrl.PasteFromClipboard; // use AsText to prevent formatting end; procedure TfrmDCSumm.popSummMemoReformatClick(Sender: TObject); begin inherited; if Screen.ActiveControl <> memNewSumm then Exit; ReformatMemoParagraph(memNewSumm); end; procedure TfrmDCSumm.popSummMemoFindClick(Sender: TObject); begin inherited; SendMessage(TRichEdit(popSummMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0); with dlgFindText do begin Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top); FindText := ''; Options := [frDown, frHideUpDown]; Execute; end; end; procedure TfrmDCSumm.dlgFindTextFind(Sender: TObject); begin dmodShared.FindRichEditText(dlgFindText, TRichEdit(popSummMemo.PopupComponent)); end; procedure TfrmDCSumm.popSummMemoReplaceClick(Sender: TObject); begin inherited; SendMessage(TRichEdit(popSummMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0); with dlgReplaceText do begin Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top); FindText := ''; ReplaceText := ''; Options := [frDown, frHideUpDown]; Execute; end; end; procedure TfrmDCSumm.dlgReplaceTextReplace(Sender: TObject); begin inherited; dmodShared.ReplaceRichEditText(dlgReplaceText, TRichEdit(popSummMemo.PopupComponent)); end; procedure TfrmDCSumm.dlgReplaceTextFind(Sender: TObject); begin inherited; dmodShared.FindRichEditText(dlgFindText, TRichEdit(popSummMemo.PopupComponent)); end; procedure TfrmDCSumm.popSummMemoSpellClick(Sender: TObject); begin inherited; DoAutoSave(0); timAutoSave.Enabled := False; try SpellCheckForControl(memNewSumm); finally FChanged := True; DoAutoSave(0); timAutoSave.Enabled := True; end; end; procedure TfrmDCSumm.popSummMemoGrammarClick(Sender: TObject); begin inherited; DoAutoSave(0); timAutoSave.Enabled := False; try GrammarCheckForControl(memNewSumm); finally FChanged := True; DoAutoSave(0); timAutoSave.Enabled := True; end; end; procedure TfrmDCSumm.FormCreate(Sender: TObject); begin inherited; PageID := CT_DCSUMM; FDischargeDate := FMNow; EditingIndex := -1; FEditDCSumm.LastCosigner := 0; FEditDCSumm.LastCosignerName := ''; FLastSummID := ''; frmDrawers := TfrmDrawers.CreateDrawers(Self, pnlDrawers, [],[]); frmDrawers.Align := alBottom; frmDrawers.RichEditControl := memNewSumm; frmDrawers.Splitter := splDrawers; frmDrawers.DefTempPiece := 3; FImageFlag := TBitmap.Create; FDocList := TStringList.Create; end; procedure TfrmDCSumm.mnuViewDetailClick(Sender: TObject); begin inherited; if lstSumms.ItemIEN <= 0 then Exit; mnuViewDetail.Checked := not mnuViewDetail.Checked; if mnuViewDetail.Checked then begin StatusText('Retrieving discharge summary details...'); Screen.Cursor := crHourGlass; LoadDetailText(memSumm.Lines, lstSumms.ItemIEN); Screen.Cursor := crDefault; StatusText(''); memSumm.SelStart := 0; memSumm.Repaint; end else lstSummsClick(Self); SendMessage(memSumm.Handle, WM_VSCROLL, SB_TOP, 0); end; procedure TfrmDCSumm.FormClose(Sender: TObject; var Action: TCloseAction); var Saved: Boolean; IEN: Int64; ErrMsg: string; DeleteSts: TActionRec; begin inherited; if frmFrame.TimedOut and (EditingIndex <> -1) then begin FSilent := True; if memNewSumm.GetTextLen > 0 then SaveCurrentSumm(Saved) else begin IEN := lstSumms.GetIEN(EditingIndex); if not LastSaveClean(IEN) then // means note hasn't been committed yet begin LockDocument(IEN, ErrMsg); if ErrMsg = '' then begin DeleteDocument(DeleteSts, IEN, ''); UnlockDocument(IEN); end; {if ErrMsg} end; {if not LastSaveClean} end; {else} end; {if frmFrame} end; procedure TfrmDCSumm.mnuActIdentifyAddlSignersClick(Sender: TObject); var Exclusions: TStrings; Saved, x, y: boolean; SignerList: TSignerList; ActionSts: TActionRec; SigAction: integer; SavedDocID: string; ARefDate: TFMDateTime; begin inherited; if NoSummSelected() then Exit; if lstSumms.ItemIndex = EditingIndex then begin SaveCurrentSumm(Saved); if not Saved then Exit; LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end; x := CanChangeCosigner(lstSumms.ItemIEN); ActOnDocument(ActionSts, lstSumms.ItemIEN, 'IDENTIFY SIGNERS'); y := ActionSts.Success; if x and not y then begin if InfoBox(ActionSts.Reason + CRLF + CRLF + 'Would you like to change the cosigner?', TX_IN_AUTH, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) = ID_YES then SigAction := SG_COSIGNER else Exit; end else if y and not x then SigAction := SG_ADDITIONAL else if x and y then SigAction := SG_BOTH else begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); Exit; end; // NEED TO PREVENT CHANGE OF COSIGNER ON DC SUMMARIES? { if y then SigAction := SG_ADDITIONAL else begin InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK); Exit; end; } Exclusions := GetCurrentSigners(lstSumms.ItemIEN); ARefDate := ExtractFloat(Piece(Piece(lstSumms.Items[lstSumms.ItemIndex], U, 9), ';', 2)); if ARefDate = 0 then //no discharge date, so use note date ARefDate := StrToFloat(Piece(lstSumms.Items[lstSumms.ItemIndex], U, 3)); SelectAdditionalSigners(Font.Size, lstSumms.ItemIEN, SigAction, Exclusions, SignerList, CT_DCSUMM, ARefDate); with SignerList do begin case SigAction of SG_ADDITIONAL: if Changed and (Signers <> nil) and (Signers.Count > 0) then UpdateAdditionalSigners(lstSumms.ItemIEN, Signers); SG_COSIGNER: if Changed then ChangeAttending(lstSumms.ItemIEN, Cosigner); SG_BOTH: if Changed then begin if (Signers <> nil) and (Signers.Count > 0) then UpdateAdditionalSigners(lstSumms.ItemIEN, Signers); ChangeAttending(lstSumms.ItemIEN, Cosigner); end; end; lstSummsClick(Self); end; end; procedure TfrmDCSumm.popSummMemoAddlSignClick(Sender: TObject); begin inherited; mnuActIdentifyAddlSignersClick(Self); end; procedure TfrmDCSumm.ProcessNotifications; var x: string; Saved: boolean; tmpNode: TTreeNode; AnObject: PDocTreeObject; begin if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; lblSumms.Caption := Notifications.Text; tvSumms.Caption := Notifications.Text; EditingIndex := -1; lstSumms.Enabled := True ; pnlRead.BringToFront ; x := Notifications.AlertData; //x := MakeDCSummListItem(Notifications.AlertData); if StrToIntDef(Piece(x, U, 1), 0) = 0 then begin InfoBox(TX_NO_ALERT, TX_CAP_NO_ALERT, MB_OK); Exit; end; uChanging := True; tvSumms.Items.BeginUpdate; lstSumms.Clear; KillDocTreeObjects(tvSumms); tvSumms.Items.Clear; lstSumms.Items.Add(x); AnObject := MakeDCSummTreeObject('ALERT^Alerted Note^^^^^^^^^^^%^0'); tmpNode := tvSumms.Items.AddObjectFirst(tvSumms.Items.GetFirstNode, AnObject.NodeText, AnObject); TORTreeNode(tmpNode).StringData := 'ALERT^Alerted Note^^^^^^^^^^^%^0'; tmpNode.ImageIndex := IMG_TOP_LEVEL; AnObject := MakeDCSummTreeObject(x); tmpNode := tvSumms.Items.AddChildObjectFirst(tmpNode, AnObject.NodeText, AnObject); TORTreeNode(tmpNode).StringData := x; SetTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext, CT_DCSUMM); tvSumms.Selected := tmpNode; tvSumms.Items.EndUpdate; uChanging := False; tvSummsChange(Self, tvSumms.Selected); case Notifications.Followup of NF_DCSUMM_UNSIGNED_NOTE: ; //Automatically deleted by sig action!!! end; if Copy(Piece(Notifications.RecordID, U, 2), 1, 6) = 'TIUADD' then Notifications.Delete; if Copy(Piece(Notifications.RecordID, U, 2), 1, 5) = 'TIUID' then Notifications.Delete; end; procedure TfrmDCSumm.SetViewContext(AContext: TTIUContext); var Saved: boolean; begin if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; EditingIndex := -1; tvSumms.Enabled := True ; pnlRead.BringToFront ; if AContext.Status <> '' then with uDCSummContext do begin BeginDate := AContext.BeginDate; EndDate := AContext.EndDate; FMBeginDate := AContext.FMBeginDate; FMEndDate := AContext.FMEndDate; Status := AContext.Status; Author := AContext.Author; MaxDocs := AContext.MaxDocs; ShowSubject := AContext.ShowSubject; GroupBy := AContext.GroupBy; SortBy := AContext.SortBy; ListAscending := AContext.ListAscending; TreeAscending := AContext.TreeAscending; Keyword := AContext.Keyword; SearchField := AContext.SearchField; Filtered := AContext.Filtered; Changed := True; mnuViewClick(Self); end else begin ViewContext := NC_RECENT ; mnuViewClick(Self); end; end; procedure TfrmDCSumm.mnuViewSaveAsDefaultClick(Sender: TObject); const TX_NO_MAX = 'You have not specified a maximum number of summaries to be returned.' + CRLF + 'If you save this preference, the result will be that ALL summaries for every' + CRLF + 'patient will be saved as your default view.' + CRLF + CRLF + 'For patients with large numbers of summaries, this could result in some lengthy' + CRLF + 'delays in loading the list of summaries.' + CRLF + CRLF + 'Are you sure you mean to do this?'; TX_REPLACE = 'Replace current defaults?'; begin inherited; if FCurrentContext.MaxDocs = 0 then if InfoBox(TX_NO_MAX,'Warning', MB_YESNO or MB_ICONWARNING) = IDNO then begin mnuViewClick(mnuViewCustom); Exit; end; if InfoBox(TX_REPLACE,'Confirmation', MB_YESNO or MB_ICONQUESTION) = IDYES then begin SaveCurrentDCSummContext(FCurrentContext); FDefaultContext := FCurrentContext; //lblSumms.Caption := 'Default List'; end; end; procedure TfrmDCSumm.mnuViewReturntoDefaultClick(Sender: TObject); begin inherited; SetViewContext(FDefaultContext); end; procedure TfrmDCSumm.popSummMemoTemplateClick(Sender: TObject); begin inherited; EditTemplates(Self, True, FEditCtrl.SelText); end; procedure TfrmDCSumm.popSummListPopup(Sender: TObject); begin inherited; N5.Visible := (popSummList.PopupComponent is TORTreeView); popSummListExpandAll.Visible := N5.Visible; popSummListExpandSelected.Visible := N5.Visible; popSummListCollapseAll.Visible := N5.Visible; popSummListCollapseSelected.Visible := N5.Visible; end; procedure TfrmDCSumm.popSummListExpandAllClick(Sender: TObject); begin inherited; tvSumms.FullExpand; end; procedure TfrmDCSumm.popSummListCollapseAllClick(Sender: TObject); begin inherited; tvSumms.Selected := nil; lvSumms.Items.Clear; memSumm.Clear; tvSumms.FullCollapse; tvSumms.Selected := tvSumms.TopItem; end; procedure TfrmDCSumm.popSummListExpandSelectedClick(Sender: TObject); begin inherited; if tvSumms.Selected = nil then exit; with tvSumms.Selected do if HasChildren then Expand(True); end; procedure TfrmDCSumm.popSummListCollapseSelectedClick(Sender: TObject); begin inherited; if tvSumms.Selected = nil then exit; with tvSumms.Selected do if HasChildren then Collapse(True); end; procedure TfrmDCSumm.mnuNewTemplateClick(Sender: TObject); begin inherited; EditTemplates(Self, True); end; procedure TfrmDCSumm.mnuEditTemplatesClick(Sender: TObject); begin inherited; EditTemplates(Self); end; procedure TfrmDCSumm.mnuOptionsClick(Sender: TObject); begin inherited; mnuEditTemplates.Enabled := frmDrawers.CanEditTemplates; mnuNewTemplate.Enabled := frmDrawers.CanEditTemplates; mnuEditSharedTemplates.Enabled := frmDrawers.CanEditShared; mnuNewSharedTemplate.Enabled := frmDrawers.CanEditShared; mnuEditDialgFields.Enabled := CanEditTemplateFields; end; procedure TfrmDCSumm.mnuEditSharedTemplatesClick(Sender: TObject); begin inherited; EditTemplates(Self, FALSE, '', TRUE); end; procedure TfrmDCSumm.mnuNewSharedTemplateClick(Sender: TObject); begin inherited; EditTemplates(Self, TRUE, '', TRUE); end; procedure TfrmDCSumm.FormDestroy(Sender: TObject); begin FImageFlag.Free; FDocList.Free; KillDocTreeObjects(tvSumms); inherited; end; function TfrmDCSumm.GetDrawers: TFrmDrawers; begin Result := frmDrawers; end; procedure TfrmDCSumm.SetEditingIndex(const Value: Integer); begin FEditingIndex := Value; end; (*function TfrmDCSumm.MakeTitleText(IsAddendum: Boolean = False): string; { returns display text for list box based on FEditNote } begin Result := FormatFMDateTime('mmm dd,yy', FEditDCSumm.DischargeDateTime) + U; if IsAddendum and (CompareText(Copy(FEditDCSumm.TitleName, 1, 8), 'Addendum') <> 0) then Result := Result + 'Addendum to '; Result := Result + FEditDCSumm.TitleName + ', ' + FEditDCSumm.LocationName + ', ' + FEditDCSumm.DictatorName; end;*) function TfrmDCSumm.LacksRequiredForCreate: Boolean; { determines if the fields required to create the note are present } var CurTitle: Integer; ADateTime: TFMDateTime; begin Result := False; with FEditDCSumm do begin if Title <= 0 then Result := True; if Dictator <= 0 then Result := True; if AdmitDateTime <= 0 then Result := True; if DischargeDateTime > 0 then ADateTime := DischargeDateTime else ADateTime := DictDateTime; if (DocType = TYP_ADDENDUM) then begin if AskCosignerForDocument(Addend, Dictator, ADateTime) and (Cosigner <= 0) then Result := True; end else begin if Title > 0 then CurTitle := Title else CurTitle := DocType; if AskCosignerForTitle(CurTitle, Dictator, ADateTime) and (Cosigner <= 0) then Result := True; end; end; end; function TfrmDCSumm.VerifySummTitle: Boolean; const VNT_UNKNOWN = 0; VNT_NO = 1; VNT_YES = 2; var AParam: string; begin if FVerifySummTitle = VNT_UNKNOWN then begin AParam := GetUserParam('ORWOR VERIFY NOTE TITLE'); if AParam = '1' then FVerifySummTitle := VNT_YES else FVerifySummTitle := VNT_NO; end; Result := FVerifySummTitle = VNT_YES; end; function TfrmDCSumm.LockSumm(AnIEN: Int64): Boolean; { returns true if summ successfully locked } var LockMsg: string; begin Result := True; if Changes.Exist(CH_SUM, IntToStr(AnIEN)) then Exit; // already locked LockDocument(AnIEN, LockMsg); if LockMsg <> '' then begin Result := False; InfoBox(LockMsg, TC_NO_LOCK, MB_OK); end; end; procedure TfrmDCSumm.DoAutoSave(Suppress: integer = 1); var ErrMsg: string; begin if fFrame.frmFrame.DLLActive = True then Exit; if (EditingIndex > -1) and FChanged then begin StatusText('Autosaving note...'); //PutTextOnly(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex)); timAutoSave.Enabled := False; try SetText(ErrMsg, memNewSumm.Lines, lstSumms.GetIEN(EditingIndex), Suppress); finally timAutoSave.Enabled := True; end; FChanged := False; StatusText(''); end; if ErrMsg <> '' then InfoBox(TX_SAVE_ERROR1 + ErrMsg + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING); //Assert(ErrMsg = '', 'AutoSave: ' + ErrMsg); end; procedure TfrmDCSumm.timAutoSaveTimer(Sender: TObject); begin inherited; DoAutoSave; end; function TfrmDCSumm.GetTitleText(AnIndex: Integer): string; { returns non-tabbed text for the title of a note given the ItemIndex in lstSumms } begin with lstSumms do Result := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(Piece(Items[AnIndex], U, 3))) + ' ' + Piece(Items[AnIndex], U, 2) + ', ' + Piece(Items[AnIndex], U, 6) + ', ' + Piece(Piece(Items[AnIndex], U, 5), ';', 2) end; procedure TfrmDCSumm.cmdChangeClick(Sender: TObject); var LastTitle: Integer; OKPressed, IsIDChild: Boolean; x: string; ListItemForEdit: string; begin inherited; IsIDChild := uIDNotesActive and (FEditDCSumm.IDParent > 0); LastTitle := FEditDCSumm.Title; if Sender <> Self then begin FShowAdmissions := False; OKPressed := ExecuteDCSummProperties(FEditDCSumm, ListItemForEdit, FShowAdmissions, IsIDChild); end else OKPressed := True; if not OKPressed then Exit; // update display fields & uPCEEdit lblNewTitle.Caption := ' ' + FEditDCSumm.TitleName + ' '; if (FEditDCSumm.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), 'Addendum') <> 0) then lblNewTitle.Caption := 'Addendum to: ' + lblNewTitle.Caption; with lblNewTitle do bvlNewTitle.SetBounds(Left - 1, Top - 1, Width + 2, Height + 2); lblRefDate.Caption := FormatFMDateTime('mmm dd,yyyy@hh:nn', FEditDCSumm.DischargeDateTime); lblDictator.Caption := FEditDCSumm.DictatorName; x := 'Adm: ' + FormatFMDateTime('mm/dd/yy', FEditDCSumm.AdmitDateTime) + ' ' + FEditDCSumm.LocationName; lblVisit.Caption := x; x := ' Dis: ' + FormatFMDateTime('mm/dd/yy', FEditDCSumm.DischargeDateTime); lblDischarge.Caption := x; if Length(FEditDCSumm.AttendingName) > 0 then lblCosigner.Caption := 'Attending: ' + FEditDCSumm.AttendingName else lblCosigner.Caption := ''; uPCEEdit.NoteTitle := FEditDCSumm.Title; // modify signature requirements if author or cosigner changed if (User.DUZ <> FEditDCSumm.Dictator) and (User.DUZ <> FEditDCSumm.Attending) then Changes.ReplaceSignState(CH_SUM, lstSumms.ItemID, CH_SIGN_NA) else Changes.ReplaceSignState(CH_SUM, lstSumms.ItemID, CH_SIGN_YES); x := lstSumms.Items[EditingIndex]; SetPiece(x, U, 2, lblNewTitle.Caption); SetPiece(x, U, 3, FloatToStr(FEditDCSumm.DischargeDateTime)); tvSumms.Selected.Text := MakeDCSummDisplayText(x); TORTreeNode(tvSumms.Selected).StringData := x; lstSumms.Items[EditingIndex] := x; Changes.ReplaceText(CH_SUM, lstSumms.ItemID, GetTitleText(EditingIndex)); if LastTitle <> FEditDCSumm.Title then mnuActLoadBoilerClick(Self); end; procedure TfrmDCSumm.mnuActChangeClick(Sender: TObject); begin inherited; if NoSummSelected() then Exit; if (FEditingIndex < 0) or (lstSumms.ItemIndex <> FEditingIndex) then Exit; cmdChangeClick(Sender); end; procedure TfrmDCSumm.mnuActLoadBoilerClick(Sender: TObject); var NoteEmpty: Boolean; BoilerText: TStringList; DocInfo: string; procedure AssignBoilerText; begin ExecuteTemplateOrBoilerPlate(BoilerText, FEditDCSumm.Title, ltTitle, Self, 'Title: ' + FEditDCSumm.TitleName, DocInfo); QuickCopyWith508Msg(BoilerText, memNewSumm); FChanged := False; end; begin inherited; if NoSummSelected() then Exit; if (FEditingIndex < 0) or (lstSumms.ItemIndex <> FEditingIndex) then Exit; BoilerText := TStringList.Create; try NoteEmpty := memNewSumm.Text = ''; LoadBoilerPlate(BoilerText, FEditDCSumm.Title); if (BoilerText.Text <> '') or assigned(GetLinkedTemplate(IntToStr(FEditDCSumm.Title), ltTitle)) then begin DocInfo := MakeXMLParamTIU(IntToStr(lstSumms.ItemIEN), FEditDCSumm); if NoteEmpty then AssignBoilerText else begin case QueryBoilerPlate(BoilerText) of 0: { do nothing } ; // ignore 1: begin ExecuteTemplateOrBoilerPlate(BoilerText, FEditDCSumm.Title, ltTitle, Self, 'Title: ' + FEditDCSumm.TitleName, DocInfo); QuickAddWith508Msg(BoilerText, memNewSumm); // append end; 2: AssignBoilerText // replace end; end; end else begin if Sender = mnuActLoadBoiler then InfoBox(TX_NO_BOIL, TC_NO_BOIL, MB_OK) else begin if not NoteEmpty then if not FChanged and (InfoBox(TX_BLR_CLEAR, TC_BLR_CLEAR, MB_YESNO) = ID_YES) then memNewSumm.Lines.Clear; end; end; {if BoilerText.Text <> ''} finally BoilerText.Free; end; end; procedure TfrmDCSumm.popSummMemoSaveContinueClick(Sender: TObject); begin inherited; FChanged := True; DoAutoSave; end; procedure TfrmDCSumm.mnuEditDialgFieldsClick(Sender: TObject); begin inherited; EditDialogFields; end; //=================== Added for sort/search enhancements ====================== procedure TfrmDCSumm.LoadSumms; var tmpList: TStringList; ANode: TORTreeNode; begin tmpList := TStringList.Create; try FDocList.Clear; uChanging := True; RedrawSuspend(memSumm.Handle); RedrawSuspend(lvSumms.Handle); tvSumms.Items.BeginUpdate; lstSumms.Items.Clear; KillDocTreeObjects(tvSumms); tvSumms.Items.Clear; tvSumms.Items.EndUpdate; lvSumms.Items.Clear; memSumm.Clear; memSumm.Invalidate; lblTitle.Caption := ''; lvSumms.Caption := lblTitle.Caption; lblTitle.Hint := lblTitle.Caption; with FCurrentContext do begin if Status <> IntToStr(NC_UNSIGNED) then begin ListSummsForTree(tmpList, NC_UNSIGNED, 0, 0, 0, 0, TreeAscending); if tmpList.Count > 0 then begin CreateListItemsForDocumentTree(FDocList, tmpList, NC_UNSIGNED, GroupBy, TreeAscending, CT_DCSUMM); UpdateTreeView(FDocList, tvSumms); end; tmpList.Clear; FDocList.Clear; end; if Status <> IntToStr(NC_UNCOSIGNED) then begin ListSummsForTree(tmpList, NC_UNCOSIGNED, 0, 0, 0, 0, TreeAscending); if tmpList.Count > 0 then begin CreateListItemsForDocumentTree(FDocList, tmpList, NC_UNCOSIGNED, GroupBy, TreeAscending, CT_DCSUMM); UpdateTreeView(FDocList, tvSumms); end; tmpList.Clear; FDocList.Clear; end; ListSummsForTree(tmpList, StrToIntDef(Status, 0), FMBeginDate, FMEndDate, Author, MaxDocs, TreeAscending); CreateListItemsForDocumentTree(FDocList, tmpList, StrToIntDef(Status, 0), GroupBy, TreeAscending, CT_DCSUMM); UpdateTreeView(FDocList, tvSumms); end; with tvSumms do begin uChanging := True; tvSumms.Items.BeginUpdate; RemoveParentsWithNoChildren(tvSumms, FCurrentContext); // moved TO here in v15.9 (RV) if FLastSummID <> '' then Selected := FindPieceNode(FLastSummID, 1, U, nil); if Selected = nil then begin if (FCurrentContext.GroupBy <> '') or (FCurrentContext.Filtered) then begin ANode := TORTreeNode(Items.GetFirstNode); while ANode <> nil do begin ANode.Expand(False); Selected := ANode; ANode := TORTreeNode(ANode.GetNextSibling); end; end else begin ANode := tvSumms.FindPieceNode(FCurrentContext.Status, 1, U, nil); if ANode <> nil then ANode.Expand(False); ANode := tvSumms.FindPieceNode(IntToStr(NC_UNSIGNED), 1, U, nil); if ANode = nil then ANode := tvSumms.FindPieceNode(IntToStr(NC_UNCOSIGNED), 1, U, nil); if ANode = nil then ANode := tvSumms.FindPieceNode(FCurrentContext.Status, 1, U, nil); if ANode <> nil then begin if ANode.getFirstChild <> nil then Selected := ANode.getFirstChild else Selected := ANode; end; end; end; memSumm.Clear; with lvSumms do begin Selected := nil; if FCurrentContext.SortBy <> '' then ColumnToSort := Pos(FCurrentContext.SortBy, 'RDSAL') - 1; if not FCurrentContext.ShowSubject then begin Columns[1].Width := 2 * (Width div 5); Columns[2].Width := 0; end else begin Columns[1].Width := Width div 5; Columns[2].Width := Columns[1].Width; end; end; //RemoveParentsWithNoChildren(tvSumms, FCurrentContext); //moved FROM here in v15.9 (RV) tvSumms.Items.EndUpdate; uChanging := False; SendMessage(tvSumms.Handle, WM_VSCROLL, SB_TOP, 0); if Selected <> nil then tvSummsChange(Self, Selected); end; finally RedrawActivate(memSumm.Handle); RedrawActivate(lvSumms.Handle); tmpList.Free; end; end; procedure TfrmDCSumm.UpdateTreeView(DocList: TStringList; Tree: TORTreeView); begin with Tree do begin uChanging := True; Items.BeginUpdate; FastAddStrings(DocList, lstSumms.Items); BuildDocumentTree(DocList, '0', Tree, nil, FCurrentContext, CT_DCSUMM); Items.EndUpdate; uChanging := False; end; end; procedure TfrmDCSumm.tvSummsChange(Sender: TObject; Node: TTreeNode); var x, MySearch, MyNodeID: string; i: integer; WhyNot: string; begin if uChanging then Exit; //This gives the change a chance to occur when keyboarding, so that WindowEyes //doesn't use the old value. Application.ProcessMessages; with tvSumms do begin memSumm.Clear; if Selected = nil then Exit; if uIDNotesActive then begin mnuActDetachFromIDParent.Enabled := (Selected.ImageIndex in [IMG_ID_CHILD, IMG_ID_CHILD_ADD]); popSummListDetachFromIDParent.Enabled := (Selected.ImageIndex in [IMG_ID_CHILD, IMG_ID_CHILD_ADD]); if (Selected.ImageIndex in [IMG_SINGLE, IMG_PARENT, IMG_ID_CHILD, IMG_ID_CHILD_ADD]) then mnuActAttachtoIDParent.Enabled := CanBeAttached(PDocTreeObject(Selected.Data)^.DocID, WhyNot) else mnuActAttachtoIDParent.Enabled := False; popSummListAttachtoIDParent.Enabled := mnuActAttachtoIDParent.Enabled; if (Selected.ImageIndex in [IMG_SINGLE, IMG_PARENT, IMG_IDNOTE_OPEN, IMG_IDNOTE_SHUT, IMG_IDPAR_ADDENDA_OPEN, IMG_IDPAR_ADDENDA_SHUT]) then mnuActAddIDEntry.Enabled := CanReceiveAttachment(PDocTreeObject(Selected.Data)^.DocID, WhyNot) else mnuActAddIDEntry.Enabled := False; popSummListAddIDEntry.Enabled := mnuActAddIDEntry.Enabled end; RedrawSuspend(lvSumms.Handle); RedrawSuspend(memSumm.Handle); popSummListExpandSelected.Enabled := Selected.HasChildren; popSummListCollapseSelected.Enabled := Selected.HasChildren; x := TORTreeNode(Selected).StringData; if (Selected.ImageIndex in [IMG_TOP_LEVEL, IMG_GROUP_OPEN, IMG_GROUP_SHUT]) then begin lvSumms.Visible := True; lvSumms.Items.Clear; lvSumms.Height := (2 * lvSumms.Parent.Height) div 5; with lblTitle do begin Caption := Trim(Selected.Text); if (FCurrentContext.SearchField <> '') and (FCurrentContext.Filtered) then begin case FCurrentContext.SearchField[1] of 'T': MySearch := 'TITLE'; 'S': MySearch := 'SUBJECT'; 'B': MySearch := 'TITLE or SUBJECT'; end; Caption := Caption + ' where ' + MySearch + ' contains "' + UpperCase(FCurrentContext.Keyword) + '"'; end; Hint := Caption; lvSumms.Caption := Caption; end; if Selected.ImageIndex = IMG_TOP_LEVEL then MyNodeID := Piece(TORTreeNode(Selected).StringData, U, 1) else if Selected.Parent.ImageIndex = IMG_TOP_LEVEL then MyNodeID := Piece(TORTreeNode(Selected.Parent).StringData, U, 1) else if Selected.Parent.Parent.ImageIndex = IMG_TOP_LEVEL then MyNodeID := Piece(TORTreeNode(Selected.Parent.Parent).StringData, U, 1); uChanging := True; TraverseTree(tvSumms, lvSumms, Selected.GetFirstChild, MyNodeID, FCurrentContext); with lvSumms do begin for i := 0 to Columns.Count - 1 do Columns[i].ImageIndex := IMG_NONE; ColumnSortForward := FCurrentContext.ListAscending; if ColumnToSort = 5 then ColumnToSort := 0; if ColumnSortForward then Columns[ColumnToSort].ImageIndex := IMG_ASCENDING else Columns[ColumnToSort].ImageIndex := IMG_DESCENDING; if ColumnToSort = 0 then ColumnToSort := 5; AlphaSort; Columns[5].Width := 0; Columns[6].Width := 0; end; uChanging := False; with lvSumms do if Items.Count > 0 then begin Selected := Items[0]; lvSummsSelectItem(Self, Selected, True); end else begin Selected := nil; lstSumms.ItemIndex := -1; memPCEShow.Clear; ShowPCEControls(False); end; pnlWrite.Visible := False; pnlRead.Visible := True; (* UpdateReminderFinish; ShowPCEControls(False); frmDrawers.DisplayDrawers(FALSE); cmdNewSumm.Visible := TRUE; cmdPCE.Visible := FALSE; lblSpace1.Top := cmdNewSumm.Top - lblSpace1.Height;*) //memSumm.Clear; end else if StrToIntDef(Piece(x, U, 1), 0) > 0 then begin memSumm.Clear; lvSumms.Visible := False; lstSumms.SelectByID(Piece(x, U, 1)); lstSummsClick(Self); SendMessage(memSumm.Handle, WM_VSCROLL, SB_TOP, 0); end; SendMessage(tvSumms.Handle, WM_HSCROLL, SB_THUMBTRACK, 0); RedrawActivate(lvSumms.Handle); RedrawActivate(memSumm.Handle); end; end; procedure TfrmDCSumm.tvSummsCollapsed(Sender: TObject; Node: TTreeNode); begin with Node do begin if (ImageIndex in [IMG_GROUP_OPEN, IMG_IDNOTE_OPEN, IMG_IDPAR_ADDENDA_OPEN]) then ImageIndex := ImageIndex - 1; if (SelectedIndex in [IMG_GROUP_OPEN, IMG_IDNOTE_OPEN, IMG_IDPAR_ADDENDA_OPEN]) then SelectedIndex := SelectedIndex - 1; end; end; procedure TfrmDCSumm.tvSummsExpanded(Sender: TObject; Node: TTreeNode); function SortByTitle(Node1, Node2: TTreeNode; Data: Longint): Integer; stdcall; begin { Within an ID parent node, sorts in ascending order by title BUT - addenda to parent document are always at the top of the sort, in date order} if (Copy(PDocTreeObject(Node1.Data)^.DocTitle, 1, 8) = 'Addendum') and (Copy(PDocTreeObject(Node2.Data)^.DocTitle, 1, 8) = 'Addendum') then begin Result := AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocFMDate), PChar(PDocTreeObject(Node2.Data)^.DocFMDate)); end else if Copy(PDocTreeObject(Node1.Data)^.DocTitle, 1, 8) = 'Addendum' then Result := -1 else if Copy(PDocTreeObject(Node2.Data)^.DocTitle, 1, 8) = 'Addendum' then Result := 1 else begin if Data = 0 then Result := AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocTitle), PChar(PDocTreeObject(Node2.Data)^.DocTitle)) else Result := -AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocTitle), PChar(PDocTreeObject(Node2.Data)^.DocTitle)); end end; function SortByDate(Node1, Node2: TTreeNode; Data: Longint): Integer; stdcall; begin { Within an ID parent node, sorts in ascending order by document date BUT - addenda to parent document are always at the top of the sort, in date order} if (Copy(PDocTreeObject(Node1.Data)^.DocTitle, 1, 8) = 'Addendum') and (Copy(PDocTreeObject(Node2.Data)^.DocTitle, 1, 8) = 'Addendum') then begin Result := AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocFMDate), PChar(PDocTreeObject(Node2.Data)^.DocFMDate)); end else if Copy(PDocTreeObject(Node1.Data)^.DocTitle, 1, 8) = 'Addendum' then Result := -1 else if Copy(PDocTreeObject(Node2.Data)^.DocTitle, 1, 8) = 'Addendum' then Result := 1 else begin if Data = 0 then Result := AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocFMDate), PChar(PDocTreeObject(Node2.Data)^.DocFMDate)) else Result := -AnsiStrIComp(PChar(PDocTreeObject(Node1.Data)^.DocFMDate), PChar(PDocTreeObject(Node2.Data)^.DocFMDate)); end; end; begin with Node do begin if Assigned(Data) then if (Pos('<', PDocTreeObject(Data)^.DocHasChildren) > 0) then begin if (PDocTreeObject(Node.Data)^.OrderByTitle) then CustomSort(@SortByTitle, 0) else CustomSort(@SortByDate, 0); end; if (ImageIndex in [IMG_GROUP_SHUT, IMG_IDNOTE_SHUT, IMG_IDPAR_ADDENDA_SHUT]) then ImageIndex := ImageIndex + 1; if (SelectedIndex in [IMG_GROUP_SHUT, IMG_IDNOTE_SHUT, IMG_IDPAR_ADDENDA_SHUT]) then SelectedIndex := SelectedIndex + 1; end; end; procedure TfrmDCSumm.tvSummsClick(Sender: TObject); begin (* if tvSumms.Selected = nil then exit; if (tvSumms.Selected.ImageIndex in [IMG_TOP_LEVEL, IMG_GROUP_OPEN, IMG_GROUP_SHUT]) then begin uChanging := True; lvSumms.Selected := nil; uChanging := False; memSumm.Clear; end;*) end; procedure TfrmDCSumm.tvSummsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var AnItem: TORTreeNode; begin Accept := False; if not uIDNotesActive then exit; AnItem := TORTreeNode(tvSumms.GetNodeAt(X, Y)); if (AnItem = nil) or (AnItem.ImageIndex in [IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) then Exit; with tvSumms.Selected do if (ImageIndex in [IMG_SINGLE, IMG_PARENT, IMG_ID_CHILD, IMG_ID_CHILD_ADD]) then Accept := (AnItem.ImageIndex in [IMG_SINGLE, IMG_PARENT, IMG_IDNOTE_OPEN, IMG_IDNOTE_SHUT, IMG_IDPAR_ADDENDA_OPEN, IMG_IDPAR_ADDENDA_SHUT]) else if (ImageIndex in [IMG_IDNOTE_OPEN, IMG_IDNOTE_SHUT, IMG_IDPAR_ADDENDA_OPEN, IMG_IDPAR_ADDENDA_SHUT]) then Accept := (AnItem.ImageIndex in [IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) else if (ImageIndex in [IMG_ADDENDUM, IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) then Accept := False; end; procedure TfrmDCSumm.tvSummsDragDrop(Sender, Source: TObject; X, Y: Integer); var HT: THitTests; Saved: boolean; ADestNode: TORTreeNode; begin if not uIDNotesActive then begin CancelDrag; exit; end; if tvSumms.Selected = nil then exit; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; HT := tvSumms.GetHitTestInfoAt(X, Y); ADestNode := TORTreeNode(tvSumms.GetNodeAt(X, Y)); DoAttachIDChild(TORTreeNode(tvSumms.Selected), ADestNode); end; procedure TfrmDCSumm.tvSummsStartDrag(Sender: TObject; var DragObject: TDragObject); const TX_CAP_NO_DRAG = 'Item cannot be moved'; var WhyNot: string; Saved: boolean; begin if (tvSumms.Selected.ImageIndex in [IMG_ADDENDUM, IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) or (not uIDNotesActive) or (lstSumms.ItemIEN = 0) then begin CancelDrag; Exit; end; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; end; if not CanBeAttached(PDocTreeObject(tvSumms.Selected.Data)^.DocID, WhyNot) then begin InfoBox(WhyNot, TX_CAP_NO_DRAG, MB_OK); CancelDrag; end; end; procedure TfrmDCSumm.lvSummsColumnClick(Sender: TObject; Column: TListColumn); var i, ClickedColumn: Integer; begin if Column.Index = 0 then ClickedColumn := 5 else ClickedColumn := Column.Index; if ClickedColumn = ColumnToSort then ColumnSortForward := not ColumnSortForward else ColumnSortForward := True; for i := 0 to lvSumms.Columns.Count - 1 do lvSumms.Columns[i].ImageIndex := IMG_NONE; if ColumnSortForward then lvSumms.Columns[Column.Index].ImageIndex := IMG_ASCENDING else lvSumms.Columns[Column.Index].ImageIndex := IMG_DESCENDING; ColumnToSort := ClickedColumn; case ColumnToSort of 5: FCurrentContext.SortBy := 'R'; 1: FCurrentContext.SortBy := 'D'; 2: FCurrentContext.SortBy := 'S'; 3: FCurrentContext.SortBy := 'A'; 4: FCurrentContext.SortBy := 'L'; else FCurrentContext.SortBy := 'R'; end; FCurrentContext.ListAscending := ColumnSortForward; (Sender as TCustomListView).AlphaSort; //with lvSumms do if Selected <> nil then Scroll(0, Selected.Top - TopItem.Top); end; procedure TfrmDCSumm.lvSummsCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var ix: Integer; begin if ColumnToSort = 0 then Compare := CompareText(Item1.Caption,Item2.Caption) else begin ix := ColumnToSort - 1; Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]); end; if not ColumnSortForward then Compare := -Compare; end; procedure TfrmDCSumm.lvSummsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin if uChanging or (not Selected) then Exit; with lvSumms do begin StatusText('Retrieving selected discharge summary...'); lstSumms.SelectByID(Item.SubItems[5]); lstSummsClick(Self); SendMessage(memSumm.Handle, WM_VSCROLL, SB_TOP, 0); end; end; procedure TfrmDCSumm.lvSummsResize(Sender: TObject); begin inherited; with lvSumms do begin if not FCurrentContext.ShowSubject then begin Columns[1].Width := 2 * (Width div 5); Columns[2].Width := 0; end else begin Columns[1].Width := Width div 5; Columns[2].Width := Columns[1].Width; end; end; end; procedure TfrmDCSumm.EnableDisableIDNotes; begin uIDNotesActive := False; // := IDNotesInstalled; Not yet on this tab mnuActDetachFromIDParent.Visible := uIDNotesActive; popSummListDetachFromIDParent.Visible := uIDNotesActive; mnuActAddIDEntry.Visible := uIDNotesActive; popSummListAddIDEntry.Visible := uIDNotesActive; mnuActAttachtoIDParent.Visible := uIDNotesActive; popSummListAttachtoIDParent.Visible := uIDNotesActive; if uIDNotesActive then tvSumms.DragMode := dmAutomatic else tvSumms.DragMode := dmManual; end; procedure TfrmDCSumm.mnuIconLegendClick(Sender: TObject); begin inherited; ShowIconLegend(ilNotes); end; procedure TfrmDCSumm.mnuActAttachtoIDParentClick(Sender: TObject); var AChildNode: TORTreeNode; AParentID: string; SavedDocID: string; Saved: boolean; begin inherited; if not uIDNotesActive then exit; if lstSumms.ItemIEN = 0 then exit; SavedDocID := lstSumms.ItemID; if EditingIndex <> -1 then begin SaveCurrentSumm(Saved); if not Saved then Exit; LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); end; if tvSumms.Selected = nil then exit; AChildNode := TORTreeNode(tvSumms.Selected); AParentID := SelectParentNodeFromList(tvSumms); if AParentID = '' then exit; with tvSumms do Selected := FindPieceNode(AParentID, 1, U, Items.GetFirstNode); DoAttachIDChild(AChildNode, TORTreeNode(tvSumms.Selected)); end; procedure TfrmDCSumm.DoAttachIDChild(AChild, AParent: TORTreeNode); const TX_ATTACH_CNF = 'Confirm Attachment'; TX_ATTACH_FAILURE = 'Attachment failed'; var ErrMsg, WhyNot: string; SavedDocID: string; begin if (AChild = nil) or (AParent = nil) then exit; ErrMsg := ''; if not CanBeAttached(PDocTreeObject(AChild.Data)^.DocID, WhyNot) then ErrMsg := ErrMsg + WhyNot + CRLF + CRLF; if not CanReceiveAttachment(PDocTreeObject(AParent.Data)^.DocID, WhyNot) then ErrMsg := ErrMsg + WhyNot; if ErrMsg <> '' then begin InfoBox(ErrMsg, TX_ATTACH_FAILURE, MB_OK); Exit; end else begin WhyNot := ''; if (InfoBox('ATTACH: ' + AChild.Text + CRLF + CRLF + ' TO: ' + AParent.Text + CRLF + CRLF + 'Are you sure?', TX_ATTACH_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit; SavedDocID := PDocTreeObject(AParent.Data)^.DocID; end; if AChild.ImageIndex in [IMG_ID_CHILD, IMG_ID_CHILD_ADD] then begin if DetachEntryFromParent(PDocTreeObject(AChild.Data)^.DocID, WhyNot) then begin if AttachEntryToParent(PDocTreeObject(AChild.Data)^.DocID, PDocTreeObject(AParent.Data)^.DocID, WhyNot) then begin LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); if tvSumms.Selected <> nil then tvSumms.Selected.Expand(False); end else InfoBox(WhyNot, TX_ATTACH_FAILURE, MB_OK); end else begin WhyNot := StringReplace(WhyNot, 'ATTACH', 'DETACH', [rfIgnoreCase]); WhyNot := StringReplace(WhyNot, 'to an ID', 'from an ID', [rfIgnoreCase]); InfoBox(WhyNot, TX_DETACH_FAILURE, MB_OK); Exit; end; end else begin if AttachEntryToParent(PDocTreeObject(AChild.Data)^.DocID, PDocTreeObject(AParent.Data)^.DocID, WhyNot) then begin LoadSumms; with tvSumms do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); if tvSumms.Selected <> nil then tvSumms.Selected.Expand(False); end else InfoBox(WhyNot, TX_ATTACH_FAILURE, MB_OK); end; end; function TfrmDCSumm.SetSummTreeLabel(AContext: TTIUContext): string; var x: string; function SetDateRangeText(AContext: TTIUContext): string; var x1: string; begin with AContext do if BeginDate <> '' then begin x1 := ' from ' + UpperCase(BeginDate); if EndDate <> '' then x1 := x1 + ' to ' + UpperCase(EndDate) else x1 := x1 + ' to TODAY'; end; Result := x1; end; begin with AContext do begin if MaxDocs > 0 then x := 'Last ' + IntToStr(MaxDocs) + ' ' else x := 'All '; case StrToIntDef(Status, 0) of NC_ALL : x := x + 'Signed Summaries'; NC_UNSIGNED : begin x := x + 'Unsigned Summaries for '; if Author > 0 then x := x + ExternalName(Author, 200) else x := x + User.Name; x := x + SetDateRangeText(AContext); end; NC_UNCOSIGNED : begin x := x + 'Uncosigned Summaries for '; if Author > 0 then x := x + ExternalName(Author, 200) else x := x + User.Name; x := x + SetDateRangeText(AContext); end; NC_BY_AUTHOR : x := x + 'Signed Summaries for ' + ExternalName(Author, 200) + SetDateRangeText(AContext); NC_BY_DATE : x := x + 'Signed Summaries ' + SetDateRangeText(AContext); else x := 'Custom List'; end; end; Result := x; end; procedure TfrmDCSumm.memNewSummKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; if (Key = VK_TAB) then begin if ssShift in Shift then begin FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control Key := 0; end else if ssCtrl in Shift then begin FindNextControl(Sender as TWinControl, True, True, False).SetFocus; //next control Key := 0; end; end; if (key = VK_ESCAPE) then begin FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control key := 0; end; end; procedure TfrmDCSumm.sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); begin inherited; if pnlWrite.Visible then if NewSize > frmDCSumm.ClientWidth - memNewSumm.Constraints.MinWidth - sptHorz.Width then NewSize := frmDCSumm.ClientWidth - memNewSumm.Constraints.MinWidth - sptHorz.Width; end; procedure TfrmDCSumm.popSummMemoPreviewClick(Sender: TObject); begin frmDrawers.mnuPreviewTemplateClick(Sender); end; procedure TfrmDCSumm.popSummMemoInsTemplateClick(Sender: TObject); begin frmDrawers.mnuInsertTemplateClick(Sender); end; {Returns True & Displays a Message if Currently No D/C Summary is Selected, Otherwise returns false and does not display a message.} function TfrmDCSumm.NoSummSelected: Boolean; begin if lstSumms.ItemIEN <= 0 then begin InfoBox(TX_NOSUMM,TX_NOSUMM_CAP,MB_OK or MB_ICONWARNING); Result := true; end else Result := false; end; procedure TfrmDCSumm.ViewInfo(Sender: TObject); begin inherited; frmFrame.ViewInfo(Sender); end; procedure TfrmDCSumm.mnuViewInformationClick(Sender: TObject); begin inherited; mnuViewDemo.Enabled := frmFrame.pnlPatient.Enabled; mnuViewVisits.Enabled := frmFrame.pnlVisit.Enabled; mnuViewPrimaryCare.Enabled := frmFrame.pnlPrimaryCare.Enabled; mnuViewMyHealtheVet.Enabled := not (Copy(frmFrame.laMHV.Hint, 1, 2) = 'No'); mnuInsurance.Enabled := not (Copy(frmFrame.laVAA2.Hint, 1, 2) = 'No'); mnuViewFlags.Enabled := frmFrame.lblFlag.Enabled; mnuViewRemoteData.Enabled := frmFrame.lblCirn.Enabled; mnuViewReminders.Enabled := frmFrame.pnlReminders.Enabled; mnuViewPostings.Enabled := frmFrame.pnlPostings.Enabled; end; initialization SpecifyFormIsNotADialog(TfrmDCSumm); uPCEEdit := TPCEData.Create; uPCEShow := TPCEData.Create; finalization uPCEEdit.Free; uPCEShow.Free; end.