| 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
 | 
|---|