home *** CD-ROM | disk | FTP | other *** search
- *!******************************************************
- *!
- *! Program: YesItWorks
- *! Purpose: To demonstrate GHOICE(), extra-strength
- *! heavy-duty ACHOICE() shell
- *! Author: Greg Lief
- *!
- *!******************************************************
- #include "gkeys.ch"
- #translate FAKE_KEY => __Keyboard(CHR(255))
-
- LOCAL MyArray, mrow := 5, mcol := 25, xx, oldcursor := SETCURSOR(0)
- PRIVATE oldcolor
- MyArray := {"BASS ", "BLUEGILL ", "GRUMPFISH ", ;
- "ROCKFISH ", "SAILFISH ", "COD ", "HADDOCK ", ;
- "HOLY MACKEREL ", "MACKEREL ", "HERRING ", ;
- "SALMON ", "TUNA ", "BARRACUDA ", "PIRANHA ", ;
- "DOLPHIN ", "HATCHET ", "STICKLEBACK ", ;
- "SCALED BLENNY ", "PUFFER ", "SARGASSUM ", ;
- "VIPERFISH ", "LAMPREY ", "BLOWFISH ", "CATFISH ", ;
- "ANGELFISH ", "FIGHTING FISH ", "TRIGGERFISH ", ;
- "ROSEFISH "}
- Ghoice(MyArray)
- CLEAR
- oldcolor := SETCOLOR("+W/RB")
- BOX1(4, 23, 19, 56)
- CENTER(4, "[ Selected Fish ]")
- FOR xx = 1 TO 28
- IF RIGHT(MyArray[xx], 1) = CHR(251)
- @ mrow, mcol SAY SUBSTR(MyArray[xx], 1, ;
- LEN(MyArray[xx]) - 1)
- IF mcol = 25
- mcol = 42
- ELSE
- mcol = 25
- mrow++
- ENDIF
- ENDIF
- NEXT
- INKEY(0)
- SETCURSOR(oldcursor)
- SETCOLOR(oldcolor)
- RETURN
-
-
- *!******************************************************
- *!
- *! Function: Ghoice()
- *! Purpose: Shell for ACHOICE() that provides:
- *! (a) elevator status bar showing relative
- *! position (particularly useful when not
- *! all array elements appear on screen at
- *! the same time)
- *! (b) search provision by typing first
- *! letters of desired element
- *! (c) ability to tag one or all array
- *! elements for future batch processing
- *! Author: Greg Lief
- *! Copyright (c) 1989-90 Greg Lief
- *!
- *!******************************************************
- FUNCTION Ghoice
- PARAMETERS marray, mtop, mleft, mbottom, mright
- LOCAL xx, maxwidth, oldcolor, oldscrn
- PRIVATE rel_elem, rel_row, buffer, searchstr, ;
- last_ele, unsel_clr, box_clr, bar_clr, ;
- hilite_clr, bar_line
- last_ele := LEN(marray)
- IF PCOUNT() = 1
- *** determine widest array element
- maxwidth := 0
- AEVAL(marray, { | a | maxwidth := MAX(maxwidth, LEN(a)) } )
- mright := (mleft := INT((78 - maxwidth) / 2)) + maxwidth + 1
- mtop := 7
- mbottom := 17
- ENDIF
- searchstr := []
- rel_elem := rel_row := 1
- box_clr := IF(ISCOLOR(), 'W/B', 'W/N')
- bar_clr := 'W/N, I'
- stat_clr := '+GR/N'
- unsel_clr := box_clr
- hilite_clr := 'I'
- draw_bar := (last_ele > mbottom - mtop - 1)
- *** force status bar to be drawn on first pass
- bar_line := mtop + 2
- oldcolor := SETCOLOR(box_clr)
- oldscrn := SAVESCREEN(mtop, mleft, mbottom, mright)
- BOX2(mtop, mleft, mbottom, mright)
- IF draw_bar
- SETCOLOR(bar_clr)
- FOR xx = mtop + 1 TO mbottom - 1
- @ xx, mright SAY CHR(176)
- NEXT
- ENDIF
- SETCOLOR(box_clr + ',' + hilite_clr + ',,,' + ;
- unsel_clr)
- FAKE_KEY
- DO WHILE .T.
- ACHOICE(mtop+1, mleft+1, mbottom-1, mright-1,;
- marray, NIL, 'KeyTest', rel_elem, rel_row)
- IF LASTKEY() = ENTER .OR. LASTKEY() = ESC
- EXIT
- ENDIF
- ENDDO
- RESTSCREEN(mtop, mleft, mbottom, mright, oldscrn)
- SETCOLOR(oldcolor)
- RETURN NIL
-
-
- *!******************************************************
- *!
- *! Function: KeyTest()
- *! Purpose: Handle keystroke exceptions etc
- *! Author: Greg Lief
- *! Copyright (c) 1989-90 Greg Lief
- *!
- *!******************************************************
- FUNCTION KeyTest(status, curr_elem, curr_row)
- LOCAL xx, oldrow := ROW(), oldcol := COL(), ;
- ret_val := CONTINUE, oldcolor, key
- key := LASTKEY()
- DO CASE
-
- CASE status = PAST_TOP
- rel_elem := last_ele
- FAKE_KEY && force status bar display
- ret_val := ABORT && force ACHOICE() to restart
-
- CASE status = PAST_BOTTOM
- rel_elem := 1
- FAKE_KEY && force status bar display
- ret_val := ABORT && force ACHOICE() to restart
-
- CASE status = IDLE .OR. key = 255
- oldcolor := SETCOLOR()
- IF draw_bar
- *** draw arrows if there are elements beyond
- *** top or bottom of window
- ** first, the bottom
- @ mbottom, mright SAY ;
- IF(last_ele - curr_elem >= mbottom - oldrow, ;
- CHR(25), CHR(188))
- ** then the top
- @ mtop,mright SAY ;
- IF(oldrow - curr_elem < mtop, ;
- CHR(24), CHR(187))
-
- ** if status bar position has changed...
- IF bar_line != mtop + 1 + ;
- INT((curr_elem / last_ele) * ;
- (mbottom - mtop - 2))
- *** first, blank out previous status bar
- SETCOLOR(bar_clr)
- @ bar_line, mright SAY CHR(176)
- *** then recalculate position of status bar
- bar_line := mtop + 1 + ;
- INT( (curr_elem / last_ele) * ;
- (mbottom - mtop - 2) )
- SETCOLOR(stat_clr)
- *** finally, redraw it
- @ bar_line, mright SAY CHR(219)
- ENDIF
- ENDIF
- SETCOLOR(oldcolor)
-
- CASE key = SPACEBAR && toggle this fish on/off
- marray[curr_elem] := LEFT(marray[curr_elem], ;
- LEN(marray[curr_elem]) - 1) + ;
- IF(RIGHT(marray[curr_elem], 1) = " ", "√", " ")
- rel_elem := curr_elem + 1
- rel_row := curr_row + 1
- searchstr := [] && reset search string
- @ mbottom, 33 SAY REPLICATE(CHR(205), 14)
- ret_val := ABORT && Force ACHOICE redisplay
-
- CASE key = ENTER .OR. key = ESC
- ret_val := ABORT && prepare to fall out
-
- CASE key = HOME
- KEYBOARD CHR(CTRL_PGUP)
-
- CASE key = END
- KEYBOARD CHR(CTRL_PGDN)
-
- CASE key = F8 && tag all items
- FOR xx = 1 TO last_ele
- marray[xx] = LEFT(marray[xx], ;
- LEN(marray[xx]) - 1) + CHR(251)
- NEXT
- rel_elem := curr_elem && save current position
- rel_row := curr_row && and relative position
- ret_val := ABORT && Force ACHOICE redisplay
-
- CASE key = F9 && clear all tags
- FOR xx = 1 TO last_ele
- marray[xx] := LEFT(marray[xx], ;
- LEN(marray[xx]) - 1) + CHR(SPACEBAR)
- NEXT
- rel_elem := curr_elem && save current position
- rel_row := curr_row && and relative position
- ret_val := ABORT && Force ACHOICE redisplay
-
- CASE key = F10 && reverse all tags
- FOR xx = 1 TO last_ele
- marray[xx] := LEFT(marray[xx], ;
- LEN(marray[xx]) - 1) + ;
- IF(RIGHT(marray[xx], 1) = " ", "√", " ")
- NEXT
- rel_elem := curr_elem && save current position
- rel_row := curr_row && and relative position
- ret_val := ABORT && Force ACHOICE redisplay
-
- *** letter key
- CASE Isalpha(CHR(key)) && see STD.CH
- searchstr += CHR(key)
- telem := ASCAN2(marray, searchstr)
- rel_elem := IF(telem = 0, curr_elem, telem)
- @ mbottom, 36 SAY "[" + PAD(searchstr, 6) + "]"
- ret_val := ABORT && Force ACHOICE redisplay
-
- CASE key = BACKSPACE .OR. key = LTARROW
- IF LEN(searchstr) > 0
- searchstr := SUBSTR(searchstr, 1, ;
- LEN(searchstr) - 1)
- telem := ASCAN2(marray, searchstr)
- rel_elem := IF(telem = 0, curr_elem, telem)
- ENDIF
- @ mbottom, 36 SAY IF(LEN(searchstr) = 0, ;
- REPLICATE(DOUBLE_LINE, 8), ;
- "[" + PAD(searchstr, 6) + "]")
- ret_val := ABORT && Force ACHOICE redisplay
-
- ENDCASE
- RETURN ret_val
-
-
- *!******************************************************
- *!
- *! Function: AScan2()
- *! Purpose: Perform case-insensitive ASCAN()
- *! Author: Greg Lief
- *!
- *!******************************************************
- FUNCTION AScan2(array, value)
- RETURN ASCAN(array, { | a | UPPER(a) = UPPER(value) } )
-