DDGLBXA ;SFISC/MKO-A LIST BOX ;1:58 PM  26 Apr 1996
 ;;22.0;VA FileMan;;Mar 30, 1999
 ;Per VHA Directive 10-93-142, this routine should not be modified.
 ;
LIST(DDGLGLO,DDGLOUT,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLFLG,DDGLMAP) ;
 ;Input:
 ;  DDGLGLO = closed reference of local or global that contains
 ;            the list of entries
 ;               @DDGLGLO("B",entry,index)=""
 ;  DDGLROW = $Y of top left corner
 ;  DDGLCOL = $X of top left corner
 ;  DDGLHT  = height of box
 ;  DDGLWD  = width of box
 ;  DDGLSEL = text of selected item
 ;  DDGLFLG = flags
 ;  DDGLMAP = array to customize key sequences
 ;
 ;Output:
 ;  DDGLOUT = index of selected entry (if any)
 ;  DDGLOUT(0) = selected entry
 ;  DDGLOUT("C") = code indicates what terminated the read
 ;
 ;Other variables:
 N DDGLCID ;  window (control) id
 N DDGLNL ; number of lines in list
 N DDGLNC ; number of columns in list
 N DDGLLINE ; current line number
 N DDGLITEM ; item array
 ;              DDGLITEM(1..DDGLNL) = text of item displayed
 ;
 Q:$G(DDGLGLO)=""
 D INIT
 X DDGLZOSF("EOFF")
 W $P(DDGLVID,DDGLDEL,11)
 ;
 D ^DDGLBXA1
 ;
 W $P(DDGLVID,DDGLDEL,12)
 X DDGLZOSF("EON")
 D DESTROY(DDGLCID,$G(DDGLFLG))
 Q
 ;
CREATE(DDGLGLO,DDGLCID,DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLMAP) ;
 ;Create a list box window
 ;Out:
 ; .DDGLCID array = properties of list box
 ; .DDGLCID(id,"SV") = cid^$Y^$X^NL^NC^LINE
 ; .DDGLCID(id,"ITEM",1..nl) = text of item n in display
 ; .DDGLCID(id,"GL") = DDGLGLO
 ; .DDGLCID(id,"KMAP","IN")
 ; .DDGLCID(id,"KMAP","OUT")
 ; .DDGLCID(id,"KMAP","KD")
 ; .DDGLCID(id,"KMAP","TO")
 ;
 Q:$G(DDGLGLO)=""
 N DDGLNL,DDGLNC,DDGLLINE,DDGLLAST,DDGLITEM
 D INIT
 D SETCID
 Q
 ;
DESTROY(DDGLCID,DDGLFLG) ;Destroy the window and cleanup
 D DESTROY^DDGLIBW(DDGLCID)
 K DDGLCID(DDGLCID)
 D KILL^DDGLIB0($G(DDGLFLG))
 Q
 ;
READ(DDGLCID,DDGLOUT) ;
 N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 N DX,DY
 ;
 D SETPARM
 X DDGLZOSF("EOFF")
 W $P(DDGLVID,DDGLDEL,11)
 ;
 D ^DDGLBXA1
 ;
 D SETCID
 W $P(DDGLVID,DDGLDEL,12)
 X DDGLZOSF("EON")
 Q
 ;
UPDATE(DDGLCID,DDGLVAL) ;
 N DDGLGLO,DDGLROW,DDGLCOL,DDGLNL,DDGLNC,DDGLLINE,DDGLSEL,DDGLITEM
 N DDGLI,DDGLT,DX,DY
 ;
 D SETPARM
 ;
 ;Get closest match incl. or foll. DDGLVAL
 S DDGLSEL=$G(DDGLVAL)
 I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 Q:DDGLSEL=""
 ;
 ;Check whether DDGLVAL is already on the screen
 I DDGLITEM(1)']]DDGLSEL,DDGLSEL']]DDGLITEM(DDGLNL) D
 . D CUP(DDGLLINE,1)
 . W $E(DDGLITEM(DDGLLINE),1,DDGLNC)
 . F DDGLLINE=1:1:DDGLNL Q:DDGLITEM(DDGLLINE)=DDGLSEL
 . D CUP(DDGLLINE,1)
 . W $P(DDGLVID,DDGLDEL,6)_$E(DDGLSEL,1,DDGLNC)_$P(DDGLVID,DDGLDEL,10)
 ;
 ;If not, adjust the array
 E  D
 . S DDGLT=DDGLSEL
 . F DDGLI=1:1:DDGLNL D
 .. S DDGLITEM(DDGLI)=DDGLT
 .. S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 . D DISP(DDGLSEL)
 ;
 D SETCID
 Q
 ;
SETCID ;Set DDGLCID array
 K DDGLCID(DDGLCID)
 S DDGLCID(DDGLCID,"SV")=DDGLCID_U_DDGLROW_U_DDGLCOL_U_DDGLNL_U_DDGLNC_U_DDGLLINE
 M DDGLCID(DDGLCID,"ITEM")=DDGLITEM
 S DDGLCID(DDGLCID,"GL")=DDGLGLO
 M DDGLCID(DDGLCID,"KMAP")=DDGLKEY("KMAP")
 Q
 ;
SETPARM ;Set parameters from DDGLCID array
 N DDGLI
 S DDGLGLO=DDGLCID(DDGLCID,"GL")
 ;
 K DDGLKEY("KMAP")
 M DDGLKEY("KMAP")=DDGLCID(DDGLCID,"KMAP")
 M DDGLITEM=DDGLCID(DDGLCID,"ITEM")
 ;
 S DDGLI=DDGLCID(DDGLCID,"SV")
 S DDGLROW=$P(DDGLI,U,2)
 S DDGLCOL=$P(DDGLI,U,3)
 S DDGLNL=$P(DDGLI,U,4)
 S DDGLNC=$P(DDGLI,U,5)
 S DDGLLINE=$P(DDGLI,U,6)
 S DDGLSEL=DDGLITEM(DDGLLINE)
 K DDGLCID(DDGLCID)
 Q
 ;
INIT ;Create list box (window) and setup variables
 ;In:      DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLSEL,DDGLGLO,DDGLMAP
 ;Returns: DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 ;         DDGLCID,DDGLNL,DDGLNC,DDGLLINE,DDGLITEM,DDGLKEY("KMAP")
 ;
 N DDGLAREA,DDGLI,DDGLT
 D INIT^DDGLIB0()
 ;
 ;Check and default DDGLROW,DDGLCOL,DDGLHT,DDGLWD,DDGLIND
 I $G(DDGLROW,-1)<0 S DDGLROW=5
 E  I DDGLROW+3>IOSL S DDGLROW=IOSL-3
 I $G(DDGLCOL,-1)<0 S DDGLCOL=5
 E  I DDGLCOL+5>IOM S DDGLCOL=IOM-5
 ;
 S DDGLHT=$S($D(DDGLHT)[0:7,DDGLHT<3:3,1:DDGLHT)
 S:DDGLROW+DDGLHT+1>IOSL DDGLHT=IOSL-DDGLROW
 ;
 S DDGLWD=$S($D(DDGLWD)[0:14,DDGLWD<5:5,1:DDGLWD)
 S:DDGLCOL+DDGLWD+1>IOM DDGLWD=IOM-DDGLCOL
 ;
 I $G(DDGLSEL)="" S DDGLSEL=$O(@DDGLGLO@(""))
 E  I '$D(@DDGLGLO@(DDGLSEL)) S DDGLSEL=$O(@DDGLGLO@(DDGLSEL))
 ;
 ;Initialize variables
 F DDGLI=1:1 Q:'$$EXIST^DDGLIBW("LBOX"_DDGLI)
 S DDGLCID="LBOX"_DDGLI
 S DDGLAREA=DDGLROW_U_DDGLCOL_U_DDGLHT_U_DDGLWD
 S DDGLNL=DDGLHT-2
 S DDGLNC=DDGLWD-4
 S DDGLLINE=1
 ;
 ;Fill DDGLITEM array
 S DDGLT=DDGLSEL
 F DDGLI=1:1:DDGLNL D
 . S DDGLITEM(DDGLI)=DDGLT
 . S:DDGLT]"" DDGLT=$O(@DDGLGLO@(DDGLT))
 ;
 ;Get key sequences, create window, display list
 D GETKEY
 D CREATE^DDGLIBW(DDGLCID,DDGLAREA,1)
 D DISP(DDGLSEL)
 Q
 ;
DISP(DDGLSEL) ;Display the list
 ;In: DDGLSEL = text of selected item
 ;
 N DDGLI,DDGLT
 F DDGLI=1:1:DDGLNL D
 . D CUP(DDGLI,1)
 . S DDGLT=$E(DDGLITEM(DDGLI),1,DDGLNC)
 . S DDGLT=$S(DDGLT=DDGLSEL:$P(DDGLVID,DDGLDEL,6)_DDGLT_$P(DDGLVID,DDGLDEL,10),1:DDGLT)_$J("",DDGLNC-$L(DDGLT))
 . W DDGLT
 Q
 ;
CUP(Y,X) ;Position cursor relative to list coordinates
 S DY=DDGLROW+Y,DX=DDGLCOL+X+1 X IOXY
 Q
 ;
GETKEY ;Get key sequences and defaults
 N AU,AD,AR,AL,F1,F2,F3,F4
 N FIND,SELECT,INSERT,REMOVE,PREVSC,NEXTSC
 N I,K,N,T
 S AU=$P(DDGLKEY,U,2)
 S AD=$P(DDGLKEY,U,3)
 S AR=$P(DDGLKEY,U,4)
 S AL=$P(DDGLKEY,U,5)
 S F1=$P(DDGLKEY,U,6)
 S FIND=$P(DDGLKEY,U,10)
 S SELECT=$P(DDGLKEY,U,11)
 S PREVSC=$P(DDGLKEY,U,14)
 S NEXTSC=$P(DDGLKEY,U,15)
 ;
 S DDGLKEY("KMAP","IN")="",DDGLKEY("KMAP","OUT")=""
 ;
 I $D(DDGLMAP)>9 S I=0 F  S I=$O(DDGLMAP(I)) Q:'I  D
 . I $P(DDGLMAP(I),";",2)="KEYDOWN" S DDGLKEY("KMAP","KD")=$P(DDGLMAP(I),";") Q
 . I $P(DDGLMAP(I),";",2)="TIMEOUT" S DDGLKEY("KMAP","TO")=$P(DDGLMAP(I),";") Q
 . ;
 . S @("K="_$P(DDGLMAP(I),";",2))
 . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(DDGLMAP(I),";")_";"
 ;
 F I=1:1 S T=$P($T(MAP+I),";;",2,999) Q:T=""  D
 . S @("K="_$P(T,";",2))
 . I DDGLKEY("KMAP","IN")'[(U_K),K]"" D
 .. S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U_K
 .. S DDGLKEY("KMAP","OUT")=DDGLKEY("KMAP","OUT")_$P(T,";")_";"
 S DDGLKEY("KMAP","IN")=DDGLKEY("KMAP","IN")_U
 S DDGLKEY("KMAP","OUT")=$E(DDGLKEY("KMAP","OUT"),1,$L(DDGLKEY("KMAP","OUT"))-1)
 Q
 ;
MAP ;Keys for main screen
 ;;UP;AU
 ;;UP;AL
 ;;DN;AD
 ;;DN;AR
 ;;PUP;F1_AU
 ;;PUP;PREVSC
 ;;PDN;F1_AD
 ;;PDN;NEXTSC
 ;;TOP;F1_"T"
 ;;TOP;F1_F1_AU
 ;;TOP;FIND
 ;;BOT;F1_"B"
 ;;BOT;F1_F1_AD
 ;;BOT;SELECT
 ;;SEL;$C(13)
 ;;SEL;F1_"E"
 ;;QT;$C(27)_$C(27)
 ;;QT;F1_"Q"
 ;;QT;F1_"C"
 ;;
