home *** CD-ROM | disk | FTP | other *** search
- // Tb24.prg
- //
- // Browsing Nested arrays to any depth
- //
- // Compile with /a /m /n /w /dTEST
- //
- // Link with Tbutils, Dict
-
- #include "Inkey.ch"
- #include "Tbutils.ch"
-
- #ifdef TEST
- FUNCTION Tb24
-
- LOCAL aRepMenu := { ;
- {"Reports 1", "Select Reports 1" }, ;
- {"Reports 2", "Select Reports 2" }, ;
- {"Reports 3", "Select Reports 3" }, ;
- {"Reports 4", "Select Reports 4" } ;
- }
-
- LOCAL aPayMenu := { ;
- {"Payables 1", "Select Payables 1" }, ;
- {"Payables 2", "Select Payables 2" }, ;
- {"Payables 3", "Select Payables 3" }, ;
- {"Payables 2", "Select Payables 4" } ;
- }
-
- LOCAL aRecMenu := { ;
- {"Receivables 1", "Select Receivables 1" }, ;
- {"Receivables 2", aRepMenu }, ;
- {"Receivables 3", "Select Receivables 3" }, ;
- {"Receivables 2", aRepMenu } ;
- }
-
-
- LOCAL aMenu1 := { ;
- {"Payables", aPaymenu }, ;
- {"Receivables", aRecmenu }, ;
- {"Reports", aRepmenu } ;
- }
-
-
- CLEAR SCREEN
- @ 4, 9 TO 21, 71
- ? BrNest(5, 10, 20, 70, aMenu1)
-
- RETURN NIL
- #endif
-
-
- FUNCTION BrNest(nTop, nLeft, nBottom, nRight, aVar)
-
- LOCAL oTbr := TBabrNest(aVar)
- LOCAL lExitRequested := .F.
- LOCAL nKey
- LOCAL cSaveScr
-
- oTbr:nTop := nTop + 1
- oTbr:nLeft := nLeft + 1
- oTbr:nBottom := nBottom - 1
- oTbr:nright := nRight - 1
-
- CLEAR SCREEN
- @ nTop, nLeft TO nBottom, nRight
-
- DO WHILE !lExitRequested
- FullStabilize(oTbr)
- IF !(ValType(aVar[oTbr:cargo]) == "A")
- oTbr:deHilite()
- oTbr:colPos := 1
- FullStabilize(oTbr)
- ELSEIF oTbr:colPos > Len(aVar[oTbr:cargo])
- oTbr:deHilite()
- oTbr:colPos := Len(aVar[oTbr:cargo])
- FullStabilize(oTbr)
- ENDIF
- nKey := Inkey(0)
- IF !StdMeth(nKey, oTbr)
- DO CASE
- CASE nKey == K_ESC
- lExitRequested := .T.
-
- CASE nKey == K_ENTER
- IF ValType(aVar[oTbr:cargo]) == "A" .AND. ;
- ValType(aVar[oTbr:cargo, oTbr:colPos]) == "A"
- cSaveScr := SaveScreen(nTop, nLeft, nBottom, nRight)
- @ nTop, nLeft CLEAR TO nBottom, nRight
- BrNest(nTop, nLeft, nBottom, nRight, ;
- aVar[oTbr:cargo, oTbr:colPos])
- RestScreen(nTop, nLeft, nBottom, nRight, cSaveScr)
- ENDIF
- ENDCASE
- lExitRequested := (nKey == K_ESC)
- ENDIF
-
- ENDDO
-
- RETURN NIL
-
-
- FUNCTION TBabrNest(aVar)
-
- LOCAL oTbr := TBrowseNew()
- LOCAL nTBColumns := 1
- LOCAL i
- LOCAL oTbc
-
- oTbr:cargo := 1
-
- Aeval(aVar, {|aElem| ;
- nTBColumns := iif(ValType(aElem) == "A", ;
- Max(Len(aElem), nTBColumns), ;
- nTBColumns) })
-
- FOR i := 1 TO nTBColumns
- oTbc := TBColumnNew(, Anest2Blk(oTbr, aVar, i))
- oTbc:width := AnestWidth(aVar, i)
- oTbr:addColumn(oTbc)
- NEXT
-
- oTbr:goTopBlock := {|| oTbr:cargo := 1 }
- oTbr:goBottomBlock := {|| oTbr:cargo := Len(aVar) }
- oTbr:skipBlock := ARRAY_SKIPPER(oTbr:cargo, aVar)
-
- RETURN oTbr
-
-
- FUNCTION Anest2Blk(oTbr, aVar, nCol)
-
- RETURN {|| ArrayDisplay(oTbr, aVar, nCol) }
-
-
- FUNCTION AnestWidth(aVar, nCol)
-
- LOCAL i
- LOCAL nLen := Len(aVar)
- LOCAL nLongest := 0
- LOCAL xElem
-
- FOR i := 1 TO nLen
- IF ValType(aVar[i]) == "A"
- IF Len(aVar[i]) >= nCol
- xElem := aVar[i, nCol]
- IF ValType(xElem) == "A"
- xElem := "Array"
- ENDIF
- ELSE
- xElem := ""
- ENDIF
- ELSE
- xElem := aVar[i]
- ENDIF
-
- nLongest := Max(nLongest, DataLen(xElem))
- 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
-
- FUNCTION ArrayDisplay(oTbr, aVar, nCol)
-
- LOCAL rVal
-
- IF !(ValType(aVar[oTbr:cargo]) == "A")
- IF nCol > 1
- rVal := ""
- ELSE
- rVal := aVar[oTbr:cargo]
- ENDIF
- ELSEIF nCol <= Len(aVar[oTbr:cargo])
- IF ValType(aVar[oTbr:cargo, nCol]) == "A"
- rVal := "Array"
- ELSE
- rVal := aVar[oTbr:cargo, nCol]
- ENDIF
- ELSE
- rVal := ""
- ENDIF
-
- RETURN rVal