home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / VLIST110 / EXAMPLES / DEMO.PRG < prev    next >
Text File  |  1992-03-17  |  23KB  |  800 lines

  1. *******************************************************************************
  2. *                                                                             *
  3. *                             Virtual List system                             *
  4. *                                                                             *
  5. *                            Demonstration program                            *
  6. *                                                                             *
  7. *                            1991 Jayson R. Minard                            *
  8. *                                                                             *
  9. *─────────────────────────────────────────────────────────────────────────────*
  10. *                                                                             *
  11. * This program demonstrates the capabilities and flexibility of the VList     *
  12. * library.  The following are shown:                                          *
  13. *                                                                             *
  14. *          Pulldown menus                                                     *
  15. *          Prompts                                                            *
  16. *          Popup menus                                                        *
  17. *          Picklists                                                          *
  18. *                                                                             *
  19. *─────────────────────────────────────────────────────────────────────────────*
  20. *                                                                             *
  21. * All major features are preceded by comments containing the text '!LOOK'.    *
  22. * This will allow you to search and find the features of the VList library.   *
  23. *                                                                             *
  24. *******************************************************************************
  25.  
  26. #INCLUDE WARN.HDR
  27. #INCLUDE DATE.HDR
  28. #INCLUDE STRING.HDR
  29. #INCLUDE SYSTEM.HDR
  30. #INCLUDE DATABASE.HDR
  31. #INCLUDE IO.HDR
  32. #INCLUDE COLORS.HDR
  33. #INCLUDE KEYS.HDR
  34.  
  35. #INCLUDE vlist.hdr
  36. #INCLUDE vmouse.hdr
  37.  
  38. VARDEF EXTERN
  39.   BYTE  __color_std,;
  40.         __color_enhcd
  41. ENDDEF
  42.  
  43. *******************************************************************************
  44. *                              global variables                               *
  45. *******************************************************************************
  46.  
  47. VARDEF
  48.   LOGICAL is_mono
  49.   LOGICAL set_delete_on
  50.   LOGICAL is_mouse
  51.   LOGICAL main_loop
  52.  
  53.   LOGICAL at_end
  54.   LOGICAL at_front
  55.  
  56.   *- menu list
  57.   LONG    menu_list
  58.   LONG    prompt_list
  59.  
  60.   *- colors
  61.   BYTE  d_main_std,;
  62.         d_main_enhcd,;
  63.         d_main_border,;
  64.         d_main_back,;
  65.         d_main_data,;
  66.         d_menu_std,;
  67.         d_menu_enhcd,;
  68.         d_menu_hi_std,;
  69.         d_menu_hi_enhcd,;
  70.         d_menu_border,;
  71.         d_menu_skip
  72.  
  73. ENDDEF
  74.  
  75. *******************************************************************************
  76. *                            database definitions                             *
  77. *******************************************************************************
  78.  
  79. DBFDEF people
  80.   CHAR( 20 )  first_name
  81.   CHAR( 20 )  last_name
  82.   CHAR( 40 )  salutation
  83.   CHAR( 40 )  address1
  84.   CHAR( 40 )  address2
  85.   CHAR( 30 )  city
  86.   CHAR( 2 )   state
  87.   CHAR( 10 )  zip
  88.   CHAR( 12 )  phone1
  89.   CHAR( 12 )  phone2
  90.  
  91.   DATE        f_contact      && first contact date
  92.   DATE        l_contact      && last contact date
  93.   DATE        n_contact      && next contact date
  94. ENDDEF
  95.  
  96. INDEXDEF
  97.   CHAR( 40 )  i_people     UPPER( people->last_name +;
  98.                                   people->first_name )
  99. ENDDEF
  100.  
  101.  
  102. *******************************************************************************
  103. *                                Draw_Border()                                *
  104. *******************************************************************************
  105.  
  106. PROCEDURE Draw_Border
  107.   PARAMETERS VALUE LOGICAL active,;
  108.              VALUE LOGICAL clear_middle
  109.  
  110.   VARDEF
  111.     CHAR( 8 ) border_chars
  112.     CHAR( 1 ) fill_middle
  113.   ENDDEF
  114.  
  115.   IF active
  116.     border_chars = &double_box
  117.   ELSE
  118.     border_chars = &single_box
  119.   ENDIF
  120.  
  121.   IF clear_middle
  122.     fill_middle = " "
  123.   ELSE
  124.     fill_middle = ""
  125.   ENDIF
  126.  
  127.   FILL( 3, 5, 17, 73, border_chars, fill_middle, d_main_border, d_main_std, 6 )
  128.  
  129. ENDPRO
  130.  
  131. *******************************************************************************
  132. *                                DRAW_TITLES()                                *
  133. *******************************************************************************
  134.  
  135. PROCEDURE Draw_Titles
  136.   VARDEF
  137.     BYTE  old_std, old_enhcd
  138.   ENDDEF
  139.  
  140.   old_std   = __color_std
  141.   old_enhcd = __color_enhcd
  142.  
  143.   __color_std = d_main_std
  144.   @ 4,  7 SAY "Last name: "
  145.   @ 4, 40 SAY "First name: "
  146.   @ 6,  7 SAY "Salutation: "
  147.   @ 8,  7 SAY "Address: "
  148.   @11,  7 SAY "City: "
  149.   @11, 45 SAY "State: "
  150.   @11, 56 SAY "Zip: "
  151.   @13,  7 SAY "Phone 1: "
  152.   @13, 30 SAY "Phone 2: "
  153.   @15,  7 SAY "First contact: "
  154.   @15, 32 SAY "Last: "
  155.   @15, 48 SAY "Next: "
  156.  
  157.   __color_enhcd = old_enhcd
  158.   __color_std   = old_std
  159.  
  160. ENDPRO
  161.  
  162.  
  163. *******************************************************************************
  164. *                                 DRAW_REC()                                  *
  165. *******************************************************************************
  166.  
  167. PROCEDURE Draw_Rec
  168.   VARDEF
  169.     BYTE  old_std, old_enhcd
  170.   ENDDEF
  171.  
  172.   old_std   = __color_std
  173.   old_enhcd = __color_enhcd
  174.  
  175.   __color_std   = d_main_data
  176.   @ 4, 18 SAY people->last_name
  177.   @ 4, 52 SAY people->first_name
  178.   @ 6, 19 SAY people->salutation
  179.   @ 8, 16 SAY people->address1
  180.   @ 9, 16 SAY people->address2
  181.   @11, 13 SAY people->city
  182.   @11, 52 SAY people->state PICTURE "@!"
  183.   @11, 61 SAY people->zip PICTURE "XXXXX-XXXX"
  184.   @13, 16 SAY people->phone1 PICTURE "999-999-9999"
  185.   @13, 39 SAY people->phone2 PICTURE "999-999-9999"
  186.   @15, 22 SAY people->f_contact
  187.   @15, 38 SAY people->l_contact
  188.   @15, 54 SAY people->n_contact
  189.  
  190.   __color_enhcd = old_enhcd
  191.   __color_std   = old_std
  192.  
  193. ENDPRO
  194.  
  195.  
  196. *******************************************************************************
  197. *                                  GET_REC()                                  *
  198. *******************************************************************************
  199.  
  200. PROCEDURE Get_Rec
  201.   VARDEF
  202.     BYTE  old_std, old_enhcd
  203.   ENDDEF
  204.  
  205.   old_std   = __color_std
  206.   old_enhcd = __color_enhcd
  207.  
  208.   __color_std   = d_main_data
  209.   __color_enhcd = d_main_enhcd
  210.   @ 4, 18 GET people->last_name
  211.   @ 4, 52 GET people->first_name
  212.   @ 6, 19 GET people->salutation
  213.   @ 8, 16 GET people->address1
  214.   @ 9, 16 GET people->address2
  215.   @11, 13 GET people->city
  216.   @11, 52 GET people->state PICTURE "@!"
  217.   @11, 61 GET people->zip PICTURE "XXXXX-XXXX"
  218.   @13, 16 GET people->phone1 PICTURE "999-999-9999"
  219.   @13, 39 GET people->phone2 PICTURE "999-999-9999"
  220.   @15, 22 GET people->f_contact
  221.   @15, 38 GET people->l_contact
  222.   @15, 54 GET people->n_contact
  223.  
  224.   CURSOR_ON()
  225.   READ
  226.   CURSOR_OFF()
  227.  
  228.   __color_enhcd = old_enhcd
  229.   __color_std   = old_std
  230.  
  231. ENDPRO
  232.  
  233. *******************************************************************************
  234. *                                    Add()                                    *
  235. *******************************************************************************
  236.  
  237. PROCEDURE Add
  238.   PARAMETERS       LOGICAL    ret_val,;
  239.              CONST CHAR( 40 ) add_str
  240.  
  241.   * !LOOK:  The following code segment shows the addition of elements into
  242.   *         a list.  The code determines if the element is to be skipped
  243.   *         or not (horizontal lines in a menu are skipped).
  244.  
  245.   IF ret_val = .F.
  246.     RETURN
  247.   ENDIF
  248.  
  249.   IF AT( "?", add_str ) > 0 .AND. AT( "...", add_str ) > 0
  250.     IF .NOT. Vlist_Append( menu_list, &jl_skip, &jl_default, add_str )
  251.       ret_val = .F.
  252.     ENDIF
  253.  
  254.   ELSE
  255.     IF .NOT. Vlist_Add( menu_list, add_str )
  256.       ret_val = .F.
  257.     ENDIF
  258.  
  259.   ENDIF
  260.  
  261. ENDPRO
  262.  
  263.  
  264. *******************************************************************************
  265. *                                 SET_MENUS()                                 *
  266. *******************************************************************************
  267.  
  268. PROCEDURE Setup_Menus
  269.   VARDEF
  270.     LOGICAL ret_val
  271.   ENDDEF
  272.  
  273.   * !LOOK:  The following code segment shows the creation of a pulldown
  274.   *         and popup menu list.
  275.  
  276.   menu_list = VLIST_INIT( 50 )
  277.   IF menu_list = 0
  278.     __color_std = &black_white
  279.     CLEAR
  280.     ? "!ERROR:  cannot initialize pulldown menu system due to insufficient memory"
  281.     ?
  282.     QUIT 1
  283.   ENDIF
  284.  
  285.   ADD( ret_val, "1.1 @1  |  ^People DBF  " )
  286.   ADD( ret_val, "1.1.0   |" )
  287.   ADD( ret_val, "1.1.1   | ^Append " )
  288.   ADD( ret_val, "1.1.2   | ^Modify " )
  289.   ADD( ret_val, "1.1.?   |─..." )
  290.   ADD( ret_val, "1.1.3   | ^Browse " )
  291.   ADD( ret_val, "1.2 @15 |  ^Utilities  " )
  292.   ADD( ret_val, "1.2.0   |" )
  293.   ADD( ret_val, "1.2.1   | ^Reindex " )
  294.   ADD( ret_val, "1.2.2   | ^Pack " )
  295.   ADD( ret_val, "1.2.?   |─..." )
  296.   ADD( ret_val, "1.2.3   | ^Quit " )
  297.  
  298.   ADD( ret_val, "2.0     | Quit? " )
  299.   ADD( ret_val, "2.1     |   ^Yes  " )
  300.   ADD( ret_val, "2.2     |   ^No   " )
  301.  
  302.   IF ret_val = .F.
  303.     __color_std = &black_white
  304.     CLEAR
  305.     ? "!ERROR:  setting pulldown options due to insufficient memory"
  306.     ?
  307.     QUIT 1
  308.   ENDIF
  309.  
  310. ENDPRO
  311.  
  312. *******************************************************************************
  313. *                               SETUP_PROMPTS()                               *
  314. *******************************************************************************
  315.  
  316. PROCEDURE SETUP_PROMPTS
  317.  
  318.   prompt_list = VLIST_INIT( 40 )
  319.  
  320.   IF prompt_list = 0
  321.     __color_std = &black_white
  322.     CLEAR
  323.     ? "!ERROR:  cannot initialize prompt system due to insufficient memory"
  324.     ?
  325.     QUIT 1
  326.   ENDIF
  327.  
  328.   * !LOOK:  This code sets up a list to simulate the @PROMPT command
  329.  
  330.   VList_Add( prompt_list, "1.1 @20,3  |  ^Next  " )
  331.   VList_Add( prompt_list, "1.2 @20,11 |  ^Previous  " )
  332.   VList_Add( prompt_list, "1.3 @20,23 |  ^Top  " )
  333.   VList_Add( prompt_list, "1.4 @20,30 |  ^Bottom  " )
  334.   VList_Add( prompt_list, "1.5 @20,40 |  [ ] ^Deleted  " )
  335.   VList_Add( prompt_list, "1.6 @20,55 |  [ ] ^SET DELETE ON  " )
  336.  
  337. ENDPRO
  338.  
  339.  
  340. *******************************************************************************
  341. *                               ALTER_PROMPTS()                               *
  342. *******************************************************************************
  343.  
  344. PROCEDURE Alter_Prompts
  345.  
  346.   * !LOOK:  we can now alter elements in an existing list.
  347.  
  348.   IF .NOT. A_DELETED( people )
  349.     Vlist_Edit( prompt_list, 5, "1.5 @20, 40 |  [ ] ^Deleted  " )
  350.   ELSE
  351.     Vlist_Edit( prompt_list, 5, "1.5 @20, 40 |  [X] ^Deleted  " )
  352.   ENDIF
  353.  
  354.   IF at_end
  355.     Vlist_Set_Status( prompt_list, 1, &jl_skip )
  356.     Vlist_Set_Status( prompt_list, 4, &jl_skip )
  357.   ELSE
  358.     Vlist_Set_Status( prompt_list, 1, &jl_normal )
  359.     Vlist_Set_Status( prompt_list, 4, &jl_normal )
  360.   ENDIF
  361.  
  362.   IF at_front
  363.     Vlist_Set_Status( prompt_list, 2, &jl_skip )
  364.     Vlist_Set_Status( prompt_list, 3, &jl_skip )
  365.   ELSE
  366.     Vlist_Set_Status( prompt_list, 2, &jl_normal )
  367.     Vlist_Set_Status( prompt_list, 3, &jl_normal )
  368.   ENDIF
  369.  
  370. ENDPRO
  371.  
  372. *******************************************************************************
  373. *                                 DBF_LINE()                                  *
  374. *******************************************************************************
  375.  
  376. FUNCTION CHAR Dbf_Line
  377.   VARDEF
  378.     CHAR one_line
  379.     CHAR temp_str
  380.   ENDDEF
  381.  
  382.   one_line = STR( A_RECNO( people ), 5, 0 )
  383.   temp_str = TRIM( people->last_name ) + ", " + TRIM( people->first_name )
  384.   temp_str = LEFT( temp_str + SPACE( 40 - LEN( temp_str ) ), 40 )
  385.   one_line = one_line + temp_str + "│"
  386.   one_line = one_line + people->phone1 + "│"
  387.   one_line = one_line + people->phone2
  388.  
  389.   RETURN one_line
  390. ENDPRO
  391.  
  392. *******************************************************************************
  393. *                                Handle_Select                                *
  394. *******************************************************************************
  395. * This routine is called when an element is selected from a pulldown menu     *
  396. * system.                                                                     *
  397. *******************************************************************************
  398.  
  399. FUNCTION UINT Handle_Select
  400.   PARAMETERS VALUE LONG handle,;
  401.        VALUE UINT system,;
  402.        VALUE UINT over,;
  403.        VALUE UINT down
  404.  
  405.   VARDEF
  406.     BYTE old_std, old_enhcd
  407.     UINT decision, save_var
  408.     ULONG old_rec
  409.     LONG  browse_list
  410.     UINT  browse_left, browse_right, browse_top, browse_current
  411.     UINT  temp_cnt, temp_first
  412.   ENDDEF
  413.  
  414.   DO CASE
  415.     CASE over = 1
  416.       SAVE_AREA( 2, 1, 8, 12 )
  417.       Draw_Border( .T., .T. )
  418.  
  419.       DO CASE
  420.         CASE over = 1 .AND. down = 1   && add
  421.           old_rec = A_RECNO( people )
  422.  
  423.           Draw_Titles()
  424.           !people APPEND BLANK
  425.           Get_Rec()
  426.           IF LASTKEY() = 27
  427.             !people DELETE
  428.             !people GOTO old_rec
  429.           ENDIF
  430.  
  431.           Draw_Rec()
  432.         CASE over = 1 .AND. down = 2   && modify
  433.           Draw_Titles()
  434.           Get_Rec()
  435.           Draw_Rec()
  436.         CASE over = 1 .AND. down = 3   && browse
  437.           old_rec = A_RECNO( people )
  438.  
  439.           * !LOOK:  the VLIST system can be used for database browse simulation:
  440.  
  441.           browse_list = VLIST_INIT( 250 )
  442.           IF browse_list <> 0
  443.  
  444.             !people GOTO TOP
  445.  
  446.             temp_first = 1
  447.             DO WHILE .NOT. A_EOF( people )
  448.               IF .NOT. Vlist_Add( browse_list, Dbf_Line() )
  449.                 EXIT
  450.               ENDIF
  451.  
  452.               IF A_RECNO( people ) = old_rec
  453.                 temp_first = Vlist_Number( browse_list )
  454.               ENDIF
  455.  
  456.               !people SKIP
  457.             ENDDO
  458.  
  459.             browse_current = temp_first
  460.             IF browse_current > 12
  461.               browse_top = browse_current - 6
  462.  
  463.               DO WHILE ( Vlist_Max( browse_list ) - browse_top + 1 ) < 12
  464.                 browse_top = browse_top - 1
  465.               ENDDO
  466.  
  467.             ELSE
  468.               browse_top = 1
  469.             ENDIF
  470.  
  471.             browse_left    = 6
  472.             browse_right   = 100
  473.  
  474.             old_std   = __color_std
  475.             old_enhcd = __color_enhcd
  476.             __color_std   = d_main_std
  477.             __color_enhcd = d_main_enhcd
  478.  
  479.             * !LOOK:  the following is the actual display of the database
  480.             *         browse simulation.  This is the normal PICK-LIST
  481.             *         replacement.
  482.  
  483.             Vlist_Pick( browse_list, 4, 6, 15, 71,;
  484.                         browse_top, browse_current,;
  485.                         0, 0, browse_left, browse_right, 1, 0,;
  486.                         Vlist_Default_Key_Handler,;
  487.                         .F., .T., .F., is_mouse, .F. )
  488.  
  489.             __color_std   = old_std
  490.             __color_enhcd = old_enhcd
  491.  
  492.             IF LASTKEY() = 27
  493.               !people GOTO old_rec
  494.             ELSE
  495.               old_rec = VAL( LEFT( Vlist_Cstr( browse_list ), 5 ) )
  496.               !people GOTO old_rec
  497.             ENDIF
  498.  
  499.             Vlist_Clear( browse_list )
  500.           ENDIF
  501.  
  502.           Draw_Border( .T., .T. )
  503.           Draw_Titles()
  504.           Draw_Rec()
  505.       ENDCASE
  506.  
  507.       Draw_Border( .F., .F. )
  508.       RESTORE_AREA()
  509.  
  510.     CASE over = 2 .AND. down = 1   && reindex
  511.       SAVE_SCREEN()
  512.       FILL( 10, 32, 13, 49, &double_box, " ", d_menu_border, d_menu_std, 6 )
  513.       @11, 34 SAY "ReINDEXing..."
  514.       !people REINDEX
  515.       RESTORE_AREA()
  516.     CASE over = 2 .AND. down = 2   && pack
  517.       SAVE_SCREEN()
  518.       FILL( 10, 33, 13, 47, &double_box, " ", d_menu_border, d_menu_std, 6 )
  519.       @11, 35 SAY "PACKing..."
  520.       !people PACK
  521.       !people REINDEX
  522.       RESTORE_AREA()
  523.     CASE over = 2 .AND. down = 3
  524.       decision = 2
  525.  
  526.       * !LOOK:  call to show the pulldown menu:
  527.  
  528.       VList_PopUp( menu_list, 2, decision, Vlist_Default_Menu_Handler,;
  529.                    10, 34, 24,;
  530.                    &double_box,;
  531.                    d_menu_border, d_menu_std,;
  532.                    .T., .T., save_var, .T., .F., is_mouse, .T. )
  533.  
  534.       IF decision = 1 .AND. LASTKEY() <> 27
  535.         main_loop = .F.
  536.         RETURN 1
  537.       ENDIF
  538.  
  539.     OTHERWISE
  540.   ENDCASE
  541.  
  542.   RETURN 0
  543. ENDPRO
  544.  
  545.  
  546.  
  547. *******************************************************************************
  548. *                                FORCE_MAIN()                                 *
  549. *******************************************************************************
  550.  
  551. PROCEDURE Force_Main
  552.   PARAMETERS CONST CHAR( 128 ) dos_cmd_line
  553.  
  554.   VARDEF
  555.     CHAR( 128 )  our_cmd_line
  556.     BYTE         old_std, old_y, old_x
  557.     LOGICAL      re_index
  558.     UINT         selected
  559.     INT          lkey
  560.     CHAR( 8 )    old_time
  561.     UINT         pull_over, pull_down
  562.   ENDDEF
  563.  
  564.   *- save machine state
  565.  
  566.   old_std = __color_std
  567.   old_y   = ROW()
  568.   old_x   = COL()
  569.   SAVE_SCREEN()
  570.  
  571.   SET STATUS OFF
  572.   SET SCOREBOARD OFF
  573.   SET EXCLUSIVE ON
  574.  
  575.   our_cmd_line = TRIM( UPPER( dos_cmd_line ) )
  576.  
  577.   *- check for /M parameter to signify forced mono mode.
  578.  
  579.   IF AT( "/M", our_cmd_line ) > 0
  580.     is_mono = .T.
  581.   ELSE
  582.     is_mono = .NOT. ISCOLOR()
  583.   ENDIF
  584.  
  585.   *- check for database existance
  586.  
  587.   SET ALIAS i_people TO "people.fdx"
  588.  
  589.   re_index = .F.
  590.   IF .NOT. EXIST( "people.dbf" )
  591.     BUILD "people.dbf" FROM ALIAS people
  592.     re_index = .T.
  593.   ELSE
  594.     IF .NOT. EXIST( "people.fdx" )
  595.       re_index = .T.
  596.     ENDIF
  597.  
  598.   ENDIF
  599.  
  600.   OPEN "people.dbf" ALIAS people EXCLUSIVE
  601.  
  602.   IF re_index
  603.     !people INDEX i_people
  604.   ENDIF
  605.  
  606.   !people SET INDEX TO i_people
  607.  
  608.   *- set color variables
  609.  
  610.   IF is_mono
  611.     d_main_std       = &black_white
  612.     d_main_enhcd     = &white_black
  613.     d_main_border    = &black_light_grey
  614.     d_main_data      = &black_light_grey
  615.     d_main_back      = &black_black
  616.     d_menu_std       = &black_light_grey
  617.     d_menu_enhcd     = &white_black
  618.     d_menu_hi_std    = &black_white
  619.     d_menu_hi_enhcd  = &white_black
  620.     d_menu_border    = &black_light_grey
  621.     d_menu_skip      = &black_light_grey
  622.   ELSE
  623.     d_main_std       = &black_white
  624.     d_main_enhcd     = &blue_white
  625.     d_main_border    = &black_light_grey
  626.     d_main_data      = &black_light_grey
  627.     d_main_back      = &black_light_cyan
  628.     d_menu_std       = &blue_white
  629.     d_menu_enhcd     = &black_white
  630.     d_menu_hi_std    = &blue_light_cyan
  631.     d_menu_hi_enhcd  = &black_light_cyan
  632.     d_menu_border    = &blue_light_grey
  633.     d_menu_skip      = &blue_light_grey
  634.   ENDIF
  635.  
  636.   SET DELETE OFF
  637.   set_delete_on = .F.
  638.  
  639.   *- draw initial screen
  640.  
  641.   __color_std      = d_main_std
  642.   __color_enhcd    = d_main_enhcd
  643.   __color_skip     = d_menu_skip
  644.   __color_bar      = d_main_border
  645.   __color_tab      = d_main_border
  646.   __color_hi_std   = d_menu_hi_std
  647.   __color_hi_enhcd = d_menu_hi_enhcd
  648.   __scroll_offset  = 1
  649.   __embed_char     = "^"
  650.  
  651.   CLEAR
  652.  
  653.   FILL( 2, 0, 22, 79, "▒▒▒▒▒▒▒▒", "▒", d_main_back, d_main_back, 0 )
  654.   __color_std = d_main_border
  655.   @ 1, 0 TO  1, 79
  656.   @23, 0 TO 23, 79
  657.   __color_std = d_main_std
  658.   @24, 0 SAY CENTER( "VLIST Demonstration (c) 1991 Jayson R. Minard", 80 )
  659.  
  660.   Draw_Border( .F., .T. )
  661.  
  662.   Draw_Titles()
  663.   main_loop = .T.
  664.  
  665.   Setup_Menus()
  666.   Setup_Prompts()
  667.  
  668.   IF Vmouse_Init() = 0
  669.     is_mouse = .F.
  670.   ELSE
  671.     is_mouse = .T.
  672.     Vmouse_Reset()
  673.   ENDIF
  674.  
  675.   selected = 1
  676.   at_end   = A_EOF( people )
  677.   at_front = .T.
  678.   pull_over = 1
  679.   pull_down = 1
  680.  
  681.   FILL( 19, 1, 22, 78, &double_box, " ", d_menu_border, d_menu_std, 6 )
  682.   CURSOR_OFF()
  683.   Alter_Prompts()
  684.  
  685.   DO WHILE main_loop
  686.     Draw_Rec()
  687.  
  688.     __color_std   = d_menu_std
  689.     __color_enhcd = d_menu_enhcd
  690.     selected = Vlist_Prompt( prompt_list, 1, selected,;
  691.                              Vlist_Default_Prompt_Handler,;
  692.                              is_mouse, .T. )
  693.  
  694.     lkey = LASTKEY()
  695.     DO CASE
  696.       CASE lkey = 27
  697.         FILL( 19, 1, 22, 78, &single_box, "", d_menu_border, d_menu_std, 6 )
  698.         __color_std = d_main_border
  699.         @ 1, 0 TO  1, 79 DOUBLE
  700.         __color_std = d_menu_std
  701.         @ 0, 0 CLEAR TO 0, 79
  702.  
  703.         * !LOOK:  show the pulldown menu
  704.  
  705.         VList_Pulldown( menu_list, 1, pull_over, pull_down,;
  706.                         Handle_Select, Vlist_Default_Menu_Handler,;
  707.                         0, 2, 22,;
  708.                         0, &single_box, d_menu_border, d_menu_std,;
  709.                         .T., .F., is_mouse, .F., .T. )
  710.  
  711.         FILL( 19, 1, 22, 78, &double_box, "", d_menu_border, d_menu_std, 6 )
  712.         __color_std = d_main_border
  713.         @ 1, 0 TO  1, 79
  714.         @ 0, 0 CLEAR TO 0, 79
  715.         __color_std = d_menu_std
  716.  
  717.       CASE selected = 1 && next
  718.         !people SKIP 2
  719.         IF A_EOF( people )
  720.           at_end = .T.
  721.           selected = 2
  722.         ELSE
  723.           at_end = .F.
  724.         ENDIF
  725.  
  726.         !people SKIP - 1
  727.  
  728.         at_front = A_BOF( people )
  729.  
  730.         Alter_Prompts()
  731.  
  732.       CASE selected = 2        && previous
  733.         !people SKIP -2
  734.         IF A_BOF( people )
  735.           at_front = .T.
  736.           selected = 1
  737.         ELSE
  738.           at_front = .F.
  739.           !people SKIP
  740.         ENDIF
  741.  
  742.         at_end = A_EOF( people )
  743.  
  744.         Alter_Prompts()
  745.  
  746.       CASE selected = 3 && top
  747.         !people GOTO TOP
  748.         at_front = .T.
  749.         at_end = A_EOF( people )
  750.         selected = 1
  751.  
  752.         Alter_Prompts()
  753.  
  754.       CASE selected = 4 && bottom
  755.         !people GOTO BOTTOM
  756.         at_end = .T.
  757.         at_front = A_BOF( people )
  758.         selected = 2
  759.  
  760.         Alter_Prompts()
  761.  
  762.       CASE selected = 5 && deleted()
  763.         IF A_DELETED( people )
  764.           !people RECALL
  765.         ELSE
  766.           !people DELETE
  767.         ENDIF
  768.  
  769.         Alter_Prompts()
  770.  
  771.       CASE selected = 6 && set delete
  772.       * !LOOK:  alter an existing prompt to act like a push-button
  773.  
  774.         IF set_delete_on
  775.           SET DELETE OFF
  776.           Vlist_Edit( prompt_list, 6, "1.6 @20, 55 |  [ ] ^SET DELETE ON  " )
  777.         ELSE
  778.           SET DELETE ON
  779.           Vlist_Edit( prompt_list, 6, "1.6 @20, 55 |  [X] ^SET DELETE ON  " )
  780.         ENDIF
  781.  
  782.         set_delete_on = .NOT. set_delete_on
  783.     ENDCASE
  784.  
  785.   ENDDO
  786.  
  787.   *- reset machine state
  788.   CURSOR_ON()
  789.  
  790.   IF is_mouse
  791.     Vmouse_Reset()
  792.     Vmouse_Cursor( .F. )
  793.   ENDIF
  794.  
  795.   CLOSE ALL
  796.   __color_std = old_std
  797.   RESTORE_AREA()
  798.   @ old_y, old_x
  799.  
  800. ENDPRO