home *** CD-ROM | disk | FTP | other *** search
- // Tb21.prg
- //
- // A replacement for Achoice
- //
- // Link with Tbutils, dict
-
- #include "Inkey.ch"
- #include "Tbutils.ch"
-
- #define KH_SELECT 1
- #define KH_CONTINUE 2
- #define KH_ABORT 3
-
- FUNCTION Tb21
-
- LOCAL aTest := Array(100)
- LOCAL aSelectables := Array(102)
- LOCAL i
- LOCAL bKeyHandler := {|nKey, oTbr| MyKeyHandler(nKey, oTbr) }
-
- FOR i := 1 TO Len(aTest)
- aTest[i] := Str(i * i)
- NEXT
-
- Afill(aSelectables, .T.)
- aSelectables[3] := .F.
- aSelectables[18] := .F.
-
- FOR i := 90 TO 100
- aSelectables[i] := .F.
- NEXT
-
- CLEAR SCREEN
- ? Achoice(10, 10, 20, 20, aTest, aSelectables,, 10, 2)
- Inkey(0)
- CLEAR SCREEN
- aTest[1] := "123456789012345"
-
- aTest[10] := "123456789012345678901234567890"
- Aadd(aTest, NIL)
- Aadd(aTest, Space(25))
-
- ? Tchoice(10, 10, 20, 70, aTest, aSelectables, bKeyHandler, 10, 2)
- Inkey(0)
-
- RETURN NIL
-
- #define GOING_UP(nKey) Chr(nKey) $ (Chr(K_UP) + Chr(K_PGUP) + ;
- Chr(K_CTRL_PGUP))
-
-
- FUNCTION Tchoice(nTop, nLeft, nBottom, nRight, aMenuItems, ;
- aSelectableItems, bKeyHandle, nInitialItem, nWindowRow)
-
- LOCAL oTbr := TBrowseNew(nTop, nLeft, nBottom, nRight)
- LOCAL oTbc
- LOCAL nElem := iif(nInitialItem == NIL, 1, nInitialItem)
- LOCAL lExitRequested := .F.
- LOCAL nKey
- LOCAL i
- LOCAL nKeyHandleResult
-
- oTbc := TBColumnNew(, {|| aMenuItems[nElem]} )
-
- IF ValType(aSelectableItems) == "A"
- oTbc:colorBlock := {|| iif(aSelectableItems[nElem], ;
- {1, 2}, {5, 5}) }
- ENDIF
-
- oTbc:width := Awidth(aMenuItems)
-
- oTbr:addColumn(oTbc)
-
- oTbr:goTopBlock := {|| nElem := 1}
- oTbr:goBottomBlock := {|| nElem := Len(aMenuItems) }
- oTbr:skipBlock := ARRAY_SKIPPER(nElem, aMenuItems)
- lExitRequested := .F.
- FullStabilize(oTbr)
- IF nWindowRow != NIL
- DispBegin()
- oTbr:deHilite()
- oTbr:autoLite := .F.
- IF oTbr:rowPos > nWindowRow + 1
- oTbr:rowPos := oTbr:rowCount
- FOR i := 1 TO oTbr:rowPos - (nWindowRow + 1)
- oTbr:down()
- FullStabilize(oTbr)
- NEXT
- oTbr:rowPos := nWindowRow + 1
- ELSE
- oTbr:rowPos := 1
- FOR i := 1 TO (nWindowRow + 1) - oTbr:rowPos
- oTbr:up()
- FullStabilize(oTbr)
- NEXT
- oTbr:rowPos := nWindowRow + 1
- ENDIF
- oTbr:autoLite := .T.
- DispEnd()
- ENDIF
-
- DO WHILE !lExitRequested
- FullStabilize(oTbr)
- IF !aSelectableItems[nElem]
- IF GOING_UP(LastKey())
- IF nElem != 1
- KEYBOARD Chr(K_UP)
- ELSE
- KEYBOARD Chr(K_DOWN)
- ENDIF
- ELSE
- IF nElem != Len(aMenuItems)
- KEYBOARD Chr(K_DOWN)
- ELSE
- KEYBOARD Chr(K_UP)
- ENDIF
- ENDIF
- ENDIF
- nKey := Inkey(0)
- IF bKeyHandle != NIL
- nKeyHandleResult := Eval(bKeyHandle, nKey, oTbr)
- DO CASE
- CASE nKeyHandleResult == KH_SELECT
- lExitRequested := .T.
-
- CASE nKeyHandleResult == KH_ABORT
- lExitRequested := .T.
- nElem := 0
-
- CASE nKeyHandleResult == KH_CONTINUE
-
- ENDCASE
- ELSEIF !StdMeth(nKey, oTbr)
- DO CASE
- CASE nKey == K_ESC
- lExitRequested := .T.
- nElem := 0
-
- CASE nKey == K_ENTER
- lExitRequested := .T.
- ENDCASE
- ENDIF
- ENDDO
-
- RETURN nElem
-
-
- FUNCTION MyKeyHandler(nKey, oTbr)
-
- LOCAL nKeyHandleResult := KH_CONTINUE
-
- IF !StdMeth(nKey, oTbr)
- DO CASE
- CASE nKey == K_ESC
- nKeyHandleResult := KH_ABORT
-
- CASE nKey == K_ENTER
- nKeyHandleResult := KH_SELECT
- ENDCASE
- ENDIF
-
- RETURN nKeyHandleResult
-
-
- FUNCTION Awidth(aVar)
-
- LOCAL i
- LOCAL nLen := Len(aVar)
- LOCAL nLongest := 0
-
- FOR i := 1 TO nLen
- nLongest := Max(nLongest, DataLen(aVar[i]))
- NEXT
-
- RETURN nLongest
-
-
- FUNCTION DataLen(xElem)
-
- LOCAL nLen
- LOCAL cType := ValType(xElem)
-
- DO CASE
- CASE cType $ "ACM"
- nLen := Len(xElem)
-
- CASE cType == "N"
- nLen := Len(Str(xElem))
-
- CASE cType == "L"
- nLen := 1
-
- CASE cType == "D"
- nLen := 8
-
- CASE cType == "U" // Value NIL
- nLen := 3
-
- ENDCASE
-
- RETURN nLen