/*

    post block example at end
    07/11/03 11:37
    markcarew@magicwanddept.com.au

*/









//////////////////////////////////////////////////////////////////////
//
//  TEST.PRG
//
//  Copyright:
//   Alaska Software Inc., (c) 1997-1999. All rights reserved.
//

//  Contents:
//      A simple sample program which demonstrates the use of the XbpGet
//      class in conjunction with the XbpGetController class.
//
//////////////////////////////////////////////////////////////////////

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "COMMON.ch"
#DEFINE GC_SAY_ROW    1
#DEFINE GC_SAY_COL    2
#DEFINE GC_SAY_TEXT   3
#DEFINE GC_SAY_PICT   4
#DEFINE GC_SAY_COLOR  5
#DEFINE GC_FLD_GSB    6
#DEFINE GC_FLD_VALUE  7
#DEFINE GC_FLD_TYP    8
#DEFINE GC_FLD_NO     9
#DEFINE GC_ADMISSION  10
#DEFINE GC_FILE       11
#DEFINE GC_FIELD      12
#DEFINE GC_VFUNC      13
#DEFINE GC_NUM_ITEMS  13

#DEFINE XBPCOMBOGET_VERSION "1.20"
#DEFINE XBPCOMBOGET_DATE    "07/11/03 20:22"

PROCEDURE APPSYS()
RETURN

PROCEDURE DBESYS()
RETURN



PROCEDURE Main
  *
  local aDates
  local aTests
  local aTimes
  local aNumbers
  LOCAL aPos := Array(2)
  LOCAL oDlg, oXbp, drawingArea, oCtrl, oXbp1, oXbp2
  LOCAL aPP := { { XBP_PP_COMPOUNDNAME, FONT_DEFFIXED_SMALL } }
  LOCAL aString    := { "A nice little String", NIL }
  LOCAL aNumeric   := { -1234.567, "@K 999,999,999.999" }
  LOCAL aDate      := { Date(), NIL }
  LOCAL aLogic     := { .T., NIL }
  LOCAL aPhone     := { 496196123456780, "@R (+99)9999 999 999 999" }
  LOCAL aZIP       := { 63110, "XX-99999" }
  LOCAL aTime      := { "12:12AM", "99:99@!" }
  LOCAL aBLZ       := { 4132486, "999-9-999" }
  LOCAL aUPPERCASE := { "a lowercase string", "@!" }

  SET CENTURY ON
  SET DATE BRITISH
  // SET TIME "hh:MM:TT"
  // setLocale(NLS_S1159,"AM")
  // setLocale(NLS_S2359,"PM")
  *
  aTimes := ;
    {;
    "12:00AM"  , "12:30AM"  , "01:00AM"  , "01:30AM"  , "02:00AM"  , ;
    "02:30AM"  , "03:00AM"  , "03:30AM"  , "04:00AM"  , "04:30AM"  , ;
    "05:00AM"  , "05:30AM"  , "06:00AM"  , "06:30AM"  , "07:00AM"  , ;
    "07:30AM"  , "08:00AM"  , "08:30AM"  , "09:00AM"  , "09:30AM"  , ;
    "10:00AM"  , "10:30AM"  , "11:00AM"  , "11:30AM"  , "12:00PM"  , ;
    "12:30PM"  , "01:00PM"  , "01:30PM"  , "02:00PM"  , "02:30PM"  , ;
    "03:00PM"  , "03:30PM"  , "04:00PM"  , "04:30PM"  , "05:00PM"  , ;
    "05:30PM"  , "06:00PM"  , "06:30PM"  , "07:00PM"  , "07:30PM"  , ;
    "08:00PM"  , "08:30PM"  , "09:00PM"  , "09:30PM"  , "10:00PM"  , ;
    "10:30PM"  , "11:00PM"  , "11:30PM" ;
    }
  aTests := ;
    {;
    "CAT"  , "DOG"  , "MOUSE"  , "HOUSE"  , "FROG"  , ;
    "LOG"  , "TREE"  , "DRAIN"  , "POST"  , "SWING"  , ;
    "LAUNDRY"  , "VERANDAH"  , "FRAME"  , "FERRULE"}
  *
  aNumbers      := array(12)
  *
  aNumbers[1]   := 1
  aNumbers[2]   := 3.45
  aNumbers[3]   := 3.45
  aNumbers[4]   := 3.45
  aNumbers[5]   := 3900.45
  aNumbers[6]   := 3.45
  aNumbers[7]   := 3.45
  aNumbers[8]   := 3.45
  aNumbers[9]   := 777.77
  aNumbers[10]  := 123.45
  aNumbers[11]  := 456123.45
  aNumbers[12]  := 345123.45
  *
  aDates        := ;
    {date(),date()-1,date()-2,date()-3,date()-4,date()-5,date()-6}
  *
  aPos[1]       := 100
  aPos[2]       := 100

  oDlg          := ;
    XbpDialog():new( SetAppWindow():setParent(), , aPos, {415,501}, , .T.)
  oDlg:taskList := .T.
  *
  oDlg:title    := ;
    "Test - XbpComboGet " + ;
    XBPCOMBOGET_VERSION + ;
    " - " + ;
    XBPCOMBOGET_DATE
  *
  oDlg:visible  := .T.
  oDlg:close    := {|mp1,mp2,obj| obj:destroy() }
  *
  *  necessary for combobox
  *
  oDlg:create()

  drawingArea   := oDlg:drawingArea
  drawingArea:setColorBG( GRA_CLR_PALEGRAY   )
  drawingArea:setFontCompoundName( "8.Arial" )

  oXbp := XbpPushButton():new( drawingArea, , {316,236}, {84,24} )
  oXbp:caption := "Ok"
  oXbp:clipSiblings := .T.
  oXbp:create()
  oXbp:activate := {|| oCtrl:getData(), PostAppEvent( xbeP_Close ) }

  oXbp := XbpPushButton():new( drawingArea, , {316,200}, {84,24} )
  oXbp:caption := "GetData"
  oXbp:clipSiblings := .T.
  oXbp:create()
   /*
   oXbp:activate := {|| printValues( oCtrl:getList() ) }
   */
  oXbp1 := XbpStatic():new( drawingArea, , {8,204}, {288,216} )
  oXbp1:caption := "No Picture"
  oXbp1:clipSiblings := .T.
  oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
  oXbp1:create()
  *
  oXbp := XbpStatic():new( oXbp1, , {4,340}, {164,20} )
  oXbp:caption := "ALT+DOWN FOR COMBO LIST - CTRL+UP\DOWN NAVIGATE"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpStatic():new( oXbp1, , {4,152}, {64,20} )
  oXbp:caption := "DATES"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp := XbpComboGet():new( oXbp1, ,{76,152},{120,20} , aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aDates[1] )
  oXbp:type     := XBPCOMBO_DROPDOWN
  oXbp:tabstop  := .T.
  oXbp:picture  := "@D"
  oXbp:bufferlength := 9
  *
  oXbp:create()
  oXbp:setitems(aDates)
  // oXbp:setWhere({76,152},{120,20},200)
  oXbp:setWhere(,,200)
  oXbp:setData(date())
  oXbp:editable := .T.
  *=================================
  *---------------------------------

  oXbp := XbpStatic():new( oXbp1, , {4,128}, {64,20} )
  oXbp:caption := "Numbers"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp := XbpComboGet():new( oXbp1, , {76,128},{160,20} , aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aNumbers[1] )
  oXbp:type     := XBPCOMBO_DROPDOWN
  oXbp:tabstop  := .T.
  oXbp:picture  := "@K ###,###.##"
  oXbp:bufferlength := 11

  oXbp:create()
  oXbp:setitems(aNumbers)
  oXbp:setWhere( , ,200)
  oXbp:setData(12456.89)
  oXbp:editable := .T.
  *=================================
  *---------------------------------

  oXbp := XbpStatic():new( oXbp1, , {4,104}, {64,20} )
  oXbp:caption := "Things"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp := XbpComboGet():new( oXbp1, , {76,104},{204,20} , aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aTests[1] )
  oXbp:type     := XBPCOMBO_DROPDOWN
  oXbp:tabstop  := .T.
  oXbp:picture  := "@!"
  oXbp:bufferlength := 18

  oXbp:create()
  oXbp:setitems(aTests)
  oXbp:setWhere( , , 200)
  oXbp:setData("CLOG")
  oXbp:editable := .T.
  *=================================
  *---------------------------------


  oXbp := XbpStatic():new( oXbp1, , {4,80}, {64,20} )
  oXbp:caption := "String"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

   /*
    * Postvalidation: String must not be empty
    */
  oXbp := XbpGet():new( oXbp1, , {76,80}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Picture      := aString[2]
  oXbp:Datalink     := varBlock( @aString[1] )
  oXbp:postBlock    := {|| .NOT. Empty( aString[1] ) }
  oXbp:create()

  oXbp := XbpStatic():new( oXbp1, , {4,56}, {64,20} )
  oXbp:caption := "Numeric"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp1, , {76,56}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Picture  := aNumeric[2]
  oXbp:Datalink := varBlock( @aNumeric[1] )
  oXbp:create()

  oXbp := XbpStatic():new( oXbp1, , {4,32}, {64,20} )
  oXbp:caption := "Date"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp1, , {76,32}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aDate[1] )
  oXbp:Picture  := aDate[2]
  oXbp:create()

  oXbp := XbpStatic():new( oXbp1, , {4,8}, {64,20} )
  oXbp:caption := "Logic"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp1, , {76,8}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aLogic[1] )
  oXbp:Picture  := aLogic[2]
  oXbp:create()

  oXbp2 := XbpStatic():new( drawingArea, , {8,4}, {288,198} )
  oXbp2:caption := "With Picture"
  oXbp2:clipSiblings := .T.
  oXbp2:clipchildren := .F.
  oXbp2:type := XBPSTATIC_TYPE_GROUPBOX
  oXbp2:create()

  oXbp := XbpStatic():new( oXbp2, , {4,152}, {64,20} )
  oXbp:caption := "Phone"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

   /*
    * Prevalidation: Editing is only allowed when Logic == .T.
    */
  oXbp := XbpGet():new( oXbp2, , {76,152}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aPhone[1] )
  oXbp:Picture  := aPhone[2]
  oXbp:preBlock := {|| aLogic[1] }
  oXbp:create()

  oXbp := XbpStatic():new( oXbp2, , {4,128}, {64,20} )
  oXbp:caption := "ZIP"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp2, , {76,128}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aZIP[1] )
  oXbp:Picture  := aZIP[2]
  oXbp:create()
  /*
  oXbp := XbpStatic():new( oXbp2, , {4,104}, {100,20} )
  oXbp:caption := "Time Simple"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()
  *
  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp := XbpComboGet():new( oXbp2, , , , aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aTime[1] )
  oXbp:type     := XBPCOMBO_SIMPLE
  oXbp:tabstop  := .T.
  oXbp:picture  := "99:99!!"
  oXbp:bufferlength := 18

  oXbp:create()
  oXbp:setitems(aTimes)
  oXbp:setWhere({116,104},{80,20},200)
  oXbp:setData("09:09AM")
  oXbp:editable := .T.
  *=================================
  *---------------------------------
  */
  *
  oXbp := XbpStatic():new( oXbp2, , {4,80}, {100,20} )
  oXbp:caption := "Time Drop Down"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()
  *
  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp       := XbpComboGet():new( oXbp2, , {116,80},{85,20} , aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aTime[1] )
  oXbp:type     := XBPCOMBO_DROPDOWN
  oXbp:tabstop  := .T.
  oXbp:picture  := "##:##!M"
  oXbp:bufferlength := 7
  *
  oXbp:create()
  oXbp:PostBlock := {|g|validTime(g)}
  *
  oXbp:setitems(aTimes)
  oXbp:setWhere( , ,200)
  oXbp:setData("33:11AM")
  oXbp:editable := .T.
  *=================================
  *---------------------------------

  oXbp := XbpStatic():new( oXbp2, , {4,56}, {100,20} )
  oXbp:caption := "Time Drop List"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()
  *
  *---------------------------
  *+++++++++++++++++++++++++++
  oXbp := XbpComboGet():new( oXbp2, , {116,56},{85,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aTime[1] )
  oXbp:type     := XBPCOMBO_DROPDOWNLIST
  oXbp:tabstop  := .T.
  oXbp:picture  := "##:##!M"
  oXbp:bufferlength := 7
  *
  oXbp:create()
  oXbp:setitems(aTimes)
  oXbp:setWhere( , ,100)
  oXbp:setData("12:12AM")
  oXbp:editable := .F.
  *=================================
  *---------------------------------
  *
  oXbp := XbpStatic():new( oXbp2, , {4,32}, {64,20} )
  oXbp:caption := "Bank"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp2, , {76,32}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aBLZ[1] )
  oXbp:Picture  := aBLZ[2]
  oXbp:create()

  oXbp := XbpStatic():new( oXbp2, , {4,8}, {64,20} )
  oXbp:caption := "UPPERCASE"
  oXbp:clipSiblings := .T.
  oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  oXbp:create()

  oXbp := XbpGet():new( oXbp2, , {76,8}, {204,20}, aPP )
  oXbp:clipSiblings := .T.
  oXbp:Datalink := varBlock( @aUPPERCASE[1] )
  oXbp:Picture  := aUPPERCASE[2]
  oXbp:create()

   /*
    * Create the XbpGetController object
    */
  oCtrl := XbpGetController():new( oDlg )
  oCtrl:create()

   /*
    * Terminate READ when application window is closed
    *
    * NOTE:
    *
    * when the XbpGetController object is associated with a window, the
    * window does not need to call :killRead() in its :close code block.
    * We must do this here, because oCtrl does not know SetAppWindow(),
    * and clicking the X-button in the application window must
    * terminate the application. :killRead() terminates the event
    * loop running in oCtrl:read()
    */
  // SetAppWindow():close := {|| oCtrl:killRead() }

   /*
    * Start editing in modal window at 1ST XbpGet
    */
  oCtrl:read( )

RETURN


/*
 * generic code block for variable passed by reference
 */
FUNCTION varBlock( val )
RETURN { |x| IIF( PCOUNT()==1, val := x, val ) }

/*

 Combo box postblock splits one field into three

*/

function ValidTime(oGet)
  *
  local cEach
  local cTime
  local lEarly
  local lRetVal
  local nLen
  local nLowHour
  local nMinuteNumb
  local nPtr
  *
  *      11:23PM
  *      06:00AM
  *      00:00AM  and 00:00PM
  *
  lRetVal               := TRUE
  *
  cTime                 := oGet:getdata()
  cTime                 := padr(cTime,7)
  *
  cTime                 := strTran(cTime,space(1),"0")
  *
  nLen                  := len(cTime)
  *
  *  look at the time one character at a time
  *  from the left side
  *  if validation fails exit
  *  .... No error message
  *
  FOR nPtr              := 1 TO nLen
    *
    * new to xbase much faster than
    * substr()             ...........
    *
    cEach               := cTime[nPtr]
    *
    do case
    case nPtr           == 1
      *
      do case
      case cEach        == "0"
        *
        lEarly          := TRUE
        *
      case cEach        == "1"
        *
        lEarly          := FALSE
        *
      otherwise
        *
        lRetVal         := FALSE
        *
      END CASE
      *
    case nPtr           == 2
      *
      do case
      case lEarly       == TRUE
        *
        *   0 THROUGH 9
        *
        IF isdigit(cEach)
        else
          *
          lRetVal       := FALSE
          *
        ENDIF
        *
      case lEarly       == FALSE
        *
        *   0, 1 OR 2
        *
        nLowHour          := val(cEach)
        *
        IF nLowHour       <= 2
        else
          lRetVal         := FALSE
        ENDIF
        *
      END CASE
      *
    case nPtr             == 3
      *
      *  should be ==  ":"
      *
    case nPtr             == 4
      *
      *   0 through 5
      *
      nMinuteNumb         := val(cEach)
      *
      IF nMinuteNumb      <= 5
      else
        lRetVal           := FALSE
      ENDIF
      *
    case nPtr == 5
      *
      *   0 through 9
      *
      nMinuteNumb         := val(cEach)
      *
      IF nMinuteNumb      <= 9
        *
      else
        *
        lRetVal           := FALSE
        *
      ENDIF
    case nPtr             == 6
      *
      IF cEach            $ "AP"
        *
      else
        *
        lRetVal           := FALSE
        *
      ENDIF
      *
    case nPtr             == 7
      *
      IF cEach            == "M"
        *
      else
        *
        lRetVal           := FALSE
        *
      ENDIF
      *
    endcase
    *
    IF lRetVal            == FALSE
      *
      EXIT
      *
    ENDIF
    *
  NEXT
  *
  IF lRetVal == FALSE
    *
    tone(1000)
    sleep(10)
    tone(500)
    *
    /*
    oGet:cargo[GC_FLD_VALUE] := "00:00AM"
    oGet:setdata(oGet:cargo[GC_FLD_VALUE])
    */
  ENDIF
  *
RETURN lRetVal


function oBlk(oget)
  local bBlock
  bBlock := ;
    {|x|iif(x== nil,oget:cargo[GC_FLD_VALUE],oget:cargo[GC_FLD_VALUE]:=x)}
return bBlock
