| 1 | RGUTEDT ;CAIRO/DKM - Screen-oriented line editor;04-Sep-1998 11:26;DKM | 
|---|
| 2 | ;;2.1;RUN TIME LIBRARY;;Mar 22, 1999 | 
|---|
| 3 | ;================================================================= | 
|---|
| 4 | ; Inputs: | 
|---|
| 5 | ;   RGDATA  = Data to edit | 
|---|
| 6 | ;   RGLEN   = Maximum length of data | 
|---|
| 7 | ;   RGX     = Starting column position | 
|---|
| 8 | ;   RGY     = Starting row position | 
|---|
| 9 | ;   RGVALD  = List of valid inputs (optional) | 
|---|
| 10 | ;   RGDISV  = DISV node to save under (optional) | 
|---|
| 11 | ;   RGTERM  = Valid input terminators (default=<CR>) | 
|---|
| 12 | ;   RGABRT  = Valid input abort characters (default=none) | 
|---|
| 13 | ;   RGRM    = Right margin setting (default=IOM or 80) | 
|---|
| 14 | ;   RGQUIT  = Exit code (returned) | 
|---|
| 15 | ;   RGOPT   = Input options | 
|---|
| 16 | ;      C = Mark <CR> with ~ | 
|---|
| 17 | ;      E = Echo off | 
|---|
| 18 | ;      H = Horizontal scroll | 
|---|
| 19 | ;      I = No timeout | 
|---|
| 20 | ;      L = Lowercase only | 
|---|
| 21 | ;      O = Overwrite mode | 
|---|
| 22 | ;      Q = Quiet mode | 
|---|
| 23 | ;      R = Reverse video | 
|---|
| 24 | ;      T = Auto-terminate | 
|---|
| 25 | ;      U = Uppercase only | 
|---|
| 26 | ;      V = Up/down cursor keys terminate input | 
|---|
| 27 | ;      X = Suppress auto-erase | 
|---|
| 28 | ; Outputs: | 
|---|
| 29 | ;   Return value = Edited data | 
|---|
| 30 | ;================================================================= | 
|---|
| 31 | ENTRY(RGDATA,RGLEN,RGX,RGY,RGVALD,RGOPT,RGDISV,RGTERM,RGABRT,RGRM,RGQUIT) ; | 
|---|
| 32 | N RGZ,RGZ1,RGZ2,RGSAVE,RGINS,RGAE,RGBUF,RGTAB,RGPOS,RGEON,RGLEFT,RGBEL,RGMAX,RGRVON,RGRVOFF,RGC,RGW | 
|---|
| 33 | S RGVALD=$G(RGVALD),RGOPT=$$UP^XLFSTR($G(RGOPT)),RGBEL=$S(RGOPT'["Q":$C(7),1:""),RGDISV=$G(RGDISV) | 
|---|
| 34 | S:$G(RGTERM)="" RGTERM=$C(13)                                         ; Valid line terminators | 
|---|
| 35 | S RGABRT=$G(RGABRT)                                                   ; Valid input abort keys | 
|---|
| 36 | S RGRVON=$C(27,91,55,109),RGRVOFF=$C(27,91,109)                       ; Reverse video control | 
|---|
| 37 | S RGINS=RGOPT'["O"                                                    ; Default mode = insert | 
|---|
| 38 | S RGAE=RGOPT'["X"                                                     ; Auto-erase option | 
|---|
| 39 | S RGEON=RGOPT'["E"                                                    ; No echo option | 
|---|
| 40 | I RGOPT["I"!'$D(DTIME) N DTIME S DTIME=9999999999                                ; Suppress timeout option | 
|---|
| 41 | S RGBUF="" | 
|---|
| 42 | S RGRM=$G(RGRM,$G(IOM,80))                                            ; Display width | 
|---|
| 43 | S RGTAB=$C(9)                                                         ; Tab character | 
|---|
| 44 | S RGX=$G(RGX,$X),RGY=$G(RGY,$Y),RGW=RGRM-RGX | 
|---|
| 45 | S:RGW'>0 RGW=1 | 
|---|
| 46 | S:'$G(RGLEN) RGLEN=RGW                                                ; Default field width | 
|---|
| 47 | S RGMAX=$S(RGOPT["H":250,1:RGLEN)                                     ; Maximum data length | 
|---|
| 48 | S (RGSAVE,RGDATA)=$E($G(RGDATA),1,RGMAX)                              ; Truncate data if too long | 
|---|
| 49 | I $$NEWERR^%ZTER N $ET S $ET="" | 
|---|
| 50 | S @$$TRAP^RGZOSF("ERROR^RGUTEDT") | 
|---|
| 51 | D RM^RGZOSF(0) | 
|---|
| 52 | X ^%ZOSF("EOFF") | 
|---|
| 53 | F  Q:RGDATA'[RGTAB  S RGZ=$P(RGDATA,RGTAB),RGDATA=RGZ_$J("",8-($L(RGZ)#8))_$P(RGDATA,RGTAB,2,999) | 
|---|
| 54 | RESTART D RESET | 
|---|
| 55 | AGAIN F RGQUIT=0:0 Q:RGQUIT  D NXT S RGAE=0 | 
|---|
| 56 | X ^%ZOSF("EON") | 
|---|
| 57 | W $$XY^RGUT(RGX,RGY),$S(RGOPT["R":RGRVOFF,1:"") | 
|---|
| 58 | I RGDISV'="" Q:"^^"[RGDATA RGDATA S:RGDATA=" " RGDATA=$G(^DISV(DUZ,RGDISV)) | 
|---|
| 59 | S:RGDISV'="" ^DISV(DUZ,RGDISV)=RGDATA | 
|---|
| 60 | Q RGDATA                                                              ; Return to calling routine | 
|---|
| 61 | NXT D POSCUR()                                                            ; Position cursor | 
|---|
| 62 | R *RGC:DTIME                                                          ; Next character typed | 
|---|
| 63 | I RGC=27 D ESC Q:'RGC | 
|---|
| 64 | I RGC<1!(RGABRT[$C(RGC)) S RGDATA=U,RGQUIT=1 Q | 
|---|
| 65 | I RGTERM[$C(RGC) D TERM Q | 
|---|
| 66 | I RGC<28 D:RGC'=27 @("CTL"_$C(RGC+64)) Q | 
|---|
| 67 | I RGC=127!(RGC=240) D CTLH Q | 
|---|
| 68 | I RGC>64,RGC<91,RGOPT["L" S RGC=RGC+32 | 
|---|
| 69 | E  I RGC>96,RGC<123,RGOPT["U" S RGC=RGC-32 | 
|---|
| 70 | I $L(RGVALD),RGVALD'[$C(RGC) D RAISE^RGZOSF() | 
|---|
| 71 | D:RGAE CTLK,POSCUR()                                                  ; Erase buffer if auto erase on | 
|---|
| 72 | D INSW($C(RGC)) | 
|---|
| 73 | S RGQUIT=RGPOS=RGLEN&(RGOPT["T") | 
|---|
| 74 | Q | 
|---|
| 75 | CTLA S RGINS='RGINS                                                        ; Toggle insert mode | 
|---|
| 76 | Q | 
|---|
| 77 | CTLB D MOVETO(0)                                                           ; Move cursor to beginning | 
|---|
| 78 | Q | 
|---|
| 79 | CTLX S RGDATA=RGSAVE                                                       ; Restore buffer to original | 
|---|
| 80 | G RESET | 
|---|
| 81 | CTLE D MOVETO($L(RGDATA))                                                  ; Move cursor to end | 
|---|
| 82 | Q | 
|---|
| 83 | CTLI D INSW($J("",8-(RGPOS#8)))                                            ; Insert expanded tab | 
|---|
| 84 | Q | 
|---|
| 85 | CTLJ F RGZ=RGPOS:-1:1 Q:$A(RGDATA,RGZ)'=32                                     ; Find previous nonspace | 
|---|
| 86 | F RGZ=RGZ:-1:1 Q:$A(RGDATA,RGZ)=32                                          ; Find previous space | 
|---|
| 87 | S RGBUF=$E(RGDATA,RGZ,RGPOS)                                            ; Save deleted portion | 
|---|
| 88 | S RGDATA=$E(RGDATA,1,RGZ-1)_$E(RGDATA,RGPOS+1,RGLEN)                    ; Remove word | 
|---|
| 89 | D MOVETO(RGZ-1) | 
|---|
| 90 | Q | 
|---|
| 91 | CTLK S RGBUF=RGDATA                                                        ; Save buffer | 
|---|
| 92 | S RGDATA=""                                                           ; Erase buffer | 
|---|
| 93 | D RESET | 
|---|
| 94 | Q | 
|---|
| 95 | CTLL S RGBUF=$E(RGDATA,RGPOS+1,RGLEN)                                      ; Save deleted portion | 
|---|
| 96 | S RGDATA=$E(RGDATA,1,RGPOS)                                           ; Truncate at current position | 
|---|
| 97 | D DSPLY(RGPOS) | 
|---|
| 98 | Q | 
|---|
| 99 | CTLM D POSCUR(RGPOS),INSW("~"):RGOPT["C",MOVETO(RGPOS-$X+RGX+RGW) | 
|---|
| 100 | Q | 
|---|
| 101 | CTLR D INSW(RGBUF)                                                         ; Insert at current position | 
|---|
| 102 | Q | 
|---|
| 103 | CTLT D CTLL | 
|---|
| 104 | Q | 
|---|
| 105 | CTLU S RGBUF=$E(RGDATA,1,RGPOS)                                            ; Save deleted portion | 
|---|
| 106 | S RGDATA=$E(RGDATA,RGPOS+1,RGLEN)                                     ; Remove to left of cursor | 
|---|
| 107 | D RESET | 
|---|
| 108 | Q | 
|---|
| 109 | CTLH I 'RGPOS W RGBEL Q | 
|---|
| 110 | D LEFT | 
|---|
| 111 | CTLD S RGDATA=$E(RGDATA,1,RGPOS)_$E(RGDATA,RGPOS+2,RGMAX)                  ; Delete character to left | 
|---|
| 112 | D DSPLY(RGPOS,1) | 
|---|
| 113 | Q | 
|---|
| 114 | TERM S RGQUIT=2 | 
|---|
| 115 | Q | 
|---|
| 116 | ESC R *RGZ:1 | 
|---|
| 117 | R:RGZ>0 *RGZ:1 | 
|---|
| 118 | S RGC=0 | 
|---|
| 119 | G UP:RGZ=65,DOWN:RGZ=66,RIGHT:RGZ=67,LEFT:RGZ=68                              ;Execute code | 
|---|
| 120 | S RGC=27 | 
|---|
| 121 | Q | 
|---|
| 122 | DSPLY(RGP1,RGP2) ; | 
|---|
| 123 | Q:'RGEON                                                              ; Refresh buffer display starting at position RGP1 | 
|---|
| 124 | N RGZ,RGZ1 | 
|---|
| 125 | S RGP1=+$G(RGP1,RGLEFT),RGZ=$E(RGDATA,RGP1+1,RGLEFT+RGLEN),RGP2=$S($D(RGP2):RGP2+$L(RGZ),1:RGLEN-RGP1+RGLEFT) | 
|---|
| 126 | S:RGP2>RGLEN RGP2=RGLEN | 
|---|
| 127 | S RGZ=RGZ_$J("",RGP2-$L(RGZ)) | 
|---|
| 128 | F  D  Q:RGZ="" | 
|---|
| 129 | .D POSCUR(RGP1) | 
|---|
| 130 | .S RGZ1=RGRM-$X | 
|---|
| 131 | .S:RGZ1<1 RGZ1=1 | 
|---|
| 132 | .W $E(RGZ,1,RGZ1) | 
|---|
| 133 | .S RGZ=$E(RGZ,RGZ1+1,999),RGP1=RGP1+RGZ1 | 
|---|
| 134 | Q | 
|---|
| 135 | INSW(RGTXT) ; | 
|---|
| 136 | S:RGPOS>$L(RGDATA) RGDATA=RGDATA_$J("",RGPOS-$L(RGDATA))              ; Pad if past end of buffer | 
|---|
| 137 | S RGDATA=$E($E(RGDATA,1,RGPOS)_RGTXT_$E(RGDATA,RGPOS+2-RGINS,RGMAX),1,RGMAX) | 
|---|
| 138 | D DSPLY(RGPOS,0),MOVETO(RGPOS+$L(RGTXT)) | 
|---|
| 139 | Q | 
|---|
| 140 | POSCUR(RGP) ; | 
|---|
| 141 | N RGZX,RGZY | 
|---|
| 142 | S RGP=+$G(RGP,RGPOS),RGZX=RGP-RGLEFT,RGZY=RGZX\RGW+RGY,RGZX=RGZX#RGW+RGX | 
|---|
| 143 | W $$XY^RGUT(RGZX,RGZY) | 
|---|
| 144 | Q | 
|---|
| 145 | MOVETO(RGP) ; | 
|---|
| 146 | I RGP>RGMAX!(RGP<0) W RGBEL Q | 
|---|
| 147 | S RGPOS=RGP,RGP=RGLEFT | 
|---|
| 148 | S:RGPOS<RGLEFT RGLEFT=RGPOS-RGW-1 | 
|---|
| 149 | S:RGLEFT+RGLEN<RGPOS RGLEFT=RGPOS-RGW+1 | 
|---|
| 150 | S:RGLEFT'<RGMAX RGLEFT=RGMAX-RGW | 
|---|
| 151 | S:RGLEFT<0 RGLEFT=0 | 
|---|
| 152 | D DSPLY():RGLEFT'=RGP,POSCUR() | 
|---|
| 153 | Q | 
|---|
| 154 | UP I RGOPT["V" S RGQUIT=3 | 
|---|
| 155 | E  D MOVETO(RGPOS-RGW) | 
|---|
| 156 | Q | 
|---|
| 157 | DOWN I RGOPT["V" S RGQUIT=4 | 
|---|
| 158 | E  D MOVETO(RGPOS+RGW) | 
|---|
| 159 | Q | 
|---|
| 160 | RIGHT D MOVETO(RGPOS+1) | 
|---|
| 161 | Q | 
|---|
| 162 | LEFT D MOVETO(RGPOS-1) | 
|---|
| 163 | Q | 
|---|
| 164 | RESET W $S(RGOPT["R":RGRVON,1:RGRVOFF) | 
|---|
| 165 | S (RGPOS,RGLEFT)=0                                                    ; Current edit offset | 
|---|
| 166 | D DSPLY()                                                             ; Refresh display | 
|---|
| 167 | Q | 
|---|
| 168 | ERROR W RGBEL                                                               ; Sound bell | 
|---|
| 169 | S @$$TRAP^RGZOSF("ERROR^RGUTEDT") | 
|---|
| 170 | G AGAIN | 
|---|