home *** CD-ROM | disk | FTP | other *** search
/ PC Direct 1996 May / PCDMAY.ISO / software / clarion / 3rdparty / tools / library / prgtools.exe / PROGT002.CLW < prev    next >
Encoding:
Text File  |  1995-05-29  |  30.5 KB  |  819 lines

  1.                      MEMBER('PROGTOOL.clw')       ! This is a MEMBER module
  2.  
  3. ! Comment Block Extension Template ---------------------------------------------
  4.   OMIT('! ---')
  5.  
  6. Created  5/21/95 at  6:01PM
  7. Changed  5/28/95 at 10:03AM
  8.  
  9.   These comments were entered in the Programmer Comments
  10.   embed point in the procedure used for browsing people.
  11.   This is a handy place to keep notes about assumptions
  12.   made in the procedure, special techniques used, or
  13.   other special information for the programmer.
  14.   
  15.   Note that this source code also contains the source
  16.   code generated by the ScaleWindow template; take a
  17.   look to see the complex code generated by an
  18.   extension template with a single prompt.
  19.  
  20. ! -------------------------------------------------------End Programmer Comments
  21.  
  22. PeoView PROCEDURE
  23.  
  24. LocalRequest         LONG,AUTO
  25. OriginalRequest      LONG,AUTO
  26. LocalResponse        LONG,AUTO
  27. WindowOpened         LONG
  28. WindowInitialized    LONG
  29. ForceRefresh         LONG,AUTO
  30. RecordFiltered       LONG
  31. Lcl:FullName         STRING(25)
  32. CurrentSelected  LONG,AUTO
  33. Queue:Browse         QUEUE                        ! Browsing Queue
  34. BRW1::Lcl:FullName     LIKE(Lcl:FullName)         ! Queue Display field
  35. BRW1::Peo:LastName     LIKE(Peo:LastName)         ! Queue Display field
  36. BRW1::Peo:FirstName    LIKE(Peo:FirstName)        ! Queue Display field
  37. BRW1::Position         STRING(255)                ! Queue POSITION information
  38. BRW1::Mark             BYTE                       ! Queue POSITION information
  39.                      END                          ! END (Browsing Queue)
  40. BRW1::QuickScan      BYTE                         ! Flag for Range/Filter test
  41. BRW1::RecordStatus   BYTE                         ! Flag for Range/Filter test
  42. BRW1::InitializePage BYTE                         ! Flag for Range/Filter test
  43. BRW1::ItemsToFill    LONG                         ! Controls records retrieved
  44. BRW1::MaxItemsInList LONG                         ! Retrieved after window opened
  45. BRW1::LocatedPosition STRING(255)                 ! POSITION of located record
  46. BRW1::QueuePointer   LONG                         ! Queue position of located record
  47. BRW1::NextChoice     LONG                         ! Queue position of located record
  48. BRW1::NewSelectPosted BYTE                        ! Queue position of located record
  49. BRW1::CurrentScroll  BYTE                         ! Queue position of scroll thumb
  50. BRW1::CurrentScrollRecord LONG                    ! Queue position of scroll thumb
  51. BrowseWindow         WINDOW('Browse People'),AT(,,140,100),FONT('Arial',8,,),CENTER,IMM,ICON('PEOPLE.ICO'),SYSTEM,GRAY,MAX,RESIZE,MDI
  52.                        LIST,AT(4,4,88,92),MSG('Browsing Records'),USE(?List),IMM,VSCROLL,FORMAT('100L~Name~@s25@'),FROM(Queue:Browse)
  53.                        BUTTON('&Insert'),AT(96,4,40,12),KEY(InsertKey),USE(?Insert)
  54.                        BUTTON('C&hange'),AT(96,20,40,12),KEY(CtrlEnter),USE(?Change),DEFAULT
  55.                        BUTTON('&Delete'),AT(96,36,40,12),KEY(DeleteKey),USE(?Delete)
  56.                        BUTTON('&Select'),AT(96,52,40,12),KEY(EnterKey),USE(?Select)
  57.                        BUTTON('&Close'),AT(96,84,40,12),USE(?Close)
  58.                      END
  59. ! ProgTool ScaleWindow Template
  60.   ! ?List                LIST
  61. LIST1Pos             SHORT,DIM(4)
  62. LIST1Old             SHORT,DIM(4)
  63. LIST1Ratio           DECIMAL(3,3),DIM(4)
  64.   ! ?Insert              BUTTON
  65. BUTTON2Pos           SHORT,DIM(4)
  66. BUTTON2Old           SHORT,DIM(4)
  67. BUTTON2Ratio         DECIMAL(3,3),DIM(4)
  68.   ! ?Change              BUTTON
  69. BUTTON3Pos           SHORT,DIM(4)
  70. BUTTON3Old           SHORT,DIM(4)
  71. BUTTON3Ratio         DECIMAL(3,3),DIM(4)
  72.   ! ?Delete              BUTTON
  73. BUTTON4Pos           SHORT,DIM(4)
  74. BUTTON4Old           SHORT,DIM(4)
  75. BUTTON4Ratio         DECIMAL(3,3),DIM(4)
  76.   ! ?Select              BUTTON
  77. BUTTON5Pos           SHORT,DIM(4)
  78. BUTTON5Old           SHORT,DIM(4)
  79. BUTTON5Ratio         DECIMAL(3,3),DIM(4)
  80.   ! ?Close               BUTTON
  81. BUTTON6Pos           SHORT,DIM(4)
  82. BUTTON6Old           SHORT,DIM(4)
  83. BUTTON6Ratio         DECIMAL(3,3),DIM(4)
  84. OldWinPos            REAL,DIM(4)
  85. WindowScaled         Byte
  86. MinWinWidth          Short
  87. MinWinHeight         Short
  88.   ! End Template
  89.   CODE
  90.   LocalRequest = GlobalRequest
  91.   OriginalRequest = GlobalRequest
  92.   LocalResponse = RequestCancelled
  93.   ForceRefresh = False
  94.   CLEAR(GlobalRequest)
  95.   CLEAR(GlobalResponse)
  96.   IF People::Used = 0
  97.     CheckOpen(People,1)
  98.   END
  99.   People::Used += 1
  100.   OPEN(BrowseWindow)
  101.   WindowOpened=True
  102.   INIRestoreWindow('PeoView','PROGTOOL.INI')
  103.     ! ProgTool ScaleWindow Template
  104.     WindowScaled = GETINI('PeoView','WindowScaled',0,'PROGTOOL' & '.INI')
  105.     IF WindowScaled
  106.     ! ?List                LIST
  107.       LIST1Ratio[1] = GETINI('PeoView','LIST' & '1' & 'XPOS',.1,'PROGTOOL' & '.INI')
  108.       LIST1Ratio[2] = GETINI('PeoView','LIST' & '1' & 'YPOS',.1,'PROGTOOL' & '.INI')
  109.       LIST1Ratio[3] = GETINI('PeoView','LIST' & '1' & 'Width',.1,'PROGTOOL' & '.INI')
  110.       LIST1Ratio[4] = GETINI('PeoView','LIST' & '1' & 'Height',.1,'PROGTOOL' & '.INI')
  111.     ! ?Insert              BUTTON
  112.       BUTTON2Ratio[1] = GETINI('PeoView','BUTTON' & '2' & 'XPOS',.1,'PROGTOOL' & '.INI')
  113.       BUTTON2Ratio[2] = GETINI('PeoView','BUTTON' & '2' & 'YPOS',.1,'PROGTOOL' & '.INI')
  114.       BUTTON2Ratio[3] = GETINI('PeoView','BUTTON' & '2' & 'Width',.1,'PROGTOOL' & '.INI')
  115.       BUTTON2Ratio[4] = GETINI('PeoView','BUTTON' & '2' & 'Height',.1,'PROGTOOL' & '.INI')
  116.     ! ?Change              BUTTON
  117.       BUTTON3Ratio[1] = GETINI('PeoView','BUTTON' & '3' & 'XPOS',.1,'PROGTOOL' & '.INI')
  118.       BUTTON3Ratio[2] = GETINI('PeoView','BUTTON' & '3' & 'YPOS',.1,'PROGTOOL' & '.INI')
  119.       BUTTON3Ratio[3] = GETINI('PeoView','BUTTON' & '3' & 'Width',.1,'PROGTOOL' & '.INI')
  120.       BUTTON3Ratio[4] = GETINI('PeoView','BUTTON' & '3' & 'Height',.1,'PROGTOOL' & '.INI')
  121.     ! ?Delete              BUTTON
  122.       BUTTON4Ratio[1] = GETINI('PeoView','BUTTON' & '4' & 'XPOS',.1,'PROGTOOL' & '.INI')
  123.       BUTTON4Ratio[2] = GETINI('PeoView','BUTTON' & '4' & 'YPOS',.1,'PROGTOOL' & '.INI')
  124.       BUTTON4Ratio[3] = GETINI('PeoView','BUTTON' & '4' & 'Width',.1,'PROGTOOL' & '.INI')
  125.       BUTTON4Ratio[4] = GETINI('PeoView','BUTTON' & '4' & 'Height',.1,'PROGTOOL' & '.INI')
  126.     ! ?Select              BUTTON
  127.       BUTTON5Ratio[1] = GETINI('PeoView','BUTTON' & '5' & 'XPOS',.1,'PROGTOOL' & '.INI')
  128.       BUTTON5Ratio[2] = GETINI('PeoView','BUTTON' & '5' & 'YPOS',.1,'PROGTOOL' & '.INI')
  129.       BUTTON5Ratio[3] = GETINI('PeoView','BUTTON' & '5' & 'Width',.1,'PROGTOOL' & '.INI')
  130.       BUTTON5Ratio[4] = GETINI('PeoView','BUTTON' & '5' & 'Height',.1,'PROGTOOL' & '.INI')
  131.     ! ?Close               BUTTON
  132.       BUTTON6Ratio[1] = GETINI('PeoView','BUTTON' & '6' & 'XPOS',.1,'PROGTOOL' & '.INI')
  133.       BUTTON6Ratio[2] = GETINI('PeoView','BUTTON' & '6' & 'YPOS',.1,'PROGTOOL' & '.INI')
  134.       BUTTON6Ratio[3] = GETINI('PeoView','BUTTON' & '6' & 'Width',.1,'PROGTOOL' & '.INI')
  135.       BUTTON6Ratio[4] = GETINI('PeoView','BUTTON' & '6' & 'Height',.1,'PROGTOOL' & '.INI')
  136.       MinWinWidth = GETINI('PeoView','MinWinWidth',100,'PROGTOOL' & '.INI')
  137.       MinWinHeight = GETINI('PeoView','MinWinHeight',100,'PROGTOOL' & '.INI')
  138.       DO ResizeWindow
  139.     ELSE  !Window has never been scaled
  140.       OldWinPos[3] = BrowseWindow{Prop:Width}
  141.       OldWinPos[4] = BrowseWindow{Prop:Height}
  142.       MinWinWidth = OldWinPos[3]
  143.       MinWinHeight = OldWinPos[4]
  144.     ! ?List                  LIST
  145.       GETPOSITION(?List,LIST1Old[1],LIST1Old[2],LIST1Old[3],LIST1Old[4])
  146.       LIST1Ratio[1] = LIST1Old[1] / OldWinPos[3]
  147.       LIST1Ratio[2] = LIST1Old[2] / OldWinPos[4]
  148.       LIST1Ratio[3] = LIST1Old[3] / OldWinPos[3]
  149.       LIST1Ratio[4] = LIST1Old[4] / OldWinPos[4]
  150.       PUTINI('PeoView','LIST' & '1' & 'XPOS',LIST1Ratio[1],'PROGTOOL' & '.INI')
  151.       PUTINI('PeoView','LIST' & '1' & 'YPOS',LIST1Ratio[2],'PROGTOOL' & '.INI')
  152.       PUTINI('PeoView','LIST' & '1' & 'Width',LIST1Ratio[3],'PROGTOOL' & '.INI')
  153.       PUTINI('PeoView','LIST' & '1' & 'Height',LIST1Ratio[4],'PROGTOOL' & '.INI')
  154.     ! ?Insert                BUTTON
  155.       GETPOSITION(?Insert,BUTTON2Old[1],BUTTON2Old[2],BUTTON2Old[3],BUTTON2Old[4])
  156.       BUTTON2Ratio[1] = BUTTON2Old[1] / OldWinPos[3]
  157.       BUTTON2Ratio[2] = BUTTON2Old[2] / OldWinPos[4]
  158.       BUTTON2Ratio[3] = BUTTON2Old[3] / OldWinPos[3]
  159.       BUTTON2Ratio[4] = BUTTON2Old[4] / OldWinPos[4]
  160.       PUTINI('PeoView','BUTTON' & '2' & 'XPOS',BUTTON2Ratio[1],'PROGTOOL' & '.INI')
  161.       PUTINI('PeoView','BUTTON' & '2' & 'YPOS',BUTTON2Ratio[2],'PROGTOOL' & '.INI')
  162.       PUTINI('PeoView','BUTTON' & '2' & 'Width',BUTTON2Ratio[3],'PROGTOOL' & '.INI')
  163.       PUTINI('PeoView','BUTTON' & '2' & 'Height',BUTTON2Ratio[4],'PROGTOOL' & '.INI')
  164.     ! ?Change                BUTTON
  165.       GETPOSITION(?Change,BUTTON3Old[1],BUTTON3Old[2],BUTTON3Old[3],BUTTON3Old[4])
  166.       BUTTON3Ratio[1] = BUTTON3Old[1] / OldWinPos[3]
  167.       BUTTON3Ratio[2] = BUTTON3Old[2] / OldWinPos[4]
  168.       BUTTON3Ratio[3] = BUTTON3Old[3] / OldWinPos[3]
  169.       BUTTON3Ratio[4] = BUTTON3Old[4] / OldWinPos[4]
  170.       PUTINI('PeoView','BUTTON' & '3' & 'XPOS',BUTTON3Ratio[1],'PROGTOOL' & '.INI')
  171.       PUTINI('PeoView','BUTTON' & '3' & 'YPOS',BUTTON3Ratio[2],'PROGTOOL' & '.INI')
  172.       PUTINI('PeoView','BUTTON' & '3' & 'Width',BUTTON3Ratio[3],'PROGTOOL' & '.INI')
  173.       PUTINI('PeoView','BUTTON' & '3' & 'Height',BUTTON3Ratio[4],'PROGTOOL' & '.INI')
  174.     ! ?Delete                BUTTON
  175.       GETPOSITION(?Delete,BUTTON4Old[1],BUTTON4Old[2],BUTTON4Old[3],BUTTON4Old[4])
  176.       BUTTON4Ratio[1] = BUTTON4Old[1] / OldWinPos[3]
  177.       BUTTON4Ratio[2] = BUTTON4Old[2] / OldWinPos[4]
  178.       BUTTON4Ratio[3] = BUTTON4Old[3] / OldWinPos[3]
  179.       BUTTON4Ratio[4] = BUTTON4Old[4] / OldWinPos[4]
  180.       PUTINI('PeoView','BUTTON' & '4' & 'XPOS',BUTTON4Ratio[1],'PROGTOOL' & '.INI')
  181.       PUTINI('PeoView','BUTTON' & '4' & 'YPOS',BUTTON4Ratio[2],'PROGTOOL' & '.INI')
  182.       PUTINI('PeoView','BUTTON' & '4' & 'Width',BUTTON4Ratio[3],'PROGTOOL' & '.INI')
  183.       PUTINI('PeoView','BUTTON' & '4' & 'Height',BUTTON4Ratio[4],'PROGTOOL' & '.INI')
  184.     ! ?Select                BUTTON
  185.       GETPOSITION(?Select,BUTTON5Old[1],BUTTON5Old[2],BUTTON5Old[3],BUTTON5Old[4])
  186.       BUTTON5Ratio[1] = BUTTON5Old[1] / OldWinPos[3]
  187.       BUTTON5Ratio[2] = BUTTON5Old[2] / OldWinPos[4]
  188.       BUTTON5Ratio[3] = BUTTON5Old[3] / OldWinPos[3]
  189.       BUTTON5Ratio[4] = BUTTON5Old[4] / OldWinPos[4]
  190.       PUTINI('PeoView','BUTTON' & '5' & 'XPOS',BUTTON5Ratio[1],'PROGTOOL' & '.INI')
  191.       PUTINI('PeoView','BUTTON' & '5' & 'YPOS',BUTTON5Ratio[2],'PROGTOOL' & '.INI')
  192.       PUTINI('PeoView','BUTTON' & '5' & 'Width',BUTTON5Ratio[3],'PROGTOOL' & '.INI')
  193.       PUTINI('PeoView','BUTTON' & '5' & 'Height',BUTTON5Ratio[4],'PROGTOOL' & '.INI')
  194.     ! ?Close                 BUTTON
  195.       GETPOSITION(?Close,BUTTON6Old[1],BUTTON6Old[2],BUTTON6Old[3],BUTTON6Old[4])
  196.       BUTTON6Ratio[1] = BUTTON6Old[1] / OldWinPos[3]
  197.       BUTTON6Ratio[2] = BUTTON6Old[2] / OldWinPos[4]
  198.       BUTTON6Ratio[3] = BUTTON6Old[3] / OldWinPos[3]
  199.       BUTTON6Ratio[4] = BUTTON6Old[4] / OldWinPos[4]
  200.       PUTINI('PeoView','BUTTON' & '6' & 'XPOS',BUTTON6Ratio[1],'PROGTOOL' & '.INI')
  201.       PUTINI('PeoView','BUTTON' & '6' & 'YPOS',BUTTON6Ratio[2],'PROGTOOL' & '.INI')
  202.       PUTINI('PeoView','BUTTON' & '6' & 'Width',BUTTON6Ratio[3],'PROGTOOL' & '.INI')
  203.       PUTINI('PeoView','BUTTON' & '6' & 'Height',BUTTON6Ratio[4],'PROGTOOL' & '.INI')
  204.       PUTINI('PeoView','MinWinWidth',MinWinWidth,'PROGTOOL' & '.INI')
  205.       PUTINI('PeoView','MinWinHeight',MinWinHeight,'PROGTOOL' & '.INI')
  206.       PUTINI('PeoView','WindowScaled',1,'PROGTOOL' & '.INI')
  207.     END
  208.     ! End Template
  209.   SET(Peo:NameKey)
  210.   ?List{Prop:Alrt,251} = MouseLeft2
  211.   IF LocalRequest = SelectRecord
  212.     ?Select{Prop:Hide} = False
  213.     ENABLE(?Select)
  214.     ?Select{Prop:Default} = True
  215.   ELSE
  216.     ?Select{Prop:Hide} = True
  217.     DISABLE(?Select)
  218.   END
  219.   ?List{Prop:Alrt,255} = InsertKey
  220.   ?List{Prop:Alrt,254} = DeleteKey
  221.   ?List{Prop:Alrt,253} = CtrlEnter
  222.   ACCEPT
  223.     CASE EVENT()
  224.     OF EVENT:OpenWindow
  225.       IF NOT WindowInitialized
  226.         DO InitializeWindow
  227.         WindowInitialized = True
  228.       END
  229.       SELECT(?List)
  230.     OF EVENT:GainFocus
  231.       IF NOT WindowInitialized
  232.         WindowInitialized = True
  233.         DO InitializeWindow
  234.       ELSE
  235.         ForceRefresh = True
  236.         DO RefreshWindow
  237.       END
  238.     OF EVENT:Sized
  239.       ! ProgTool ScaleWindow Template
  240.         DO ResizeWindow
  241.       ! End Template
  242.     END
  243.     CASE FIELD()
  244.     OF ?List
  245.       CASE EVENT()
  246.       OF EVENT:NewSelection
  247.         DO BRW1::NewSelection
  248.       OF EVENT:ScrollUp
  249.         DO BRW1::ScrollUp
  250.       OF EVENT:ScrollDown
  251.         DO BRW1::ScrollDown
  252.       OF EVENT:PageUp
  253.         DO BRW1::PageUp
  254.       OF EVENT:PageDown
  255.         DO BRW1::PageDown
  256.       OF EVENT:ScrollTop
  257.         DO BRW1::ScrollTop
  258.       OF EVENT:ScrollBottom
  259.         DO BRW1::ScrollBottom
  260.       OF EVENT:AlertKey
  261.         DO BRW1::AlertKey
  262.       OF EVENT:ScrollDrag
  263.         IF ?List{Prop:VScrollPos} <= 1
  264.           POST(Event:ScrollTop,?List)
  265.         ELSIF ?List{Prop:VScrollPos} = 100
  266.           POST(Event:ScrollBottom,?List)
  267.         ELSE
  268.           Peo:LastName = Sort:Name:Array[?List{Prop:VScrollPos}]
  269.           DO BRW1::LocateRecord
  270.         END
  271.       END
  272.     OF ?Insert
  273.       CASE EVENT()
  274.       OF EVENT:Accepted
  275.         DO SyncWindow
  276.         DO BRW1::ButtonInsert
  277.       END
  278.     OF ?Change
  279.       CASE EVENT()
  280.       OF EVENT:Accepted
  281.         DO SyncWindow
  282.         DO BRW1::ButtonChange
  283.       END
  284.     OF ?Delete
  285.       CASE EVENT()
  286.       OF EVENT:Accepted
  287.         DO SyncWindow
  288.         DO BRW1::ButtonDelete
  289.       END
  290.     OF ?Select
  291.       CASE EVENT()
  292.       OF EVENT:Accepted
  293.         DO SyncWindow
  294.         LocalResponse = RequestCompleted
  295.         POST(Event:CloseWindow)
  296.       END
  297.     OF ?Close
  298.       CASE EVENT()
  299.       OF EVENT:Accepted
  300.         DO SyncWindow
  301.         LocalResponse = RequestCancelled
  302.         POST(Event:CloseWindow)
  303.       END
  304.     END
  305.   END
  306.   DO ProcedureReturn
  307. !---------------------------------------------------------------------------
  308. ProcedureReturn ROUTINE
  309.   People::Used -= 1
  310.   IF People::Used = 0 THEN CLOSE(People).
  311.   IF WindowOpened
  312.     INISaveWindow('PeoView','PROGTOOL.INI')
  313.     CLOSE(BrowseWindow)
  314.   END
  315.   IF LocalResponse
  316.     GlobalResponse = LocalResponse
  317.   ELSE
  318.     GlobalResponse = RequestCancelled
  319.   END
  320.   RETURN
  321. !---------------------------------------------------------------------------
  322. InitializeWindow ROUTINE
  323.   DO BRW1::OpenWindow
  324.   DO RefreshWindow
  325. !---------------------------------------------------------------------------
  326. RefreshWindow ROUTINE
  327.   CurrentSelected = SELECTED()
  328.   IF NOT ForceRefresh
  329.     IF RECORDS(Queue:Browse)
  330.       GET(Queue:Browse,CHOICE(?List))
  331.       DO BRW1::FillBuffer
  332.       DO BRW1::ValidateRecord
  333.       IF BRW1::RecordStatus <> Record:OK
  334.         FREE(Queue:Browse)
  335.         DO BRW1::InitializeBrowse
  336.       END
  337.     ELSE
  338.       DO BRW1::InitializeBrowse
  339.     END
  340.   ELSE
  341.     DO BRW1::InitializeBrowse
  342.     DO BRW1::RefreshPage
  343.   END
  344.   ?List{Prop:VScrollPos} = BRW1::CurrentScroll
  345.   DISPLAY()
  346.   ForceRefresh = False
  347.   IF SELECTED() <> CurrentSelected
  348.     SELECT(CurrentSelected)
  349.   END
  350. !---------------------------------------------------------------------------
  351. SyncWindow ROUTINE
  352.   IF RECORDS(Queue:Browse)
  353.     GET(Queue:Browse,CHOICE(?List))
  354.     REGET(Peo:NameKey,BRW1::Position)
  355.   END
  356. !---------------------------------------------------------------------------
  357. !----------------------------------------------------------------------
  358. BRW1::OpenWindow ROUTINE
  359.   IF LocalRequest = SelectRecord
  360.     SET(Peo:NameKey,Peo:NameKey)
  361.     DO BRW1::LocateRecord
  362.   ELSE
  363.     DO BRW1::InitializeBrowse
  364.     SELECT(?List,1)
  365.   END
  366.   DO BRW1::FillBuffer
  367.   IF NOT BRW1::NewSelectPosted
  368.     BRW1::NewSelectPosted = True
  369.     POST(Event:NewSelection,?List)
  370.   END
  371. !----------------------------------------------------------------------
  372. BRW1::InitializeBrowse ROUTINE
  373.   IF SEND(People,'QUICKSCAN=on').
  374.   IF SEND(People,'QUICKSCAN=off').
  375.   DO BRW1::RefreshPage
  376. !----------------------------------------------------------------------
  377. BRW1::FillBuffer ROUTINE
  378.   Lcl:FullName = BRW1::Lcl:FullName
  379.   Peo:LastName = BRW1::Peo:LastName
  380.   Peo:FirstName = BRW1::Peo:FirstName
  381. !----------------------------------------------------------------------
  382. BRW1::ResetLow ROUTINE
  383.   SET(Peo:NameKey)
  384. !----------------------------------------------------------------------
  385. BRW1::ResetHigh ROUTINE
  386.   SET(Peo:NameKey)
  387. !----------------------------------------------------------------------
  388. BRW1::ResetClear ROUTINE
  389.   SET(Peo:NameKey)
  390. !----------------------------------------------------------------------
  391. BRW1::FillQueue ROUTINE
  392.   ! *** Format an element of the browse queue (Browse on People)
  393.     Lcl:FullName = CLIP(Peo:FirstName) & ' ' & Peo:LastName
  394.   ! *** End Embed
  395.   BRW1::Lcl:FullName = Lcl:FullName
  396.   BRW1::Peo:LastName = Peo:LastName
  397.   BRW1::Peo:FirstName = Peo:FirstName
  398.   BRW1::Position = POSITION(Peo:NameKey)
  399. !----------------------------------------------------------------------
  400. BRW1::NewSelection ROUTINE
  401.   BRW1::NewSelectPosted = False
  402.   IF RECORDS(Queue:Browse)
  403.     DO BRW1::FillBuffer
  404.     BRW1::CurrentScroll = 100
  405.     LOOP BRW1::CurrentScrollRecord = 1 TO 100
  406.       IF Sort:Name:Array[BRW1::CurrentScrollRecord] => UPPER(Peo:LastName)
  407.         IF BRW1::CurrentScrollRecord <= 1
  408.           BRW1::CurrentScroll = 0
  409.         ELSIF BRW1::CurrentScrollRecord = 100
  410.           BRW1::CurrentScroll = 100
  411.         ELSE
  412.           BRW1::CurrentScroll = ((BRW1::CurrentScrollRecord / 100) * 100)
  413.         END
  414.         BREAK
  415.       END
  416.     END
  417.     DO RefreshWindow
  418.   END
  419. !----------------------------------------------------------------------
  420. BRW1::ScrollUp ROUTINE
  421.   IF RECORDS(Queue:Browse)
  422.     IF CHOICE(?List)>1
  423.       SELECT(?List, CHOICE(?List)-1)
  424.     ELSE
  425.       GET(Queue:Browse,1)                         ! Get the first queue item
  426.       RESET(Peo:NameKey,BRW1::Position)           ! Reset for sequential processing
  427.       PREVIOUS(People)                            ! Retrieve record, reverse access
  428.       BRW1::ItemsToFill = 1                       ! Load a single item
  429.       DO BRW1::FillBackward                       ! Fill with previous read(s)
  430.     END
  431.     IF NOT BRW1::NewSelectPosted
  432.       BRW1::NewSelectPosted = True
  433.       POST(Event:NewSelection,?List)
  434.     END
  435.   END
  436. !----------------------------------------------------------------------
  437. BRW1::ScrollDown ROUTINE
  438.   IF RECORDS(Queue:Browse)
  439.     IF CHOICE(?List)<RECORDS(Queue:Browse)
  440.       SELECT(?List, CHOICE(?List)+1)
  441.     ELSE
  442.       GET(Queue:Browse,RECORDS(Queue:Browse))     ! Get the last queue item
  443.       RESET(Peo:NameKey,BRW1::Position)           ! Reset for sequential processing
  444.       NEXT(People)                                ! Retrieve record, forward access
  445.       BRW1::ItemsToFill = 1                       ! load a single item
  446.       DO BRW1::FillForward                        ! Fill with next read(s)
  447.     END
  448.     IF NOT BRW1::NewSelectPosted
  449.       BRW1::NewSelectPosted = True
  450.       POST(Event:NewSelection,?List)
  451.     END
  452.   END
  453. !----------------------------------------------------------------------
  454. BRW1::PageUp ROUTINE
  455.   IF RECORDS(Queue:Browse)
  456.     GET(Queue:Browse,1)                           ! Get the first queue item
  457.     RESET(Peo:NameKey,BRW1::Position)             ! Reset for sequential processing
  458.     PREVIOUS(People)                              ! Retrieve record, reverse access
  459.     BRW1::ItemsToFill = ?List{Prop:Items}         ! Load a full page
  460.     DO BRW1::FillBackward                         ! Fill with previous read(s)
  461.     IF BRW1::ItemsToFill
  462.       BRW1::NextChoice = CHOICE(?List)-BRW1::ItemsToFill
  463.       IF BRW1::NextChoice < 1
  464.         BRW1::NextChoice = 1
  465.       END
  466.       SELECT(?List, BRW1::NextChoice)
  467.     END
  468.     IF NOT BRW1::NewSelectPosted
  469.       BRW1::NewSelectPosted = True
  470.       POST(Event:NewSelection,?List)
  471.     END
  472.   END
  473. !----------------------------------------------------------------------
  474. BRW1::PageDown ROUTINE
  475.   IF RECORDS(Queue:Browse)
  476.     GET(Queue:Browse,RECORDS(Queue:Browse))       ! Get the last queue item
  477.     RESET(Peo:NameKey,BRW1::Position)             ! Reset for sequential processing
  478.     NEXT(People)                                  ! Retrieve record, forward access
  479.     BRW1::ItemsToFill = ?List{Prop:Items}         ! Load a full page
  480.     DO BRW1::FillForward                          ! Fill with next read(s)
  481.     IF BRW1::ItemsToFill
  482.       BRW1::NextChoice = CHOICE(?List)+BRW1::ItemsToFill
  483.       IF BRW1::NextChoice > RECORDS(Queue:Browse)
  484.         BRW1::NextChoice = RECORDS(Queue:Browse)
  485.       END
  486.       SELECT(?List, BRW1::NextChoice)
  487.     END
  488.     IF NOT BRW1::NewSelectPosted
  489.       BRW1::NewSelectPosted = True
  490.       POST(Event:NewSelection,?List)
  491.     END
  492.   END
  493. !----------------------------------------------------------------------
  494. BRW1::ScrollTop ROUTINE
  495.   IF RECORDS(Queue:Browse)
  496.     FREE(Queue:Browse)
  497.     DO BRW1::RefreshPage
  498.     SELECT(?List,1)                               ! Select first list item
  499.     IF NOT BRW1::NewSelectPosted
  500.       BRW1::NewSelectPosted = True
  501.       POST(Event:NewSelection,?List)
  502.     END
  503.   END
  504. !----------------------------------------------------------------------
  505. BRW1::ScrollBottom ROUTINE
  506.   IF RECORDS(Queue:Browse)
  507.     SETCURSOR(Cursor:Wait)
  508.     FREE(Queue:Browse)                            ! Free the browse queue
  509.     DO BRW1::ResetHigh                            ! Reset for first page access
  510.     BRW1::ItemsToFill = ?List{Prop:Items}         ! Load a full page
  511.     DO BRW1::FillBackward                         ! Fill with previous read(s)
  512.     SELECT(?List, RECORDS(Queue:Browse))          ! Select last list item
  513.     SETCURSOR()
  514.     IF NOT BRW1::NewSelectPosted
  515.       BRW1::NewSelectPosted = True
  516.       POST(Event:NewSelection,?List)
  517.     END
  518.   END
  519. !----------------------------------------------------------------------
  520. BRW1::AlertKey ROUTINE
  521.   IF RECORDS(Queue:Browse)
  522.     CASE KEYCODE()                                ! What keycode was hit
  523.     OF MouseLeft2
  524.       IF LocalRequest = SelectRecord
  525.         POST(Event:Accepted,?Select)
  526.         EXIT
  527.       END
  528.       POST(Event:Accepted,?Change)
  529.       DO BRW1::FillBuffer
  530.     OF InsertKey
  531.       POST(Event:Accepted,?Insert)
  532.     OF DeleteKey
  533.       POST(Event:Accepted,?Delete)
  534.     OF CtrlEnter
  535.       POST(Event:Accepted,?Change)
  536.     ELSE                                          ! ELSE (What keycode was hit)
  537.       IF CHR(KEYCHAR())
  538.         DO BRW1::ResetClear
  539.         Peo:LastName = CHR(KEYCHAR())
  540.         GET(People,0)
  541.         DO BRW1::LocateRecord                     ! Find the record
  542.       END
  543.     END                                           ! END (What keycode was hit)
  544.   END
  545.   IF NOT BRW1::NewSelectPosted
  546.     BRW1::NewSelectPosted = True
  547.     POST(Event:NewSelection,?List)
  548.   END
  549. !----------------------------------------------------------------------
  550. BRW1::ValidateRecord ROUTINE
  551.   BRW1::RecordStatus = Record:OK
  552.   EXIT
  553. !----------------------------------------------------------------------
  554. BRW1::FillForward ROUTINE
  555.   IF BRW1::ItemsToFill > 1
  556.     IF SEND(People,'QUICKSCAN=on').
  557.     BRW1::QuickScan = True
  558.   END
  559.   LOOP WHILE BRW1::ItemsToFill
  560.     NEXT(People)
  561.     IF ERRORCODE() THEN BREAK.
  562.     DO BRW1::ValidateRecord
  563.     EXECUTE(BRW1::RecordStatus)
  564.       BEGIN
  565.         GET(Queue:Browse,RECORDS(Queue:Browse))
  566.         DO BRW1::FillBuffer
  567.         BREAK
  568.       END
  569.       CYCLE
  570.     END
  571.     IF RECORDS(Queue:Browse) = ?List{Prop:Items}
  572.       GET(Queue:Browse,1)
  573.       DELETE(Queue:Browse)
  574.     END
  575.     BRW1::ItemsToFill -= 1
  576.     DO BRW1::FillQueue
  577.     ADD(Queue:Browse)
  578.   END
  579.   IF BRW1::QuickScan
  580.     IF SEND(People,'QUICKSCAN=off').
  581.     BRW1::QuickScan = False
  582.   END
  583.   EXIT
  584. !----------------------------------------------------------------------
  585. BRW1::FillBackward ROUTINE
  586.   IF BRW1::ItemsToFill > 1
  587.     IF SEND(People,'QUICKSCAN=on').
  588.     BRW1::QuickScan = True
  589.   END
  590.   LOOP WHILE BRW1::ItemsToFill
  591.     PREVIOUS(People)
  592.     IF ERRORCODE() THEN BREAK.
  593.     DO BRW1::ValidateRecord
  594.     EXECUTE(BRW1::RecordStatus)
  595.       BEGIN
  596.         GET(Queue:Browse,1)
  597.         DO BRW1::FillBuffer
  598.         BREAK
  599.       END
  600.       CYCLE
  601.     END
  602.     IF RECORDS(Queue:Browse) = ?List{Prop:Items}
  603.       GET(Queue:Browse,RECORDS(Queue:Browse))
  604.       DELETE(Queue:Browse)
  605.     END
  606.     BRW1::ItemsToFill -= 1
  607.     DO BRW1::FillQueue
  608.     ADD(Queue:Browse,1)
  609.   END
  610.   IF BRW1::QuickScan
  611.     IF SEND(People,'QUICKSCAN=off').
  612.     BRW1::QuickScan = False
  613.   END
  614.   EXIT
  615. !----------------------------------------------------------------------
  616. BRW1::LocateRecord ROUTINE
  617.   SETCURSOR(Cursor:Wait)
  618.   FREE(Queue:Browse)
  619.   IF POSITION(Peo:NameKey)
  620.     RESET(Peo:NameKey,POSITION(Peo:NameKey))
  621.   ELSE
  622.     SET(Peo:NameKey,Peo:NameKey)
  623.   END
  624.   BRW1::LocatedPosition = ''
  625.   LOOP
  626.     NEXT(People)
  627.     IF ERRORCODE() THEN BREAK.
  628.     DO BRW1::ValidateRecord
  629.     EXECUTE(BRW1::RecordStatus)
  630.       BREAK
  631.       CYCLE
  632.     END
  633.     BRW1::LocatedPosition = POSITION(Peo:NameKey)
  634.     RESET(Peo:NameKey,BRW1::LocatedPosition)
  635.     BREAK
  636.   END
  637.   BRW1::ItemsToFill = ?List{Prop:Items}
  638.   DO BRW1::FillForward
  639.   IF BRW1::ItemsToFill
  640.     IF ~RECORDS(Queue:Browse)
  641.       DO BRW1::ResetHigh                          ! Reset for first page access
  642.     ELSE
  643.       GET(Queue:Browse,1)
  644.       RESET(Peo:NameKey,BRW1::Position)
  645.       PREVIOUS(People)
  646.     END
  647.     DO BRW1::FillBackward
  648.   END
  649.   IF ~RECORDS(Queue:Browse)
  650.     CLEAR(Peo:Record)
  651.     ?List{Prop:Disable} = 1
  652.     ?Change{Prop:Disable} = 1
  653.     ?Delete{Prop:Disable} = 1
  654.   ELSE
  655.     ?List{Prop:Disable} = 0
  656.     IF BRW1::LocatedPosition
  657.       BRW1::QueuePointer = 1
  658.       LOOP
  659.         GET(Queue:Browse,BRW1::QueuePointer)
  660.         IF ERRORCODE() THEN BREAK.
  661.         IF BRW1::Position = BRW1::LocatedPosition THEN BREAK.
  662.         BRW1::QueuePointer += 1
  663.       END
  664.     ELSE
  665.       BRW1::QueuePointer = RECORDS(Queue:Browse)
  666.     END
  667.     SELECT(?List,BRW1::QueuePointer)
  668.     DO BRW1::FillBuffer
  669.     ?Change{Prop:Disable} = 0
  670.     ?Delete{Prop:Disable} = 0
  671.   END
  672.   SETCURSOR()
  673.   EXIT
  674. !----------------------------------------------------------------------
  675. BRW1::RefreshPage ROUTINE
  676.   SETCURSOR(Cursor:Wait)
  677.   IF NOT RECORDS(Queue:Browse)
  678.     BRW1::InitializePage = True
  679.     DO BRW1::ResetLow
  680.   ELSE
  681.     BRW1::InitializePage = False
  682.     GET(Queue:Browse,1)
  683.     RESET(Peo:NameKey,BRW1::Position)
  684.   END
  685.   FREE(Queue:Browse)
  686.   BRW1::ItemsToFill = ?List{Prop:Items}
  687.   DO BRW1::FillForward
  688.   IF NOT BRW1::InitializePage
  689.     IF BRW1::ItemsToFill
  690.       GET(Queue:Browse,1)
  691.       RESET(Peo:NameKey,BRW1::Position)
  692.       PREVIOUS(People)
  693.       DO BRW1::FillBackward
  694.     END
  695.   END
  696.   IF ~RECORDS(Queue:Browse)
  697.     CLEAR(Peo:Record)
  698.     ?List{Prop:Disable} = 1
  699.     ?Change{Prop:Disable} = 1
  700.     ?Delete{Prop:Disable} = 1
  701.   ELSE
  702.     ?List{Prop:Disable} = 0
  703.     GET(Queue:Browse,CHOICE(?List))
  704.     IF ERRORCODE()
  705.       GET(Queue:Browse,RECORDS(Queue:Browse))
  706.     END
  707.     DO BRW1::FillBuffer
  708.     ?Change{Prop:Disable} = 0
  709.     ?Delete{Prop:Disable} = 0
  710.   END
  711.   SETCURSOR()
  712.   EXIT
  713. !----------------------------------------------------------------
  714. BRW1::ButtonInsert ROUTINE
  715.   GET(People,0)
  716.   CLEAR(Peo:Record,0)
  717.   SET(Peo:NameKey)
  718.   LocalRequest = InsertRecord
  719.   DO BRW1::CallUpdate
  720.   IF LocalResponse = RequestCompleted
  721.     DO BRW1::ValidateRecord
  722.     IF BRW1::RecordStatus = Record:OK
  723.       DO BRW1::LocateRecord
  724.     END
  725.   END
  726.   LocalRequest = OriginalRequest
  727.   SELECT(?List)
  728.   ForceRefresh = True
  729.   DO RefreshWindow
  730. !----------------------------------------------------------------
  731. BRW1::ButtonChange ROUTINE
  732.   LocalRequest = ChangeRecord
  733.   DO BRW1::CallUpdate
  734.   IF LocalResponse = RequestCompleted
  735.     DO BRW1::ValidateRecord
  736.     IF BRW1::RecordStatus = Record:OK
  737.       IF BRW1::Position = POSITION(Peo:NameKey)
  738.         DO BRW1::RefreshPage
  739.       ELSE
  740.         DO BRW1::LocateRecord
  741.       END
  742.     ELSE
  743.       SELECT(?List,CHOICE(?List))
  744.     END
  745.   END
  746.   LocalRequest = OriginalRequest
  747.   SELECT(?List)
  748.   ForceRefresh = True
  749.   DO RefreshWindow
  750. !----------------------------------------------------------------
  751. BRW1::ButtonDelete ROUTINE
  752.   LocalRequest = DeleteRecord
  753.   DO BRW1::CallUpdate
  754.   IF LocalResponse = RequestCompleted
  755.     DELETE(Queue:Browse)
  756.     DO BRW1::RefreshPage
  757.   END
  758.   LocalRequest = OriginalRequest
  759.   SELECT(?List)
  760.   ForceRefresh = True
  761.   DO RefreshWindow
  762. !----------------------------------------------------------------
  763. BRW1::CallUpdate ROUTINE
  764.   GlobalRequest = LocalRequest
  765.   PeoEdit
  766.   LocalResponse = GlobalResponse
  767. ! ProgTool ScaleWindow Template
  768. ResizeWindow ROUTINE
  769.   IF BrowseWindow{Prop:Width} < MinWinWidth
  770.     BrowseWindow{Prop:Width} = MinWinWidth
  771.   END
  772.   IF BrowseWindow{Prop:Height} < MinWinHeight
  773.     BrowseWindow{Prop:Height} = MinWinHeight
  774.   END
  775.   OldWinPos[3] = BrowseWindow{Prop:Width}
  776.   OldWinPos[4] = BrowseWindow{Prop:Height}
  777.   ! ?List   LIST
  778.   LIST1Pos[1] = OldWinPos[3] * LIST1Ratio[1]
  779.   LIST1Pos[2] = OldWinPos[4] * LIST1Ratio[2]
  780.   LIST1Pos[3] = OldWinPos[3] * LIST1Ratio[3]
  781.   LIST1Pos[4] = OldWinPos[4] * LIST1Ratio[4]
  782.   SETPOSITION(?List,LIST1Pos[1],LIST1Pos[2],LIST1Pos[3],LIST1Pos[4])
  783.   ! ?Insert   BUTTON
  784.   BUTTON2Pos[1] = OldWinPos[3] * BUTTON2Ratio[1]
  785.   BUTTON2Pos[2] = OldWinPos[4] * BUTTON2Ratio[2]
  786.   BUTTON2Pos[3] = OldWinPos[3] * BUTTON2Ratio[3]
  787.   BUTTON2Pos[4] = OldWinPos[4] * BUTTON2Ratio[4]
  788.   SETPOSITION(?Insert,BUTTON2Pos[1],BUTTON2Pos[2],BUTTON2Pos[3],BUTTON2Pos[4])
  789.   ! ?Change   BUTTON
  790.   BUTTON3Pos[1] = OldWinPos[3] * BUTTON3Ratio[1]
  791.   BUTTON3Pos[2] = OldWinPos[4] * BUTTON3Ratio[2]
  792.   BUTTON3Pos[3] = OldWinPos[3] * BUTTON3Ratio[3]
  793.   BUTTON3Pos[4] = OldWinPos[4] * BUTTON3Ratio[4]
  794.   SETPOSITION(?Change,BUTTON3Pos[1],BUTTON3Pos[2],BUTTON3Pos[3],BUTTON3Pos[4])
  795.   ! ?Delete   BUTTON
  796.   BUTTON4Pos[1] = OldWinPos[3] * BUTTON4Ratio[1]
  797.   BUTTON4Pos[2] = OldWinPos[4] * BUTTON4Ratio[2]
  798.   BUTTON4Pos[3] = OldWinPos[3] * BUTTON4Ratio[3]
  799.   BUTTON4Pos[4] = OldWinPos[4] * BUTTON4Ratio[4]
  800.   SETPOSITION(?Delete,BUTTON4Pos[1],BUTTON4Pos[2],BUTTON4Pos[3],BUTTON4Pos[4])
  801.   ! ?Select   BUTTON
  802.   BUTTON5Pos[1] = OldWinPos[3] * BUTTON5Ratio[1]
  803.   BUTTON5Pos[2] = OldWinPos[4] * BUTTON5Ratio[2]
  804.   BUTTON5Pos[3] = OldWinPos[3] * BUTTON5Ratio[3]
  805.   BUTTON5Pos[4] = OldWinPos[4] * BUTTON5Ratio[4]
  806.   SETPOSITION(?Select,BUTTON5Pos[1],BUTTON5Pos[2],BUTTON5Pos[3],BUTTON5Pos[4])
  807.   ! ?Close   BUTTON
  808.   BUTTON6Pos[1] = OldWinPos[3] * BUTTON6Ratio[1]
  809.   BUTTON6Pos[2] = OldWinPos[4] * BUTTON6Ratio[2]
  810.   BUTTON6Pos[3] = OldWinPos[3] * BUTTON6Ratio[3]
  811.   BUTTON6Pos[4] = OldWinPos[4] * BUTTON6Ratio[4]
  812.   SETPOSITION(?Close,BUTTON6Pos[1],BUTTON6Pos[2],BUTTON6Pos[3],BUTTON6Pos[4])
  813.   IF WindowInitialized
  814.     ForceRefresh = True
  815.     DO RefreshWindow
  816.   END
  817. ! End Template
  818.  
  819.