Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: CIAUEDT

CIAUEDT.m

Go to the documentation of this file.
  1. CIAUEDT ;MSC/IND/DKM - Screen-oriented line editor;14-Aug-2006 09:35;DKM
  1. ;;1.2;CIA UTILITIES;;Mar 20, 2007
  1. ;;Copyright 2000-2006, Medsphere Systems Corporation
  1. ;=================================================================
  1. ; Inputs:
  1. ; CIADATA = Data to edit
  1. ; CIALEN = Maximum length of data
  1. ; CIAX = Starting column position
  1. ; CIAY = Starting row position
  1. ; CIAVALD = List of valid inputs (optional)
  1. ; CIADISV = DISV node to save under (optional)
  1. ; CIATERM = Valid input terminators (default=<CR>)
  1. ; CIAABRT = Valid input abort characters (default=none)
  1. ; CIARM = Right margin setting (default=IOM or 80)
  1. ; CIAQUIT = Exit code (returned)
  1. ; CIAOPT = Input options
  1. ; C = Mark <CR> with ~
  1. ; E = Echo off
  1. ; H = Horizontal scroll
  1. ; I = No timeout
  1. ; L = Lowercase only
  1. ; O = Overwrite mode
  1. ; Q = Quiet mode
  1. ; R = Reverse video
  1. ; T = Auto-terminate
  1. ; U = Uppercase only
  1. ; V = Up/down cursor keys terminate input
  1. ; X = Suppress auto-erase
  1. ; Outputs:
  1. ; Return value = Edited data
  1. ;=================================================================
  1. ENTRY(CIADATA,CIALEN,CIAX,CIAY,CIAVALD,CIAOPT,CIADISV,CIATERM,CIAABRT,CIARM,CIAQUIT) ;
  1. N CIAZ,CIAZ1,CIAZ2,CIASAVE,CIAINS,CIAAE,CIABUF,CIATAB,CIAPOS,CIAEON,CIALEFT,CIABEL,CIAMAX,CIARVON,CIARVOFF,CIAC,CIAW
  1. S CIAVALD=$G(CIAVALD),CIAOPT=$$UP^XLFSTR($G(CIAOPT)),CIABEL=$S(CIAOPT'["Q":$C(7),1:""),CIADISV=$G(CIADISV)
  1. S:$G(CIATERM)="" CIATERM=$C(13) ; Valid line terminators
  1. S CIAABRT=$G(CIAABRT) ; Valid input abort keys
  1. S CIARVON=$C(27,91,55,109),CIARVOFF=$C(27,91,109) ; Reverse video control
  1. S CIAINS=CIAOPT'["O" ; Default mode = insert
  1. S CIAAE=CIAOPT'["X" ; Auto-erase option
  1. S CIAEON=CIAOPT'["E" ; No echo option
  1. I CIAOPT["I"!'$D(DTIME) N DTIME S DTIME=99999999 ; Suppress timeout option
  1. S CIABUF=""
  1. S CIARM=$G(CIARM,$G(IOM,80)) ; Display width
  1. S CIATAB=$C(9) ; Tab character
  1. S CIAX=$G(CIAX,$X),CIAY=$G(CIAY,$Y),CIAW=CIARM-CIAX
  1. S:CIAW'>0 CIAW=1
  1. S:'$G(CIALEN) CIALEN=CIAW ; Default field width
  1. S CIAMAX=$S(CIAOPT["H":250,1:CIALEN) ; Maximum data length
  1. S (CIASAVE,CIADATA)=$E($G(CIADATA),1,CIAMAX) ; Truncate data if too long
  1. I $$NEWERR^%ZTER N $ET S $ET=""
  1. S @$$TRAP^CIAUOS("ERROR^CIAUEDT")
  1. D RM^CIAUOS(0)
  1. X ^%ZOSF("EOFF")
  1. F Q:CIADATA'[CIATAB S CIAZ=$P(CIADATA,CIATAB),CIADATA=CIAZ_$J("",8-($L(CIAZ)#8))_$P(CIADATA,CIATAB,2,999)
  1. RESTART D RESET
  1. AGAIN F CIAQUIT=0:0 Q:CIAQUIT D NXT S CIAAE=0
  1. X ^%ZOSF("EON")
  1. W $$XY^CIAU(CIAX,CIAY),$S(CIAOPT["R":CIARVOFF,1:"")
  1. I CIADISV'="" Q:"^^"[CIADATA CIADATA S:CIADATA=" " CIADATA=$G(^DISV(DUZ,CIADISV))
  1. S:CIADISV'="" ^DISV(DUZ,CIADISV)=CIADATA
  1. Q CIADATA ; Return to calling routine
  1. NXT D POSCUR() ; Position cursor
  1. R *CIAC:DTIME ; Next character typed
  1. I CIAC=27 D ESC Q:'CIAC
  1. I CIAC<1!(CIAABRT[$C(CIAC)) S CIADATA=U,CIAQUIT=1 Q
  1. I CIATERM[$C(CIAC) D TERM Q
  1. I CIAC<28 D:CIAC'=27 @("CTL"_$C(CIAC+64)) Q
  1. I CIAC=127!(CIAC=240) D CTLH Q
  1. I CIAC>64,CIAC<91,CIAOPT["L" S CIAC=CIAC+32
  1. E I CIAC>96,CIAC<123,CIAOPT["U" S CIAC=CIAC-32
  1. I $L(CIAVALD),CIAVALD'[$C(CIAC) D RAISE^CIAUOS()
  1. D:CIAAE CTLK,POSCUR() ; Erase buffer if auto erase on
  1. D INSW($C(CIAC))
  1. S CIAQUIT=CIAPOS=CIALEN&(CIAOPT["T")
  1. Q
  1. CTLA S CIAINS='CIAINS ; Toggle insert mode
  1. Q
  1. CTLB D MOVETO(0) ; Move cursor to beginning
  1. Q
  1. CTLX S CIADATA=CIASAVE ; Restore buffer to original
  1. G RESET
  1. CTLE D MOVETO($L(CIADATA)) ; Move cursor to end
  1. Q
  1. CTLI D INSW($J("",8-(CIAPOS#8))) ; Insert expanded tab
  1. Q
  1. CTLJ F CIAZ=CIAPOS:-1:1 Q:$A(CIADATA,CIAZ)'=32 ; Find previous nonspace
  1. F CIAZ=CIAZ:-1:1 Q:$A(CIADATA,CIAZ)=32 ; Find previous space
  1. S CIABUF=$E(CIADATA,CIAZ,CIAPOS) ; Save deleted portion
  1. S CIADATA=$E(CIADATA,1,CIAZ-1)_$E(CIADATA,CIAPOS+1,CIALEN) ; Remove word
  1. D MOVETO(CIAZ-1)
  1. Q
  1. CTLK S CIABUF=CIADATA ; Save buffer
  1. S CIADATA="" ; Erase buffer
  1. D RESET
  1. Q
  1. CTLL S CIABUF=$E(CIADATA,CIAPOS+1,CIALEN) ; Save deleted portion
  1. S CIADATA=$E(CIADATA,1,CIAPOS) ; Truncate at current position
  1. D DSPLY(CIAPOS)
  1. Q
  1. CTLM D POSCUR(CIAPOS),INSW("~"):CIAOPT["C",MOVETO(CIAPOS-$X+CIAX+CIAW)
  1. Q
  1. CTLR D INSW(CIABUF) ; Insert at current position
  1. Q
  1. CTLT D CTLL
  1. Q
  1. CTLU S CIABUF=$E(CIADATA,1,CIAPOS) ; Save deleted portion
  1. S CIADATA=$E(CIADATA,CIAPOS+1,CIALEN) ; Remove to left of cursor
  1. D RESET
  1. Q
  1. CTLH I 'CIAPOS W CIABEL Q
  1. D LEFT
  1. CTLD S CIADATA=$E(CIADATA,1,CIAPOS)_$E(CIADATA,CIAPOS+2,CIAMAX) ; Delete character to left
  1. D DSPLY(CIAPOS,1)
  1. Q
  1. TERM S CIAQUIT=2
  1. Q
  1. ESC R *CIAZ:1
  1. R:CIAZ>0 *CIAZ:1
  1. S CIAC=0
  1. G UP:CIAZ=65,DOWN:CIAZ=66,RIGHT:CIAZ=67,LEFT:CIAZ=68 ;Execute code
  1. S CIAC=27
  1. Q
  1. DSPLY(CIAP1,CIAP2) ;
  1. Q:'CIAEON ; Refresh buffer display starting at position CIAP1
  1. N CIAZ,CIAZ1
  1. S CIAP1=+$G(CIAP1,CIALEFT),CIAZ=$E(CIADATA,CIAP1+1,CIALEFT+CIALEN),CIAP2=$S($D(CIAP2):CIAP2+$L(CIAZ),1:CIALEN-CIAP1+CIALEFT)
  1. S:CIAP2>CIALEN CIAP2=CIALEN
  1. S CIAZ=CIAZ_$J("",CIAP2-$L(CIAZ))
  1. F D Q:CIAZ=""
  1. .D POSCUR(CIAP1)
  1. .S CIAZ1=CIARM-$X
  1. .S:CIAZ1<1 CIAZ1=1
  1. .W $E(CIAZ,1,CIAZ1)
  1. .S CIAZ=$E(CIAZ,CIAZ1+1,999),CIAP1=CIAP1+CIAZ1
  1. Q
  1. INSW(CIATXT) ;
  1. S:CIAPOS>$L(CIADATA) CIADATA=CIADATA_$J("",CIAPOS-$L(CIADATA)) ; Pad if past end of buffer
  1. S CIADATA=$E($E(CIADATA,1,CIAPOS)_CIATXT_$E(CIADATA,CIAPOS+2-CIAINS,CIAMAX),1,CIAMAX)
  1. D DSPLY(CIAPOS,0),MOVETO(CIAPOS+$L(CIATXT))
  1. Q
  1. POSCUR(CIAP) ;
  1. N CIAZX,CIAZY
  1. S CIAP=+$G(CIAP,CIAPOS),CIAZX=CIAP-CIALEFT,CIAZY=CIAZX\CIAW+CIAY,CIAZX=CIAZX#CIAW+CIAX
  1. W $$XY^CIAU(CIAZX,CIAZY)
  1. Q
  1. MOVETO(CIAP) ;
  1. I CIAP>CIAMAX!(CIAP<0) W CIABEL Q
  1. S CIAPOS=CIAP,CIAP=CIALEFT
  1. S:CIAPOS<CIALEFT CIALEFT=CIAPOS-CIAW-1
  1. S:CIALEFT+CIALEN<CIAPOS CIALEFT=CIAPOS-CIAW+1
  1. S:CIALEFT'<CIAMAX CIALEFT=CIAMAX-CIAW
  1. S:CIALEFT<0 CIALEFT=0
  1. D DSPLY():CIALEFT'=CIAP,POSCUR()
  1. Q
  1. UP I CIAOPT["V" S CIAQUIT=3
  1. E D MOVETO(CIAPOS-CIAW)
  1. Q
  1. DOWN I CIAOPT["V" S CIAQUIT=4
  1. E D MOVETO(CIAPOS+CIAW)
  1. Q
  1. Q
  1. LEFT D MOVETO(CIAPOS-1)
  1. Q
  1. RESET W $S(CIAOPT["R":CIARVON,1:CIARVOFF)
  1. S (CIAPOS,CIALEFT)=0 ; Current edit offset
  1. D DSPLY() ; Refresh display
  1. Q
  1. ERROR W CIABEL ; Sound bell
  1. S @$$TRAP^CIAUOS("ERROR^CIAUEDT")
  1. G AGAIN