home *** CD-ROM | disk | FTP | other *** search
Wrap
' ' '****************************************************************************** ' Function : QUERY * ' * ' Purpose: * ' * ' * ' Results: * ' * ' Usage : * ' * ' * ' Date Written : 09/01/90 - Date Tested: 09/01/90 - Author: James P Morgan * ' Date Modified: - : - : * '-----------------------------------------------------------------------------* ' NOTE: * '****************************************************************************** ' * ' SUB PROGRAM NAME (PARAMETERS) STATIC/RECURSIVE * '-----------------------------------------------------------------------------* ' * '============================================================================ ' ' SUB QUERY(MSGLINES%,MSGDAT$(1),QUADRANT$,MSG1$,LEFT.BUTTON.MSG$,LEFT.BUTTON.REPLY$,RIGHT.BUTTON.MSG$,RIGHT.BUTTON.REPLY$,QUERY.TYPE%,RETURN.CODE%) STATIC 100: DEFINT A-Z VIDEO.RETURN.CODE%=0 MAKEWIND.RETURN.CODE%=0 SETQUAD.RETURN.CODE%=0 MSGDAT.MIN=LBOUND(MSGDAT$) 'adjust to callers "OPTION BASE" 'Determine Maximum Length of Messages MSGLEN%=0 110: MENU.TOP.ROW=0 MENU.TOP.LEFT.COL=0 MENU.BOTTOM.ROW=0 MENU.BOTTOM.RIGHT.COL=0 FIRST.TIME=-1 ' ' SELECT CASE QUERY.TYPE% CASE 0 'caution/question type window FRAME=1 FORE=0 'black BACK=6 'yellow SHADOW=1 ACTIVE.FG%=0 ACTIVE.BG%=7 'white INACTIVE.FG%=0 INACTIVE.BG%=6 LABEL$="" CASE 1 'warning type window FRAME=1 FORE=15 'high intensity white BACK=4 'red SHADOW=1 ACTIVE.FG%=0 'black ACTIVE.BG%=7 'white INACTIVE.FG%=7 INACTIVE.BG%=4 LABEL$="" CASE ELSE FRAME=1 FORE=0 BACK=6 SHADOW=1 ACTIVE.FG%=0 ACTIVE.BG%=7 INACTIVE.FG%=0 INACTIVE.BG%=6 LABEL$="" END SELECT ' 120: CLICK=0 LFT%=0 RGT%=0 BUTTONS%=0 'assume no mouse support avail CALL MMCHECK(BUTTONS%) 'see if mouse support avail MOUSEROW=0 MOUSECOL=0 CALL MMSETLOC(MOUSECOL,MOUSEROW) 'locate the mouse in upper left CALL MMCURSORON CALL MMGETLOC(MOUSECOL,MOUSEROW) 'find the length of the longest message line ' 200: FOR I=MSGDAT.MIN TO MSGDAT.MIN+MSGLINES% IF LEN(MSGDAT$(I)) > MSGLEN% THEN MSGLEN%=LEN(MSGDAT$(I)) END IF NEXT MSG$=LTRIM$(RTRIM$(MSG1$)) IF MSGLEN%<LEN(MSG$) THEN 'make the header as big as MSGLEN%=LEN(MSG$) 'longest message , if need be END IF ' insure message buttons the same size as the largest of the two LEFT.BUTTON.MSG$=LTRIM$(RTRIM$(LEFT.BUTTON.MSG$)) RIGHT.BUTTON.MSG$=LTRIM$(RTRIM$(RIGHT.BUTTON.MSG$)) LEFT.BUTTON.LEN=LEN(LEFT.BUTTON.MSG$) RIGHT.BUTTON.LEN=LEN(RIGHT.BUTTON.MSG$) IF LEFT.BUTTON.LEN<8 THEN 'a button is a minimum of 8 characters BUTTON.PAD=(8-LEFT.BUTTON.LEN)\2 LEFT.BUTTON.MSG$=SPACE$(BUTTON.PAD)+LEFT.BUTTON.MSG$+SPACE$(8) LEFT.BUTTON.MSG$=LEFT$(LEFT.BUTTON.MSG$,8) LEFT.BUTTON.LEN=LEN(LEFT.BUTTON.MSG$) END IF IF RIGHT.BUTTON.LEN<8 THEN BUTTON.PAD=(8-RIGHT.BUTTON.LEN)\2 RIGHT.BUTTON.MSG$=SPACE$(BUTTON.PAD)+RIGHT.BUTTON.MSG$+SPACE$(8) RIGHT.BUTTON.MSG$=LEFT$(RIGHT.BUTTON.MSG$,8) RIGHT.BUTTON.LEN=LEN(RIGHT.BUTTON.MSG$) END IF 'make both buttons the same size (as the longest of the two) BUTTON.PAD%=ABS(LEFT.BUTTON.LEN-RIGHT.BUTTON.LEN)\2 IF LEFT.BUTTON.LEN<RIGHT.BUTTON.LEN THEN BUTTON.STRING$=STRING$(255," ") MID$(BUTTON.STRING$,1+BUTTON.PAD%)=LEFT.BUTTON.MSG$ LEFT.BUTTON.MSG$=LEFT$(BUTTON.STRING$,RIGHT.BUTTON.LEN) END IF IF RIGHT.BUTTON.LEN<LEFT.BUTTON.LEN THEN BUTTON.STRING$=STRING$(255," ") MID$(BUTTON.STRING$,1+BUTTON.PAD%)=RIGHT.BUTTON.MSG$ RIGHT.BUTTON.MSG$=LEFT$(BUTTON.STRING$,LEFT.BUTTON.LEN) END IF BUTTON.STRING$="" LEFT.BUTTON.LEN=LEN(LEFT.BUTTON.MSG$) RIGHT.BUTTON.LEN=LEN(RIGHT.BUTTON.MSG$) TEMP.MSGLEN=LEFT.BUTTON.LEN+RIGHT.BUTTON.LEN+8 ' make message header as wide as both buttons, if need be and center it IF MSGLEN%<TEMP.MSGLEN THEN MSGLEN%=TEMP.MSGLEN END IF MSG.STRING$=STRING$(255," ") MSG.PAD=ABS(LEN(MSG$)-MSGLEN%)\2 MID$(MSG.STRING$,1+MSG.PAD)=MSG$ MSG$=LEFT$(MSG.STRING$,LEN(MSG$)+(2*MSG.PAD)) MSG1$=MSG$ MSGLEN%=MSGLEN%+2 'If Quadrant is in ROW:COL format, extract Row and Column IF INSTR(QUADRANT$,":")<>0 THEN GOSUB QUERY.GET.ORD GOTO QUERY.GO1 END IF 'Determine Position based on Quadrant Parameter and size of QUERY Messages QUADRANT = VAL(QUADRANT$) IF QUADRANT <0 OR QUADRANT >4 THEN QUADRANT=0 END IF CALL SETQUAD(QUADRANT,CROW,CCOL,MSGLEN%+8,MSGLINES%+8,SETQUAD.RETURN.CODE%) ULR=CROW-((MSGLINES%+7)/2) 'adjust for header lines ULC=CCOL-(MSGLEN%/2) LRR=ULR+MSGLINES%+7 LRC=ULC+MSGLEN%-1 ' 'Create Window for QUERY Box QUERY.GO1: CALL MMCURSOROFF LABEL$="" GROW=0 QUERY.ULR=ULR 'remember co-ordinates for QUERY window QUERY.ULC=ULC QUERY.LRR=LRR QUERY.LRC=LRC CALL MAKEWIND(ULR,ULC,LRR,LRC,FRAME,FORE,BACK,GROW,SHADOW,LABEL$,MAKEWIND.RETURN.CODE%) ATTR=(BACK AND 7)*16+FORE ROW=ULR COL=ULC MSG$=STRING$(MSGLEN%,205) CALL FASTPRT(MSG$,ROW,COL,ATTR,VIDEO.RETURN.CODE%) ROW=ULR+2 CALL FASTPRT(MSG$,ROW,COL,ATTR,VIDEO.RETURN.CODE%) IF QUERY.TYPE%=1 THEN 'warning type window? ATTR=&hCF END IF ROW=ULR+1 COL=ULC MSG$=MSG1$ 'Place 'QUERY' Message in Box CALL FASTPRT(MSG$,ROW,COL,ATTR,VIDEO.RETURN.CODE%) IF QUERY.TYPE%=1 THEN FORE=7 ATTR=(BACK AND 7)*16+FORE END IF 300: FOR I=MSGDAT.MIN TO MSGDAT.MIN+MSGLINES% 'Place QUERY Text in Box ROW=ULR+(I-MSGDAT.MIN)+4 'normalize to base 1 COL=CCOL-(MSGLEN%/2)+1 MSG$=MSGDAT$(I) CALL FASTPRT(MSG$,ROW,COL,ATTR,VIDEO.RETURN.CODE%) NEXT CALL MMCURSORON ' 'Draw Cancel and Continue Boxes QUERY.SHIFT: CALL MMCURSOROFF IF FIRST.TIME THEN MOUSEROW=0 MOUSECOL=0 CALL MMSETLOC(MOUSECOL,MOUSEROW) END IF BOXULR=ULR+6+MSGLINES% BOXLRR=BOXULR BOXULC=CCOL-4-LEN(LEFT.BUTTON.MSG$) BOXLRC=CCOL-5 MENU.TOP.ROW=BOXULR-1 MENU.BOTTOM.ROW=BOXLRR+1 IF RETURN.CODE%=0 THEN BACK=ACTIVE.BG% FORE=ACTIVE.FG% MENU.TOP.LEFT.COL=BOXULC-1 MENU.BOTTOM.RIGHT.COL=BOXLRC+1 ELSE BACK=INACTIVE.BG% FORE=INACTIVE.FG% END IF SHADOW=0 LEFT.ULR=BOXULR-1 LEFT.ULC=BOXULC-1 LEFT.LRR=BOXLRR+1 LEFT.LRC=BOXLRC+1 CALL MAKEWIND(BOXULR,BOXULC,BOXLRR,BOXLRC,FRAME,FORE,BACK,GROW,SHADOW,LABEL$,MAKEWIND.RETURN.CODE%) MSG$=LEFT.BUTTON.MSG$ COL=BOXULC ATTR=(BACK AND 7)*16+FORE CALL FASTPRT(MSG$,BOXULR,COL,ATTR,VIDEO.RETURN.CODE%) BOXULC=CCOL+4 BOXLRC=CCOL+3+LEN(RIGHT.BUTTON.MSG$) IF RETURN.CODE%=0 THEN BACK=INACTIVE.BG% FORE=INACTIVE.FG% ELSE BACK=ACTIVE.BG% FORE=ACTIVE.FG% MENU.TOP.LEFT.COL=BOXULC-1 MENU.BOTTOM.RIGHT.COL=BOXLRC+1 END IF SHADOW=0 RIGHT.ULR=BOXULR-1 RIGHT.ULC=BOXULC-1 RIGHT.LRR=BOXLRR+1 RIGHT.LRC=BOXLRC+1 CALL MAKEWIND(BOXULR,BOXULC,BOXLRR,BOXLRC,FRAME,FORE,BACK,GROW,SHADOW,LABEL$,MAKEWIND.RETURN.CODE%) MSG$=RIGHT.BUTTON.MSG$ ATTR=(BACK AND 7)*16+FORE COL=BOXULC CALL FASTPRT(MSG$,BOXULR,COL,ATTR,VIDEO.RETURN.CODE%) IF FIRST.TIME THEN MOUSEROW=(MENU.TOP.ROW)*8 MOUSECOL=((MENU.TOP.LEFT.COL+((MENU.BOTTOM.RIGHT.COL-MENU.TOP.LEFT.COL)\2))-1)*8 CALL MMSETLOC(MOUSECOL,MOUSEROW) FIRST.TIME=0 END IF CALL MMCURSORON ' QUERY.PRESS: GOSUB QUERY.GET.PRESS IF KP$="" THEN GOTO QUERY.PRESS END IF IF LEN(KP$)=2 THEN 'extended function key pressed GOTO QUERY.PRESS.EXTENDED END IF IF KP$=CHR$(27) THEN 'ESC key pressed RETURN.CODE%=-1 GOTO QUERY.DONE END IF IF KP$=CHR$(13) THEN 'ENTER key pressed GOTO QUERY.DONE END IF IF INSTR(LEFT.BUTTON.REPLY$,KP$)<>0 THEN IF RETURN.CODE%=1 THEN RETURN.CODE%=0 GOTO QUERY.SHIFT END IF END IF IF INSTR(RIGHT.BUTTON.REPLY$,KP$)<>0 THEN IF RETURN.CODE%=0 THEN RETURN.CODE%=1 GOTO QUERY.SHIFT END IF END IF 'Process ERROR GOSUB QUERY.SOUNDOFF GOTO QUERY.PRESS ' QUERY.PRESS.EXTENDED: 'Process LEFT ARROW KeyPress IF ASC(RIGHT$(KP$,1))=77 THEN IF RETURN.CODE%=1 THEN RETURN.CODE%=0 GOTO QUERY.SHIFT ELSEIF RETURN.CODE%=0 THEN RETURN.CODE%=1 GOTO QUERY.SHIFT END IF END IF 'Process RIGHT ARROW KeyPress IF ASC(RIGHT$(KP$,1))=75 THEN IF RETURN.CODE%=1 THEN RETURN.CODE%=0 GOTO QUERY.SHIFT ELSEIF RETURN.CODE%=0 THEN RETURN.CODE%=1 GOTO QUERY.SHIFT END IF END IF 'Process ERROR GOSUB QUERY.SOUNDOFF GOTO QUERY.PRESS ' ' QUERY.GET.PRESS: IF BUTTONS%=0 THEN 'mouse supported? GOTO QUERY.GET.INKEY 'NO END IF CALL MMGETLOC(MOUSECOL,MOUSEROW) 'get mouse cursor location MOUSECOL=(MOUSECOL\8)+1 'convert to 80x25 text screen co-ordinates MOUSEROW=(MOUSEROW\8)+1 QUERY.CHECK.IF.INBOX: IF (MOUSEROW<QUERY.ULR) OR (MOUSEROW>QUERY.LRR) THEN GOTO QUERY.OUTSIDE.BOX END IF IF (MOUSECOL<QUERY.ULC) OR (MOUSECOL>QUERY.LRC) THEN GOTO QUERY.OUTSIDE.BOX END IF IF ((MOUSEROW>=LEFT.ULR) AND (MOUSEROW<=LEFT.LRR))_ AND_ ((MOUSECOL>=LEFT.ULC) AND (MOUSECOL<=LEFT.LRC)) THEN GOTO QUERY.CHECK.LEFT.BOX END IF IF ((MOUSEROW>=RIGHT.ULR) AND (MOUSEROW<=RIGHT.LRR))_ AND_ ((MOUSECOL>=RIGHT.ULC) AND (MOUSECOL<=RIGHT.LRC)) THEN GOTO QUERY.CHECK.RIGHT.BOX END IF CLICK=-1 'flush the mouse clicks DO WHILE CLICK CALL MMCLICK(LFT%,RGT%) 'see if user clicked mouse while in the box CLICK=LFT%+RGT% 'any button clicked LOOP GOTO QUERY.GET.INKEY ' QUERY.CHECK.LEFT.BOX: CALL MMCLICK(LFT%,RGT%) 'see if user clicked mouse while in the box CLICK=LFT%+RGT% 'any button clicked IF CLICK=0 THEN GOTO QUERY.GET.INKEY END IF IF RETURN.CODE%=1 THEN 'simulate Left or Right Cursor press KP$=LEFT$(LEFT.BUTTON.REPLY$,1) ELSE KP$=CHR$(13) END IF RETURN ' QUERY.CHECK.RIGHT.BOX: CALL MMCLICK(LFT%,RGT%) 'see if user clicked mouse while in the box CLICK=LFT%+RGT% 'any button clicked IF CLICK=0 THEN GOTO QUERY.GET.INKEY END IF IF RETURN.CODE%=1 THEN 'simulate Left or Right Cursor press KP$=CHR$(13) ELSE KP$=LEFT$(RIGHT.BUTTON.REPLY$,1) END IF RETURN ' QUERY.OUTSIDE.BOX: CALL MMCLICK(LFT%,RGT%) 'see if user clicked mouse while in the box CLICK=LFT%+RGT% 'any button clicked IF CLICK THEN KP$=CHR$(27) 'YES, same as pressing ENTER RETURN END IF GOTO QUERY.GET.INKEY ' QUERY.GET.INKEY: KP$=INKEY$ 'was a keyboard key pressed IF LEN(KP$)=0 THEN GOTO QUERY.GET.PRESS 'NO END IF RETURN ' QUERY.GET.ORD: QUADRANT$=LTRIM$(QUADRANT$) QUADRANT$=RTRIM$(QUADRANT$) COLON.LOC=INSTR(QUADRANT$,":") IF COLON.LOC=1 THEN QUADRANT$="01"+QUADRANT$ COLON.LOC=3 END IF ULR%=VAL(LEFT$(QUADRANT$,COLON.LOC-1)) IF (ULR%<1) OR (ULR%>24) THEN ULR%=2 END IF IF COLON.LOC=LEN(QUADRANT$) THEN QUADRANT$=QUADRANT$+"00" END IF ULC%=VAL(RIGHT$(QUADRANT$,COLON.LOC+1)) IF (ULC%<1) OR (ULC%>80) THEN GOSUB QUERY.CENTER.ON.THE.LINE END IF QUADRANT.ROW$=STR$(ULR%) QUADRANT$="0"+RIGHT$(QUADRANT.ROW$,LEN(QUADRANT.ROW$)-1)+":" QUADRANT.COL$=STR$(ULC%) QUADRANT$=QUADRANT$+"0"+RIGHT$(QUADRANT.COL$,LEN(QUADRANT.COL$)-1) ULR%=ULR%+1 LRR=ULR+MSGLINES%+7 LRC=ULC+MSGLEN%-1 CCOL=ULC+((LRC-ULC)/2+.5) RETURN QUERY.CENTER.ON.THE.LINE: TEMP.ULC=40-(MSGLEN%/2) IF (ULC<2) THEN TEMP.ULC=2 END IF ULC=TEMP.ULC RETURN ' QUERY.SOUNDOFF: SOUND 1000,1 SOUND 1500,2 SOUND 500,1 RETURN ' QUERY.DONE: MSG.STRING$="" 'string space cleanup MSG$="" KP$="" CALL MMCURSOROFF EXIT SUB END SUB