//kt -- Modified with SourceScanner on 7/19/2007, also 8/09
unit fNotes;
{$O-}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
fHSplit, StdCtrls, ExtCtrls, Menus, ComCtrls, ORCtrls, ORFn, uConst, ORDtTm,
uPCE, ORClasses, fDrawers, ImgList, rTIU, uTIU, uDocTree, fRptBox, fPrintList,
MSHTML,TMGHTML2,ActiveX, //kt added this line 8/09 for HTML editing
fNoteST, ORNet, fNoteSTStop, OleCtrls, SHDocVw, DKLang, Buttons, ToolWin;
type
TEditModes = (emNone,emText,emHTML); //kt 8/09
TViewModes = (vmEdit,vmView,vmText,vmHTML); //kt 8/09
TViewModeSet = Set of TViewModes; //kt 8/09
const
vmHTML_MODE : array [false..true] of TViewModes = (vmText,vmHTML); //kt 8/09
emHTML_MODE : array [false..true] of TEditModes = (emText,emHTML); //kt 8/09
type
TfrmNotes = class(TfrmHSplit)
mnuNotes: TMainMenu;
mnuView: TMenuItem;
mnuViewChart: TMenuItem;
mnuChartReports: TMenuItem;
mnuChartLabs: TMenuItem;
mnuChartDCSumm: TMenuItem;
mnuChartCslts: TMenuItem;
mnuChartNotes: 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;
lblNotes: TOROffsetLabel;
pnlRead: TPanel;
lblTitle: TOROffsetLabel;
memNote: TRichEdit;
pnlWrite: TPanel;
memNewNote: TRichEdit;
WebBrowser1: TWebBrowser; //kt added (and WebBrowser1 object in form file)
Z3: TMenuItem;
mnuViewAll: TMenuItem;
mnuViewByAuthor: TMenuItem;
mnuViewByDate: TMenuItem;
mnuViewUncosigned: TMenuItem;
mnuViewUnsigned: TMenuItem;
mnuActSignList: TMenuItem;
cmdNewNote: TORAlignButton;
cmdPCE: TORAlignButton;
lblSpace1: TLabel;
popNoteMemo: TPopupMenu;
popNoteMemoCut: TMenuItem;
popNoteMemoCopy: TMenuItem;
popNoteMemoPaste: TMenuItem;
Z10: TMenuItem;
popNoteMemoSignList: TMenuItem;
popNoteMemoDelete: TMenuItem;
popNoteMemoEdit: TMenuItem;
popNoteMemoSave: TMenuItem;
popNoteMemoSign: TMenuItem;
popNoteList: TPopupMenu;
popNoteListAll: TMenuItem;
popNoteListByAuthor: TMenuItem;
popNoteListByDate: TMenuItem;
popNoteListUncosigned: TMenuItem;
popNoteListUnsigned: TMenuItem;
sptVert: TSplitter;
memPCEShow: TRichEdit;
mnuActIdentifyAddlSigners: TMenuItem;
popNoteMemoAddlSign: TMenuItem;
Z11: TMenuItem;
popNoteMemoSpell: TMenuItem;
popNoteMemoGrammar: TMenuItem;
mnuViewCustom: TMenuItem;
N1: TMenuItem;
mnuViewSaveAsDefault: TMenuItem;
ReturntoDefault1: TMenuItem;
pnlDrawers: TPanel;
lstNotes: TORListBox;
splDrawers: TSplitter;
popNoteMemoTemplate: TMenuItem;
Z12: TMenuItem;
mnuOptions: TMenuItem;
mnuEditTemplates: TMenuItem;
mnuNewTemplate: TMenuItem;
N2: TMenuItem;
mnuEditSharedTemplates: TMenuItem;
mnuNewSharedTemplate: TMenuItem;
popNoteMemoAddend: TMenuItem;
pnlFields: TPanel;
lblNewTitle: TStaticText;
lblRefDate: TStaticText;
lblAuthor: TStaticText;
lblVisit: TStaticText;
lblCosigner: TStaticText;
cmdChange: TButton;
lblSubject: TStaticText;
txtSubject: TCaptionEdit;
timAutoSave: TTimer;
popNoteMemoPaste2: TMenuItem;
popNoteMemoReformat: TMenuItem;
Z4: TMenuItem;
mnuActChange: TMenuItem;
mnuActLoadBoiler: TMenuItem;
bvlNewTitle: TBevel;
popNoteMemoSaveContinue: TMenuItem;
N3: TMenuItem;
mnuEditDialgFields: TMenuItem;
tvNotes: TORTreeView;
lvNotes: TCaptionListView;
sptList: TSplitter;
N4: TMenuItem;
popNoteListExpandSelected: TMenuItem;
popNoteListExpandAll: TMenuItem;
popNoteListCollapseSelected: TMenuItem;
popNoteListCollapseAll: TMenuItem;
popNoteListCustom: TMenuItem;
mnuActDetachFromIDParent: TMenuItem;
N5: TMenuItem;
popNoteListDetachFromIDParent: TMenuItem;
popNoteListAddIDEntry: TMenuItem;
mnuActAddIDEntry: TMenuItem;
mnuIconLegend: TMenuItem;
N6: TMenuItem;
popNoteMemoFind: TMenuItem;
dlgFindText: TFindDialog;
dlgReplaceText: TReplaceDialog;
popNoteMemoReplace: TMenuItem;
N7: TMenuItem;
mnuChartSurgery: TMenuItem;
mnuActAttachtoIDParent: TMenuItem;
popNoteListAttachtoIDParent: TMenuItem;
N8: TMenuItem;
popNoteMemoPreview: TMenuItem;
popNoteMemoInsTemplate: TMenuItem;
popNoteMemoEncounter: TMenuItem;
mnuSearchForText: TMenuItem;
popSearchForText: TMenuItem;
mnuViewInformation: TMenuItem;
mnuViewDemo: TMenuItem;
mnuViewVisits: TMenuItem;
mnuViewPrimaryCare: TMenuItem;
mnuViewMyHealtheVet: TMenuItem;
mnuInsurance: TMenuItem;
mnuViewFlags: TMenuItem;
mnuViewReminders: TMenuItem;
mnuViewRemoteData: TMenuItem;
mnuViewPostings: TMenuItem;
pnlHtmlViewer: TPanel; //kt 8/09
pnlTextWrite: TPanel; //kt 8/09
popNoteMemoHTMLFormat: TMenuItem; //kt 8/09
pnlHTMLWrite: TPanel; //kt 8/09
pnlHTMLEdit: TPanel; //kt 8/09
ToolBar: TToolBar; //kt 8/09
cbFontNames: TComboBox; //kt 8/09
cbFontSize: TComboBox; //kt 8/09
btnFonts: TSpeedButton; //kt 8/09
btnItalic: TSpeedButton; //kt 8/09
btnBold: TSpeedButton; //kt 8/09
btnUnderline: TSpeedButton; //kt 8/09
btnBullets: TSpeedButton; //kt 8/09
btnNumbers: TSpeedButton; //kt 8/09
btnLeftAlign: TSpeedButton; //kt 8/09
btnCenterAlign: TSpeedButton; //kt 8/09
btnRightAlign: TSpeedButton; //kt 8/09
btnMoreIndent: TSpeedButton; //kt 8/09
btnLessIndent: TSpeedButton; //kt 8/09
btnTextColor: TSpeedButton; //kt 8/09
btnBackColor: TSpeedButton; //kt 8/09
btnImage: TSpeedButton;
popupAddImage: TPopupMenu;
mnuSelectExistingImage: TMenuItem;
mnuAddNewImage: TMenuItem;
mnuSearchNotes: TMenuItem; //kt 7/5/10
procedure mnuChartTabClick(Sender: TObject);
procedure lstNotesClick(Sender: TObject);
procedure pnlRightResize(Sender: TObject);
procedure cmdNewNoteClick(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 cmdPCEClick(Sender: TObject);
procedure popNoteMemoCutClick(Sender: TObject);
procedure popNoteMemoCopyClick(Sender: TObject);
procedure popNoteMemoPasteClick(Sender: TObject);
procedure popNoteMemoPopup(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 popNoteMemoAddlSignClick(Sender: TObject);
procedure popNoteMemoSpellClick(Sender: TObject);
procedure popNoteMemoGrammarClick(Sender: TObject);
procedure mnuViewSaveAsDefaultClick(Sender: TObject);
procedure mnuViewReturntoDefaultClick(Sender: TObject);
procedure popNoteMemoTemplateClick(Sender: TObject);
procedure mnuEditTemplatesClick(Sender: TObject);
procedure mnuNewTemplateClick(Sender: TObject);
procedure mnuEditSharedTemplatesClick(Sender: TObject);
procedure mnuNewSharedTemplateClick(Sender: TObject);
procedure mnuOptionsClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cmdChangeClick(Sender: TObject);
procedure pnlFieldsResize(Sender: TObject);
procedure timAutoSaveTimer(Sender: TObject);
procedure memNewNoteChange(Sender: TObject);
procedure popNoteMemoReformatClick(Sender: TObject);
procedure mnuActChangeClick(Sender: TObject);
procedure mnuActLoadBoilerClick(Sender: TObject);
procedure popNoteMemoSaveContinueClick(Sender: TObject);
procedure mnuEditDialgFieldsClick(Sender: TObject);
procedure tvNotesChange(Sender: TObject; Node: TTreeNode);
procedure tvNotesClick(Sender: TObject);
procedure tvNotesCollapsed(Sender: TObject; Node: TTreeNode);
procedure tvNotesExpanded(Sender: TObject; Node: TTreeNode);
procedure tvNotesStartDrag(Sender: TObject;
var DragObject: TDragObject);
procedure tvNotesDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure tvNotesDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure lvNotesColumnClick(Sender: TObject; Column: TListColumn);
procedure lvNotesCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
procedure lvNotesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
procedure popNoteListExpandAllClick(Sender: TObject);
procedure popNoteListCollapseAllClick(Sender: TObject);
procedure popNoteListExpandSelectedClick(Sender: TObject);
procedure popNoteListCollapseSelectedClick(Sender: TObject);
procedure popNoteListPopup(Sender: TObject);
procedure lvNotesResize(Sender: TObject);
procedure mnuIconLegendClick(Sender: TObject);
procedure popNoteMemoFindClick(Sender: TObject);
procedure dlgFindTextFind(Sender: TObject);
procedure popNoteMemoReplaceClick(Sender: TObject);
procedure dlgReplaceTextReplace(Sender: TObject);
procedure dlgReplaceTextFind(Sender: TObject);
procedure mnuActAttachtoIDParentClick(Sender: TObject);
procedure memNewNoteKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
//kt procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); //kt added
procedure popNoteMemoInsTemplateClick(Sender: TObject);
procedure popNoteMemoPreviewClick(Sender: TObject);
procedure tvNotesAddition(Sender: TObject; Node: TTreeNode);
procedure tvNotesDeletion(Sender: TObject; Node: TTreeNode);
procedure tvNotesExit(Sender: TObject);
procedure pnlReadExit(Sender: TObject);
procedure cmdNewNoteExit(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure memNewNoteKeyPress(Sender: TObject; var Key: Char);
procedure memNewNoteKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure memPCEShowExit(Sender: TObject);
procedure cmdChangeExit(Sender: TObject);
procedure cmdPCEExit(Sender: TObject);
procedure ViewInfo(Sender: TObject);
procedure mnuViewInformationClick(Sender: TObject);
procedure btnBackColorClick(Sender: TObject); //kt 8/09
procedure btnBoldClick(Sender: TObject); //kt 8/09
procedure btnBulletsClick(Sender: TObject); //kt 8/09
procedure btnCenterAlignClick(Sender: TObject); //kt 8/09
procedure btnFontsClick(Sender: TObject); //kt 8/09
procedure btnItalicClick(Sender: TObject); //kt 8/09
procedure btnLeftAlignClick(Sender: TObject); //kt 8/09
procedure btnLessIndentClick(Sender: TObject); //kt 8/09
procedure btnMoreIndentClick(Sender: TObject); //kt 8/09
procedure btnNumbersClick(Sender: TObject); //kt 8/09
procedure btnRightAlignClick(Sender: TObject); //kt 8/09
procedure btnTextColorClick(Sender: TObject); //kt 8/09
procedure btnUnderlineClick(Sender: TObject); //kt 8/09
procedure cbFontNamesChange(Sender: TObject); //kt 8/09
procedure cbFontSizeChange(Sender: TObject); //kt 8/09
procedure btnImageClick(Sender: TObject); //kt 4/10
procedure popNoteMemoHTMLFormatClick(Sender: TObject);
procedure mnuAddNewImageClick(Sender: TObject);
procedure mnuSelectExistingImageClick(Sender: TObject);
procedure mnuSearchNotesClick(Sender: TObject); //kt 8/09
private
FNavigatingTab : Boolean; //Currently Using tab to navigate
FEditingIndex: Integer; // index of note being currently edited
FChanged: Boolean; // true if any text has changed in the note
FEditCtrl: TCustomEdit;
FSilent: Boolean;
FCurrentContext: TTIUContext;
FDefaultContext: TTIUContext;
FOrderID: string;
FImageFlag: TBitmap;
FEditNote: TEditNoteRec;
FViewNote : TStringList; //kt 8/09
FWarmedUp : boolean; //kt 8/09
FVerifyNoteTitle: Integer;
FDocList: TStringList;
FConfirmed: boolean;
FLastNoteID: string;
FNewIDChild: boolean;
FEditingNotePCEObj: boolean;
FDeleted: boolean;
FOldFramePnlPatientExit: TNotifyEvent;
FOldDrawerPnlTemplatesButtonExit: TNotifyEvent;
FOldDrawerPnlEncounterButtonExit: TNotifyEvent;
FOldDrawerEdtSearchExit: TNotifyEvent;
FMousing: TDateTime;
FStarting: boolean;
LastAuthor: Int64; //kt 6-1-05
LastAuthorName: string; //kt 6-1-05
FHTMLEditMode : TEditModes; //kt 7/09 This is the mode of the note being edited (even if not actively displayed)
FViewMode : TViewModeSet; //kt 7/09 This is the status of the display
procedure frmFramePnlPatientExit(Sender: TObject);
procedure frmDrawerPnlTemplatesButtonExit(Sender: TObject);
procedure frmDrawerPnlEncounterButtonExit(Sender: TObject);
procedure frmDrawerEdtSearchExit(Sender: TObject);
procedure ClearEditControls;
procedure DoAutoSave(Suppress: integer = 1);
function GetTitleText(AnIndex: Integer): string;
procedure InsertAddendum;
procedure InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
function LacksRequiredForCreate: Boolean;
procedure LoadForEdit;
function LockConsultRequest(AConsult: Integer): Boolean;
function LockConsultRequestAndNote(AnIEN: Int64): Boolean;
procedure RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
procedure SaveEditedNote(var Saved: Boolean);
procedure SaveCurrentNote(var Saved: Boolean);
procedure SetEditingIndex(const Value: Integer);
procedure SetSubjectVisible(ShouldShow: Boolean);
procedure ShowPCEControls(ShouldShow: Boolean);
function StartNewEdit(NewNoteType: integer): Boolean;
procedure UnlockConsultRequest(ANote: Int64; AConsult: Integer = 0);
procedure ProcessNotifications;
procedure SetViewContext(AContext: TTIUContext);
property EditingIndex: Integer read FEditingIndex write SetEditingIndex;
function GetDrawers: TFrmDrawers;
function CanFinishReminder: boolean;
procedure DisplayPCE;
function VerifyNoteTitle: Boolean;
// added for treeview
procedure LoadNotes;
procedure UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
procedure EnableDisableIDNotes;
procedure ShowPCEButtons(Editing: boolean);
procedure DoAttachIDChild(AChild, AParent: TORTreeNode);
function SetNoteTreeLabel(AContext: TTIUContext): string;
procedure UpdateNoteAuthor(DocInfo: string);
procedure SetHTMLEditMode(HTMLEditMode : boolean; Quiet : Boolean=false); //kt
procedure ToggleHTMLEditMode; //kt
procedure BroadcastImages(Note: TStrings); //kt
procedure ProperRepaint(Editing : Boolean); //kt
procedure SetEditorFocus; //kt
function EditorHasText : boolean; //kt
procedure ChangeToNote(IEN : String; ADFN : String = '-1'); //kt 6/26/10
public
HtmlEditor : THtmlObj; //kt 8/09
HtmlViewer : THtmlObj; //kt 8/09
procedure SetDisplayToHTMLvsText(Mode :TViewModeSet; Lines : TStrings; ActivateOnly : boolean=False); //kt 8/09
function ActiveEditOf(AnIEN: Int64; ARequest: integer): Boolean;
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 AssignRemForm;
property OrderID: string read FOrderID;
property ViewMode :TViewModeSet read FViewMode; //kt 8/09
procedure LstNotesToPrint;
constructor Create(AOwner: TComponent); override; //kt 8/09
destructor Destroy; override; //kt 8/09
published
property Drawers: TFrmDrawers read GetDrawers; // Keep Drawers published
end;
var
frmNotes: TfrmNotes;
SearchTextStopFlag: Boolean; // Text Search CQ: HDS00002856
implementation
{$R *.DFM}
uses fFrame, fVisit, fEncnt, rCore, uCore, fNoteBA, fNoteBD, fSignItem, fEncounterFrame,
rPCE, Clipbrd, fNoteCslt, fNotePrt, rVitals, fAddlSigners, fNoteDR, fConsults, uSpell,
fTIUView, fTemplateEditor, uReminders, fReminderDialog, uOrders, rConsults, fReminderTree,
fNoteProps, fNotesBP, fTemplateFieldEditor, dShared, rTemplates,
FIconLegend, fPCEEdit, fNoteIDParents, rSurgery, uSurgery, uTemplates,
uAccessibleTreeView, uAccessibleTreeNode, fTemplateDialog, DateUtils,
StrUtils {//KT added 1-1-05},
//fImages, {//kt added 9-20-05}
fOptionsNotes, //kt 8/09
fImagePickExisting, //kt 6/16/10
rHTMLTools, fImages, UploadImages, {//kt added 5-27-05 for IsHTMLDocument}
fPtDocSearch; //kt 6/21/10
const
NT_NEW_NOTE = -10; // Holder IEN for a new note
NT_ADDENDUM = -20; // Holder IEN for a new addendum
NT_ACT_NEW_NOTE = 2;
NT_ACT_ADDENDUM = 3;
NT_ACT_EDIT_NOTE = 4;
NT_ACT_ID_ENTRY = 5;
VIEW_ACTIVATE_ONLY = true; //kt 8/09
//TX_NEED_VISIT = 'A visit is required before creating a new progress note.'; <-- original line. //kt 7/19/2007
//TX_CREATE_ERR = 'Error Creating Note'; <-- original line. //kt 7/19/2007
//TX_UPDATE_ERR = 'Error Updating Note'; <-- original line. //kt 7/19/2007
//TX_NO_NOTE = 'No progress note is currently being edited'; <-- original line. //kt 7/19/2007
//TX_SAVE_NOTE = 'Save Progress Note'; <-- original line. //kt 7/19/2007
//TX_ADDEND_NO = 'Cannot make an addendum to a note that is being edited'; <-- original line. //kt 7/19/2007
//TX_DEL_OK = CRLF + CRLF + 'Delete this progress note?'; <-- original line. //kt 7/19/2007
//TX_DEL_ERR = 'Unable to Delete Note'; <-- original line. //kt 7/19/2007
//TX_SIGN = 'Sign Note'; <-- original line. //kt 7/19/2007
//TX_COSIGN = 'Cosign Note'; <-- original line. //kt 7/19/2007
//TX_SIGN_ERR = 'Unable to Sign Note'; <-- original line. //kt 7/19/2007
// TX_SCREQD = 'This progress note title requires the service connected questions to be '+
// 'answered. The Encounter form will now be opened. Please answer all '+
// 'service connected questions.';
// TX_SCREQD_T = 'Response required for SC questions.';
//TX_NONOTE = 'No progress note is currently selected.'; <-- original line. //kt 7/19/2007
//TX_NONOTE_CAP = 'No Note Selected'; <-- original line. //kt 7/19/2007
//TX_NOPRT_NEW = 'This progress note may not be printed until it is saved'; <-- original line. //kt 7/19/2007
//TX_NOPRT_NEW_CAP = 'Save Progress Note'; <-- original line. //kt 7/19/2007
//TX_NO_ALERT = 'There is insufficient information to process this alert.' + CRLF + <-- original line. //kt 7/19/2007
// 'Either the alert has already been deleted, or it contained invalid data.' + CRLF + CRLF + <-- original line. //kt 7/19/2007
// 'Click the NEXT button if you wish to continue processing more alerts.'; <-- original line. //kt 7/19/2007
//TX_CAP_NO_ALERT = 'Unable to Process Alert'; <-- original line. //kt 7/19/2007
//TX_ORDER_LOCKED = 'This record is locked by an action underway on the Consults tab'; <-- original line. //kt 7/19/2007
//TC_ORDER_LOCKED = 'Unable to access record'; <-- original line. //kt 7/19/2007
//TX_NO_ORD_CHG = 'The note is still associated with the previously selected request.' + CRLF + <-- original line. //kt 7/19/2007
// 'Finish the pending action on the consults tab, then try again.'; <-- original line. //kt 7/19/2007
//TC_NO_ORD_CHG = 'Locked Consult Request'; <-- original line. //kt 7/19/2007
//TX_NEW_SAVE1 = 'You are currently editing:' + CRLF + CRLF; <-- original line. //kt 7/19/2007
//TX_NEW_SAVE2 = CRLF + CRLF + 'Do you wish to save this note and begin a new one?'; <-- original line. //kt 7/19/2007
//TX_NEW_SAVE3 = CRLF + CRLF + 'Do you wish to save this note and begin a new addendum?'; <-- original line. //kt 7/19/2007
//TX_NEW_SAVE4 = CRLF + CRLF + 'Do you wish to save this note and edit the one selected?'; <-- original line. //kt 7/19/2007
//TX_NEW_SAVE5 = CRLF + CRLF + 'Do you wish to save this note and begin a new Interdisciplinary entry?'; <-- original line. //kt 7/19/2007
//TC_NEW_SAVE2 = 'Create New Note'; <-- original line. //kt 7/19/2007
//TC_NEW_SAVE3 = 'Create New Addendum'; <-- original line. //kt 7/19/2007
//TC_NEW_SAVE4 = 'Edit Different Note'; <-- original line. //kt 7/19/2007
//TC_NEW_SAVE5 = 'Create New Interdisciplinary Entry'; <-- original line. //kt 7/19/2007
//TX_EMPTY_NOTE = CRLF + CRLF + 'This note contains no text and will not be saved.' + CRLF + <-- original line. //kt 7/19/2007
// 'Do you wish to delete this note?'; <-- original line. //kt 7/19/2007
//TC_EMPTY_NOTE = 'Empty Note'; <-- original line. //kt 7/19/2007
//TX_EMPTY_NOTE1 = 'This note contains no text and can not be signed.'; <-- original line. //kt 7/19/2007
//TC_NO_LOCK = 'Unable to Lock Note'; <-- original line. //kt 7/19/2007
//TX_ABSAVE = 'It appears the session terminated abnormally when this' + CRLF + <-- original line. //kt 7/19/2007
// 'note was last edited. Some text may not have been saved.' + CRLF + CRLF + <-- original line. //kt 7/19/2007
// 'Do you wish to continue and sign the note?'; <-- original line. //kt 7/19/2007
//TC_ABSAVE = 'Possible Missing Text'; <-- original line. //kt 7/19/2007
//TX_NO_BOIL = 'There is no boilerplate text associated with this title.'; <-- original line. //kt 7/19/2007
//TC_NO_BOIL = 'Load Boilerplate Text'; <-- original line. //kt 7/19/2007
//TX_BLR_CLEAR = 'Do you want to clear the previously loaded boilerplate text?'; <-- original line. //kt 7/19/2007
//TC_BLR_CLEAR = 'Clear Previous Boilerplate Text'; <-- original line. //kt 7/19/2007
//TX_DETACH_CNF = 'Confirm Detachment'; <-- original line. //kt 7/19/2007
//TX_DETACH_FAILURE = 'Detach failed'; <-- original line. //kt 7/19/2007
//TX_RETRACT_CAP = 'Retraction Notice'; <-- original line. //kt 7/19/2007
//TX_RETRACT = 'This document will now be RETRACTED. As Such, it has been removed' +CRLF + <-- original line. //kt 7/19/2007
// ' from public view, and from typical Releases of Information,' +CRLF + <-- original line. //kt 7/19/2007
// ' but will remain indefinitely discoverable to HIMS.' +CRLF +CRLF; <-- original line. //kt 7/19/2007
//TX_AUTH_SIGNED = 'Author has not signed, are you SURE you want to sign.' +CRLF; <-- original line. //kt 7/19/2007
{
type
//CQ8300
ClipboardData = record
Text: array[0..255] of char;
end;
}
var
TX_NEED_VISIT : string; //kt
TX_CREATE_ERR : string; //kt
TX_UPDATE_ERR : string; //kt
TX_NO_NOTE : string; //kt
TX_SAVE_NOTE : string; //kt
TX_ADDEND_NO : string; //kt
TX_DEL_OK : string; //kt
TX_DEL_ERR : string; //kt
TX_SIGN : string; //kt
TX_COSIGN : string; //kt
TX_SIGN_ERR : string; //kt
TX_NONOTE : string; //kt
TX_NONOTE_CAP : string; //kt
TX_NOPRT_NEW : string; //kt
TX_NOPRT_NEW_CAP : string; //kt
TX_NO_ALERT : string; //kt
TX_CAP_NO_ALERT : string; //kt
TX_ORDER_LOCKED : string; //kt
TC_ORDER_LOCKED : string; //kt
TX_NO_ORD_CHG : string; //kt
TC_NO_ORD_CHG : string; //kt
TX_NEW_SAVE1 : string; //kt
TX_NEW_SAVE2 : string; //kt
TX_NEW_SAVE3 : string; //kt
TX_NEW_SAVE4 : string; //kt
TX_NEW_SAVE5 : string; //kt
TC_NEW_SAVE2 : string; //kt
TC_NEW_SAVE3 : string; //kt
TC_NEW_SAVE4 : string; //kt
TC_NEW_SAVE5 : string; //kt
TX_EMPTY_NOTE : string; //kt
TC_EMPTY_NOTE : string; //kt
TX_EMPTY_NOTE1 : string; //kt
TC_NO_LOCK : string; //kt
TX_ABSAVE : string; //kt
TC_ABSAVE : string; //kt
TX_NO_BOIL : string; //kt
TC_NO_BOIL : string; //kt
TX_BLR_CLEAR : string; //kt
TC_BLR_CLEAR : string; //kt
TX_DETACH_CNF : string; //kt
TX_DETACH_FAILURE : string; //kt
TX_RETRACT_CAP : string; //kt
TX_RETRACT : string; //kt
TX_AUTH_SIGNED : string; //kt
procedure SetupVars;
//kt Added entire function to replace constant declarations 7/19/2007
begin
TX_NEED_VISIT := DKLangConstW('fNotes_A_visit_is_required_before_creating_a_new_progress_notex');
TX_CREATE_ERR := DKLangConstW('fNotes_Error_Creating_Note');
TX_UPDATE_ERR := DKLangConstW('fNotes_Error_Updating_Note');
TX_NO_NOTE := DKLangConstW('fNotes_No_progress_note_is_currently_being_edited');
TX_SAVE_NOTE := DKLangConstW('fNotes_Save_Progress_Note');
TX_ADDEND_NO := DKLangConstW('fNotes_Cannot_make_an_addendum_to_a_note_that_is_being_edited');
TX_DEL_OK := CRLF + CRLF + DKLangConstW('fNotes_Delete_this_progress_notex');
TX_DEL_ERR := DKLangConstW('fNotes_Unable_to_Delete_Note');
TX_SIGN := DKLangConstW('fNotes_Sign_Note');
TX_COSIGN := DKLangConstW('fNotes_Cosign_Note');
TX_SIGN_ERR := DKLangConstW('fNotes_Unable_to_Sign_Note');
TX_NONOTE := DKLangConstW('fNotes_No_progress_note_is_currently_selectedx');
TX_NONOTE_CAP := DKLangConstW('fNotes_No_Note_Selected');
TX_NOPRT_NEW := DKLangConstW('fNotes_This_progress_note_may_not_be_printed_until_it_is_saved');
TX_NOPRT_NEW_CAP := DKLangConstW('fNotes_Save_Progress_Note');
TX_NO_ALERT := DKLangConstW('fNotes_There_is_insufficient_information_to_process_this_alertx') + CRLF +
DKLangConstW('fNotes_Either_the_alert_has_already_been_deletedx_or_it_contained_invalid_datax') + CRLF + CRLF +
DKLangConstW('fNotes_Click_the_NEXT_button_if_you_wish_to_continue_processing_more_alertsx');
TX_CAP_NO_ALERT := DKLangConstW('fNotes_Unable_to_Process_Alert');
TX_ORDER_LOCKED := DKLangConstW('fNotes_This_record_is_locked_by_an_action_underway_on_the_Consults_tab');
TC_ORDER_LOCKED := DKLangConstW('fNotes_Unable_to_access_record');
TX_NO_ORD_CHG := DKLangConstW('fNotes_The_note_is_still_associated_with_the_previously_selected_requestx') + CRLF +
DKLangConstW('fNotes_Finish_the_pending_action_on_the_consults_tabx_then_try_againx');
TC_NO_ORD_CHG := DKLangConstW('fNotes_Locked_Consult_Request');
TX_NEW_SAVE1 := DKLangConstW('fNotes_You_are_currently_editingx') + CRLF + CRLF;
TX_NEW_SAVE2 := CRLF + CRLF + DKLangConstW('fNotes_Do_you_wish_to_save_this_note_and_begin_a_new_onex');
TX_NEW_SAVE3 := CRLF + CRLF + DKLangConstW('fNotes_Do_you_wish_to_save_this_note_and_begin_a_new_addendumx');
TX_NEW_SAVE4 := CRLF + CRLF + DKLangConstW('fNotes_Do_you_wish_to_save_this_note_and_edit_the_one_selectedx');
TX_NEW_SAVE5 := CRLF + CRLF + DKLangConstW('fNotes_Do_you_wish_to_save_this_note_and_begin_a_new_Interdisciplinary_entryx');
TC_NEW_SAVE2 := DKLangConstW('fNotes_Create_New_Note');
TC_NEW_SAVE3 := DKLangConstW('fNotes_Create_New_Addendum');
TC_NEW_SAVE4 := DKLangConstW('fNotes_Edit_Different_Note');
TC_NEW_SAVE5 := DKLangConstW('fNotes_Create_New_Interdisciplinary_Entry');
TX_EMPTY_NOTE := CRLF + CRLF + DKLangConstW('fNotes_This_note_contains_no_text_and_will_not_be_savedx') + CRLF +
DKLangConstW('fNotes_Do_you_wish_to_delete_this_notex');
TC_EMPTY_NOTE := DKLangConstW('fNotes_Empty_Note');
TX_EMPTY_NOTE1 := DKLangConstW('fNotes_This_note_contains_no_text_and_can_not_be_signedx');
TC_NO_LOCK := DKLangConstW('fNotes_Unable_to_Lock_Note');
TX_ABSAVE := DKLangConstW('fNotes_It_appears_the_session_terminated_abnormally_when_this') + CRLF +
DKLangConstW('fNotes_note_was_last_editedx_Some_text_may_not_have_been_savedx') + CRLF + CRLF +
DKLangConstW('fNotes_Do_you_wish_to_continue_and_sign_the_notex');
TC_ABSAVE := DKLangConstW('fNotes_Possible_Missing_Text');
TX_NO_BOIL := DKLangConstW('fNotes_There_is_no_boilerplate_text_associated_with_this_titlex');
TC_NO_BOIL := DKLangConstW('fNotes_Load_Boilerplate_Text');
TX_BLR_CLEAR := DKLangConstW('fNotes_Do_you_want_to_clear_the_previously_loaded_boilerplate_textx');
TC_BLR_CLEAR := DKLangConstW('fNotes_Clear_Previous_Boilerplate_Text');
TX_DETACH_CNF := DKLangConstW('fNotes_Confirm_Detachment');
TX_DETACH_FAILURE := DKLangConstW('fNotes_Detach_failed');
TX_RETRACT_CAP := DKLangConstW('fNotes_Retraction_Notice');
TX_RETRACT := DKLangConstW('fNotes_This_document_will_now_be_RETRACTEDx__As_Suchx_it_has_been_removed') +CRLF +
DKLangConstW('fNotes_from_public_viewx_and_from_typical_Releases_of_Informationx') +CRLF +
DKLangConstW('fNotes_but_will_remain_indefinitely_discoverable_to_HIMSx') +CRLF +CRLF;
TX_AUTH_SIGNED := DKLangConstW('fNotes_Author_has_not_signedx_are_you_SURE_you_want_to_signx') +CRLF;
end;
var
uPCEShow, uPCEEdit: TPCEData;
ViewContext: Integer;
frmDrawers: TfrmDrawers;
uTIUContext: TTIUContext;
ColumnToSort: Integer;
ColumnSortForward: Boolean;
uChanging: Boolean;
uIDNotesActive: Boolean;
constructor TfrmNotes.Create(AOwner: TComponent);
//kt Added function 8/09
begin
inherited Create(AOwner);
FViewNote := TStringList.Create;
end;
destructor TfrmNotes.Destroy;
//kt Added function 8/09
begin
FViewNote.Free;
FEditNote.Lines.Free; //kt
inherited Destroy;
end;
{ TPage common methods --------------------------------------------------------------------- }
function TfrmNotes.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. '; <-- original line. //kt 7/19/2007
WhyNot := DKLangConstW('fNotes_A_template_in_progress_will_be_abortedx'); //kt added 7/19/2007
Result := False;
end;
'0': begin
// if WhyNot = 'COMMIT' then <-- original line. //kt 7/19/2007
if WhyNot = DKLangConstW('fNotes_COMMIT') then //kt added 7/19/2007
begin
FSilent := True;
frmTemplateDialog.Silent := True;
frmTemplateDialog.ModalResult := mrCancel;
end;
end;
end;
if Assigned(frmRemDlg) then
case BOOLCHAR[frmFrame.CCOWContextChanging] of
'1': begin
// WhyNot := 'All current reminder processing information will be discarded. '; <-- original line. //kt 7/19/2007
WhyNot := DKLangConstW('fNotes_All_current_reminder_processing_information_will_be_discardedx'); //kt added 7/19/2007
Result := False;
end;
'0': begin
if WhyNot = 'COMMIT' then
begin
FSilent := True;
frmRemDlg.Silent := True;
frmRemDlg.btnCancelClick(Self);
end;
end;
end;
if EditingIndex <> -1 then
case BOOLCHAR[frmFrame.CCOWContextChanging] of
'1': begin
{if ((vmHTML in FViewMode) and (HTMLEditor.Text <> '')) //kt 8/09
or ((not (vmHTML in FViewMode)) and (memNewNote.GetTextLen > 0 )) then begin //kt }
if EditorHasText then begin //kt 7/10
// WhyNot := WhyNot + 'A note in progress will be saved as unsigned. ' <-- original line. //kt 7/19/2007
WhyNot := WhyNot + DKLangConstW('fNotes_A_note_in_progress_will_be_saved_as_unsignedx') //kt added 7/19/2007
end else begin //kt
// WhyNot := WhyNot + 'An empty note in progress will be deleted. '; <-- original line. //kt 7/19/2007
WhyNot := WhyNot + DKLangConstW('fNotes_An_empty_note_in_progress_will_be_deletedx'); //kt added 7/19/2007
end; //kt
Result := False;
end;
'0': begin
// if WhyNot = 'COMMIT' then FSilent := True; <-- original line. //kt 7/19/2007
if WhyNot = DKLangConstW('fNotes_COMMIT') then FSilent := True; //kt added 7/19/2007
SaveCurrentNote(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'; <-- original line. //kt 7/19/2007
WhyNot := WhyNot + DKLangConstW('fNotes_Encounter_information_being_edited_will_not_be_saved'); //kt added 7/19/2007
Result := False;
end;
'0': begin
if WhyNot = 'COMMIT' then
begin
FSilent := True;
frmEncounterFrame.Abort := False;
frmEncounterFrame.Cancel := True;
end;
end;
end; {case}
end;
procedure TfrmNotes.LstNotesToPrint;
var
AParentID: string;
SavedDocID: string;
Saved: boolean;
begin
inherited;
if not uIDNotesActive then exit;
if lstNotes.ItemIEN = 0 then exit;
SavedDocID := lstNotes.ItemID;
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;
if tvNotes.Selected = nil then exit;
AParentID := frmPrintList.SelectParentFromList(tvNotes,CT_NOTES);
if AParentID = '' then exit;
with tvNotes do Selected := FindPieceNode(AParentID, 1, U, Items.GetFirstNode);
end;
procedure TfrmNotes.ClearPtData;
{ clear all controls that contain patient specific information }
begin
inherited ClearPtData;
ClearEditControls;
uChanging := True;
tvNotes.Items.BeginUpdate;
KilldocTreeObjects(tvNotes);
tvNotes.Items.Clear;
tvNotes.Items.EndUpdate;
lvNotes.Items.Clear;
uChanging := False;
lstNotes.Clear;
memNote.Clear;
HTMLViewer.Clear; //kt
HTMLEditor.Clear; //kt
FWarmedUp := false; //kt
SetDisplayToHTMLvsText([vmText,vmView],nil,VIEW_ACTIVATE_ONLY); //kt
memPCEShow.Clear;
uPCEShow.Clear;
uPCEEdit.Clear;
frmDrawers.ResetTemplates;
end;
procedure TfrmNotes.DisplayPage;
{ causes page to be visible and conditionally executes initialization code }
begin
inherited DisplayPage;
frmFrame.ShowHideChartTabMenus(mnuViewChart);
frmFrame.mnuFilePrint.Tag := CT_NOTES;
frmFrame.mnuFilePrint.Enabled := True;
frmFrame.mnuFilePrintSetup.Enabled := True;
frmFrame.mnuFilePrintSelectedItems.Enabled := True;
if InitPage then
begin
EnableDisableIDNotes;
FDefaultContext := GetCurrentTIUContext;
FCurrentContext := FDefaultContext;
popNoteMemoSpell.Visible := SpellCheckAvailable;
popNoteMemoGrammar.Visible := popNoteMemoSpell.Visible;
Z11.Visible := popNoteMemoSpell.Visible;
timAutoSave.Interval := User.AutoSave * 1000; // convert seconds to milliseconds
SetEqualTabStops(memNewNote);
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 TfrmNotes.RequestPrint;
var
Saved: Boolean;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
with lstNotes do
begin
if ItemIndex = EditingIndex then
//if ItemIEN < 0 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
if ItemIEN > 0 then PrintNote(ItemIEN, MakeNoteDisplayText(Items[ItemIndex])) else
begin
if ItemIEN = 0 then InfoBox(TX_NONOTE, TX_NONOTE_CAP, MB_OK);
if ItemIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK);
end;
end;
end;
{for printing multiple notes}
procedure TfrmNotes.RequestMultiplePrint(AForm: TfrmPrintList);
var
NoteIEN: int64;
i: integer;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
with AForm.lbIDParents do
begin
for i := 0 to Items.Count - 1 do
begin
if Selected[i] then
begin
NoteIEN := StrToInt64def(Piece(TStringList(Items.Objects[i])[0],U,1),0);
if NoteIEN > 0 then PrintNote(NoteIEN, Items[i], TRUE) else
begin
if NoteIEN = 0 then InfoBox(TX_NONOTE, TX_NONOTE_CAP, MB_OK);
if NoteIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK);
end;
end; {if selected}
end; {for}
end; {with}
end;
procedure TfrmNotes.SetFontSize(NewFontSize: Integer);
{ adjusts the font size of any controls that don't have ParentFont = True }
begin
inherited SetFontSize(NewFontSize);
frmDrawers.Font.Size := NewFontSize;
SetEqualTabStops(memNewNote);
end;
procedure TfrmNotes.mnuChartTabClick(Sender: TObject);
{ reroute to Chart Tab menu of the parent form: frmFrame }
begin
inherited;
frmFrame.mnuChartTabClick(Sender);
end;
{ General procedures ----------------------------------------------------------------------- }
procedure TfrmNotes.ClearEditControls;
{ resets controls used for entering a new progress note }
begin
// clear FEditNote (should FEditNote be an object with a clear method?)
with FEditNote do
begin
DocType := 0;
Title := 0;
TitleName := '';
DateTime := 0;
Author := 0;
AuthorName := '';
Cosigner := 0;
CosignerName := '';
Subject := '';
Location := 0;
LocationName := '';
PkgIEN := 0;
PkgPtr := '';
PkgRef := '';
NeedCPT := False;
Addend := 0;
{LastCosigner & LastCosignerName aren't cleared because they're used as default for next note.}
//kt 8/09 Lines := nil;
if Assigned (Lines) then Lines.Clear; //kt 8/09
PRF_IEN := 0;
ActionIEN := '';
end;
// clear the editing controls (also clear the new labels?)
txtSubject.Text := '';
if memNewNote <> nil then memNewNote.Clear; //CQ7012 Added test for nil
HTMLEditor.Clear; //kt 8/09
HTMLViewer.Clear; //kt 8/09
FHTMLEditMode := emNone; //kt 8/09
timAutoSave.Enabled := False;
// clear the PCE object for editing
uPCEEdit.Clear;
// set the tracking variables to initial state
EditingIndex := -1;
FChanged := False;
end;
procedure TfrmNotes.ShowPCEControls(ShouldShow: Boolean);
begin
sptVert.Visible := ShouldShow;
memPCEShow.Visible := ShouldShow;
if(ShouldShow) then
sptVert.Top := memPCEShow.Top - sptVert.Height;
if (vmHTML in FViewMode) then begin //kt 8/09
HTMLViewer.Invalidate; //kt 8/09
end else begin //kt 8/09
memNote.Invalidate;
end; //kt 8/09
end;
procedure TfrmNotes.DisplayPCE;
{ displays PCE information if appropriate & enables/disabled editing of PCE data }
var
EnableList, ShowList: TDrawers;
VitalStr: TStringlist;
NoPCE: boolean;
ActionSts: TActionRec;
AnIEN: integer;
begin
memPCEShow.Clear;
with lstNotes 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;
ShowPCEButtons(TRUE);
ShowPCEControls(cmdPCE.Enabled or (memPCEShow.Lines.Count > 0));
if(NoPCE and memPCEShow.Visible) then
memPCEShow.Lines.Insert(0, TX_NOPCE);
memPCEShow.SelStart := 0;
if(InteractiveRemindersActive) then
begin
if(GetReminderStatus = rsNone) then
EnableList := [odTemplates]
else
EnableList := [odTemplates, odReminders];
ShowList := [odTemplates, odReminders];
end
else
begin
EnableList := [odTemplates];
ShowList := [odTemplates];
end;
frmDrawers.DisplayDrawers(TRUE, EnableList, ShowList);
end;
end else
begin
ShowPCEButtons(FALSE);
frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]);
AnIEN := lstNotes.ItemIEN;
ActOnDocument(ActionSts, AnIEN, 'VIEW');
if ActionSts.Success then
begin
// StatusText('Retrieving encounter information...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Retrieving_encounter_informationxxx')); //kt added 7/19/2007
with uPCEShow do
begin
NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
PCEForNote(AnIEN, uPCEEdit);
AddStrData(memPCEShow.Lines);
NoPCE := (memPCEShow.Lines.Count = 0);
VitalStr := TStringList.create;
try
GetVitalsFromNote(VitalStr, uPCEShow, AnIEN);
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);
memPCEShow.SelStart := 0;
end;
StatusText('');
end
else
ShowPCEControls(FALSE);
end; {if ItemIndex}
end;
{ supporting calls for writing notes }
function TfrmNotes.GetTitleText(AnIndex: Integer): string;
{ returns non-tabbed text for the title of a note given the ItemIndex in lstNotes }
begin
with lstNotes 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;
function TfrmNotes.LacksRequiredForCreate: Boolean;
{ determines if the fields required to create the note are present }
var
CurTitle: Integer;
begin
Result := False;
with FEditNote do
begin
if Title <= 0 then Result := True;
if Author <= 0 then Result := True;
if DateTime <= 0 then Result := True;
if IsConsultTitle(Title) and (PkgIEN = 0) then Result := True;
if IsSurgeryTitle(Title) and (PkgIEN = 0) then Result := True;
if IsPRFTitle(Title) and (PRF_IEN = 0) and (not DocType = TYP_ADDENDUM) then Result := True;
if (DocType = TYP_ADDENDUM) then
begin
if AskCosignerForDocument(Addend, Author) and (Cosigner <= 0) then Result := True;
end else
begin
if Title > 0 then CurTitle := Title else CurTitle := DocType;
if AskCosignerForTitle(CurTitle, Author, DateTime) and (Cosigner <= 0) then Result := True;
end;
end;
end;
function TfrmNotes.VerifyNoteTitle: Boolean;
const
VNT_UNKNOWN = 0;
VNT_NO = 1;
VNT_YES = 2;
var
AParam: string;
begin
if FVerifyNoteTitle = VNT_UNKNOWN then
begin
AParam := GetUserParam('ORWOR VERIFY NOTE TITLE');
if AParam = '1' then FVerifyNoteTitle := VNT_YES else FVerifyNoteTitle := VNT_NO;
end;
Result := FVerifyNoteTitle = VNT_YES;
end;
procedure TfrmNotes.SetSubjectVisible(ShouldShow: Boolean);
{ hide/show subject & resize panel accordingly - leave 6 pixel margin above memNewNote }
begin
if ShouldShow then
begin
lblSubject.Visible := True;
txtSubject.Visible := True;
pnlFields.Height := txtSubject.Top + txtSubject.Height + 6;
end else
begin
lblSubject.Visible := False;
txtSubject.Visible := False;
pnlFields.Height := lblVisit.Top + lblVisit.Height + 6;
end;
end;
{ consult request and note locking }
function TfrmNotes.LockConsultRequest(AConsult: Integer): Boolean;
{ returns true if consult successfully locked }
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
// *** I'm not sure about the FOrderID field - if the user is editing one note and
// deletes another, FOrderID will be for editing note, then delete note, then null
Result := True;
FOrderID := GetConsultOrderIEN(AConsult);
if (FOrderID <> '') and (FOrderID = frmConsults.OrderID) then
begin
InfoBox(TX_ORDER_LOCKED, TC_ORDER_LOCKED, MB_OK);
Result := False;
Exit;
end;
if (FOrderId <> '') then
if not OrderCanBeLocked(FOrderID) then Result := False;
if not Result then FOrderID := '';
end;
function TfrmNotes.LockConsultRequestAndNote(AnIEN: Int64): Boolean;
{ returns true if note and associated request successfully locked }
var
AConsult: Integer;
LockMsg, x: string;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
Result := True;
AConsult := 0;
if frmConsults.ActiveEditOf(AnIEN) then
begin
InfoBox(TX_ORDER_LOCKED, TC_ORDER_LOCKED, MB_OK);
Result := False;
Exit;
end;
if Changes.Exist(CH_DOC, IntToStr(AnIEN)) then Exit; // already locked
// try to lock the consult request first, if there is one
if IsConsultTitle(TitleForNote(AnIEN)) then
begin
x := GetPackageRefForNote(lstNotes.ItemIEN);
AConsult := StrToIntDef(Piece(x, ';', 1), 0);
Result := LockConsultRequest(AConsult);
end;
// now try to lock the note
if Result then
begin
LockDocument(AnIEN, LockMsg);
if LockMsg <> '' then
begin
Result := False;
// if can't lock the note, unlock the consult request that was just locked
if AConsult > 0 then
begin
UnlockOrderIfAble(FOrderID);
FOrderID := '';
end;
InfoBox(LockMsg, TC_NO_LOCK, MB_OK);
end;
end;
end;
procedure TfrmNotes.UnlockConsultRequest(ANote: Int64; AConsult: Integer = 0);
(*var
x: string;*)
begin
(* if (AConsult = 0) and IsConsultTitle(TitleForNote(ANote)) then
begin
x := GetPackageRefForNote(ANote);
AConsult := StrToIntDef(Piece(x, ';', 1), 0);
end;
if AConsult = 0 then Exit;*)
if AConsult = 0 then AConsult := GetConsultIENForNote(ANote);
if AConsult <= 0 then exit;
FOrderID := GetConsultOrderIEN(AConsult);
UnlockOrderIfAble(FOrderID);
FOrderID := '';
end;
function TfrmNotes.ActiveEditOf(AnIEN: Int64; ARequest: integer): Boolean;
begin
Result := False;
if EditingIndex < 0 then Exit;
if lstNotes.GetIEN(EditingIndex) = AnIEN then
begin
Result := True;
Exit;
end;
with FEditNote do if (PkgIEN = ARequest) and (PkgPtr = PKG_CONSULTS) then Result := True;
end;
{ create, edit & save notes }
procedure TfrmNotes.InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
{ creates the editing context for a new progress note & inserts stub into top of view list }
var
EnableAutosave, HaveRequired: Boolean;
CreatedNote: TCreatedDoc;
TmpBoilerPlate: TStringList;
tmpNode: TTreeNode;
x, WhyNot, DocInfo: string;
tempPos : integer; //kt 6-1-05
Mode : TViewModeSet; //kt 8/09
BoilerplateIsHTML : boolean;//kt 8/09
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
if frmFrame.Timedout then Exit;
FNewIDChild := IsIDChild;
EnableAutosave := FALSE;
TmpBoilerPlate := nil;
try
ClearEditControls;
FEditNote.Lines.Free; //(done d/t full wipe-out on line below} //kt 8/09
FillChar(FEditNote, SizeOf(FEditNote), 0); //v15.7
FEditNote.Lines := TStringList.Create; //Freed in Destructor //kt 8/09
with FEditNote do
begin
DocType := TYP_PROGRESS_NOTE;
IsNewNote := True;
Title := DfltNoteTitle;
TitleName := DfltNoteTitleName;
if IsIDChild and (not CanTitleBeIDChild(Title, WhyNot)) then
begin
Title := 0;
TitleName := '';
end;
if IsSurgeryTitle(Title) then // Don't want surgery title sneaking in unchallenged
begin
Title := 0;
TitleName := '';
end;
//DateTime := FMNow; //kt 6-1-05
DateTime := Encounter.DateTime; //kt 6-1-05
//kt begin changes -------------- 6-1-05
if LastAuthor<>0 then begin
Author := LastAuthor;
AuthorName := LastAuthorName;
end else begin
Author := User.DUZ;
AuthorName := User.Name;
end;
//kt 6-1-05 Author := User.DUZ;
//kt 6-1-05 AuthorName := User.Name;
//kt end changes -------------- 6-1-05
Location := Encounter.Location;
LocationName := Encounter.LocationName;
VisitDate := Encounter.DateTime;
if IsIDChild then
IDParent := AnIDParent
else
IDParent := 0;
// Cosigner & PkgRef, if needed, will be set by fNoteProps
end;
// check to see if interaction necessary to get required fields
GetUnresolvedConsultsInfo;
if LacksRequiredForCreate or VerifyNoteTitle or uUnresolvedConsults.UnresolvedConsultsExist
then HaveRequired := ExecuteNoteProperties(FEditNote, CT_NOTES, IsIDChild, FNewIDChild, '', 0)
else HaveRequired := True;
//kt begin addition 6-1-05 -----------------
LastAuthor := FEditNote.Author;
LastAuthorName := FEditNote.AuthorName;
tempPos := Pos(' - ',LastAuthorName);
if tempPos>0 then begin //trim off title, e.g. "Jones,John - Physician
LastAuthorName:=UpperCase(Trim(MidStr(LastAuthorName,1,tempPos)));
end;
//kt end addition 6-1-05 -----------------
// lock the consult request if there is a consult
with FEditNote do if (PkgIEN > 0) and (PkgPtr = PKG_CONSULTS) then HaveRequired := LockConsultRequest(PkgIEN);
if HaveRequired then
begin
// set up uPCEEdit for entry of new note
uPCEEdit.UseEncounter := True;
uPCEEdit.NoteDateTime := FEditNote.DateTime;
uPCEEdit.PCEForNote(USE_CURRENT_VISITSTR, uPCEShow);
FEditNote.NeedCPT := uPCEEdit.CPTRequired;
// create the note
PutNewNote(CreatedNote, FEditNote);
uPCEEdit.NoteIEN := CreatedNote.IEN;
if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
if CreatedNote.ErrorText = '' then
begin
//x := $$RESOLVE^TIUSRVLO formatted string
//7348^Note Title^3000913^NERD, YOURA (N0165)^1329;Rich Vertigan;VERTIGAN,RICH^8E REHAB MED^complete^Adm: 11/05/98;2981105.095547^ ;^^0^^^2
with FEditNote do
begin
x := IntToStr(CreatedNote.IEN) + U + TitleName + U + FloatToStr(FEditNote.DateTime) + U +
Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
U + U + U + U + U + U + U;
//Link Note to PRF Action
if PRF_IEN <> 0 then
if sCallV('TIU LINK TO FLAG', [CreatedNote.IEN,PRF_IEN,ActionIEN,Patient.DFN]) = '0' then
ShowMessage('TIU LINK TO FLAG: FAILED');
end;
lstNotes.Items.Insert(0, x);
uChanging := True;
tvNotes.Items.BeginUpdate;
if IsIDChild then
begin
tmpNode := tvNotes.FindPieceNode(IntToStr(AnIDParent), 1, U, tvNotes.Items.GetFirstNode);
tmpNode.ImageIndex := IMG_IDNOTE_OPEN;
tmpNode.SelectedIndex := IMG_IDNOTE_OPEN;
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeNoteTreeObject(x));
tmpNode.ImageIndex := IMG_ID_CHILD;
tmpNode.SelectedIndex := IMG_ID_CHILD;
end
else
begin
// tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, 'New Note in Progress', <-- original line. //kt 7/19/2007
tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, DKLangConstW('fNotes_New_Note_in_Progress'), //kt added 7/19/2007
MakeNoteTreeObject('NEW^New Note in Progress^^^^^^^^^^^%^0'));
TORTreeNode(tmpNode).StringData := 'NEW^New Note in Progress^^^^^^^^^^^%^0';
tmpNode.ImageIndex := IMG_TOP_LEVEL;
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeNoteTreeObject(x));
tmpNode.ImageIndex := IMG_SINGLE;
tmpNode.SelectedIndex := IMG_SINGLE;
end;
tmpNode.StateIndex := IMG_NO_IMAGES;
TORTreeNode(tmpNode).StringData := x;
tvNotes.Selected := tmpNode;
tvNotes.Items.EndUpdate;
uChanging := False;
Changes.Add(CH_DOC, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
lstNotes.ItemIndex := 0;
EditingIndex := 0;
SetSubjectVisible(AskSubjectForNotes);
if not assigned(TmpBoilerPlate) then
TmpBoilerPlate := TStringList.Create;
LoadBoilerPlate(TmpBoilerPlate, FEditNote.Title);
FChanged := False;
cmdChangeClick(Self); // will set captions, sign state for Changes
Mode := [vmEdit] + [vmHTML_MODE[fOptionsNotes.DefaultEditHTMLMode]]; //kt 8/09
SetDisplayToHTMLvsText(Mode, nil, VIEW_ACTIVATE_ONLY); // kt 8/09
lstNotesClick(Self); // will make pnlWrite visible
if timAutoSave.Interval <> 0 then EnableAutosave := TRUE;
//kt 6/3/09 original --> if txtSubject.Visible then txtSubject.SetFocus else memNewNote.SetFocus;
if txtSubject.Visible then begin //kt 8/09
txtSubject.SetFocus; //kt 8/09
end else begin //kt 8/09
SetEditorFocus; //kt memNewNote.SetFocus; //kt 8/09
end; //kt 8/09
end else
begin
// if note creation failed or failed to get note lock (both unlikely), unlock consult
with FEditNote do if (PkgIEN > 0) and (PkgPtr = PKG_CONSULTS) then UnlockConsultRequest(0, PkgIEN);
InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
HaveRequired := False;
end; {if CreatedNote.IEN}
end; {if HaveRequired}
if not HaveRequired then
begin
ClearEditControls;
ShowPCEButtons(False);
end;
finally
if assigned(TmpBoilerPlate) then
begin
DocInfo := MakeXMLParamTIU(IntToStr(CreatedNote.IEN), FEditNote);
ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
//kt original --> memNewNote.Lines.Assign(TmpBoilerPlate);
BoilerplateIsHTML := rHTMLTools.IsHTML(TmpBoilerPlate.Text); //kt 8/09
FEditNote.Lines.Assign(TmpBoilerPlate); //kt 8/09
if not ((vmHTML in FViewMode)) and BoilerplateIsHTML then begin //kt 8/09
FViewMode := FViewMode - [vmText] + [vmHTML]; //kt 8/09
end; //kt 8/09
SetDisplayToHTMLvsText(FViewMode,FEditNote.Lines); //kt 8/09
if (vmHTML in FViewMode) then begin //kt 8/09
HtmlEditor.MoveCaretToEnd; //kt 8/09
Application.ProcessMessages; //kt 8/09
end; //kt 8/09
UpdateNoteAuthor(DocInfo);
TmpBoilerPlate.Free;
end;
if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved
timAutoSave.Enabled := True;
end;
frmNotes.pnlWriteResize(Self);
end;
procedure TfrmNotes.SetEditorFocus;
//kt added function 8/09
begin
try
if (vmHTML in FViewMode) then begin //kt 8/09
HtmlEditor.SetFocus; //kt 8/09
end else begin //kt 8/09
memNewNote.SetFocus;
end; //kt 8/09
except
on E: Exception do begin
// ignore error. Info in E
end;
end;
end;
procedure TfrmNotes.InsertAddendum;
{ sets up fields of pnlWrite to write an addendum for the selected note }
const
AS_ADDENDUM = True;
IS_ID_CHILD = False;
var
HaveRequired: Boolean;
CreatedNote: TCreatedDoc;
tmpNode: TTreeNode;
x: string;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
ClearEditControls;
with FEditNote do
begin
DocType := TYP_ADDENDUM;
IsNewNote := False;
Title := TitleForNote(lstNotes.ItemIEN);
TitleName := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
if Copy(TitleName,1,1) = '+' then TitleName := Copy(TitleName, 3, 199);
DateTime := FMNow;
Author := User.DUZ;
AuthorName := User.Name;
x := GetPackageRefForNote(lstNotes.ItemIEN);
if Piece(x, U, 1) <> '-1' then
begin
PkgRef := GetPackageRefForNote(lstNotes.ItemIEN);
PkgIEN := StrToIntDef(Piece(PkgRef, ';', 1), 0);
PkgPtr := Piece(PkgRef, ';', 2);
end;
Addend := lstNotes.ItemIEN;
//Lines := memNewNote.Lines;
// Cosigner, if needed, will be set by fNoteProps
// Location info will be set after the encounter is loaded
end;
// check to see if interaction necessary to get required fields
if LacksRequiredForCreate
then HaveRequired := ExecuteNoteProperties(FEditNote, CT_NOTES, IS_ID_CHILD, False, '', 0)
else HaveRequired := True;
// lock the consult request if there is a consult
if HaveRequired then
with FEditNote do
if (PkgIEN > 0) and (PkgPtr = PKG_CONSULTS) then HaveRequired := LockConsultRequest(PkgIEN);
if HaveRequired then
begin
uPCEEdit.NoteDateTime := FEditNote.DateTime;
uPCEEdit.PCEForNote(FEditNote.Addend, uPCEShow);
FEditNote.Location := uPCEEdit.Location;
FEditNote.LocationName := ExternalName(uPCEEdit.Location, 44);
FEditNote.VisitDate := uPCEEdit.DateTime;
PutAddendum(CreatedNote, FEditNote, FEditNote.Addend);
uPCEEdit.NoteIEN := CreatedNote.IEN;
if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
if CreatedNote.ErrorText = '' then
begin
with FEditNote do
begin
x := IntToStr(CreatedNote.IEN) + U + 'Addendum to ' + TitleName + U + FloatToStr(DateTime) + U +
Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
U + U + U + U + U + U + U;
end;
lstNotes.Items.Insert(0, x);
uChanging := True;
tvNotes.Items.BeginUpdate;
// tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, 'New Addendum in Progress', <-- original line. //kt 7/19/2007
tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, DKLangConstW('fNotes_New_Addendum_in_Progress'), //kt added 7/19/2007
MakeNoteTreeObject('ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0'));
TORTreeNode(tmpNode).StringData := 'ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0';
tmpNode.ImageIndex := IMG_TOP_LEVEL;
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeNoteTreeObject(x));
TORTreeNode(tmpNode).StringData := x;
tmpNode.ImageIndex := IMG_ADDENDUM;
tmpNode.SelectedIndex := IMG_ADDENDUM;
tvNotes.Selected := tmpNode;
tvNotes.Items.EndUpdate;
uChanging := False;
Changes.Add(CH_DOC, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
lstNotes.ItemIndex := 0;
EditingIndex := 0;
SetSubjectVisible(AskSubjectForNotes);
cmdChangeClick(Self); // will set captions, sign state for Changes
lstNotesClick(Self); // will make pnlWrite visible
if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
SetEditorFocus; //kt memNewNote.SetFocus; //kt 8/09
end else
begin
// if note creation failed or failed to get note lock (both unlikely), unlock consult
with FEditNote do if (PkgIEN > 0) and (PkgPtr = PKG_CONSULTS) then UnlockConsultRequest(0, PkgIEN);
InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
HaveRequired := False;
end; {if CreatedNote.IEN}
end; {if HaveRequired}
if not HaveRequired then ClearEditControls;
end;
procedure TfrmNotes.LoadForEdit;
{ retrieves an existing note and places the data in the fields of pnlWrite }
var
tmpNode: TTreeNode;
x: string;
Mode : TViewModeSet; //kt
begin
ClearEditControls;
if not LockConsultRequestAndNote(lstNotes.ItemIEN) then Exit;
EditingIndex := lstNotes.ItemIndex;
Changes.Add(CH_DOC, lstNotes.ItemID, GetTitleText(EditingIndex), '', CH_SIGN_YES);
GetNoteForEdit(FEditNote, lstNotes.ItemIEN);
Mode := [vmEdit] + [vmHTML_MODE[IsHTML(FEditNote.Lines) or (vmHTML in FViewMode)]]; //kt 8/09
SetDisplayToHTMLvsText(Mode,FEditNote.Lines); //kt 8/09
//kt memNewNote.Lines.Assign(FEditNote.Lines); //kt 8/09
FChanged := False;
if FEditNote.Title = TYP_ADDENDUM then
begin
FEditNote.DocType := TYP_ADDENDUM;
FEditNote.TitleName := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
if Copy(FEditNote.TitleName,1,1) = '+' then FEditNote.TitleName := Copy(FEditNote.TitleName, 3, 199);
// if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0 <-- original line. //kt 7/19/2007
if CompareText(Copy(FEditNote.TitleName, 1, 8), DKLangConstW('fNotes_Addendum')) <> 0 //kt added 7/19/2007
// then FEditNote.TitleName := FEditNote.TitleName + 'Addendum to '; <-- original line. //kt 7/19/2007
then FEditNote.TitleName := FEditNote.TitleName + DKLangConstW('fNotes_Addendum_to'); //kt added 7/19/2007
end;
uChanging := True;
tvNotes.Items.BeginUpdate;
tmpNode := tvNotes.FindPieceNode('EDIT', 1, U, nil);
if tmpNode = nil then
begin
// tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, 'Note being edited', <-- original line. //kt 7/19/2007
tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, DKLangConstW('fNotes_Note_being_edited'), //kt added 7/19/2007
MakeNoteTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
end
else
tmpNode.DeleteChildren;
x := lstNotes.Items[lstNotes.ItemIndex];
tmpNode.ImageIndex := IMG_TOP_LEVEL;
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeNoteTreeObject(x));
TORTreeNode(tmpNode).StringData := x;
//if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0 then <-- original line. //kt 7/19/2007
if CompareText(Copy(FEditNote.TitleName, 1, 8), DKLangConstW('fNotes_Addendum')) <> 0 then //kt added 7/19/2007
tmpNode.ImageIndex := IMG_SINGLE
else
tmpNode.ImageIndex := IMG_ADDENDUM;
tmpNode.SelectedIndex := tmpNode.ImageIndex;
tvNotes.Selected := tmpNode;
tvNotes.Items.EndUpdate;
uChanging := False;
uPCEEdit.NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
uPCEEdit.PCEForNote(lstNotes.ItemIEN, uPCEShow);
FEditNote.NeedCPT := uPCEEdit.CPTRequired;
txtSubject.Text := FEditNote.Subject;
SetSubjectVisible(AskSubjectForNotes);
cmdChangeClick(Self); // will set captions, sign state for Changes
lstNotesClick(Self); // will make pnlWrite visible
if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
SetEditorFocus; //kt memNewNote.SetFocus; //kt 8/09
end;
procedure TfrmNotes.SaveEditedNote(var Saved: Boolean);
{ validates fields and sends the updated note to the server }
var
UpdatedNote: TCreatedDoc;
x: string;
EmptyNote : boolean; //kt
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
Saved := False;
if not (vmHTML in FViewMode) then begin //kt 8/09
EmptyNote := (memNewNote.GetTextLen = 0) //kt 8/09
or (not ContainsVisibleChar(memNewNote.Text)); //kt 8/09
end else begin //kt 8/09
EmptyNote := (HtmlEditor.GetTextLen = 0) //kt 8/09
or (not ContainsVisibleChar(HtmlEditor.Text)); //kt 8/09
end; //kt 8/09
//kt 8/09 if (memNewNote.GetTextLen = 0) or (not ContainsVisibleChar(memNewNote.Text)) then
//kt 8/09 begin
if EmptyNote then begin
lstNotes.ItemIndex := EditingIndex;
x := lstNotes.ItemID;
uChanging := True;
tvNotes.Selected := tvNotes.FindPieceNode(x, 1, U, tvNotes.Items.GetFirstNode);
uChanging := False;
tvNotesChange(Self, tvNotes.Selected);
if FSilent or
((not FSilent) and
(InfoBox(GetTitleText(EditingIndex) + TX_EMPTY_NOTE, TC_EMPTY_NOTE, MB_YESNO) = IDYES))
then
begin
FConfirmed := True;
mnuActDeleteClick(Self);
Saved := True;
FDeleted := True;
end
else
FConfirmed := False;
Exit;
end;
//ExpandTabsFilter(memNewNote.Lines, TAB_STOP_CHARS);
if FEditNote.Lines = nil then FEditNote.Lines := TStringList.Create; //kt
//kt 8/09 FEditNote.Lines := memNewNote.Lines;
if (vmHTML in FViewMode) then begin //kt 8/09
SplitToArray(WrapHTML(HtmlEditor.HTMLText), FEditNote.Lines); //kt 8/09
rHTMLTools.InsertSubs(FEditNote.Lines); //kt 4/21/10
end else begin //kt 8/09
FEditNote.Lines.Assign(memNewNote.Lines); //kt 8/09
end; //kt 8/09
//FEditNote.Lines:= SetLinesTo74ForSave(memNewNote.Lines, Self);
FEditNote.Subject := txtSubject.Text;
FEditNote.NeedCPT := uPCEEdit.CPTRequired;
timAutoSave.Enabled := False;
try
PutEditedNote(UpdatedNote, FEditNote, lstNotes.GetIEN(EditingIndex));
finally
timAutoSave.Enabled := True;
end;
// there's no unlocking here since the note is still in Changes after a save
if UpdatedNote.IEN > 0 then
begin
if lstNotes.ItemIndex = EditingIndex then
begin
EditingIndex := -1;
lstNotesClick(Self);
end;
EditingIndex := -1; // make sure EditingIndex reset even if not viewing edited note
Saved := True;
FNewIDChild := False;
FChanged := False;
HTMLEditor.KeyStruck := false; //kt
end else
begin
if not FSilent then
InfoBox(TX_SAVE_ERROR1 + UpdatedNote.ErrorText + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING);
end;
end;
procedure TfrmNotes.SaveCurrentNote(var Saved: Boolean);
{ called whenever a note should be saved - uses IEN to call appropriate save logic }
begin
if EditingIndex < 0 then Exit;
SaveEditedNote(Saved);
end;
{ Form events ------------------------------------------------------------------------------ }
procedure TfrmNotes.FormCreate(Sender: TObject);
var
CacheDir : AnsiString; //kt 9-05
begin
inherited;
//kt --- Begin Modification 9-2005, 8/09 -------------
fOptionsNotes.Loaded; //ported from version .15 1-27-10
CacheDir := ExtractFilePath(ParamStr(0))+ 'Cache'; //kt 9-05
if not DirectoryExists(CacheDir) then CreateDir(CacheDir);
//kt HTMLfilename := CacheDir + '\html_note.html'; //kt 5-05
LastAuthor :=0; //kt 5-05
LastAuthorName:=''; //kt 5-05
DesiredHTMLFontSize := 2; //Used later to downsize during printing.
SetRegHTMLFontSize(DesiredHTMLFontSize); //0=SMALLEST ... 4=LARGEST
//kt Note: On creation, THtmlObj will remember Application.OnMessage. But if
// another object (say a prior THtmlObj) has become active and already
// changed the handler, then there will be a problem. So probably best
// to create them all at once. //kt
HtmlViewer := THtmlObj.Create(pnlHTMLViewer,Application);
HtmlEditor := THtmlObj.Create(pnlHTMLEdit,Application);
TWinControl(HtmlViewer).Parent:=pnlHTMLViewer;
TWinControl(HtmlViewer).Align:=alClient;
HtmlEditor.PrevControl := cmdPCE;
HtmlEditor.NextControl := cmdChange;
//Note: A 'loaded' function will initialize the THtmlObj's, but it can't be
// done until after this constructor is done, and this TfrmNotes has been
// assigned a parent. So done elsewhere.
HtmlViewer.PopupMenu := popNoteMemo;
TWinControl(HtmlEditor).Parent:=pnlHTMLEdit;
TWinControl(HtmlEditor).Align:=alClient;
HtmlEditor.PopupMenu := popNoteMemo;
cbFontNames.Items.Assign(Screen.Fonts);
FViewMode := [vmView,vmText];
FHTMLEditMode := emNone;
HTMLViewer.BackgroundColor := ReadOnlyColor;
//kt --- End Modification 9-2005, 8/09 ------
PageID := CT_NOTES;
memNote.Color := ReadOnlyColor;
memPCEShow.Color := ReadOnlyColor;
lblNewTitle.Color := ReadOnlyColor;
EditingIndex := -1;
FEditNote.LastCosigner := 0;
FEditNote.LastCosignerName := '';
FLastNoteID := '';
frmDrawers := TfrmDrawers.CreateDrawers(Self, pnlDrawers, [],[]);
frmDrawers.Align := alBottom;
frmDrawers.RichEditControl := memNewNote;
frmDrawers.HTMLEditControl := HtmlEditor; //kt 8/09
frmDrawers.HTMLModeSwitcher := SetHTMLEditMode; //kt 8/09
frmDrawers.NewNoteButton := cmdNewNote;
frmDrawers.Splitter := splDrawers;
frmDrawers.DefTempPiece := 1;
tvNotes.Images := dmodShared.imgNotes;
tvNotes.StateImages := dmodShared.imgImages;
lvNotes.StateImages := dmodShared.imgImages;
lvNotes.SmallImages := dmodShared.imgNotes;
FImageFlag := TBitmap.Create;
FDocList := TStringList.Create;
TAccessibleTreeView.WrapControl(tvNotes);
RestoreRegHTMLFontSize; //kt, elh 8/09
end;
procedure TfrmNotes.pnlRightResize(Sender: TObject);
{ memNote (TRichEdit) doesn't repaint appropriately unless it's parent panel is refreshed }
begin
inherited;
pnlRight.Refresh;
if (vmHTML in FViewMode) then begin //kt 8/09
HTMLViewer.Repaint; //kt 8/09
end else begin //kt 8/09
memNote.Repaint
end; //kt 8/09
end;
procedure TfrmNotes.pnlWriteResize(Sender: TObject);
const
LEFT_MARGIN = 4;
begin
inherited;
//kt NOTE: I don't know how to do the equivalent for HTML. Actually, I don't think it applies.
LimitEditWidth(memNewNote, MAX_PROGRESSNOTE_WIDTH - 1);
//CQ7012 Added test for nil
if memNewNote <> nil then
memNewNote.Constraints.MinWidth := TextWidthByFont(memNewNote.Font.Handle, StringOfChar('X', MAX_PROGRESSNOTE_WIDTH)) + (LEFT_MARGIN * 2) + ScrollBarWidth;
//CQ7012 Added test for nil
if (Self <> nil) and (pnlLeft <> nil) and (pnlWrite <> nil) and (sptHorz <> nil) then
pnlLeft.Width := self.ClientWidth - pnlWrite.Width - sptHorz.Width;
end;
{ Left panel (selector) events ------------------------------------------------------------- }
procedure TfrmNotes.lstNotesClick(Sender: TObject);
{ loads the text for the selected note or displays the editing panel for the selected note }
var
Note : TStrings; //kt 6/09. Will be pointer to FViewNote, or FEditNote.Lines
Editing : boolean; //kt 8/09
Mode : TViewModeSet; //kt 8/09
IsHTML : boolean; //kt 8/09
begin
inherited;
//kt 8/09 with lstNotes do if ItemIndex = -1 then Exit
//kt 8/09 else if ItemIndex = EditingIndex then
with lstNotes do begin //kt 8/09
if ItemIndex = -1 then Exit; //kt 8/09
Editing := (ItemIndex = EditingIndex); //kt 8/09
if Editing then begin //kt 8/09
if FEditNote.Lines = nil then FEditNote.Lines := TStringList.Create; //kt 8/09
Note := FEditNote.Lines; //kt 8/09
mnuViewDetail.Enabled := False;
if (FEditNote.IDParent <> 0) and (not FNewIDChild) then
mnuActChange.Enabled := False
else
mnuActChange.Enabled := True;
mnuActLoadBoiler.Enabled := True;
UpdateReminderFinish;
Mode := [vmEdit] + [vmHTML_MODE[(FHTMLEditMode=emHTML)]]; //kt 8/09
SetDisplayToHTMLvsText(Mode,FEditNote.Lines,VIEW_ACTIVATE_ONLY); //kt 8/09
FWarmedUp := true; //kt 8/09
end else begin
// StatusText('Retrieving selected progress note...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Retrieving_selected_progress_notexxx')); //kt added 7/19/2007
Screen.Cursor := crAppStart; //kt changed from crHourGlass; 1/1/05
//kt 8/09 pnlRead.Visible := True;
//kt 8/09 pnlWrite.Visible := False;
UpdateReminderFinish;
lblTitle.Caption := Piece(Piece(Items[ItemIndex], U, 8), ';', 1) + #9 + Piece(Items[ItemIndex], U, 2) + ', ' +
Piece(Items[ItemIndex], U, 6) + ', ' + Piece(Piece(Items[ItemIndex], U, 5), ';', 2) +
' (' + FormatFMDateTime('mmm dd,yy@hh:nn', MakeFMDateTime(Piece(Items[ItemIndex], U, 3)))
+ ')';
lvNotes.Caption := lblTitle.Caption;
//kt 8/09 LoadDocumentText(memNote.Lines, ItemIEN);
LoadDocumentText(FViewNote, ItemIEN); //kt 8/09
Note := FViewNote; //kt 8/09
memNote.SelStart := 0;
mnuViewDetail.Enabled := True;
mnuViewDetail.Checked := False;
mnuActChange.Enabled := False;
mnuActLoadBoiler.Enabled := False;
Screen.Cursor := crDefault;
StatusText('');
IsHTML := rHTMLTools.IsHTML(FViewNote); //kt 8/09
Mode := [vmView] + [vmHTML_MODE[IsHTML]]; //kt 8/09
SetDisplayToHTMLvsText(Mode,FViewNote); //kt 8/09
if not FWarmedUp and IsHTML then begin //kt 8/09
FWarmedUp := true; //kt 8/09
//First HTML page won't display without this... //kt 8/09
SetDisplayToHTMLvsText(Mode,FViewNote); //kt 8/09
end; //kt 8/09
end;
end; //kt 8/09
if(assigned(frmReminderTree)) then frmReminderTree.EnableActions;
//DisplayPCE; //kt 5-31-05 (moved down below)
pnlRight.Refresh;
ProperRepaint(Editing); //kt 8/09
//kt 8/09 memNewNote.Repaint;
//kt 8/09 memNote.Repaint;
NotifyOtherApps(NAE_REPORT, 'TIU^' + lstNotes.ItemID);
frmImages.NewNoteSelected(Editing); //kt 9/05
DisplayPCE; //kt 5-31-05 (move down from above)
BroadcastImages(Note); //kt 8/09
end;
procedure TfrmNotes.ProperRepaint(Editing : Boolean);
//kt Added function 8/09
begin
if Editing then begin
if (vmHTML in FViewMode) then begin
HtmlEditor.Repaint;
end else begin
memNewNote.Repaint;
end;
end else begin
if (vmHTML in FViewMode) then begin
HtmlViewer.Repaint;
end else begin
memNote.Repaint;
end;
end;
Application.ProcessMessages;
end;
procedure TfrmNotes.BroadcastImages(Note: TStrings);
//kt added function 8/09
var
ImageList : TStringList;
i : integer;
begin
ImageList := TStringList.Create;
if rHTMLTools.CheckForImageLink(Note, ImageList) then begin
for i:= 0 to ImageList.Count-1 do begin
NotifyOtherApps(NAE_REPORT, 'IMAGE^' + ImageList.Strings[i]);
end;
end;
ImageList.Free;
end;
function TfrmNotes.EditorHasText : boolean;
//kt added function 8/09
begin
if (vmHTML in FViewMode) then begin
//kt Result := (HTMLViewer.Text <> '');
Result := (HTMLEditor.Text <> ''); // kt 7/10
end else begin
//kt Result := (memNote.Lines.Count > 0);
Result := (memNewNote.GetTextLen > 0); //kt 7/10
end;
end;
procedure TfrmNotes.cmdNewNoteClick(Sender: TObject);
//{ maps 'New Note' button to the New Progress Note menu item } <-- original line. //kt 7/19/2007
{ maps DKLangConstW('fNotes_New_Note') button to the New Progress Note menu item } //kt added 7/19/2007
begin
inherited;
mnuActNewClick(Self);
end;
procedure TfrmNotes.cmdPCEClick(Sender: TObject);
var
Refresh: boolean;
ActionSts: TActionRec;
AnIEN: integer;
PCEObj, tmpPCEEdit: TPCEData;
procedure UpdateEncounterInfo;
begin
if not FEditingNotePCEObj then
begin
PCEObj := nil;
AnIEN := lstNotes.ItemIEN;
//kt 8/09 if (AnIEN <> 0) and (memNote.Lines.Count > 0) then
if (AnIEN <> 0) and EditorHasText then //kt 8/09
begin
ActOnDocument(ActionSts, AnIEN, 'VIEW');
if ActionSts.Success then
begin
uPCEShow.CopyPCEData(uPCEEdit);
PCEObj := uPCEEdit;
end;
end;
Refresh := EditPCEData(PCEObj);
end
else
begin
UpdatePCE(uPCEEdit);
Refresh := TRUE;
end;
if Refresh and (not frmFrame.Closing) then
DisplayPCE;
end;
begin
inherited;
cmdPCE.Enabled := FALSE;
if lstNotes.ItemIndex <> EditingIndex then
// save uPCEEdit for note being edited, before updating current note's encounter, then restore (RV - TAM-0801-31056)
begin
tmpPCEEdit := TPCEData.Create;
try
uPCEEdit.CopyPCEData(tmpPCEEdit);
UpdateEncounterInfo;
tmpPCEEdit.CopyPCEData(uPCEEdit);
finally
tmpPCEEdit.Free;
end;
end
else
// no other note being edited, so just proceed as before.
UpdateEncounterInfo;
if cmdPCE <> nil then
cmdPCE.Enabled := TRUE
end;
{ Right panel (editor) events -------------------------------------------------------------- }
procedure TfrmNotes.mnuActChangeClick(Sender: TObject);
begin
inherited;
if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
cmdChangeClick(Sender);
end;
procedure TfrmNotes.mnuActLoadBoilerClick(Sender: TObject);
var
NoteEmpty: Boolean;
BoilerText: TStringList;
DocInfo: string;
procedure AssignBoilerText;
begin
ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
SetDisplayToHTMLvsText([vmHTML,vmEdit],BoilerText); //kt 8/09
//kt 8/09 memNewNote.Lines.Assign(BoilerText);
UpdateNoteAuthor(DocInfo);
FChanged := False;
end;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
BoilerText := TStringList.Create;
try
if (vmHTML in FViewMode) then begin //kt 8/09
NoteEmpty := (HTMLEditor.Text = ''); //kt 8/09
end else begin //kt 8/09
NoteEmpty := memNewNote.Text = '';
end; //kt 8/09
LoadBoilerPlate(BoilerText, FEditNote.Title);
if (BoilerText.Text <> '') or
assigned(GetLinkedTemplate(IntToStr(FEditNote.Title), ltTitle)) then
begin
DocInfo := MakeXMLParamTIU(IntToStr(lstNotes.ItemIEN), FEditNote);
if NoteEmpty then AssignBoilerText else
begin
case QueryBoilerPlate(BoilerText) of
0: { do nothing } ; // ignore
1: begin
ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
if (vmHTML in FViewMode) then begin //kt 8/09
HTMLEditor.Text := HTMLEditor.Text + Text2HTML(BoilerText); //kt 8/09
end else begin //kt 8/09
memNewNote.Lines.AddStrings(BoilerText); // append
end; //kt 8/09
UpdateNoteAuthor(DocInfo);
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)
if (InfoBox(TX_BLR_CLEAR, TC_BLR_CLEAR, MB_YESNO) = ID_YES) then begin
if (vmHTML in FViewMode) then begin //kt 8/09
HTMLEditor.Clear; //kt 8/09
end else begin //kt 8/09
memNewNote.Lines.Clear;
end; //kt 8/09
end;
end;
end; {if BoilerText.Text <> ''}
finally
BoilerText.Free;
end;
end;
procedure TfrmNotes.cmdChangeClick(Sender: TObject);
var
LastTitle, LastConsult: Integer;
OKPressed, IsIDChild: Boolean;
x: string;
DisAssoText : String;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
IsIDChild := uIDNotesActive and (FEditNote.IDParent > 0);
LastTitle := FEditNote.Title;
FEditNote.IsNewNote := False;
DisAssoText := '';
if (FEditNote.PkgPtr = PKG_CONSULTS) then
// DisAssoText := 'Consults'; <-- original line. //kt 7/19/2007
DisAssoText := DKLangConstW('fNotes_Consults'); //kt added 7/19/2007
if (FEditNote.PkgPtr = PKG_PRF) then
// DisAssoText := 'Patient Record Flags'; <-- original line. //kt 7/19/2007
DisAssoText := DKLangConstW('fNotes_Patient_Record_Flags'); //kt added 7/19/2007
if (DisAssoText <> '') and (Sender <> Self) then
// if InfoBox('If this title is changed, Any '+DisAssoText+' will be disassociated'+ <-- original line. //kt 7/19/2007
if InfoBox(DKLangConstW('fNotes_If_this_title_is_changedx_Any')+' '+DisAssoText+DKLangConstW('fNotes_will_be_disassociated')+ //kt added 7/19/2007
// ' with this note', <-- original line. //kt 7/19/2007
DKLangConstW('fNotes_with_this_note'), //kt added 7/19/2007
// 'Disassociate '+DisAssoText+'?',MB_OKCANCEL) = IDCANCEL then <-- original line. //kt 7/19/2007
DKLangConstW('fNotes_Disassociate')+DisAssoText+'?',MB_OKCANCEL) = IDCANCEL then //kt added 7/19/2007
exit;
if FEditNote.PkgPtr = PKG_CONSULTS then LastConsult := FEditNote.PkgIEN else LastConsult := 0;;
if Sender <> Self then OKPressed := ExecuteNoteProperties(FEditNote, CT_NOTES, IsIDChild, FNewIDChild, '', 0)
else OKPressed := True;
if not OKPressed then Exit;
// update display fields & uPCEEdit
lblNewTitle.Caption := ' ' + FEditNote.TitleName + ' ';
//if (FEditNote.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), 'Addendum') <> 0) <-- original line. //kt 7/19/2007
if (FEditNote.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), DKLangConstW('fNotes_Addendum')) <> 0) //kt added 7/19/2007
// then lblNewTitle.Caption := ' Addendum to:' + lblNewTitle.Caption; <-- original line. //kt 7/19/2007
then lblNewTitle.Caption := DKLangConstW('fNotes_Addendum_tox') + lblNewTitle.Caption; //kt added 7/19/2007
with lblNewTitle do bvlNewTitle.SetBounds(Left - 1, Top - 1, Width + 2, Height + 2);
lblRefDate.Caption := FormatFMDateTime('mmm dd,yyyy@hh:nn', FEditNote.DateTime);
lblAuthor.Caption := FEditNote.AuthorName;
if uPCEEdit.Inpatient then x := 'Adm: ' else x := 'Vst: ';
x := x + FormatFMDateTime('mm/dd/yy', FEditNote.VisitDate) + ' ' + FEditNote.LocationName;
lblVisit.Caption := x;
if Length(FEditNote.CosignerName) > 0
// then lblCosigner.Caption := 'Expected Cosigner: ' + FEditNote.CosignerName <-- original line. //kt 7/19/2007
then lblCosigner.Caption := DKLangConstW('fNotes_Expected_Cosignerx') + FEditNote.CosignerName //kt added 7/19/2007
else lblCosigner.Caption := '';
uPCEEdit.NoteTitle := FEditNote.Title;
// modify signature requirements if author or cosigner changed
if (User.DUZ <> FEditNote.Author) and (User.DUZ <> FEditNote.Cosigner)
then Changes.ReplaceSignState(CH_DOC, lstNotes.ItemID, CH_SIGN_NA)
else Changes.ReplaceSignState(CH_DOC, lstNotes.ItemID, CH_SIGN_YES);
x := lstNotes.Items[EditingIndex];
SetPiece(x, U, 2, lblNewTitle.Caption);
SetPiece(x, U, 3, FloatToStr(FEditNote.DateTime));
tvNotes.Selected.Text := MakeNoteDisplayText(x);
TORTreeNode(tvNotes.Selected).StringData := x;
lstNotes.Items[EditingIndex] := x;
Changes.ReplaceText(CH_DOC, lstNotes.ItemID, GetTitleText(EditingIndex));
with FEditNote do
begin
if (PkgPtr = PKG_CONSULTS) and (LastConsult <> PkgIEN) then
begin
// try to lock the new consult, reset to previous if unable
if (PkgIEN > 0) and not LockConsultRequest(PkgIEN) then
begin
Infobox(TX_NO_ORD_CHG, TC_NO_ORD_CHG, MB_OK);
PkgIEN := LastConsult;
end else
begin
// unlock the previous consult
if LastConsult > 0 then UnlockOrderIfAble(GetConsultOrderIEN(LastConsult));
if PkgIEN = 0 then FOrderID := '';
end;
end;
//Link Note to PRF Action
if PRF_IEN <> 0 then
if sCallV('TIU LINK TO FLAG', [lstNotes.ItemIEN,PRF_IEN,ActionIEN,Patient.DFN]) = '0' then
ShowMessage('TIU LINK TO FLAG: FAILED');
end;
if LastTitle <> FEditNote.Title then mnuActLoadBoilerClick(Self);
end;
procedure TfrmNotes.memNewNoteChange(Sender: TObject);
begin
inherited;
//kt 8/09 NOTE: the equivalent functionality for HTML is HTMLEditor.Keystruck. Don't have to set here.
FChanged := True;
end;
procedure TfrmNotes.pnlFieldsResize(Sender: TObject);
{ center the reference date on the panel }
begin
inherited;
lblRefDate.Left := (pnlFields.Width - lblRefDate.Width) div 2;
if lblRefDate.Left < (lblNewTitle.Left + lblNewTitle.Width + 6)
then lblRefDate.Left := (lblNewTitle.Left + lblNewTitle.Width);
end;
procedure TfrmNotes.DoAutoSave(Suppress: integer = 1);
var
ErrMsg: string;
Changed : boolean; //kt 8/09
begin
Changed := false; //kt 8/09
if (vmHTML in FViewMode) then begin //kt 8/09
Changed := HTMLEditor.KeyStruck; //kt 8/09
end else begin //kt 8/09
Changed := FChanged; //kt 8/09
end; //kt 8/09
//kt 8/09 if (EditingIndex > -1) and FChanged then
if (EditingIndex > -1) and Changed then //kt 8/09
begin
// StatusText('Autosaving note...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Autosaving_notexxx')); //kt added 7/19/2007
//PutTextOnly(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex));
timAutoSave.Enabled := False;
try
if (vmHTML in FViewMode) then begin //kt
rHTMLTools.SplitToArray (HTMLEditor.HTMLText, FEditNote.Lines); //kt
SetText(ErrMsg, FEditNote.Lines, lstNotes.GetIEN(EditingIndex),Suppress);//kt
end else begin //kt
SetText(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex), Suppress);
end; //kt
finally
timAutoSave.Enabled := True;
end;
FChanged := False;
HTMLEditor.KeyStruck := false; //kt
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 TfrmNotes.timAutoSaveTimer(Sender: TObject);
begin
inherited;
DoAutoSave;
end;
{ View menu events ------------------------------------------------------------------------- }
procedure TfrmNotes.mnuViewClick(Sender: TObject);
{ changes the list of notes available for viewing }
var
AuthCtxt: TAuthorContext;
SearchCtxt: TSearchContext; // Text Search CQ: HDS00002856
DateRange: TNoteDateRange;
Saved: Boolean;
begin
inherited;
// save note at EditingIndex?
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
FLastNoteID := lstNotes.ItemID;
mnuViewDetail.Checked := False;
//StatusText('Retrieving progress note list...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Retrieving_progress_note_listxxx')); //kt added 7/19/2007
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);
// lblNotes.Caption := 'Last ' + IntToStr(ReturnMaxNotes) + ' Notes'; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_Last') + IntToStr(ReturnMaxNotes) + DKLangConstW('fNotes_Notes'); //kt added 7/19/2007
FCurrentContext.Status := IntToStr(ViewContext);
FCurrentContext.MaxDocs := ReturnMaxNotes;
LoadNotes;
end;
NC_ALL: begin
FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
// lblNotes.Caption := 'All Signed Notes'; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_All_Signed_Notes'); //kt added 7/19/2007
FCurrentContext.Status := IntToStr(ViewContext);
LoadNotes;
end;
NC_UNSIGNED: begin
FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
// lblNotes.Caption := 'Unsigned Notes'; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_Unsigned_Notes'); //kt added 7/19/2007
FCurrentContext.Status := IntToStr(ViewContext);
LoadNotes;
end;
// Text Search CQ: HDS00002856 --------------------
NC_SEARCHTEXT: begin;
SearchTextStopFlag := False;
SelectSearchText(Font.Size, FCurrentContext.SearchString, SearchCtxt );
with SearchCtxt do if Changed then
begin
//FCurrentContext.Status := IntToStr(ViewContext);
frmSearchStop.Show;
// lblNotes.Caption := 'Search: '+ SearchString; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_Searchx')+ SearchString; //kt added 7/19/2007
frmSearchStop.lblSearchStatus.Caption := lblNotes.Caption;
FCurrentContext.SearchString := SearchString;
LoadNotes;
end;
// Only do LoadNotes if something changed
end;
// Text Search CQ: HDS00002856 --------------------
NC_UNCOSIGNED: begin
FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
// lblNotes.Caption := 'Uncosigned Notes'; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_Uncosigned_Notes'); //kt added 7/19/2007
FCurrentContext.Status := IntToStr(ViewContext);
LoadNotes;
end;
NC_BY_AUTHOR: begin
SelectAuthor(Font.Size, FCurrentContext, AuthCtxt);
with AuthCtxt do if Changed then
begin
FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
// lblNotes.Caption := AuthorName + ': Signed Notes'; <-- original line. //kt 7/19/2007
lblNotes.Caption := AuthorName + DKLangConstW('fNotes_x_Signed_Notes'); //kt added 7/19/2007
FCurrentContext.Status := IntToStr(NC_BY_AUTHOR);
FCurrentContext.Author := Author;
FCurrentContext.TreeAscending := Ascending;
LoadNotes;
end;
end;
NC_BY_DATE: begin
SelectNoteDateRange(Font.Size, FCurrentContext, DateRange);
with DateRange do if Changed then
begin
FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
lblNotes.Caption := FormatFMDateTime('mmm dd,yy', FMBeginDate) + ' to ' +
FormatFMDateTime('mmm dd,yy', FMEndDate) + ': Signed Notes';
FCurrentContext.BeginDate := BeginDate;
FCurrentContext.EndDate := EndDate;
FCurrentContext.FMBeginDate := FMBeginDate;
FCurrentContext.FMEndDate := FMEndDate;
FCurrentContext.TreeAscending := Ascending;
FCurrentContext.Status := IntToStr(NC_BY_DATE);
LoadNotes;
end;
end;
NC_CUSTOM: begin
if Sender is TMenuItem then
begin
SelectTIUView(Font.Size, True, FCurrentContext, uTIUContext);
//lblNotes.Caption := 'Custom List';
end;
with uTIUContext do if Changed then
begin
//if not (Sender is TMenuItem) then lblNotes.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;
LoadNotes;
end;
end;
end; {case}
lblNotes.Caption := SetNoteTreeLabel(FCurrentContext);
// Text Search CQ: HDS00002856 --------------------
If FCurrentContext.SearchString <> '' then
// lblNotes.Caption := lblNotes.Caption+', containing "'+FCurrentContext.SearchString+'"'; <-- original line. //kt 7/19/2007
lblNotes.Caption := lblNotes.Caption+DKLangConstW('fNotes_x_containing_x')+FCurrentContext.SearchString+'"'; //kt added 7/19/2007
If SearchTextStopFlag=True then begin;
// lblNotes.Caption := 'Search for "'+FCurrentContext.SearchString+'" was stopped!'; <-- original line. //kt 7/19/2007
lblNotes.Caption := DKLangConstW('fNotes_Search_for_x')+FCurrentContext.SearchString+DKLangConstW('fNotes_x_was_stoppedx'); //kt added 7/19/2007
end;
frmSearchStop.Hide;
// Text Search CQ: HDS00002856 --------------------
lblNotes.hint := lblNotes.Caption;
tvNotes.Caption := lblNotes.Caption;
StatusText('');
end;
{ Action menu events ----------------------------------------------------------------------- }
function TfrmNotes.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
SetupVars; //kt added 7/19/2007 to replace constants with vars.
FStarting := False;
Result := True;
cmdNewNote.Enabled := False;
if EditingIndex > -1 then
begin
FStarting := True;
case NewNoteType of
NT_ACT_ADDENDUM: begin
Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE3;
CapMsg := TC_NEW_SAVE3;
end;
NT_ACT_EDIT_NOTE: begin
Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE4;
CapMsg := TC_NEW_SAVE4;
end;
NT_ACT_ID_ENTRY: begin
Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE5;
CapMsg := TC_NEW_SAVE5;
end;
else
begin
Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE2;
CapMsg := TC_NEW_SAVE2;
end;
end;
if InfoBox(Msg, CapMsg, MB_YESNO) = IDNO then
begin
Result := False;
FStarting := False;
end
else
begin
SaveCurrentNote(Saved);
if not Saved then Result := False else LoadNotes;
FStarting := False;
end;
end;
cmdNewNote.Enabled := (Result = False) and (FStarting = False);
end;
procedure TfrmNotes.mnuActNewClick(Sender: TObject);
const
IS_ID_CHILD = False;
{ switches to current new note or creates a new note if none is being edited already }
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if not StartNewEdit(NT_ACT_NEW_NOTE) then Exit;
//LoadNotes;
// 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);
ShowPCEButtons(False);
Exit;
end;
InsertNewNote(IS_ID_CHILD, 0);
end;
procedure TfrmNotes.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
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
AnIDParent := lstNotes.ItemIEN;
if not StartNewEdit(NT_ACT_ID_ENTRY) then Exit;
//LoadNotes;
with tvNotes 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;
InsertNewNote(IS_ID_CHILD, AnIDParent);
end;
procedure TfrmNotes.mnuActAddendClick(Sender: TObject);
{ make an addendum to an existing note }
var
ActionSts: TActionRec;
ANoteID: string;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if lstNotes.ItemIEN <= 0 then Exit;
ANoteID := lstNotes.ItemID;
if not StartNewEdit(NT_ACT_ADDENDUM) then Exit;
//LoadNotes;
with tvNotes do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
if lstNotes.ItemIndex = EditingIndex then
begin
InfoBox(TX_ADDEND_NO, TX_ADDEND_MK, MB_OK);
Exit;
end;
ActOnDocument(ActionSts, lstNotes.ItemIEN, 'MAKE ADDENDUM');
if not ActionSts.Success then
begin
InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
Exit;
end;
with lstNotes do if TitleForNote(lstNotes.ItemIEN) = TYP_ADDENDUM then
begin
InfoBox(TX_ADDEND_AD, TX_ADDEND_MK, MB_OK);
Exit;
end;
InsertAddendum;
end;
procedure TfrmNotes.mnuActDetachFromIDParentClick(Sender: TObject);
var
DocID, WhyNot: string;
Saved: boolean;
SavedDocID: string;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
if lstNotes.ItemIEN = 0 then exit;
SavedDocID := lstNotes.ItemID;
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;
if not CanBeAttached(PDocTreeObject(tvNotes.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: ' + tvNotes.Selected.Text + CRLF + CRLF +
' FROM: ' + tvNotes.Selected.Parent.Text + CRLF + CRLF +
// 'Are you sure?', TX_DETACH_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) <-- original line. //kt 7/19/2007
DKLangConstW('fNotes_Are_you_surex'), TX_DETACH_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) //kt added 7/19/2007
then Exit;
DocID := PDocTreeObject(tvNotes.Selected.Data)^.DocID;
SavedDocID := PDocTreeObject(tvNotes.Selected.Parent.Data)^.DocID;
if DetachEntryFromParent(DocID, WhyNot) then
begin
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
if tvNotes.Selected <> nil then tvNotes.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 TfrmNotes.mnuActSignListClick(Sender: TObject);
{ add the note to the Encounter object, see mnuActSignClick - copied}
const
SIG_COSIGN = 'COSIGNATURE';
SIG_SIGN = 'SIGNATURE';
var
ActionType, SignTitle: string;
ActionSts: TActionRec;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if lstNotes.ItemIEN = 0 then Exit;
if lstNotes.ItemIndex = EditingIndex then Exit; // already in signature list
if not NoteHasText(lstNotes.ItemIEN) then
begin
InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
Exit;
end;
if not LastSaveClean(lstNotes.ItemIEN) and
(InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
if CosignDocument(lstNotes.ItemIEN) then
begin
SignTitle := TX_COSIGN;
ActionType := SIG_COSIGN;
end else
begin
SignTitle := TX_SIGN;
ActionType := SIG_SIGN;
end;
ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
if not ActionSts.Success then
begin
InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
Exit;
end;
LockConsultRequestAndNote(lstNotes.ItemIEN);
with lstNotes do Changes.Add(CH_DOC, ItemID, GetTitleText(ItemIndex), '', CH_SIGN_YES);
end;
procedure TfrmNotes.RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
begin
if IEN = NT_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 TfrmNotes.mnuActDeleteClick(Sender: TObject);
{ delete the selected progress note & remove from the Encounter object if necessary }
var
DeleteSts, ActionSts: TActionRec;
SaveConsult, SavedDocIEN: Integer;
ReasonForDelete, AVisitStr, SavedDocID, x: string;
Saved: boolean;
const
ATTACHED_IMAGES_SERVER_REPLY = 'You must "delete" the Images using the Imaging package before proceeding.';
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if lstNotes.ItemIEN = 0 then Exit;
ActOnDocument(ActionSts, lstNotes.ItemIEN, 'DELETE RECORD');
if Pos(ATTACHED_IMAGES_SERVER_REPLY, ActionSts.Reason) > 0 then ActionSts.Success := true; //elh 7-13-10
if ShowMsgOn(not ActionSts.Success, ActionSts.Reason, TX_IN_AUTH) then Exit;
ReasonForDelete := SelectDeleteReason(lstNotes.ItemIEN);
if ReasonForDelete = DR_CANCEL then Exit;
if Pos(ATTACHED_IMAGES_SERVER_REPLY, ActionSts.Reason) > 0 then frmImages.DeleteAll(idmDelete); //elh 7-13-10
// suppress prompt for deletion when called from SaveEditedNote (Sender = Self)
if (Sender <> Self) and (InfoBox(MakeNoteDisplayText(lstNotes.Items[lstNotes.ItemIndex]) + TX_DEL_OK,
TX_DEL_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit;
// do the appropriate locking
if not LockConsultRequestAndNote(lstNotes.ItemIEN) then Exit;
// retraction notification message
if JustifyDocumentDelete(lstNotes.ItemIEN) then
InfoBox(TX_RETRACT, TX_RETRACT_CAP, MB_OK);
SavedDocID := lstNotes.ItemID;
SavedDocIEN := lstNotes.ItemIEN;
if (EditingIndex > -1) and (not FConfirmed) and (lstNotes.ItemIndex <> EditingIndex) and (memNewNote.GetTextLen > 0) then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
EditingIndex := -1;
FConfirmed := False;
(* if Saved then
begin
EditingIndex := -1;
mnuViewClick(Self);
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;*)
// remove the note
DeleteSts.Success := True;
x := GetPackageRefForNote(SavedDocIEN);
SaveConsult := StrToIntDef(Piece(x, ';', 1), 0);
AVisitStr := VisitStrForNote(SavedDocIEN);
RemovePCEFromChanges(SavedDocIEN, AVisitStr);
if (SavedDocIEN > 0) and (lstNotes.ItemIEN = SavedDocIEN) then DeleteDocument(DeleteSts, SavedDocIEN, ReasonForDelete);
if not Changes.Exist(CH_DOC, SavedDocID) then UnlockDocument(SavedDocIEN);
Changes.Remove(CH_DOC, SavedDocID); // this will unlock the document if in Changes
UnlockConsultRequest(0, SaveConsult); // note has been deleted, so 1st param = 0
// 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
LoadNotes;
(* with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
if tvNotes.Selected <> nil then tvNotesChange(Self, tvNotes.Selected) else
begin*)
FHTMLEditMode := emNone; //kt 8/09
pnlWrite.Visible := False;
pnlRead.Visible := True;
UpdateReminderFinish;
ShowPCEControls(False);
frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
ShowPCEButtons(FALSE);
//end; {if ItemIndex}
end {if DeleteSts}
else InfoBox(DeleteSts.Reason, TX_DEL_ERR, MB_OK or MB_ICONWARNING);
end;
procedure TfrmNotes.mnuActEditClick(Sender: TObject);
{ load the selected progress note for editing }
var
ActionSts: TActionRec;
ANoteID: string;
begin
inherited;
if lstNotes.ItemIndex = EditingIndex then Exit;
ANoteID := lstNotes.ItemID;
if not StartNewEdit(NT_ACT_EDIT_NOTE) then Exit;
//LoadNotes;
with tvNotes do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
ActOnDocument(ActionSts, lstNotes.ItemIEN, 'EDIT RECORD');
if not ActionSts.Success then
begin
InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
Exit;
end;
LoadForEdit;
end;
procedure TfrmNotes.mnuActSaveClick(Sender: TObject);
{ saves the note that is currently being edited }
var
Saved: Boolean;
SavedDocID: string;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
if EditingIndex > -1 then
begin
SavedDocID := Piece(lstNotes.Items[EditingIndex], U, 1);
FLastNoteID := SavedDocID;
SaveCurrentNote(Saved);
if Saved and (EditingIndex < 0) and (not FDeleted) then
//if Saved then
begin
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;
end
else InfoBox(TX_NO_NOTE, TX_SAVE_NOTE, MB_OK or MB_ICONWARNING);
end;
procedure TfrmNotes.mnuActSignClick(Sender: TObject);
{ sign the currently selected note, save first if necessary }
const
SIG_COSIGN = 'COSIGNATURE';
SIG_SIGN = 'SIGNATURE';
var
Saved, NoteUnlocked: Boolean;
ActionType, ESCode, SignTitle: string;
ActionSts, SignSts: TActionRec;
OK: boolean;
SavedDocID, tmpItem: string;
EditingID: string; //v22.12 - RV
tmpNode: TTreeNode;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
inherited;
(* if lstNotes.ItemIndex = EditingIndex then //v22.12 - RV
begin //v22.12 - RV
SaveCurrentNote(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 := lstNotes.Items[EditingIndex]; //v22.12 - RV
SavedDocID := lstNotes.ItemID;*) //v22.12 - RV
SavedDocID := lstNotes.ItemID; //v22.12 - RV
FLastNoteID := SavedDocID; //v22.12 - RV
if lstNotes.ItemIndex = EditingIndex then //v22.12 - RV
begin //v22.12 - RV
SaveCurrentNote(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 := lstNotes.Items[EditingIndex]; //v22.12 - RV
EditingID := Piece(tmpItem, U, 1); //v22.12 - RV
end; //v22.12 - RV
if not NoteHasText(lstNotes.ItemIEN) then
begin
InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
Exit;
end;
if not LastSaveClean(lstNotes.ItemIEN) and
(InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
if CosignDocument(lstNotes.ItemIEN) then
begin
SignTitle := TX_COSIGN;
ActionType := SIG_COSIGN;
end else
begin
SignTitle := TX_SIGN;
ActionType := SIG_SIGN;
end;
if not LockConsultRequestAndNote(lstNotes.ItemIEN) then Exit;
// no exits after things are locked
NoteUnlocked := False;
ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
if ActionSts.Success then
begin
OK := IsOK2Sign(uPCEShow, lstNotes.ItemIEN);
if frmFrame.Closing then exit;
if(uPCEShow.Updated) then
begin
uPCEShow.CopyPCEData(uPCEEdit);
uPCEShow.Updated := FALSE;
lstNotesClick(Self);
end;
if not AuthorSignedDocument(lstNotes.ItemIEN) then
begin
if (InfoBox(TX_AUTH_SIGNED +
GetTitleText(lstNotes.ItemIndex),TX_SIGN ,MB_YESNO)= ID_NO) then exit;
end;
if(OK) then
begin
with lstNotes do SignatureForItem(Font.Size, MakeNoteDisplayText(Items[ItemIndex]), SignTitle, ESCode);
if Length(ESCode) > 0 then
begin
SignDocument(SignSts, lstNotes.ItemIEN, ESCode);
RemovePCEFromChanges(lstNotes.ItemIEN);
NoteUnlocked := Changes.Exist(CH_DOC, lstNotes.ItemID);
Changes.Remove(CH_DOC, lstNotes.ItemID); // this will unlock if in Changes
if SignSts.Success then
begin
SendMessage(frmConsults.Handle, UM_NEWORDER, ORDER_SIGN, 0); {*REV*}
lstNotesClick(Self);
end
else InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK);
end {if Length(ESCode)}
else
NoteUnlocked := Changes.Exist(CH_DOC, lstNotes.ItemID);
end;
end
else InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
if not NoteUnlocked then UnlockDocument(lstNotes.ItemIEN);
UnlockConsultRequest(lstNotes.ItemIEN);
//SetViewContext(FCurrentContext); //v22.12 - RV
LoadNotes; //v22.12 - RV
//if EditingIndex > -1 then //v22.12 - RV
if (EditingID <> '') then //v22.12 - RV
begin
lstNotes.Items.Insert(0, tmpItem);
// tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, 'Note being edited', <-- original line. //kt 7/19/2007
tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, DKLangConstW('fNotes_Note_being_edited'), //kt added 7/19/2007
MakeNoteTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
tmpNode.ImageIndex := IMG_TOP_LEVEL;
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(tmpItem), MakeNoteTreeObject(tmpItem));
TORTreeNode(tmpNode).StringData := tmpItem;
SetTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext, CT_NOTES);
EditingIndex := lstNotes.SelectByID(EditingID); //v22.12 - RV
end;
//with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode); //v22.12 - RV
with tvNotes do //v22.12 - RV
begin //v22.12 - RV
Selected := FindPieceNode(FLastNoteID, U, Items.GetFirstNode); //v22.12 - RV
if Selected <> nil then
tvNotesChange(Self, Selected) //v22.12 - RV
else
tvNotes.Selected := tvNotes.Items[0]; //first Node in treeview
end; //v22.12 - RV
end;
procedure TfrmNotes.SaveSignItem(const ItemID, ESCode: string);
{ saves and optionally signs a progress note 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
SetupVars; //kt added 7/19/2007 to replace constants with vars.
AnIndex := -1;
IEN := StrToIntDef(ItemID, 0);
if IEN = 0 then Exit;
if frmFrame.TimedOut and (EditingIndex <> -1) then FSilent := True;
with lstNotes do for i := 0 to Items.Count - 1 do if lstNotes.GetIEN(i) = IEN then
begin
AnIndex := i;
break;
end;
if (AnIndex > -1) and (AnIndex = EditingIndex) then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
if FDeleted then
begin
FDeleted := False;
Exit;
end;
AnIndex := lstNotes.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_NOTE1, TC_EMPTY_NOTE, 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 = lstNotes.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;
lstNotesClick(Self);
end
else
uPCEEdit.Clear;
if(OK) then
begin
//if ((not FSilent) and IsSurgeryTitle(TitleForNote(IEN))) then DisplayOpTop(IEN);
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)}
UnlockConsultRequest(IEN);
if (AnIndex = lstNotes.ItemIndex) and (not frmFrame.ContextChanging) then
begin
LoadNotes;
with tvNotes do Selected := FindPieceNode(IntToStr(IEN), U, Items.GetFirstNode);
end;
end;
procedure TfrmNotes.popNoteMemoPopup(Sender: TObject);
const FORMAT_MODE : array[false..true] of string = ('fNotes_Formatted_Text','fNotes_Plain_Text'); //kt 8/09
begin
inherited;
if PopupComponent(Sender, popNoteMemo) is TCustomEdit
then FEditCtrl := TCustomEdit(PopupComponent(Sender, popNoteMemo))
else FEditCtrl := nil;
if FEditCtrl <> nil then
begin
popNoteMemoCut.Enabled := FEditCtrl.SelLength > 0;
popNoteMemoCopy.Enabled := popNoteMemoCut.Enabled;
popNoteMemoPaste.Enabled := (not TORExposedCustomEdit(FEditCtrl).ReadOnly) and
Clipboard.HasFormat(CF_TEXT);
popNoteMemoTemplate.Enabled := frmDrawers.CanEditTemplates and popNoteMemoCut.Enabled;
popNoteMemoFind.Enabled := FEditCtrl.GetTextLen > 0;
end else
begin
popNoteMemoHTMLFormat.Enabled := False; //kt 8/09
popNoteMemoCut.Enabled := False;
popNoteMemoCopy.Enabled := False;
popNoteMemoPaste.Enabled := False;
popNoteMemoTemplate.Enabled := False;
end;
popNoteMemoHTMLFormat.Caption := DKLangConstW('fNotes_Change_Edit_Mode_To') + ' ' + //kt 8/09
DKLangConstW(FORMAT_MODE[(vmHTML in FViewMode)]); //kt 8/09
popNoteMemoHTMLFormat.Enabled := pnlWrite.Visible; //kt 8/09
if pnlWrite.Visible then
begin
//kt 8/09 popNoteMemoSpell.Enabled := True;
//kt 8/09 popNoteMemoGrammar.Enabled := True;
//kt 8/09 popNoteMemoReformat.Enabled := True;
popNoteMemoSpell.Enabled := not pnlHTMLWrite.Visible; //kt 8/09
popNoteMemoGrammar.Enabled := not pnlHTMLWrite.Visible; //kt 8/09
popNoteMemoReformat.Enabled := not pnlHTMLWrite.Visible; //kt 8/09
popNoteMemoReplace.Enabled := (FEditCtrl.GetTextLen > 0);
popNoteMemoPreview.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
popNoteMemoInsTemplate.Enabled := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
end else
begin
popNoteMemoSpell.Enabled := False;
popNoteMemoGrammar.Enabled := False;
popNoteMemoReformat.Enabled := False;
popNoteMemoReplace.Enabled := False;
popNoteMemoPreview.Enabled := False;
popNoteMemoInsTemplate.Enabled := False;
end;
end;
(*//kt 8/09 NOTICE:
On the form, popNoteMenu was edited to add a new item as below
popNoteMemoHTMLFormat : TMenuItem
Captions: ~ Edit as Formatted Text
OnClick -- popNoteMemoHTMLFormatClick
*)
procedure TfrmNotes.popNoteMemoHTMLFormatClick(Sender: TObject);
//kt added function 8/09
begin
inherited;
ToggleHTMLEditMode;
end;
procedure TfrmNotes.popNoteMemoCutClick(Sender: TObject);
begin
inherited;
FEditCtrl.CutToClipboard;
end;
procedure TfrmNotes.popNoteMemoCopyClick(Sender: TObject);
begin
inherited;
FEditCtrl.CopyToClipboard;
end;
procedure TfrmNotes.popNoteMemoPasteClick(Sender: TObject);
begin
inherited;
FEditCtrl.SelText := Clipboard.AsText; {*KCM*}
frmNotes.pnlWriteResize(Self);
//FEditCtrl.PasteFromClipboard; // use AsText to prevent formatting
end;
procedure TfrmNotes.popNoteMemoReformatClick(Sender: TObject);
begin
inherited;
if Screen.ActiveControl <> memNewNote then Exit;
ReformatMemoParagraph(memNewNote);
end;
procedure TfrmNotes.popNoteMemoSaveContinueClick(Sender: TObject);
begin
inherited;
FChanged := True;
DoAutoSave;
end;
procedure TfrmNotes.popNoteMemoFindClick(Sender: TObject);
//var
//hData: THandle; //CQ8300
//pData: ^ClipboardData; //CQ8300
begin
inherited;
SendMessage(TRichEdit(popNoteMemo.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];
{
//CQ8300
OpenClipboard(dlgFindText.Handle);
hData := GetClipboardData(CF_TEXT);
pData := GlobalLock(hData);
FindText := pData^.Text;
GlobalUnlock(hData);
CloseClipboard;
//end CQ8300
}
Execute;
end;
end;
procedure TfrmNotes.dlgFindTextFind(Sender: TObject);
begin
dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
end;
procedure TfrmNotes.popNoteMemoReplaceClick(Sender: TObject);
begin
inherited;
SendMessage(TRichEdit(popNoteMemo.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 TfrmNotes.dlgReplaceTextFind(Sender: TObject);
begin
inherited;
dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
end;
procedure TfrmNotes.dlgReplaceTextReplace(Sender: TObject);
begin
inherited;
dmodShared.ReplaceRichEditText(dlgReplaceText, TRichEdit(popNoteMemo.PopupComponent));
end;
procedure TfrmNotes.popNoteMemoSpellClick(Sender: TObject);
begin
inherited;
DoAutoSave(0);
timAutoSave.Enabled := False;
try
SpellCheckForControl(memNewNote);
finally
FChanged := True;
DoAutoSave(0);
timAutoSave.Enabled := True;
end;
end;
procedure TfrmNotes.popNoteMemoGrammarClick(Sender: TObject);
begin
inherited;
DoAutoSave(0);
timAutoSave.Enabled := False;
try
GrammarCheckForControl(memNewNote);
finally
FChanged := True;
DoAutoSave(0);
timAutoSave.Enabled := True;
end;
end;
procedure TfrmNotes.mnuViewDetailClick(Sender: TObject);
begin
inherited;
if lstNotes.ItemIEN <= 0 then Exit;
mnuViewDetail.Checked := not mnuViewDetail.Checked;
if mnuViewDetail.Checked then
begin
// StatusText('Retrieving progress note details...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Retrieving_progress_note_detailsxxx')); //kt added 7/19/2007
Screen.Cursor := crAppStart; //kt, was crHourGlass;
//kt LoadDetailText(memNote.Lines, lstNotes.ItemIEN);
LoadDetailText(FViewNote, lstNotes.ItemIEN); //kt 8/09
SetDisplayToHTMLvsText(FViewMode,FViewNote); //kt 8/09
Screen.Cursor := crDefault;
StatusText('');
memNote.SelStart := 0;
if not (vmHTML in FViewMode) then //kt 8/09
memNote.Repaint;
end
else
lstNotesClick(Self);
if (vmHTML in FViewMode) then begin //kt 8/09
SendMessage(HTMLViewer.Handle, WM_VSCROLL, SB_TOP, 0); //kt 8/09
end else begin //kt 8/09
SendMessage(memNote.Handle, WM_VSCROLL, SB_TOP, 0);
end; //kt 8/09
end;
procedure TfrmNotes.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;
//kt 8/09 if memNewNote.GetTextLen > 0 then SaveCurrentNote(Saved)
if EditorHasText then SaveCurrentNote(Saved) //kt 8/09
else
begin
IEN := lstNotes.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 TfrmNotes.mnuActIdentifyAddlSignersClick(Sender: TObject);
var
Exclusions: TStrings;
Saved, x, y: boolean;
SignerList: TSignerList;
ActionSts: TActionRec;
SigAction: integer;
SavedDocID: string;
ARefDate: TFMDateTime;
begin
inherited;
if lstNotes.ItemIEN = 0 then exit;
SavedDocID := lstNotes.ItemID;
if lstNotes.ItemIndex = EditingIndex then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;
x := CanChangeCosigner(lstNotes.ItemIEN);
ActOnDocument(ActionSts, lstNotes.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?', <-- original line. //kt 7/19/2007
DKLangConstW('fNotes_Would_you_like_to_change_the_cosignerx'), //kt added 7/19/2007
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;
if not LockConsultRequestAndNote(lstNotes.ItemIEN) then Exit;
Exclusions := GetCurrentSigners(lstNotes.ItemIEN);
ARefDate := StrToFloat(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
SelectAdditionalSigners(Font.Size, lstNotes.ItemIEN, SigAction, Exclusions, SignerList, CT_NOTES, ARefDate);
with SignerList do
begin
case SigAction of
SG_ADDITIONAL: if Changed and (Signers <> nil) and (Signers.Count > 0) then
UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
SG_COSIGNER: if Changed then ChangeCosigner(lstNotes.ItemIEN, Cosigner);
SG_BOTH: if Changed then
begin
if (Signers <> nil) and (Signers.Count > 0) then
UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
ChangeCosigner(lstNotes.ItemIEN, Cosigner);
end;
end;
lstNotesClick(Self);
end;
UnlockDocument(lstNotes.ItemIEN);
UnlockConsultRequest(lstNotes.ItemIEN);
end;
procedure TfrmNotes.popNoteMemoAddlSignClick(Sender: TObject);
begin
inherited;
mnuActIdentifyAddlSignersClick(Self);
end;
procedure TfrmNotes.ProcessNotifications;
var
x: string;
Saved: boolean;
tmpNode: TTreeNode;
AnObject: PDocTreeObject;
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
lblNotes.Caption := Notifications.Text;
tvNotes.Caption := Notifications.Text;
EditingIndex := -1;
lstNotes.Enabled := True ;
pnlRead.BringToFront ;
// show ALL unsigned/uncosigned for a patient, not just the alerted one
// what about cosignature? How to get correct list? ORB FOLLOWUP TYPE = OR alerts only
x := 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;
tvNotes.Items.BeginUpdate;
lstNotes.Clear;
KillDocTreeObjects(tvNotes);
tvNotes.Items.Clear;
lstNotes.Items.Add(x);
AnObject := MakeNoteTreeObject('ALERT^Alerted Note^^^^^^^^^^^%^0');
tmpNode := tvNotes.Items.AddObjectFirst(tvNotes.Items.GetFirstNode, AnObject.NodeText, AnObject);
TORTreeNode(tmpNode).StringData := 'ALERT^Alerted Note^^^^^^^^^^^%^0';
tmpNode.ImageIndex := IMG_TOP_LEVEL;
AnObject := MakeNoteTreeObject(x);
tmpNode := tvNotes.Items.AddChildObjectFirst(tmpNode, AnObject.NodeText, AnObject);
TORTreeNode(tmpNode).StringData := x;
SetTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext, CT_NOTES);
tvNotes.Selected := tmpNode;
tvNotes.Items.EndUpdate;
uChanging := False;
tvNotesChange(Self, tvNotes.Selected);
case Notifications.Followup of
NF_NOTES_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 TfrmNotes.SetViewContext(AContext: TTIUContext);
var
Saved: boolean;
begin
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
FCurrentContext := AContext;
EditingIndex := -1;
tvNotes.Enabled := True ;
pnlRead.BringToFront ;
if FCurrentContext.Status <> '' then with uTIUContext do
begin
BeginDate := FCurrentContext.BeginDate;
EndDate := FCurrentContext.EndDate;
FMBeginDate := FCurrentContext.FMBeginDate;
FMEndDate := FCurrentContext.FMEndDate;
Status := FCurrentContext.Status;
Author := FCurrentContext.Author;
MaxDocs := FCurrentContext.MaxDocs;
ShowSubject := FCurrentContext.ShowSubject;
GroupBy := FCurrentContext.GroupBy;
SortBy := FCurrentContext.SortBy;
ListAscending := FCurrentContext.ListAscending;
TreeAscending := FCurrentContext.TreeAscending;
Keyword := FCurrentContext.Keyword;
SearchField := FCurrentContext.SearchField;
Filtered := FCurrentContext.Filtered;
Changed := True;
mnuViewClick(Self);
end
else
begin
ViewContext := NC_RECENT ;
mnuViewClick(Self);
end;
end;
procedure TfrmNotes.mnuViewSaveAsDefaultClick(Sender: TObject);
//const
//TX_NO_MAX = 'You have not specified a maximum number of notes to be returned.' + CRLF + <-- original line. //kt 7/19/2007
// 'If you save this preference, the result will be that ALL notes for every' + CRLF + <-- original line. //kt 7/19/2007
// 'patient will be saved as your default view.' + CRLF + CRLF + <-- original line. //kt 7/19/2007
// 'For patients with large numbers of notes, this could result in some lengthy' + CRLF + <-- original line. //kt 7/19/2007
// 'delays in loading the list of notes.' + CRLF + CRLF + <-- original line. //kt 7/19/2007
// 'Are you sure you mean to do this?'; <-- original line. //kt 7/19/2007
//TX_REPLACE = 'Replace current defaults?'; <-- original line. //kt 7/19/2007
var
TX_NO_MAX : string; //kt
TX_REPLACE : string; //kt
begin
inherited;
TX_NO_MAX := DKLangConstW('fNotes_You_have_not_specified_a_maximum_number_of_notes_to_be_returnedx') + CRLF + //kt added 7/19/2007
DKLangConstW('fNotes_If_you_save_this_preferencex_the_result_will_be_that_ALL_notes_for_every') + CRLF + //kt added 7/19/2007
DKLangConstW('fNotes_patient_will_be_saved_as_your_default_viewx') + CRLF + CRLF + //kt added 7/19/2007
DKLangConstW('fNotes_For_patients_with_large_numbers_of_notesx_this_could_result_in_some_lengthy') + CRLF + //kt added 7/19/2007
DKLangConstW('fNotes_delays_in_loading_the_list_of_notesx') + CRLF + CRLF + //kt added 7/19/2007
DKLangConstW('fNotes_Are_you_sure_you_mean_to_do_thisx'); //kt added 7/19/2007
TX_REPLACE := DKLangConstW('fNotes_Replace_current_defaultsx'); //kt added 7/19/2007
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
SaveCurrentTIUContext(FCurrentContext);
FDefaultContext := FCurrentContext;
//lblNotes.Caption := 'Default List';
end;
end;
procedure TfrmNotes.mnuViewReturntoDefaultClick(Sender: TObject);
begin
inherited;
SetViewContext(FDefaultContext);
end;
procedure TfrmNotes.popNoteMemoTemplateClick(Sender: TObject);
begin
inherited;
EditTemplates(Self, TRUE, FEditCtrl.SelText);
end;
procedure TfrmNotes.popNoteListPopup(Sender: TObject);
begin
inherited;
N4.Visible := (popNoteList.PopupComponent is TORTreeView);
popNoteListExpandAll.Visible := N4.Visible;
popNoteListExpandSelected.Visible := N4.Visible;
popNoteListCollapseAll.Visible := N4.Visible;
popNoteListCollapseSelected.Visible := N4.Visible;
end;
procedure TfrmNotes.popNoteListExpandAllClick(Sender: TObject);
begin
inherited;
tvNotes.FullExpand;
end;
procedure TfrmNotes.popNoteListCollapseAllClick(Sender: TObject);
begin
inherited;
tvNotes.Selected := nil;
lvNotes.Items.Clear;
memNote.Clear;
HTMLViewer.Clear; //kt 8/09
tvNotes.FullCollapse;
tvNotes.Selected := tvNotes.TopItem;
end;
procedure TfrmNotes.popNoteListExpandSelectedClick(Sender: TObject);
begin
inherited;
if tvNotes.Selected = nil then exit;
with tvNotes.Selected do if HasChildren then Expand(True);
end;
procedure TfrmNotes.popNoteListCollapseSelectedClick(Sender: TObject);
begin
inherited;
if tvNotes.Selected = nil then exit;
with tvNotes.Selected do if HasChildren then Collapse(True);
end;
procedure TfrmNotes.mnuEditTemplatesClick(Sender: TObject);
begin
inherited;
EditTemplates(Self);
end;
procedure TfrmNotes.mnuNewTemplateClick(Sender: TObject);
begin
inherited;
EditTemplates(Self, TRUE);
end;
procedure TfrmNotes.mnuEditSharedTemplatesClick(Sender: TObject);
begin
inherited;
EditTemplates(Self, FALSE, '', TRUE);
end;
procedure TfrmNotes.mnuNewSharedTemplateClick(Sender: TObject);
begin
inherited;
EditTemplates(Self, TRUE, '', TRUE);
end;
procedure TfrmNotes.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 TfrmNotes.SetEditingIndex(const Value: Integer);
begin
FEditingIndex := Value;
if(FEditingIndex < 0) then
KillReminderDialog(Self);
if(assigned(frmReminderTree)) then
frmReminderTree.EnableActions;
end;
function TfrmNotes.CanFinishReminder: boolean;
begin
if(EditingIndex < 0) then
Result := FALSE
else
Result := (lstNotes.ItemIndex = EditingIndex);
end;
procedure TfrmNotes.FormDestroy(Sender: TObject);
begin
//kt note: The Images tab will delete all files in .\Cache, which
// might include HTMLfilename. No harm if already deleted.
//kt 8/09 DeleteFile(HTMLfilename); //kt added 5-2-05
TAccessibleTreeView.UnwrapControl(tvNotes);
FDocList.Free;
FImageFlag.Free;
KillDocTreeObjects(tvNotes);
HtmlEditor.Free; //kt 6/7/09
HtmlViewer.Free; //kt 6/7/09
inherited;
end;
function TfrmNotes.GetDrawers: TFrmDrawers;
begin
Result := frmDrawers;
end;
procedure TfrmNotes.AssignRemForm;
begin
//kt 8/09 ReminderDialog interaction has not yet been debugged with HTML formatted text.
with RemForm do
begin
Form := Self;
PCEObj := uPCEEdit;
RightPanel := pnlRight;
CanFinishProc := CanFinishReminder;
DisplayPCEProc := DisplayPCE;
Drawers := frmDrawers;
NewNoteRE := memNewNote;
NewNoteHTMLE := HTMLEditor; //kt
NoteList := lstNotes;
end;
end;
procedure TfrmNotes.mnuEditDialgFieldsClick(Sender: TObject);
begin
inherited;
EditDialogFields;
end;
//=================== Added for sort/search enhancements ======================
procedure TfrmNotes.LoadNotes;
const
INVALID_ID = -1;
INFO_ID = 1;
var
tmpList: TStringList;
ANode: TORTreeNode;
x,xx,noteId: integer; // Text Search CQ: HDS00002856
Dest: TStrings; // Text Search CQ: HDS00002856
KeepFlag: Boolean; // Text Search CQ: HDS00002856
NoteCount, NoteMatches: integer; // Text Search CQ: HDS00002856
begin
tmpList := TStringList.Create;
try
FDocList.Clear;
uChanging := True;
RedrawSuspend(memNote.Handle);
RedrawSuspend(HTMLViewer.Handle); //kt 8/09
RedrawSuspend(lvNotes.Handle);
tvNotes.Items.BeginUpdate;
lstNotes.Items.Clear;
KillDocTreeObjects(tvNotes);
tvNotes.Items.Clear;
tvNotes.Items.EndUpdate;
lvNotes.Items.Clear;
memNote.Clear;
HTMLViewer.Clear; //kt 8/09
memNote.Invalidate;
lblTitle.Caption := '';
lvNotes.Caption := '';
with FCurrentContext do
begin
if Status <> IntToStr(NC_UNSIGNED) then
begin
ListNotesForTree(tmpList, NC_UNSIGNED, 0, 0, 0, 0, TreeAscending);
if tmpList.Count > 0 then
begin
CreateListItemsforDocumentTree(FDocList, tmpList, NC_UNSIGNED, GroupBy, TreeAscending, CT_NOTES);
UpdateTreeView(FDocList, tvNotes);
end;
tmpList.Clear;
FDocList.Clear;
end;
if Status <> IntToStr(NC_UNCOSIGNED) then
begin
ListNotesForTree(tmpList, NC_UNCOSIGNED, 0, 0, 0, 0, TreeAscending);
if tmpList.Count > 0 then
begin
CreateListItemsforDocumentTree(FDocList, tmpList, NC_UNCOSIGNED, GroupBy, TreeAscending, CT_NOTES);
UpdateTreeView(FDocList, tvNotes);
end;
tmpList.Clear;
FDocList.Clear;
end;
ListNotesForTree(tmpList, StrToIntDef(Status, 0), FMBeginDate, FMEndDate, Author, MaxDocs, TreeAscending);
CreateListItemsforDocumentTree(FDocList, tmpList, StrToIntDef(Status, 0), GroupBy, TreeAscending, CT_NOTES);
// Text Search CQ: HDS00002856 ---------------------------------------
if FCurrentContext.SearchString<>'' then // Text Search CQ: HDS00002856
begin
NoteMatches := 0;
Dest:=TStringList.Create;
NoteCount:=FDocList.Count-1;
if FDocList.Count>0 then
for x := FDocList.Count-1 downto 1 do begin; // Don't do 0, because it's informational
KeepFlag:=False;
// lblNotes.Caption:='Scanning '+IntToStr(NoteCount-x+1)+' of '+IntToStr(NoteCount)+', '+IntToStr(NoteMatches); <-- original line. //kt 7/19/2007
lblNotes.Caption:=DKLangConstW('fNotes_Scanning')+' '+IntToStr(NoteCount-x+1)+DKLangConstW('fNotes_of')+IntToStr(NoteCount)+', '+IntToStr(NoteMatches); //kt added 7/19/2007
If NoteMatches=1 then lblNotes.Caption:=lblNotes.Caption+' match' else
lblNotes.Caption:=lblNotes.Caption+' matches';
frmSearchStop.lblSearchStatus.Caption := lblNotes.Caption;
frmSearchStop.lblSearchStatus.Repaint;
lblNotes.Repaint;
// Free up some ticks so they can click the "Stop" button
application.processmessages;
application.processmessages;
application.processmessages;
If SearchTextStopFlag = False then begin
noteId := StrToIntDef(Piece(FDocList.Strings[x],'^',1),-1);
if (noteId = INVALID_ID) or (noteId = INFO_ID) then
Continue;
CallV('TIU GET RECORD TEXT', [Piece(FDocList.Strings[x],'^',1)]);
Dest.Assign(RPCBrokerV.Results);
If Dest.Count > 0 then
for xx := 0 to Dest.Count-1 do
begin
//Dest.Strings[xx] := StringReplace(Dest.Strings[xx],'#13',' ',[rfReplaceAll, rfIgnoreCase]);
if Pos(Uppercase(FCurrentContext.SearchString),Uppercase(Dest.Strings[xx]))>0 then
keepflag:=true;
end;
If KeepFlag=False then begin;
if FDocList.Count >= x then
FDocList.Delete(x);
if (tmpList.Count >= x) and (x > 0) then
tmpList.Delete(x-1);
end else
Inc(NoteMatches);
end;
end;
Dest.Free;
end;
// Text Search CQ: HDS00002856 ---------------------------------------
UpdateTreeView(FDocList, tvNotes);
end;
with tvNotes do
begin
uChanging := True;
tvNotes.Items.BeginUpdate;
RemoveParentsWithNoChildren(tvNotes, FCurrentContext); // moved here in v15.9 (RV)
if FLastNoteID <> '' then
Selected := FindPieceNode(FLastNoteID, 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 := tvNotes.FindPieceNode(FCurrentContext.Status, 1, U, nil);
if ANode <> nil then ANode.Expand(False);
ANode := tvNotes.FindPieceNode(IntToStr(NC_UNSIGNED), 1, U, nil);
if ANode = nil then
ANode := tvNotes.FindPieceNode(IntToStr(NC_UNCOSIGNED), 1, U, nil);
if ANode = nil then
ANode := tvNotes.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;
memNote.Clear;
HTMLViewer.Clear; //kt 8/09
with lvNotes 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(tvNotes, FCurrentContext); // moved FROM here in v15.9 (RV)
tvNotes.Items.EndUpdate;
uChanging := False;
SendMessage(tvNotes.Handle, WM_VSCROLL, SB_TOP, 0);
if Selected <> nil then tvNotesChange(Self, Selected);
end;
finally
//kt NOTE: Is this enough??
if (vmHTML in FViewMode) then begin //kt 8/09
RedrawActivate(HtmlViewer.Handle); //kt 8/09
end else begin //kt 8/09
RedrawActivate(memNote.Handle);
end; //kt 8/09
RedrawActivate(lvNotes.Handle);
tmpList.Free;
end;
end;
procedure TfrmNotes.UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
begin
with Tree do
begin
uChanging := True;
Items.BeginUpdate;
lstNotes.Items.AddStrings(DocList);
BuildDocumentTree(DocList, '0', Tree, nil, FCurrentContext, CT_NOTES);
Items.EndUpdate;
uChanging := False;
end;
end;
procedure TfrmNotes.tvNotesChange(Sender: TObject; Node: TTreeNode);
var
x, MySearch, MyNodeID: string;
i: integer;
WhyNot: string;
Mode : TViewModeSet; //kt 8/09
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 tvNotes do
begin
memNote.Clear;
HTMLViewer.Clear; //kt 8/09
if Selected = nil then Exit;
if uIDNotesActive then
begin
mnuActDetachFromIDParent.Enabled := (Selected.ImageIndex in [IMG_ID_CHILD, IMG_ID_CHILD_ADD]);
popNoteListDetachFromIDParent.Enabled := mnuActDetachFromIDParent.Enabled;
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;
popNoteListAttachtoIDParent.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;
popNoteListAddIDEntry.Enabled := mnuActAddIDEntry.Enabled
end;
RedrawSuspend(lvNotes.Handle);
RedrawSuspend(memNote.Handle);
RedrawSuspend(HTMLViewer.Handle); //kt 8/09
popNoteListExpandSelected.Enabled := Selected.HasChildren;
popNoteListCollapseSelected.Enabled := Selected.HasChildren;
x := TORTreeNode(Selected).StringData;
if (Selected.ImageIndex in [IMG_TOP_LEVEL, IMG_GROUP_OPEN, IMG_GROUP_SHUT]) then
begin
lvNotes.Visible := True;
lvNotes.Items.Clear;
lvNotes.Height := (2 * lvNotes.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) + '"'; <-- original line. //kt 7/19/2007
Caption := Caption + DKLangConstW('fNotes_where') + MySearch + DKLangConstW('fNotes_contains_x') + UpperCase(FCurrentContext.Keyword) + '"'; //kt added 7/19/2007
end;
lvNotes.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(tvNotes, lvNotes, Selected.GetFirstChild, MyNodeID, FCurrentContext);
with lvNotes 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 lvNotes do
if Items.Count > 0 then
begin
Selected := Items[0];
lvNotesSelectItem(Self, Selected, True);
end
else
begin
Selected := nil;
lstNotes.ItemIndex := -1;
memPCEShow.Clear;
ShowPCEControls(False);
end;
//kt 8/09
//kt NOTE: At this point the list has changed. But what is the new note-to-view's format?
// We can't just use FViewMode. Because that just states what mode was used on the last note.
Mode := [vmView] + [vmHTML_MODE[vmHTML in FViewMode]]; //kt 8/09
SetDisplayToHTMLvsText(Mode,nil,VIEW_ACTIVATE_ONLY); //kt 8/09
//kt 8/09 pnlWrite.Visible := False;
//kt 8/09 pnlRead.Visible := True;
// uncommented next 4 lines in v17.5 (RV)
//-----------------------------
UpdateReminderFinish;
ShowPCEControls(False);
frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
ShowPCEButtons(FALSE);
//-----------------------------
//memNote.Clear;
end
else if StrToIntDef(Piece(x, U, 1), 0) > 0 then
begin
memNote.Clear;
HTMLViewer.Clear; //kt 8/09
lvNotes.Visible := False;
lstNotes.SelectByID(Piece(x, U, 1));
lstNotesClick(Self);
if (vmHTML in FViewMode) then begin //kt 8/09
SendMessage(HTMLViewer.Handle, WM_VSCROLL, SB_TOP, 0); //kt 8/09
end else begin //kt 8/09
SendMessage(memNote.Handle, WM_VSCROLL, SB_TOP, 0);
end; //kt 8/09
end;
SendMessage(tvNotes.Handle, WM_HSCROLL, SB_THUMBTRACK, 0);
RedrawActivate(lvNotes.Handle);
if (vmHTML in FViewMode) then begin //kt 8/09
RedrawActivate(HtmlViewer.Handle); //kt 8/09
end else begin //kt 8/09
RedrawActivate(memNote.Handle);
end; //kt 8/09
end;
end;
procedure TfrmNotes.tvNotesCollapsed(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 TfrmNotes.tvNotesExpanded(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 TfrmNotes.tvNotesClick(Sender: TObject);
begin
(* if tvNotes.Selected = nil then exit;
if (tvNotes.Selected.ImageIndex in [IMG_TOP_LEVEL, IMG_GROUP_OPEN, IMG_GROUP_SHUT]) then
begin
uChanging := True;
lvNotes.Selected := nil;
uChanging := False;
memNote.Clear;
end;*)
end;
procedure TfrmNotes.tvNotesDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
AnItem: TORTreeNode;
begin
Accept := False;
if not uIDNotesActive then exit;
AnItem := TORTreeNode(tvNotes.GetNodeAt(X, Y));
if (AnItem = nil) or (AnItem.ImageIndex in [IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) then Exit;
with tvNotes.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 TfrmNotes.tvNotesDragDrop(Sender, Source: TObject; X, Y: Integer);
var
HT: THitTests;
Saved: boolean;
ADestNode: TORTreeNode;
begin
if not uIDNotesActive then
begin
CancelDrag;
exit;
end;
if tvNotes.Selected = nil then exit;
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;
HT := tvNotes.GetHitTestInfoAt(X, Y);
ADestNode := TORTreeNode(tvNotes.GetNodeAt(X, Y));
DoAttachIDChild(TORTreeNode(tvNotes.Selected), ADestNode);
end;
procedure TfrmNotes.tvNotesStartDrag(Sender: TObject; var DragObject: TDragObject);
//const
//TX_CAP_NO_DRAG = 'Item cannot be moved'; <-- original line. //kt 7/19/2007
//TX_NO_EDIT_DRAG = 'Items can not be dragged while a note is being edited.'; <-- original line. //kt 7/19/2007
var
WhyNot: string;
//Saved: boolean;
TX_CAP_NO_DRAG : string; //kt
TX_NO_EDIT_DRAG : string; //kt
begin
TX_CAP_NO_DRAG := DKLangConstW('fNotes_Item_cannot_be_moved'); //kt added 7/19/2007
TX_NO_EDIT_DRAG := DKLangConstW('fNotes_Items_can_not_be_dragged_while_a_note_is_being_editedx'); //kt added 7/19/2007
if EditingIndex <> -1 then
begin
InfoBox(TX_NO_EDIT_DRAG, TX_CAP_NO_DRAG, MB_ICONERROR or MB_OK);
CancelDrag;
Exit;
end;
if (tvNotes.Selected.ImageIndex in [IMG_ADDENDUM, IMG_GROUP_OPEN, IMG_GROUP_SHUT, IMG_TOP_LEVEL]) or
(not uIDNotesActive) or
(lstNotes.ItemIEN = 0) then
begin
CancelDrag;
Exit;
end;
(* if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
end;*)
if not CanBeAttached(PDocTreeObject(tvNotes.Selected.Data)^.DocID, WhyNot) then
begin
InfoBox(WhyNot, TX_CAP_NO_DRAG, MB_OK);
CancelDrag;
end;
end;
//===================== Listview events =================================
procedure TfrmNotes.lvNotesColumnClick(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 lvNotes.Columns.Count - 1 do
lvNotes.Columns[i].ImageIndex := IMG_NONE;
if ColumnSortForward then lvNotes.Columns[Column.Index].ImageIndex := IMG_ASCENDING
else lvNotes.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 lvNotes do if Selected <> nil then Scroll(0, Selected.Top - TopItem.Top);
end;
procedure TfrmNotes.lvNotesCompare(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 TfrmNotes.lvNotesSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if uChanging or (not Selected) then Exit;
with lvNotes do
begin
// StatusText('Retrieving selected progress note...'); <-- original line. //kt 7/19/2007
StatusText(DKLangConstW('fNotes_Retrieving_selected_progress_notexxx')); //kt added 7/19/2007
lstNotes.SelectByID(Item.SubItems[5]);
lstNotesClick(Self);
if (vmHTML in FViewMode) then begin //kt 8/09
SendMessage(HTMLViewer.Handle, WM_VSCROLL, SB_TOP, 0); //kt 8/09
end else begin //kt 8/09
SendMessage(memNote.Handle, WM_VSCROLL, SB_TOP, 0);
end; //kt 8/09
end;
end;
procedure TfrmNotes.lvNotesResize(Sender: TObject);
begin
inherited;
with lvNotes 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 TfrmNotes.EnableDisableIDNotes;
begin
uIDNotesActive := IDNotesInstalled;
mnuActDetachFromIDParent.Visible := uIDNotesActive;
popNoteListDetachFromIDParent.Visible := uIDNotesActive;
mnuActAddIDEntry.Visible := uIDNotesActive;
popNoteListAddIDEntry.Visible := uIDNotesActive;
mnuActAttachtoIDParent.Visible := uIDNotesActive;
popNoteListAttachtoIDParent.Visible := uIDNotesActive;
if uIDNotesActive then
tvNotes.DragMode := dmAutomatic
else
tvNotes.DragMode := dmManual;
end;
procedure TfrmNotes.ShowPCEButtons(Editing: boolean);
begin
if frmFrame.Timedout then Exit;
FEditingNotePCEObj := Editing;
if Editing or AnytimeEncounters then
begin
cmdPCE.Visible := TRUE;
if Editing then
begin
cmdPCE.Enabled := CanEditPCE(uPCEEdit);
cmdNewNote.Visible := AnytimeEncounters;
cmdNewNote.Enabled := FALSE;
end
else
begin
cmdPCE.Enabled := (GetAskPCE(0) <> apDisable);
cmdNewNote.Visible := TRUE;
cmdNewNote.Enabled := (FStarting = False); //TRUE;
end;
if cmdNewNote.Visible then
cmdPCE.Top := cmdNewNote.Top-cmdPCE.Height;
end
else
begin
cmdPCE.Enabled := FALSE;
cmdPCE.Visible := FALSE;
cmdNewNote.Visible := TRUE;
cmdNewNote.Enabled := (FStarting = False); //TRUE;
end;
if cmdPCE.Visible then
lblSpace1.Top := cmdPCE.Top - lblSpace1.Height
else
lblSpace1.Top := cmdNewNote.Top - lblSpace1.Height;
popNoteMemoEncounter.Enabled := cmdPCE.Enabled;
popNoteMemoEncounter.Visible := cmdPCE.Visible;
end;
procedure TfrmNotes.mnuIconLegendClick(Sender: TObject);
begin
inherited;
ShowIconLegend(ilNotes);
end;
procedure TfrmNotes.mnuActAttachtoIDParentClick(Sender: TObject);
var
AChildNode: TORTreeNode;
AParentID: string;
SavedDocID: string;
Saved: boolean;
begin
inherited;
if not uIDNotesActive then exit;
if lstNotes.ItemIEN = 0 then exit;
SavedDocID := lstNotes.ItemID;
if EditingIndex <> -1 then
begin
SaveCurrentNote(Saved);
if not Saved then Exit;
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
end;
if tvNotes.Selected = nil then exit;
AChildNode := TORTreeNode(tvNotes.Selected);
AParentID := SelectParentNodeFromList(tvNotes);
if AParentID = '' then exit;
with tvNotes do Selected := FindPieceNode(AParentID, 1, U, Items.GetFirstNode);
DoAttachIDChild(AChildNode, TORTreeNode(tvNotes.Selected));
end;
procedure TfrmNotes.DoAttachIDChild(AChild, AParent: TORTreeNode);
//const
//TX_ATTACH_CNF = 'Confirm Attachment'; <-- original line. //kt 7/19/2007
//TX_ATTACH_FAILURE = 'Attachment failed'; <-- original line. //kt 7/19/2007
var
ErrMsg, WhyNot: string;
SavedDocID: string;
TX_ATTACH_CNF : string; //kt
TX_ATTACH_FAILURE : string; //kt
begin
SetupVars; //kt added 7/19/2007 to replace constants with vars.
TX_ATTACH_CNF := DKLangConstW('fNotes_Confirm_Attachment'); //kt added 7/19/2007
TX_ATTACH_FAILURE := DKLangConstW('fNotes_Attachment_failed'); //kt added 7/19/2007
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) <-- original line. //kt 7/19/2007
DKLangConstW('fNotes_Are_you_surex'), TX_ATTACH_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) //kt added 7/19/2007
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
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
if tvNotes.Selected <> nil then tvNotes.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
LoadNotes;
with tvNotes do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
if tvNotes.Selected <> nil then tvNotes.Selected.Expand(False);
end
else
InfoBox(WhyNot, TX_ATTACH_FAILURE, MB_OK);
end;
end;
function TfrmNotes.SetNoteTreeLabel(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) <-- original line. //kt 7/19/2007
if EndDate <> '' then x1 := x1 + DKLangConstW('fNotes_to') + UpperCase(EndDate) //kt added 7/19/2007
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 '; <-- original line. //kt 7/19/2007
if MaxDocs > 0 then x := DKLangConstW('fNotes_Last') + IntToStr(MaxDocs) + ' ' else x := DKLangConstW('fNotes_All'); //kt added 7/19/2007
case StrToIntDef(Status, 0) of
// NC_ALL : x := x + 'Signed Notes'; <-- original line. //kt 7/19/2007
NC_ALL : x := x + DKLangConstW('fNotes_Signed_Notes'); //kt added 7/19/2007
NC_UNSIGNED : begin
// x := x + 'Unsigned Notes for '; <-- original line. //kt 7/19/2007
x := x + DKLangConstW('fNotes_Unsigned_Notes_for'); //kt added 7/19/2007
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 Notes for '; <-- original line. //kt 7/19/2007
x := x + DKLangConstW('fNotes_Uncosigned_Notes_for'); //kt added 7/19/2007
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 Notes for ' + ExternalName(Author, 200) + SetDateRangeText(AContext); <-- original line. //kt 7/19/2007
NC_BY_AUTHOR : x := x + DKLangConstW('fNotes_Signed_Notes_for') + ExternalName(Author, 200) + SetDateRangeText(AContext); //kt added 7/19/2007
// NC_BY_DATE : x := x + 'Signed Notes ' + SetDateRangeText(AContext); <-- original line. //kt 7/19/2007
NC_BY_DATE : x := x + DKLangConstW('fNotes_Signed_Notes') + SetDateRangeText(AContext); //kt added 7/19/2007
else
// x := 'Custom List'; <-- original line. //kt 7/19/2007
x := DKLangConstW('fNotes_Custom_List'); //kt added 7/19/2007
end;
end;
Result := x;
end;
procedure TfrmNotes.memNewNoteKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
FNavigatingTab := (Key = VK_TAB) and ([ssShift,ssCtrl] * Shift <> []);
if FNavigatingTab then
Key := 0;
end;
procedure TfrmNotes.UpdateNoteAuthor(DocInfo: string);
//const
//TX_INVALID_AUTHOR1 = 'The author returned by the template ('; <-- original line. //kt 7/19/2007
//TX_INVALID_AUTHOR2 = ') is not valid.' + #13#10 + 'The note''s author will remain as '; <-- original line. //kt 7/19/2007
//TC_INVALID_AUTHOR = 'Invalid Author'; <-- original line. //kt 7/19/2007
//TX_COSIGNER_REQD = ' requires a cosigner for this note.'; <-- original line. //kt 7/19/2007
//TC_COSIGNER_REQD = 'Cosigner Required'; <-- original line. //kt 7/19/2007
var
NewAuth, NewAuthName, AuthNameCheck, x: string;
ADummySender: TObject;
TX_INVALID_AUTHOR1 : string; //kt
TX_INVALID_AUTHOR2 : string; //kt
TC_INVALID_AUTHOR : string; //kt
TX_COSIGNER_REQD : string; //kt
TC_COSIGNER_REQD : string; //kt
begin
TX_INVALID_AUTHOR1 := DKLangConstW('fNotes_The_author_returned_by_the_template_x'); //kt added 7/19/2007
TX_INVALID_AUTHOR2 := DKLangConstW('fNotes_x_is_not_validx') + #13#10 + DKLangConstW('fNotes_The_notexxs_author_will_remain_as'); //kt added 7/19/2007
TC_INVALID_AUTHOR := DKLangConstW('fNotes_Invalid_Author'); //kt added 7/19/2007
TX_COSIGNER_REQD := DKLangConstW('fNotes_requires_a_cosigner_for_this_notex'); //kt added 7/19/2007
TC_COSIGNER_REQD := DKLangConstW('fNotes_Cosigner_Required'); //kt added 7/19/2007
SetupVars; //kt added 7/19/2007 to replace constants with vars.
if DocInfo = '' then Exit;
NewAuth := GetXMLParamReturnValueTIU(DocInfo, 'AUTHOR_IEN');
if NewAuth = '' then Exit;
AuthNameCheck := ExternalName(StrToInt64Def(NewAuth, 0), 200);
if AuthNameCheck = '' then
begin
NewAuthName := GetXMLParamReturnValueTIU(DocInfo, 'AUTHOR_NAME');
InfoBox(TX_INVALID_AUTHOR1 + UpperCase(NewAuthName) + TX_INVALID_AUTHOR2 + UpperCase(FEditNote.AuthorName),
TC_INVALID_AUTHOR, MB_OK and MB_ICONERROR);
Exit;
end;
with FEditNote do if StrToInt64Def(NewAuth, 0) <> Author then
begin
Author := StrToInt64Def(NewAuth, 0);
AuthorName := AuthNameCheck;
x := lstNotes.Items[EditingIndex];
SetPiece(x, U, 5, NewAuth + ';' + AuthNameCheck);
lstNotes.Items[EditingIndex] := x;
if AskCosignerForTitle(Title, Author, DateTime) then
begin
InfoBox(UpperCase(AuthNameCheck) + TX_COSIGNER_REQD, TC_COSIGNER_REQD, MB_OK);
//Cosigner := 0; CosignerName := ''; // not sure about this yet
ADummySender := TObject.Create;
try
cmdChangeClick(ADummySender);
finally
FreeAndNil(ADummySender);
end;
end
else cmdChangeClick(Self);
end;
end;
procedure TfrmNotes.sptHorzCanResize(Sender: TObject; var NewSize: Integer;
var Accept: Boolean);
begin
inherited;
if pnlWrite.Visible then
if NewSize > frmNotes.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width then
NewSize := frmNotes.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width;
end;
(*
//kt 5-2-05 added following function (initially copied from fReports.pas)
procedure TfrmNotes.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
WebDoc: IHtmlDocument2;
v: variant;
begin
{
inherited;
if uHTMLDoc = '' then Exit;
if not(uReportType = 'H') then Exit; //this can be removed if & when browser replaces memtext control
if not Assigned(WebBrowser1.Document) then Exit;
WebDoc := WebBrowser1.Document as IHtmlDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := uHTMLDoc;
WebDoc.write(PSafeArray(TVarData(v).VArray));
WebDoc.close;
//uHTMLDoc := '';
}
end;
*)
procedure TfrmNotes.popNoteMemoInsTemplateClick(Sender: TObject);
begin
frmDrawers.mnuInsertTemplateClick(Sender);
end;
procedure TfrmNotes.popNoteMemoPreviewClick(Sender: TObject);
begin
frmDrawers.mnuPreviewTemplateClick(Sender);
end;
procedure TfrmNotes.tvNotesAddition(Sender: TObject; Node: TTreeNode);
begin
inherited;
TAccessibleTreeNode.WrapControl(Node as TORTreeNode);
end;
procedure TfrmNotes.tvNotesDeletion(Sender: TObject; Node: TTreeNode);
begin
TAccessibleTreeNode.UnwrapControl(Node as TORTreeNode);
inherited;
end;
{Tab Order tricks. Need to change
tvNotes
frmDrawers.pnlTemplateButton
frmDrawers.pnlEncounterButton
cmdNewNote
cmdPCE
lvNotes
memNote
to
tvNotes
lvNotes
memNote
frmDrawers.pnlTemplateButton
frmDrawers.pnlEncounterButton
cmdNewNote
cmdPCE
}
procedure TfrmNotes.tvNotesExit(Sender: TObject);
begin
if IncSecond(FMousing,1) < Now then
begin
if (Screen.ActiveControl = frmDrawers.pnlTemplatesButton) or
(Screen.ActiveControl = frmDrawers.pnlEncounterButton) or
(Screen.ActiveControl = cmdNewNote) or
(Screen.ActiveControl = cmdPCE) then
FindNextControl( cmdPCE, True, True, False).SetFocus;
end;
FMousing := 0;
end;
procedure TfrmNotes.pnlReadExit(Sender: TObject);
begin
inherited;
if IncSecond(FMousing,1) < Now then
begin
if (Screen.ActiveControl = frmFrame.pnlPatient) then
FindNextControl( tvNotes, True, True, False).SetFocus
else
if (Screen.ActiveControl = frmDrawers.pnlTemplatesButton) or
(Screen.ActiveControl = frmDrawers.pnlEncounterButton) or
(Screen.ActiveControl = cmdNewNote) or
(Screen.ActiveControl = cmdPCE) then
FindNextControl( frmDrawers.pnlTemplatesButton, False, True, False).SetFocus;
end;
FMousing := 0;
end;
procedure TfrmNotes.cmdNewNoteExit(Sender: TObject);
begin
inherited;
if IncSecond(FMousing,1) < Now then
begin
if (Screen.ActiveControl = lvNotes) or
(Screen.ActiveControl = memNote) then
frmFrame.pnlPatient.SetFocus
else
if (Screen.ActiveControl = tvNotes) then
FindNextControl( frmFrame.pnlPatient, False, True, False).SetFocus;
end;
FMousing := 0;
end;
procedure TfrmNotes.frmFramePnlPatientExit(Sender: TObject);
begin
FOldFramePnlPatientExit(Sender);
if IncSecond(FMousing,1) < Now then
begin
if (Screen.ActiveControl = lvNotes) or
(Screen.ActiveControl = memNote) then
FindNextControl( lvNotes, False, True, False).SetFocus;
end;
FMousing := 0;
end;
procedure TfrmNotes.FormHide(Sender: TObject);
begin
inherited;
frmFrame.pnlPatient.OnExit := FOldFramePnlPatientExit;
frmDrawers.pnlTemplatesButton.OnExit := FOldDrawerPnlTemplatesButtonExit;
frmDrawers.pnlEncounterButton.OnExit := FOldDrawerPnlEncounterButtonExit;
frmDrawers.edtSearch.OnExit := FOldDrawerEdtSearchExit;
end;
procedure TfrmNotes.FormShow(Sender: TObject);
begin
inherited;
FOldFramePnlPatientExit := frmFrame.pnlPatient.OnExit;
frmFrame.pnlPatient.OnExit := frmFramePnlPatientExit;
FOldDrawerPnlTemplatesButtonExit := frmDrawers.pnlTemplatesButton.OnExit;
frmDrawers.pnlTemplatesButton.OnExit := frmDrawerPnlTemplatesButtonExit;
FOldDrawerPnlEncounterButtonExit := frmDrawers.pnlEncounterButton.OnExit;
frmDrawers.pnlEncounterButton.OnExit := frmDrawerPnlEncounterButtonExit;
FOldDrawerEdtSearchExit := frmDrawers.edtSearch.OnExit;
frmDrawers.edtSearch.OnExit := frmDrawerEdtSearchExit;
end;
procedure TfrmNotes.frmDrawerEdtSearchExit(Sender: TObject);
begin
FOldDrawerEdtSearchExit(Sender);
cmdNewNoteExit(Sender);
end;
procedure TfrmNotes.frmDrawerPnlTemplatesButtonExit(Sender: TObject);
begin
FOldDrawerPnlTemplatesButtonExit(Sender);
if Boolean(Hi(GetKeyState(VK_TAB))) and (memNewNote.CanFocus) and
Boolean(Hi(GetKeyState(VK_SHIFT))) then
memNewNote.SetFocus
else
cmdNewNoteExit(Sender);
end;
procedure TfrmNotes.frmDrawerPnlEncounterButtonExit(Sender: TObject);
begin
FOldDrawerPnlEncounterButtonExit(Sender);
cmdNewNoteExit(Sender);
end;
procedure TfrmNotes.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
inherited;
FMousing := Now;
end;
procedure TfrmNotes.SetHTMLEditMode(HTMLEditMode : boolean; Quiet : boolean);
//kt added function 7/09
var Mode : TViewModeSet; //kt
const HTML_MODE_S : Array[false..true] of string[16] = ('PLAIN','FORMATTED');
begin
if FEditNote.Lines = nil then FEditNote.Lines := TStringList.Create; //kt
if HTMLEditMode then begin
if (FViewMode = [vmHTML,vmEdit]) then exit; //no change needed.
FEditNote.Lines.Assign(memNewNote.Lines);
end else begin
if (FViewMode = [vmText,vmEdit]) then exit; //no change needed.
if HtmlEditor.GetTextLen > 0 then begin
if MessageDlg('Do you want to convert this note to PLAIN TEXT?'+#10#13+
'(May cause loss of formatting information.)',mtWarning, mbOKCancel,0) <> mrOK then begin
exit;
end;
end;
FEditNote.Lines.Text := HTMLEditor.Text;
end;
Mode := [vmEdit] + [vmHTML_MODE[HTMLEditMode]]; //kt
SetDisplayToHTMLvsText(Mode,FEditNote.Lines);
if not Quiet then begin
if MessageDlg('Start new notes in '+HTML_MODE_S[HTMLEditMode]+' TEXT by default?',mtConfirmation,[mbYES,mbNO],0) = mrYES then begin
fOptionsNotes.SetDefaultEditHTMLMode(HTMLEditMode);
end;
end;
end;
procedure TfrmNotes.ToggleHTMLEditMode;
//kt added function 6/09
var NewHTMLMode: boolean;
begin
if not (vmEdit in FViewMode) then exit; //quit if not in edit mode
NewHTMLMode := not (vmHTML in FViewMode);
SetHTMLEditMode(NewHTMLMode);
end;
procedure TfrmNotes.SetDisplayToHTMLvsText(Mode : TViewModeSet;
Lines : TStrings;
ActivateOnly : boolean {default=False});
//kt added function 7/09
//If ActivateOnly=True, then the visibility is set, but the control is not filled with text.
type
TPanelVisibilityMode = (pvmReadMode, pvmWriteMode); //kt
procedure SetPanelVisibility(Mode: TPanelVisibilityMode; HTMLMode : boolean);
procedure SetpnlReadVisibility(Visible : boolean; HTMLMode : boolean);
begin
pnlRead.Visible := Visible;
if Visible then begin
memNote.Visible := not HTMLMode;
memNote.TabStop := not HTMLMode;
pnlHTMLViewer.Visible := HTMLMode;
HTMLViewer.Visible := HTMLMode;
if HTMLMode then begin
HtmlViewer.BringToFront;
end else begin
MemNote.BringToFront;
end;
end else begin
memNote.Visible := false;
memNote.TabStop := false;
pnlHTMLViewer.Visible := false;
HTMLViewer.Visible := false;
end;
end; {SetDisplayToHTMLvsText.SetPanelVisibility.SetpnlReadVisibility}
procedure SetpnlWriteVisibility(Visible : boolean; HTMLMode : boolean);
begin
pnlWrite.Visible := Visible;
if Visible then begin
pnlHTMLWrite.Visible := HTMLMode;
pnlHTMLEdit.Visible := HTMLMode;
HTMLEditor.Visible := HTMLMode;
pnlTextWrite.Visible := not HTMLMode;
MemNewNote.Visible := not HTMLMode;
if HTMLMode then begin
HTMLEditor.BringToFront;
end else begin
MemNewNote.BringToFront;
end;
end else begin
pnlHTMLWrite.Visible := false;
pnlHTMLEdit.Visible := false;
HTMLEditor.Visible := false;
pnlTextWrite.Visible := false;
memNewNote.Visible := false;
end;
end; {SetDisplayToHTMLvsText.SetPanelVisibility.SetpnlWriteVisibility}
begin {SetDisplayToHTMLvsText.SetPanelVisibility}
SetpnlReadVisibility ((Mode=pvmReadMode), HTMLMode);
SetpnlWriteVisibility((Mode=pvmWriteMode),HTMLMode);
Application.ProcessMessages;
end; {SetDisplayToHTMLvsText.SetPanelVisibility}
procedure SetHTMLorTextEditor(HTMLEditMode : boolean;
Lines : TStrings;
ActivateOnly : boolean {default=False});
procedure ActivateHtmlEditor(Lines : TStrings);
var HTMLText : string;
begin
HtmlEditor.Editable := true;
if ActivateOnly=false then begin
if Lines <> nil then begin
if rHTMLTools.IsHTML(Lines) then begin
HTMLText := Lines.Text;
end else begin
HTMLText := Text2HTML(Lines);
if HTMLText='' then HTMLText := ' ';
end;
end else HTMLText := ' ';
HtmlEditor.HTMLText := HTMLText;
HTMLEditor.KeyStruck := false;
end;
end; {SetDisplayToHTMLvsText.SetHTMLorTextEditor.ActivateHtmlEditor}
procedure ActiveMemoEditor(Lines : TStrings);
begin
if ActivateOnly=false then begin
memNewNote.Lines.Assign(Lines); //kt new
end;
//kt HtmlEditor.Active := false; //stop intercepting OnMessages
HtmlEditor.Clear;
end; {SetDisplayToHTMLvsText.SetHTMLorTextEditor.ActiveMemoEditor}
begin {SetDisplayToHTMLvsText.SetHTMLorTextEditor}
FHTMLEditMode := emHTML_MODE[HTMLEditMode];
FViewMode := [vmEdit] + [vmHTML_MODE[HTMLEditMode]];
SetPanelVisibility(pvmWriteMode,HTMLEditMode);
pnlRight.Repaint; //kt TEMP
if HTMLEditMode then begin
ActivateHtmlEditor(Lines);
end else begin
ActiveMemoEditor(Lines);
end;
pnlRight.Repaint; //kt TEMP
end; {SetDisplayToHTMLvsText.SetHTMLorTextEditor}
procedure SetHTMLorTextViewer(HTMLViewMode : boolean;
Lines : TStrings;
ActivateOnly : boolean); //kt
//Set forms such that either HTML Viewer is visible, or standard edit window.
procedure ActivateHtmlViewer(Lines : TStrings);
begin
with frmNotes do begin
pnlHtmlViewer.Visible := true;
//memNote.Visible := false;
//memNote.TabStop := false;
HtmlViewer.BringToFront;
if ActivateOnly=False then begin
FixHTML(Lines);
HtmlViewer.HTMLText := Lines.Text;
end;
HtmlViewer.Editable := false;
HtmlViewer.BackgroundColor := clCream;
HtmlViewer.TabStop := true;
RedrawActivate(HtmlViewer.Handle);
end;
end; {SetDisplayToHTMLvsText.SetHTMLorTextViewer.ActivateHtmlViewer}
procedure ActivateMemoViewer(Lines : TStrings);
begin
with frmNotes do begin
pnlHtmlViewer.Visible := false;
HtmlViewer.Clear;
//HtmlEditor.Clear; //don't this here. Only clear in ClearEditControls...
HtmlViewer.TabStop := false;
if ActivateOnly=False then memNote.Lines.Assign(Lines); //new
memNote.Visible := true;
memNote.TabStop := true;
memNote.BringToFront;
RedrawActivate(memNote.Handle);
end;
end; {SetDisplayToHTMLvsText.SetHTMLorTextViewer.ActivateMemoViewer}
begin {SetHTMLorTextViewer}
FViewMode := [vmView] + [vmHTML_MODE[HTMLViewMode]];
SetPanelVisibility(pvmReadMode,HTMLviewMode);
//pnlRight.Repaint; //kt TEMP
if HTMLViewMode then begin
ActivateHtmlViewer(Lines);
end else begin
ActivateMemoViewer(Lines);
HtmlViewer.Clear;
end;
pnlRight.Repaint; //kt TEMP
end; {SetDisplayToHTMLvsText.SetHTMLorTextViewer}
begin {SetDisplayToHTMLvsText}
if vmEdit in Mode then begin
SetHTMLorTextEditor((vmHTML in Mode),Lines,ActivateOnly);
end else begin
SetHTMLorTextViewer((vmHTML in Mode),Lines,ActivateOnly);
end;
end; {SetDisplayToHTMLvsText}
procedure TfrmNotes.btnBoldClick(Sender: TObject);
//kt added function
begin
inherited;
HtmlEditor.ToggleBold;
end;
procedure TfrmNotes.btnItalicClick(Sender: TObject);
//kt added function
begin
inherited;
HtmlEditor.ToggleItalic;
end;
procedure TfrmNotes.btnLessIndentClick(Sender: TObject);
//kt added function
begin
inherited;
HtmlEditor.Outdent;
end;
procedure TfrmNotes.btnMoreIndentClick(Sender: TObject);
//kt added function
begin
inherited;
HtmlEditor.Indent;
end;
procedure TfrmNotes.btnRightAlignClick(Sender: TObject);
//kt added function
begin
inherited;
HtmlEditor.AlignRight;
end;
procedure TfrmNotes.btnImageClick(Sender: TObject);
//kt added function
begin
if frmImages.ImagesCount > 0 then begin
popupAddImage.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
//Will allow user to :
// Cancel, or trigger mnuAddNewImageClick or mnuSelectExistingImageClick
end else begin
mnuAddNewImageClick(self);
end;
end;
procedure TfrmNotes.mnuAddNewImageClick(Sender: TObject);
//kt added function
var
i, AddResult: integer;
oneImage: string;
ImageFName : string;
begin
inherited;
UploadForm.AllowNonImages := false; //only allow selection of IMAGES
AddResult := UploadForm.ShowModal;
UploadForm.AllowNonImages := true; // restore to allow any file
if IsAbortResult(AddResult) then exit;
for i := 0 to UploadForm.UploadedImages.Count-1 do begin
ImageFName := CPRSDir+'\Cache\' + UploadForm.UploadedImages.Strings[i];
oneImage := '';
HTMLEditor.InsertHTMLAtCaret(oneImage+#13#10);
end;
end;
procedure TfrmNotes.mnuSelectExistingImageClick(Sender: TObject);
//kt added function
var
oneImage: string;
ImageFName : string;
begin
inherited;
frmImagePickExisting := TfrmImagePickExisting.Create(Self);
if frmImagePickExisting.ShowModal = mrOK then begin
ImageFName := frmImagePickExisting.SelectedImageFName;
if ImageFName <> '' then begin
if frmImages.ThumbnailIndexForFName(ImageFName) = IMAGE_INDEX_IMAGE then begin
oneImage := '';
end else begin
oneImage := '