5 TITLE SELQUIT
- Exit Panel support for SELECT
.EXE
;AN000;
6 SUBTTL selquit
.asm
;AN000;
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16 ; This files must be compiled with MASM 3.0 (using /A option)
18 ; Copyright 1988 Microsoft
20 ; ;AN001; Added flag to indicate error processing was in effect.
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25 INCLUDE PANEL
.MAC
;AN000;
26 INCLUDE PCEQUATE
.INC ;AN000;
27 INCLUDE PAN
-LIST
.INC ;AN000;
28 INCLUDE CASTRUC
.INC ;AN000;
29 INCLUDE EXT
.INC ;AN000;
30 INCLUDE STRUC.INC ;AN000;
31 INCLUDE MACROS
.INC ;AN000;
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 EXTRN QM_ACTIVEPAN
:WORD ;AN000;
40 EXTRN GET_KEY
:NEAR ;AN000;
41 EXTRN CURSOROFF
:NEAR ;AN000;
42 EXTRN PCINPUT_CALL
:NEAR ;AN000;
43 EXTRN PCDISPQ_CALL
:NEAR ;AN000;
45 EXTRN WR_DRETLEN
:WORD ;AN000;
46 EXTRN WR_DRETOFF
:WORD ;AN000;
47 EXTRN WR_DRETSEG
:WORD ;AN000;
48 EXTRN GET_PCB
:NEAR ;AN000;
49 EXTRN QM_OPT1
:WORD ;AN000;
50 EXTRN QM_ID
:WORD ;AN000;
51 EXTRN INC_KS
:WORD ;AN000;
53 EXTRN HANDLE_CHILDREN
:NEAR ;AN000;
54 EXTRN ADJUST_UP
:NEAR ;AN000;
55 EXTRN ADJUST_DOWN
:NEAR ;AN000;
56 EXTRN INIT_PQUEUE_CALL
:NEAR ;AN000;
57 EXTRN PREPARE_PANEL_CALL
:NEAR ;AN000;
58 EXTRN DISPLAY_PANEL_CALL
:NEAR ;AN000;
59 EXTRN GET_FUNCTION_CALL
:NEAR ;AN000;
60 EXTRN QM_OPT2
:WORD ;AN000;
61 EXTRN WR_REFIELDCNT
:WORD ;AN000;
62 EXTRN ERROR_KEYS
:BYTE ;AN000;
63 EXTRN ERROR_KEYS_LEN
:ABS
;AN000;
64 EXTRN PCMBEEP_CALL
:NEAR ;AN000;
65 EXTRN BIN_TO_CHAR_ROUTINE
:FAR ;AN000;
70 SELECT
SEGMENT PARA
PUBLIC 'SELECT' ;AN000;segment for far routine
71 ASSUME
CS:SELECT
;AN000;
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ; CLC = return to SELECT
78 ; STC = quit SELECT.....
80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81 F3_ACTIVE
DB FALSE
;AN001;DT
83 PUBLIC HANDLE_F3
;AN000;
84 HANDLE_F3 PROC
;AN000;
85 PUSHH
<AX,BX,DI,ES,WR_DRETLEN
> ;AN000;
86 PUSHH
<WR_DRETOFF
,WR_DRETSEG
> ;AN000;
87 PUSHH
<WR_REFIELDCNT
> ;AN000;
89 .IF < F3_ACTIVE
eq FALSE
> near ;AN000;
90 CALL CURSOROFF
;;AN000;;;
92 MOV AX,QM_PUSHPQU
;AN000;save parent queue
93 OR AX,QM_PUSHCQU
;AN000;save child queue
94 MOV QM_OPT1
,AX ;AN000;
95 CALL PCDISPQ_CALL
;AN000;update display queue
97 MOV QM_OPT1
,QM_CLSPAN
;AN000;clear parent panel queue
98 OR QM_OPT1
,QM_CLSCHD
;AN000;clear parent panel queue
99 CALL PCDISPQ_CALL
;AN000;update display queue
100 MOV QM_ACTIVEPAN
,PAN_CONFIRM
;AN000;current active parent panel
101 MOV AX,PAN_CONFIRM
;AN000;
102 MOV QM_OPT1
,QM_PUSHPAN
;AN000;push parent panels
103 CALL PREPARE_PANEL_CALL
;AN000;add panel to display queue
105 MOV WR_REFIELDCNT
,0 ;AN000;set for break = off
106 PREPARE_PANEL PAN_HBAR
;AN000;
107 PREPARE_CHILDREN
;AN000;
108 DISPLAY_PANEL
;AN000;push parent panels
110 MOV CX,FK_ENT_F3_LEN
;AN000;
111 LEA DX,FK_ENT_F3
;AN000;
112 MOV WR_DRETLEN
,CX ;AN000;get return string length
113 MOV AX,DX ;AN000;get return string offset
114 MOV WR_DRETOFF
,AX ;AN000;
115 MOV AX,DS ;AN000;get return string segment
116 MOV WR_DRETSEG
,AX ;AN000;
118 MOV AX,INC_KS
;AN003;GHG
119 MOV N_USER_FUNC
,AX ;AN003;GHG
121 MOV AX,QM_POPPQU
;AN000;
122 OR AX,QM_POPCQU
;AN000;
123 MOV QM_OPT1
,AX ;AN000;
124 CALL PCDISPQ_CALL
;AN000;
125 MOV AX,I_USER_INDEX
;AN000;get last current element
127 .IF < N_USER_FUNC
eq F3
*256 > ;AN000;
130 MOV F3_ACTIVE
,TRUE
;AN000;DT Indicate exit selected
132 POP WR_REFIELDCNT
;AN000;
133 PUSH WR_REFIELDCNT
;AN000;
134 DISPLAY_PANEL
;AN000;
138 .ELSE ;AN027;SEH Set carry flag to avoid
139 STC ;AN027;SEH endless loop in Get_Function_call
142 POPP
<WR_REFIELDCNT
,WR_DRETSEG
> ;AN000;
143 POPP
<WR_DRETOFF
,WR_DRETLEN
,ES> ;AN000;
144 POPP
<DI,BX,AX> ;AN000;
146 HANDLE_F3 ENDP
;AN000;
147 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
153 ERROR_PANEL
DW ?
;AN000;
154 ERROR_TYPE
DW ?
;AN000;
155 ERROR_CODE
DW ?
;AN000;
156 ERROR_STRING
DB 5 DUP(0) ;AN000;
158 PUBLIC ERROR_ACTIVE
;AN001;JW
159 ERROR_ACTIVE
DB 0 ;AN001;JW
161 PUBLIC HANDLE_ERROR_CALL
;AN000;
162 HANDLE_ERROR_CALL PROC
FAR ;AN000;
163 PUSHH
<AX,BX,DI,ES,WR_DRETLEN
> ;AN000;
164 PUSHH
<WR_DRETOFF
,WR_DRETSEG
> ;AN000;
165 PUSHH
<WR_REFIELDCNT
> ;AN000;
167 MOV ERROR_CODE
,AX ;AN000;
168 MOV ERROR_PANEL
,BX ;AN000;
169 MOV ERROR_TYPE
,CX ;AN000;
170 MOV ERROR_ACTIVE
,1 ;AN001;JW
172 MOV BX,ERR_BORDER
;AN000;DT current active parent panel
173 CALL GET_PCB
;AN000;DT get the PCB for this
174 MOV ES:[DI].PCB_CHILDNUM
,CX ;AN000;DT set the number of children
176 CALL CURSOROFF
;AN000;
178 MOV QM_OPT1
,QM_PUSHPQU
;AN000;save parent queue
179 OR QM_OPT1
,QM_PUSHCQU
;AN000;save child queue
180 CALL PCDISPQ_CALL
;AN000;update display queue
182 .IF < F3_ACTIVE
eq TRUE
> ;AN000;
183 MOV QM_OPT1
,QM_CLSPAN
;AN000;clear parent panel queue
184 OR QM_OPT1
,QM_CLSCHD
;AN000;clear parent panel queue
185 CALL PCDISPQ_CALL
;AN000;update display queue
188 MOV QM_OPT1
,QM_PUSHPAN
;AN000;push parent panels
189 OR QM_OPT2
,QM_BREAKON
;AN000;break on
191 MOV BX,ERR_BORDER
;AN000;current active parent panel
192 MOV QM_ID
,BX ;AN000;current active parent panel
193 MOV QM_ACTIVEPAN
,BX ;AN000;current active parent panel
195 CALL PREPARE_PANEL_CALL
;AN000;add panel to display queue
197 MOV QM_OPT2
,0 ;AN000;
199 ;;;;;;;;MOV WR_REFIELDCNT,0 ;set for break = off
200 PREPARE_PANEL ERROR_PANEL
;AN000;
201 PREPARE_CHILDREN
;AN000;
202 DISPLAY_PANEL
;AN000;push parent panels
204 CALL PCMBEEP_CALL
;AN000;
206 MOV CX,ERROR_TYPE
;AN000;
208 LEA DX,ERROR_KEYS
;AN000;
209 CALL GET_FUNCTION_CALL
;AN000;
210 MOV ERROR_ACTIVE
,0 ;AN001;JW
212 MOV QM_OPT1
,QM_POPPQU
;AN000;
213 OR QM_OPT1
,QM_POPCQU
;AN000;
214 CALL PCDISPQ_CALL
;AN000;
215 MOV AX,I_USER_INDEX
;AN000;get last current element
217 .IF < N_USER_FUNC
eq F3
*256 > or ;AC000;DT F3 to exit SELECT
218 .IF < F3_ACTIVE
eq TRUE
> ;AN000;DT or already selected
222 POP WR_REFIELDCNT
;AN000;
223 PUSH WR_REFIELDCNT
;AN000;
224 DISPLAY_PANEL
;AN000;
228 POPP
<WR_REFIELDCNT
,WR_DRETSEG
>;AN000;
229 POPP
<WR_DRETOFF
,WR_DRETLEN
,ES>;AN000;
230 POPP
<DI,BX,AX> ;AN000;
232 HANDLE_ERROR_CALL ENDP
;AN000;
233 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
238 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
239 PUBLIC HANDLE_PANEL_CALL
;AN000;
240 HANDLE_PANEL_CALL PROC
FAR ;AN000;
244 MOV AX,PAN_INSTALL_DOS
;AN000;
245 CALL INIT_PQUEUE_CALL
;AN000;
247 CALL PREPARE_PANEL_CALL
;AN000;
249 .IF < AX ne PAN_DSKCPY_CPY
> ;AN000;
250 MOV AX,PAN_HBAR
;AN000;
251 CALL PREPARE_PANEL_CALL
;AN000;
252 CALL HANDLE_CHILDREN
;AN000;
254 CALL DISPLAY_PANEL_CALL
;AN000;
257 HANDLE_PANEL_CALL ENDP
;AN000;
258 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
263 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
264 PUBLIC HANDLE_PANEL_CALL2
;AN000;
265 HANDLE_PANEL_CALL2 PROC
FAR ;AN000;
269 CALL INIT_PQUEUE_CALL
;AN000;DT
271 CALL PREPARE_PANEL_CALL
;AN000;
274 .IF < AX ne SUB_COPYING
> ;AN000;
275 MOV AX,PAN_HBAR
;AN000;
276 CALL PREPARE_PANEL_CALL
;AN000;
277 CALL HANDLE_CHILDREN
;AN000;
279 CALL DISPLAY_PANEL_CALL
;AN000;
282 HANDLE_PANEL_CALL2 ENDP
;AN000;
283 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
287 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
288 PUBLIC HANDLE_PANEL_CALL3
;AN111;JW
289 HANDLE_PANEL_CALL3 PROC
FAR ;AN111;JW
290 CALL INIT_PQUEUE_CALL
;AN111;JW
291 CALL DISPLAY_PANEL_CALL
;AN111;JW
293 HANDLE_PANEL_CALL3 ENDP
;AN111;JW
294 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
300 PUBLIC HANDLE_KEYSTROKE
;AN000;
301 HANDLE_KEYSTROKE PROC
FAR ;AN000;
302 MOV CX,FK_ENT_LEN
;AN000;
303 LEA DX,FK_ENT
;AN000;
304 CALL GET_FUNCTION_CALL
;AN000;
306 HANDLE_KEYSTROKE ENDP
;AN000;
307 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
309 ; End of program code
311 ;;;;;;;;;;;;;;;;;;;;;;;;;