| 1 | DDGLBXA ;SFISC/MKO-A LIST BOX ;1:58 PM  26 Apr 1996
 | 
|---|
| 2 |  ;;22.0;VA FileMan;;Mar 30, 1999
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | LIST(DDGLGLO,DDGLOUT,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLFLG,DDGLMAP) ;
 | 
|---|
| 6 |  ;Input:
 | 
|---|
| 7 |  ;  DDGLGLO = closed reference of local or global that contains
 | 
|---|
| 8 |  ;            the list of entries
 | 
|---|
| 9 |  ;               @DDGLGLO("B",entry,index)=""
 | 
|---|
| 10 |  ;  DDGLROW = $Y of top left corner
 | 
|---|
| 11 |  ;  DDGLCOL = $X of top left corner
 | 
|---|
| 12 |  ;  DDGLHT  = height of box
 | 
|---|
| 13 |  ;  DDGLWD  = width of box
 | 
|---|
| 14 |  ;  DDGLSEL = text of selected item
 | 
|---|
| 15 |  ;  DDGLFLG = flags
 | 
|---|
| 16 |  ;  DDGLMAP = array to customize key sequences
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ;Output:
 | 
|---|
| 19 |  ;  DDGLOUT = index of selected entry (if any)
 | 
|---|
| 20 |  ;  DDGLOUT(0) = selected entry
 | 
|---|
| 21 |  ;  DDGLOUT("C") = code indicates what terminated the read
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ;Other variables:
 | 
|---|
| 24 |  N DDGLCID ;  window (control) id
 | 
|---|
| 25 |  N DDGLNL ; number of lines in list
 | 
|---|
| 26 |  N DDGLNC ; number of columns in list
 | 
|---|
| 27 |  N DDGLLINE ; current line number
 | 
|---|
| 28 |  N DDGLITEM ; item array
 | 
|---|
| 29 |  ;              DDGLITEM(1..DDGLNL) = text of item displayed
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  Q:$G(DDGLGLO)=""
 | 
|---|
| 32 |  D INIT
 | 
|---|
| 33 |  X DDGLZOSF("EOFF")
 | 
|---|
| 34 |  W $P(DDGLVID,DDGLDEL,11)
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  D ^DDGLBXA1
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  W $P(DDGLVID,DDGLDEL,12)
 | 
|---|
| 39 |  X DDGLZOSF("EON")
 | 
|---|
| 40 |  D DESTROY(DDGLCID,$G(DDGLFLG))
 | 
|---|
| 41 |  Q
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 | CREATE(DDGLGLO,DDGLCID,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLMAP) ;
 | 
|---|
| 44 |  ;Create a list box window
 | 
|---|
| 45 |  ;Out:
 | 
|---|
| 46 |  ; .DDGLCID array = properties of list box
 | 
|---|
| 47 |  ; .DDGLCID(id,"SV") = cid^$Y^$X^NL^NC^LINE
 | 
|---|
| 48 |  ; .DDGLCID(id,"ITEM",1..nl) = text of item n in display
 | 
|---|
| 49 |  ; .DDGLCID(id,"GL") = DDGLGLO
 | 
|---|
| 50 |  ; .DDGLCID(id,"KMAP","IN")
 | 
|---|
| 51 |  ; .DDGLCID(id,"KMAP","OUT")
 | 
|---|
| 52 |  ; .DDGLCID(id,"KMAP","KD")
 | 
|---|
| 53 |  ; .DDGLCID(id,"KMAP","TO")
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  Q:$G(DDGLGLO)=""
 | 
|---|
| 56 |  N DDGLNL,DDGLNC,DDGLLINE,DDGLLAST,DDGLITEM
 | 
|---|
| 57 |  D INIT
 | 
|---|
| 58 |  D SETCID
 | 
|---|
| 59 |  Q
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 | DESTROY(DDGLCID,DDGLFLG) ;Destroy the window and cleanup
 | 
|---|
| 62 |  D DESTROY^DDGLIBW(DDGLCID)
 | 
|---|
| 63 |  K DDGLCID(DDGLCID)
 | 
|---|
| 64 |  D KILL^DDGLIB0($G(DDGLFLG))
 | 
|---|
| 65 |  Q
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | READ(DDGLCID,DDGLOUT) ;
 | 
|---|
| 68 |  N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 | 
|---|
| 69 |  N DX,DY
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  D SETPARM
 | 
|---|
| 72 |  X DDGLZOSF("EOFF")
 | 
|---|
| 73 |  W $P(DDGLVID,DDGLDEL,11)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  D ^DDGLBXA1
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  D SETCID
 | 
|---|
| 78 |  W $P(DDGLVID,DDGLDEL,12)
 | 
|---|
| 79 |  X DDGLZOSF("EON")
 | 
|---|
| 80 |  Q
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 | UPDATE(DDGLCID,DDGLVAL) ;
 | 
|---|
| 83 |  N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 | 
|---|
| 84 |  N DDGLI,DDGLT,DX,DY
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  D SETPARM
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  ;Get closest match incl. or foll. DDGLVAL
 | 
|---|
| 89 |  S DDGLSEL=$G(DDGLVAL)
 | 
|---|
| 90 |  I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 | 
|---|
| 91 |  E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 | 
|---|
| 92 |  Q:DDGLSEL=""
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ;Check whether DDGLVAL is already on the screen
 | 
|---|
| 95 |  I DDGLITEM(1)']]DDGLSEL,DDGLSEL']]DDGLITEM(DDGLNL) D
 | 
|---|
| 96 |  . D CUP(DDGLLINE,1)
 | 
|---|
| 97 |  . W $E(DDGLITEM(DDGLLINE),1,DDGLNC)
 | 
|---|
| 98 |  . F DDGLLINE=1:1:DDGLNL Q:DDGLITEM(DDGLLINE)=DDGLSEL
 | 
|---|
| 99 |  . D CUP(DDGLLINE,1)
 | 
|---|
| 100 |  . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  ;If not, adjust the array
 | 
|---|
| 103 |  E  D
 | 
|---|
| 104 |  . S DDGLT=DDGLSEL
 | 
|---|
| 105 |  . F DDGLI=1:1:DDGLNL D
 | 
|---|
| 106 |  .. S DDGLITEM(DDGLI)=DDGLT
 | 
|---|
| 107 |  .. S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 | 
|---|
| 108 |  . D DISP(DDGLSEL)
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  D SETCID
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 | SETCID ;Set DDGLCID array
 | 
|---|
| 114 |  K DDGLCID(DDGLCID)
 | 
|---|
| 115 |  S DDGLCID(DDGLCID,"SV")=DDGLCID_U_DDGLROW_U_DDGLCOL_U_DDGLNL_U_DDGLNC_U_DDGLLINE
 | 
|---|
| 116 |  M DDGLCID(DDGLCID,"ITEM")=DDGLITEM
 | 
|---|
| 117 |  S DDGLCID(DDGLCID,"GL")=DDGLGLO
 | 
|---|
| 118 |  M DDGLCID(DDGLCID,"KMAP")=DDGLKEY("KMAP")
 | 
|---|
| 119 |  Q
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 | SETPARM ;Set parameters from DDGLCID array
 | 
|---|
| 122 |  N DDGLI
 | 
|---|
| 123 |  S DDGLGLO=DDGLCID(DDGLCID,"GL")
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  K DDGLKEY("KMAP")
 | 
|---|
| 126 |  M DDGLKEY("KMAP")=DDGLCID(DDGLCID,"KMAP")
 | 
|---|
| 127 |  M DDGLITEM=DDGLCID(DDGLCID,"ITEM")
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 |  S DDGLI=DDGLCID(DDGLCID,"SV")
 | 
|---|
| 130 |  S DDGLROW=$P(DDGLI,U,2)
 | 
|---|
| 131 |  S DDGLCOL=$P(DDGLI,U,3)
 | 
|---|
| 132 |  S DDGLNL=$P(DDGLI,U,4)
 | 
|---|
| 133 |  S DDGLNC=$P(DDGLI,U,5)
 | 
|---|
| 134 |  S DDGLLINE=$P(DDGLI,U,6)
 | 
|---|
| 135 |  S DDGLSEL=DDGLITEM(DDGLLINE)
 | 
|---|
| 136 |  K DDGLCID(DDGLCID)
 | 
|---|
| 137 |  Q
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 | INIT ;Create list box (window) and setup variables
 | 
|---|
| 140 |  ;In:      DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLGLO,DDGLMAP
 | 
|---|
| 141 |  ;Returns: DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 | 
|---|
| 142 |  ;         DDGLCID,DDGLNL,DDGLNC,DDGLLINE,DDGLITEM,DDGLKEY("KMAP")
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  N DDGLAREA,DDGLI,DDGLT
 | 
|---|
| 145 |  D INIT^DDGLIB0()
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  ;Check and default DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 | 
|---|
| 148 |  I $G(DDGLROW,-1)<0 S DDGLROW=5
 | 
|---|
| 149 |  E  I DDGLROW+3>IOSL S DDGLROW=IOSL-3
 | 
|---|
| 150 |  I $G(DDGLCOL,-1)<0 S DDGLCOL=5
 | 
|---|
| 151 |  E  I DDGLCOL+5>IOM S DDGLCOL=IOM-5
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  S DDGLHT=$S($D(DDGLHT)[0:7,DDGLHT<3:3,1:DDGLHT)
 | 
|---|
| 154 |  S:DDGLROW+DDGLHT+1>IOSL DDGLHT=IOSL-DDGLROW
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  S DDGLWD=$S($D(DDGLWD)[0:14,DDGLWD<5:5,1:DDGLWD)
 | 
|---|
| 157 |  S:DDGLCOL+DDGLWD+1>IOM DDGLWD=IOM-DDGLCOL
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 |  I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 | 
|---|
| 160 |  E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 | 
|---|
| 161 |  ;
 | 
|---|
| 162 |  ;Initialize variables
 | 
|---|
| 163 |  F DDGLI=1:1 Q:'$$EXIST^DDGLIBW("LBOX"_DDGLI)
 | 
|---|
| 164 |  S DDGLCID="LBOX"_DDGLI
 | 
|---|
| 165 |  S DDGLAREA=DDGLROW_U_DDGLCOL_U_DDGLHT_U_DDGLWD
 | 
|---|
| 166 |  S DDGLNL=DDGLHT-2
 | 
|---|
| 167 |  S DDGLNC=DDGLWD-4
 | 
|---|
| 168 |  S DDGLLINE=1
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  ;Fill DDGLITEM array
 | 
|---|
| 171 |  S DDGLT=DDGLSEL
 | 
|---|
| 172 |  F DDGLI=1:1:DDGLNL D
 | 
|---|
| 173 |  . S DDGLITEM(DDGLI)=DDGLT
 | 
|---|
| 174 |  . S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  ;Get key sequences, create window, display list
 | 
|---|
| 177 |  D GETKEY
 | 
|---|
| 178 |  D CREATE^DDGLIBW(DDGLCID,DDGLAREA,1)
 | 
|---|
| 179 |  D DISP(DDGLSEL)
 | 
|---|
| 180 |  Q
 | 
|---|
| 181 |  ;
 | 
|---|
| 182 | DISP(DDGLSEL) ;Display the list
 | 
|---|
| 183 |  ;In: DDGLSEL = text of selected item
 | 
|---|
| 184 |  ;
 | 
|---|
| 185 |  N DDGLI,DDGLT
 | 
|---|
| 186 |  F DDGLI=1:1:DDGLNL D
 | 
|---|
| 187 |  . D CUP(DDGLI,1)
 | 
|---|
| 188 |  . S DDGLT=$E(DDGLITEM(DDGLI),1,DDGLNC)
 | 
|---|
| 189 |  . S DDGLT=$S(DDGLT=DDGLSEL:$P(DDGLVID,DDGLDEL,6)_DDGLT_$P(DDGLVID,DDGLDEL,10),1:DDGLT)_$J("",DDGLNC-$L(DDGLT))
 | 
|---|
| 190 |  . W DDGLT
 | 
|---|
| 191 |  Q
 | 
|---|
| 192 |  ;
 | 
|---|
| 193 | CUP(Y,X) ;Position cursor relative to list coordinates
 | 
|---|
| 194 |  S DY=DDGLROW+Y,DX=DDGLCOL+X+1 X IOXY
 | 
|---|
| 195 |  Q
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | GETKEY ;Get key sequences and defaults
 | 
|---|
| 198 |  N AU,AD,AR,AL,F1,F2,F3,F4
 | 
|---|
| 199 |  N FIND,SELECT,INSERT,REMOVE,PREVSC,NEXTSC
 | 
|---|
| 200 |  N I,K,N,T
 | 
|---|
| 201 |  S AU=$P(DDGLKEY,U,2)
 | 
|---|
| 202 |  S AD=$P(DDGLKEY,U,3)
 | 
|---|
| 203 |  S AR=$P(DDGLKEY,U,4)
 | 
|---|
| 204 |  S AL=$P(DDGLKEY,U,5)
 | 
|---|
| 205 |  S F1=$P(DDGLKEY,U,6)
 | 
|---|
| 206 |  S FIND=$P(DDGLKEY,U,10)
 | 
|---|
| 207 |  S SELECT=$P(DDGLKEY,U,11)
 | 
|---|
| 208 |  S PREVSC=$P(DDGLKEY,U,14)
 | 
|---|
| 209 |  S NEXTSC=$P(DDGLKEY,U,15)
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 |  S DDGLKEY("KMAP","IN")="",DDGLKEY("KMAP","OUT")=""
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 |  I $D(DDGLMAP)>9 S I=0 F  S I=$O(DDGLMAP(I)) Q:'I  D
 | 
|---|
| 214 |  . I $P(DDGLMAP(I),";",2)="KEYDOWN" S DDGLKEY("KMAP","KD")=$P(DDGLMAP(I),";") Q
 | 
|---|
| 215 |  . I $P(DDGLMAP(I),";",2)="TIMEOUT" S DDGLKEY("KMAP","TO")=$P(DDGLMAP(I),";") Q
 | 
|---|
| 216 |  . ;
 | 
|---|
| 217 |  . S @("K="_$P(DDGLMAP(I),";",2))
 | 
|---|
| 218 |  . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 | 
|---|
| 219 |  .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 | 
|---|
| 220 |  .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(DDGLMAP(I),";")_";"
 | 
|---|
| 221 |  ;
 | 
|---|
| 222 |  F I=1:1 S T=$P($T(MAP+I),";;",2,999) Q:T=""  D
 | 
|---|
| 223 |  . S @("K="_$P(T,";",2))
 | 
|---|
| 224 |  . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 | 
|---|
| 225 |  .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 | 
|---|
| 226 |  .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(T,";")_";"
 | 
|---|
| 227 |  S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U
 | 
|---|
| 228 |  S DDGLKEY("KMAP","OUT")=$E(DDGLKEY("KMAP","OUT"),1,$L(DDGLKEY("KMAP","OUT"))-1)
 | 
|---|
| 229 |  Q
 | 
|---|
| 230 |  ;
 | 
|---|
| 231 | MAP ;Keys for main screen
 | 
|---|
| 232 |  ;;UP;AU
 | 
|---|
| 233 |  ;;UP;AL
 | 
|---|
| 234 |  ;;DN;AD
 | 
|---|
| 235 |  ;;DN;AR
 | 
|---|
| 236 |  ;;PUP;F1_AU
 | 
|---|
| 237 |  ;;PUP;PREVSC
 | 
|---|
| 238 |  ;;PDN;F1_AD
 | 
|---|
| 239 |  ;;PDN;NEXTSC
 | 
|---|
| 240 |  ;;TOP;F1_"T"
 | 
|---|
| 241 |  ;;TOP;F1_F1_AU
 | 
|---|
| 242 |  ;;TOP;FIND
 | 
|---|
| 243 |  ;;BOT;F1_"B"
 | 
|---|
| 244 |  ;;BOT;F1_F1_AD
 | 
|---|
| 245 |  ;;BOT;SELECT
 | 
|---|
| 246 |  ;;SEL;$C(13)
 | 
|---|
| 247 |  ;;SEL;F1_"E"
 | 
|---|
| 248 |  ;;QT;$C(27)_$C(27)
 | 
|---|
| 249 |  ;;QT;F1_"Q"
 | 
|---|
| 250 |  ;;QT;F1_"C"
 | 
|---|
| 251 |  ;;
 | 
|---|