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