DisplayInverse(X,Y,Data) do SetInv^CHUI.DRAW(1) Do Display(X,Y,Data) do SetInv^CHUI.DRAW(0) quit Display(X,Y,Data,MaxLength,Secret) N Ctr N DataLength ; length of data drawn N flgMaxLength ; flag: maximum length set S X=+$G(X),Y=+$G(Y) ; take only numeric value I X=0 S X=40-($L(Data)\2) ; center horizontally I Y=0 G EndDisp ; if Y is not valid... I '($D(Data)#10) G EndDisp ; check existance Data I '($D(ILnBgCh)#10) S ILnBgCh=" " ; if bg char not defined, set to " " I '$L(ILnBgCh) S ILnBgCh=" " ; if value is "", set to " " I $L(ILnBgCh)>1 S ILnBgCh=$E(ILnBgCh) ; strip to first char if longer S flgMaxLength=$D(MaxLength)#10 ; check if max length supplied I flgMaxLength D .S MaxLength=+(MaxLength) ; only take numeric part .I MaxLength=0 S flgMaxLength=0 ; reset flag if no numeric data .Q I flgMaxLength,($L(Data)>MaxLength) D .S Data=$E(Data,1,MaxLength) ; strip if length data larger then max length .Q I $G(Secret,0)=1 D ; convert data to "*" if secret .F Ctr=1:1:$L(Data) S $E(Data,Ctr)="*" .Q S DataLength=$L(Data) ; save length of drawn data I flgMaxLength,($L(Data)MaxLength D ; if default value > max length... .S Data=$E(Data,1,MaxLength) Q ; ...strip default value to max length I '$D(Secret) S Secret=0 ; default Secret to 0 S flgExitKeys=$D(ExitKeys)#10 ; are any exitkeys supplied? I 'flgExitKeys D ; if not supplied... .S ExitKeys="^ESCAPE^RETURN^" ; ...set to escape & return by default .Q I '$L(ExitKeys) D ; if not valid... .S ExitKeys="^ESCAPE^RETURN^" ; ...set to escape & return by default .Q S CursPos=$L(Data) ; default cursor position behind text S flgInitPos=$D(InitPos)#10 ; is initial "relative position" supplied I flgInitPos,$L(+(InitPos)) D ; if valid cursor pos supplied .S CursPos=+(InitPos) ; set cursor position .I CursPos>($L(Data)) D ; if position too far... ..S CursPos=$L(Data) ; ...set it to data length ..Q .Q I ($D(TimeOut)#2=1) D ; adjust params .I ExitKeys'["^TIMEOUT^" S ExitKeys=ExitKeys_"TIMEOUT^" .Q S TimeOut=+$G(TimeOut) ; if insertmode is not defined, define default as insert I '($D(InsMode)#10) S InsMode="INSERT" ; if tabsize is not defined, set at 8 chars I '($D(TabSize)#10) S TabSize=8 D Display(X,Y,Data,MaxLength,Secret) D SetCurs^CHUI.DRAW(X+CursPos,Y) ; set cursor S flgQuit=0 ; initialise "Quit Routine" flag S flgModified=0 ; initialise "Data Modified" flag F D Q:(flgQuit) .S Key=$$ReadKey^KEYB(TimeOut) .D Parse(Key) Q I flgExitKeys D ; if valid exitkeys supplied... .S Data=Data_"^"_KeyFunc Q ; ...add return exitkey to data I flgInitPos D ; if valid initial pos supplied... .S Data=Data_"^"_CursPos Q ; ...also add current cursor position to data EndRead ; return result Q Data ; handle key stroke Parse(Key) N Parsed ; create local vars S Parsed=0 ; initialise vars S Char=$P(Key,"^",1) S Ascii=$P(Key,"^",2) S KeyFunc=$P(Key,"^",3) I $L(Char),($L(Data)0) D .S flgModified=1 .S Data=$E(Data,1,CursPos-1)_$E(Data,CursPos+1,$L(Data)) .S CursPos=CursPos-1 ; decrease cursor position .D Display(X,Y,Data,MaxLength,Secret) ; redraw line .D SetCurs^CHUI.DRAW(X+CursPos,Y) .S Parsed=1 Q G:Parsed EndParse ; if delete, delete char at cursorpos I (KeyFunc="DELETE"),'($E(Data,CursPos+1)="") D .S flgModified=1 .S Data=$E(Data,1,CursPos)_$E(Data,CursPos+2,$L(Data)) .D Display(X,Y,Data,MaxLength,Secret) ; redraw line .D SetCurs^CHUI.DRAW(X+CursPos,Y) .S Parsed=1 Q G:Parsed EndParse I (KeyFunc="LEFT_ARROW"),(CursPos>0) D ; move left .S CursPos=CursPos-1 ; decrease cursor position .D SetCurs^CHUI.DRAW(X+CursPos,Y) ; move cursor .S Parsed=1 Q G:Parsed EndParse I (KeyFunc="RIGHT_ARROW"),(CursPos<$L(Data)),(CursPos