home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a065 / 1.img / TBEXS.EXE / TBEX22.PRG < prev    next >
Encoding:
Text File  |  1992-03-18  |  3.4 KB  |  176 lines

  1. // Tbex22.prg
  2. //
  3. // Browsing Nested arrays to 2 dimensions - allows editing
  4. //
  5. // Compile with /a /m /n /w /dTEST
  6. //
  7. // Link with Tbutils, Dict
  8.  
  9. #include "Inkey.ch"
  10. #include "Tbutils.ch"
  11.  
  12. MEMVAR GetList
  13.  
  14. #ifdef TEST
  15.   FUNCTION Tbex22
  16.   
  17.   LOCAL aAddr := { ;
  18.                    {"Spence",   "Rick", "14 Sea Oaks Drive"}, ;
  19.                    {"Schwartz", "Phil"}, ;
  20.                    "Just an Element", ;
  21.                    {30,          70,     50} ;
  22.                  }
  23.  
  24.     CLEAR SCREEN
  25.     @ 4, 9 TO 21, 71
  26.     BrNest(5, 10, 20, 70, aAddr)
  27.  
  28.   RETURN NIL
  29. #endif
  30.  
  31.  
  32. FUNCTION BrNest(nTop, nLeft, nBottom, nRight, aVar)
  33.  
  34. LOCAL oTbr := TBabrNest(aVar)
  35. LOCAL lExitRequested := .F.
  36. LOCAL nKey
  37.  
  38.   CLEAR SCREEN
  39.   oTbr:nTop    := 1
  40.   oTbr:nLeft   := 1
  41.   oTbr:nBottom := MaxRow() - 1
  42.   oTbr:nright  := MaxCol() - 1
  43.   @ 0, 0 TO MaxRow(), MaxCol()
  44.  
  45.   DO WHILE !lExitRequested
  46.     FullStabilize(oTbr)
  47.     IF !(ValType(aVar[oTbr:cargo]) == "A")
  48.       oTbr:deHilite()
  49.       oTbr:colPos := 1
  50.       FullStabilize(oTbr)
  51.     ELSEIF oTbr:colPos > Len(aVar[oTbr:cargo])
  52.       oTbr:deHilite()
  53.       oTbr:colPos := Len(aVar[oTbr:cargo])
  54.       FullStabilize(oTbr)
  55.     ENDIF
  56.     nKey := Inkey(0)
  57.     IF !StdMeth(nKey, oTbr)
  58.       DO CASE
  59.         CASE nKey == K_ESC
  60.           lExitRequested := .T.
  61.  
  62.         CASE nKey == K_ENTER
  63.           // 1 or 2 d array?
  64.           IF ValType(aVar[oTbr:cargo]) = "A"
  65.             @ Row(), Col() GET aVar[oTbr:cargo, oTbr:colPos]
  66.           ELSE
  67.             @ Row(), Col() GET aVar[oTbr:cargo]
  68.           ENDIF
  69.           READ
  70.           oTbr:refreshCurrent()
  71.       ENDCASE
  72.     ENDIF
  73.   ENDDO
  74.  
  75. RETURN NIL
  76.  
  77.  
  78. FUNCTION TBabrNest(aVar)
  79.  
  80. LOCAL oTbr := TBrowseNew()
  81. LOCAL nTBColumns := 1
  82. LOCAL i
  83. LOCAL oTbc
  84.  
  85.   oTbr:cargo := 1
  86.  
  87.   Aeval(aVar, {|aElem| ;
  88.                 nTBColumns := iif(ValType(aElem) == "A",       ;
  89.                                   Max(Len(aElem), nTBColumns), ;
  90.                                   nTBColumns) })
  91.  
  92.   FOR i := 1 TO nTBColumns
  93.     oTbc := TBColumnNew(, Anest2Blk(oTbr, aVar, i))
  94.     oTbc:width := AnestWidth(aVar, i)
  95.     oTbr:addColumn(oTbc)
  96.   NEXT
  97.  
  98.   oTbr:goTopBlock    := {|| oTbr:cargo := 1 }
  99.   oTbr:goBottomBlock := {|| oTbr:cargo := Len(aVar) }
  100.   oTbr:skipBlock     := ARRAY_SKIPPER(oTbr:cargo, aVar)
  101.  
  102. RETURN oTbr
  103.  
  104.  
  105. FUNCTION Anest2Blk(oTbr, aVar, nCol)
  106.  
  107. RETURN {|| ArrayDisplay(oTbr, aVar, nCol) }
  108.  
  109.  
  110. FUNCTION ArrayDisplay(oTbr, aVar, nCol)
  111.  
  112. LOCAL rVal
  113.  
  114.   IF !(ValType(aVar[oTbr:cargo]) == "A")
  115.     IF nCol > 1
  116.       rVal := ""
  117.     ELSE
  118.       rVal := aVar[oTbr:cargo]
  119.     ENDIF
  120.   ELSEIF nCol <= Len(aVar[oTbr:cargo])
  121.     rVal := aVar[oTbr:cargo, nCol]
  122.   ELSE
  123.     rVal := ""
  124.   ENDIF
  125.  
  126. RETURN rVal
  127.  
  128.  
  129. FUNCTION AnestWidth(aVar, nCol)
  130.  
  131. LOCAL i
  132. LOCAL nLen := Len(aVar)
  133. LOCAL nLongest := 0
  134. LOCAL xElem
  135.  
  136.   FOR i := 1 TO nLen
  137.     IF ValType(aVar[i]) == "A"
  138.       IF Len(aVar[i]) >= nCol
  139.         xElem := aVar[i, nCol]
  140.       ELSE
  141.         xElem := ""
  142.       ENDIF
  143.     ELSE
  144.       xElem := aVar[i]
  145.     ENDIF
  146.  
  147.     nLongest := Max(nLongest, DataLen(xElem))
  148.   NEXT
  149.  
  150. RETURN nLongest
  151.  
  152.  
  153. FUNCTION DataLen(xElem)
  154.  
  155. LOCAL nLen
  156. LOCAL cType := ValType(xElem)
  157.  
  158.   DO CASE
  159.     CASE cType $ "ACM"
  160.       nLen := Len(xElem)
  161.  
  162.     CASE cType == "N"
  163.       nLen := Len(Str(xElem))
  164.  
  165.     CASE cType == "L"
  166.       nLen := 1
  167.  
  168.     CASE cType == "D"
  169.       nLen := 8
  170.  
  171.     CASE cType == "U"   // Value NIL
  172.       nLen := 3
  173.   ENDCASE
  174.  
  175. RETURN nLen
  176.