home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / dbase / ccb_fix.arj / CCB_FEXT.COD next >
Encoding:
Text File  |  1991-06-09  |  61.1 KB  |  1,945 lines

  1. {
  2. // Module Name: FORM_EXT.COD
  3. // Description: This module produces PROCEDURES & FUNCTIONS
  4. //              used in form processing (for FORM.COD)
  5. //
  6. //----Modified 6/9/91 by Barry Fox, Fox Computer Consulting to allow
  7. //    help support generation to proceed if database name is different
  8. //    from form name.  Will prompt user for database name to check for
  9. //    existance of help dbf if no help dbf is found corresponding to 
  10. //    form name.
  11. //
  12. define screen_size()
  13.    // Test screen size if display > 2 screen is 43 lines
  14.    display = numset(_flgcolor)
  15.    if display > ega25 then
  16.        scrn_size = 39
  17.        max_pop_row = 36
  18.    else
  19.        scrn_size = 21
  20.        max_pop_row = 18
  21.    endif
  22.  
  23.    // Test to see if status was off before going into form designer
  24.    dB_status = numset(_flgstatus)
  25.    if scrn_size == 21 and !db_status then
  26.       scrn_size = 24
  27.       max_pop_row = 21
  28.    endif
  29.    if scrn_size == 39 and !db_status then // status is off
  30.       scrn_size = 42
  31.       max_pop_row = 39
  32.    endif
  33.    return;
  34. enddef
  35.  
  36. //--------------------------------------------------------------
  37. define display_type()
  38.     // Find out the display type we are working on
  39.     var temp;
  40.     case display of
  41.        mono:   temp = "MONO"
  42.        cga:    temp = "COLOR"
  43.        ega25:  temp = "EGA25"
  44.        mono43: temp = "MONO43"
  45.        ega43:  temp = "EGA43"
  46.      endcase
  47.      return temp;
  48. enddef
  49.  
  50. //--------------------------------------------------------------
  51. define getcolor(f_display,         // Color of the current field
  52.                 f_editable         // Field is SAY or GET
  53.                )
  54.  // Determines the color from f_display and f_editable (GET or SAY)
  55.  enum  Foreground  =   7,
  56.        Intensity   =   8,  // Color
  57.        Background  = 112,
  58.        MIntensity  = 256,
  59.        Reverse     = 512,  // Mono
  60.        Underline   =1024,
  61.        Blink       =2048,
  62.        default     =32768; // Screen set to default
  63.  
  64.  var forgrnd, enhanced, backgrnd, blnk, underln, revrse, use_colors, incolor;
  65.  incolor=""
  66.  
  67.  use_colors  = default & f_display
  68.  forgrnd  = Foreground & f_display
  69.  enhanced = (Intensity & f_display) || (MIntensity & f_display)
  70.  backgrnd = Background & f_display
  71.  blnk     = Blink  & f_display
  72.  underln  = Underline & f_display
  73.  revrse   = Reverse & f_display
  74.  
  75.  if not use_colors then // Use system colors, no colors set in designer
  76.  
  77.     if backgrnd then backgrnd = backgrnd/16 endif
  78.  
  79.     if (display != mono and display != mono43) then
  80.        case forgrnd of
  81.         0: incolor = "n"
  82.         1: incolor = "b"
  83.         2: incolor = "g"
  84.         3: incolor = "bg"
  85.         4: incolor = "r"
  86.         5: incolor = "rb"
  87.         6: incolor = "gr"
  88.         7: incolor = "w"
  89.        endcase
  90.     else
  91.        incolor = "w"
  92.     endif
  93.  
  94.     if revrse then
  95.        incolor = incolor + "i"
  96.     endif
  97.     if underln then
  98.        incolor = incolor + "u"
  99.     endif
  100.     if enhanced then
  101.        incolor = incolor + "+"
  102.     endif
  103.     if blnk then
  104.        incolor = incolor + "*"
  105.     endif
  106.  
  107.     incolor = incolor + "/"
  108.  
  109.     if (display != mono and display != mono43) then
  110.        case backgrnd of
  111.         0: incolor = incolor + "n"
  112.         1: incolor = incolor + "b"
  113.         2: incolor = incolor + "g"
  114.         3: incolor = incolor + "bg"
  115.         4: incolor = incolor + "r"
  116.         5: incolor = incolor + "rb"
  117.         6: incolor = incolor + "gr"
  118.         7: incolor = incolor + "w"
  119.        endcase
  120.     else
  121.        incolor = incolor + "n"
  122.     endif
  123.  
  124.     if f_editable and incolor then
  125.        incolor = incolor + "," + incolor
  126.     endif
  127.  
  128.  endif // use no colors
  129.  return alltrim(incolor);
  130. enddef
  131.  
  132. //--------------------------------------------------------------
  133. define outbox(mbox,            // Border type
  134.               mchar            // Special character of border
  135.              )
  136.    // Output the of Box border and character if any
  137.    var result;
  138.    case mbox of
  139.       0: result = " " // single
  140.       1: result = " DOUBLE "
  141.       2: result = " CHR("+mchar+") "
  142.    endcase
  143.    return result;
  144. enddef
  145.  
  146. //--------------------------------------------------------------
  147. define outcolor()
  148.   // Output the of color of the @ SAY GET or Box
  149.   var result;
  150.   result = "";
  151.   if len(color) > 0 then
  152.      if color_flg then
  153.         // If flag is set output a dBASE continuation ";"
  154.         result = ";" + crlf + space(3)
  155.      endif
  156.      result = result + "COLOR " + color + " "
  157.   endif
  158.   return result;
  159. enddef
  160.  
  161. //--------------------------------------------------------------
  162. define window_def(cur)                  // Pass in foreach cursor
  163.    // Build dBASE window command
  164.    var result;
  165.    result = "wndow" + wnd_cnt + " FROM " + Box_Coordinates(cur)
  166.    result = result + outbox(cur.BOX_TYPE, cur.BOX_SPECIAL_CHAR)
  167.    color = getcolor(cur.FLD_DISPLAY, cur.FLD_EDITABLE)
  168.    result = result + outcolor()
  169.    return result;
  170. enddef
  171.  
  172. //--------------------------------------------------------------
  173. define box_coordinates(cur)             // Pass in foreach cursor
  174.    // Build box coordinates for a dBASE window command
  175.    var result, temp_page, line_cnt;
  176.    temp_page = page_cnt;
  177.  
  178.    // Adjust box coordinates so that negative numbers are not generated
  179.    do while ( nul2zero(cur.BOX_TOP) - (scrn_size * temp_page) ) <= 1
  180.       temp_page = temp_page - 1
  181.    enddo
  182.    //-- Adjust "temp_page" for page 1 and 2
  183.    if page_cnt == 1 then
  184.       temp_page = 0
  185.    endif
  186.    if page_cnt == 2 then
  187.       temp_page = 1
  188.    endif
  189.    //-------------------------
  190.  
  191.    if !temp_page then
  192.       line_cnt = 0
  193.    else
  194.       line_cnt = (scrn_size * temp_page) + (1 * temp_page)
  195.    endif
  196.  
  197.    result = nul2zero(cur.BOX_TOP) - line_cnt +","
  198.    result = result + nul2zero(cur.BOX_LEFT) + " TO "
  199.    temp = nul2zero(cur.BOX_TOP) + cur.BOX_HEIGHT - line_cnt - 1
  200.    if temp > scrn_size then temp = scrn_size endif
  201.    result = result + temp + "," + (nul2zero(cur.BOX_LEFT) + cur.BOX_WIDTH - 1)
  202.    return result;
  203. enddef
  204.  
  205. //--------------------------------------------------------------
  206. define carry_flds()
  207.    // Build dBASE SET CARRY command
  208.    carry_len = carry_lent = 13
  209.    carry_first = 0
  210.    foreach FLD_ELEMENT flds
  211.       if FLD_CARRY then
  212.          carry_len = carry_len + len(FLD_FIELDNAME + ",")
  213.          carry_lent = carry_lent + len(FLD_FIELDNAME + ",")
  214.          if carry_lent > 1000 then
  215.             print(crlf + "SET CARRY TO ")
  216.             carry_len = carry_lent = 13
  217.          endif
  218.          if carry_len > 75 then 
  219.            print(";" + crlf + "  ")  
  220.            carry_len = 2 
  221.          endif
  222.          temp = cap_first(FLD_FIELDNAME)
  223.          if !carry_first then
  224.             print(temp)
  225.             carry_first = 1
  226.          else
  227.             print("," + temp)
  228.          endif
  229.       endif
  230.     next flds
  231.     print(" ADDITIVE");
  232.  return
  233. enddef
  234.  
  235. //--------------------------------------------------------------
  236. define picture_for_get(c)
  237.      if c.FLD_PICFUN then}@{c.FLD_PICFUN}\
  238. {       if at("S", c.FLD_PICFUN) then}{c.FLD_PIC_SCROLL}{endif}\
  239.  {//leave this space}\
  240. {    endif
  241.      if at("M", c.FLD_PICFUN) then
  242.         c.FLD_PIC_CHOICE}\
  243. {    else
  244.         c.FLD_TEMPLATE}\
  245. {    endif
  246.  return;
  247. enddef
  248.  
  249. //--------------------------------------------------------------
  250. define picture_for_say(c)
  251.      if c.FLD_PICFUN then}@{c.FLD_PICFUN}\
  252. {       if at("S", c.FLD_PICFUN) then}{c.FLD_PIC_SCROLL}{endif}\
  253.  {//leave this space}\
  254. {       endif
  255.      if !at("M", c.FLD_PICFUN) then
  256.         c.FLD_TEMPLATE}\
  257. {    endif
  258.  return;
  259. enddef
  260.  
  261. //--------------------------------------------------------------
  262. define ok_template(cur)                 // Pass in foreach cursor
  263.      if cur.FLD_TEMPLATE && !(chr(cur.FLD_VALUE_TYPE) == "D" ||
  264.                               chr(cur.FLD_VALUE_TYPE) == "M") then
  265.         return 1;
  266.      else
  267.         return 0;
  268.      endif
  269. enddef
  270. //--------------------------------------------------------------
  271. define ok_coordinates(cur,              // Current cursor
  272.                       xtra_width,       // Additional width to check ie, shadow
  273.                       want_message,     // Display message flag 0:No 1:Yes
  274.                       message)          // Message to display to user
  275.      // Check to see if coordinates of popup or shadow will fit on screen
  276.      // based on the dimensions of the current field
  277.      if nul2zero(cur.COL_POSITN) + len(cur.FLD_TEMPLATE) + xtra_width > screen_width then
  278.         if want_message then
  279.            beep(2)                      // UDF in builtin.def
  280.            cls()
  281.            say_center(10,"Error on Field: " + cur.FLD_FIELDNAME)
  282.            say_center(12, message)
  283.            pause(any_key)
  284.         endif
  285.         return 0;
  286.      else
  287.         return 1;
  288.      endif
  289. enddef
  290.  
  291. //--------------------------------------------------------------
  292. define make_program(ext)
  293.    // Attempt to create program (fmt) file.
  294.    ext = upper( ext)
  295.    default_drv = strset(_defdrive)  // grab default drive from dBASE
  296.    fmt_name = FRAME_PATH + NAME     // Put path on to object name
  297.    if not fileok(fmt_name) then
  298.       if not default_drv then
  299.          fmt_name = NAME
  300.       else
  301.          fmt_name = default_drv + ":" + NAME
  302.       endif
  303.    endif
  304.    fmt_name = upper(fmt_name)
  305.    if not create(fmt_name + ext) then
  306.         pause(fileroot(fmt_name) + ext + read_only + any_key)
  307.         return 0;
  308.      endif
  309.    return 1;
  310. enddef
  311.  
  312. //--------------------------------------------------------------
  313. define make_udf()
  314.    // Attempt to create dBASE procedure (prg) file.
  315.    var udf_root_file_name;
  316.    udf_root_file_name =  frame_path + "u_" + rtrim(substr(name,1,6))
  317.    if not create( udf_root_file_name + ".PRG") then
  318.       pause(udf_root_file_name + ".PRG" + read_only + any_key)
  319.       return 0;
  320.    endif
  321.    // Force dBASE to recompile the .prg
  322.    fileerase(udf_root_file_name + ".DBO")
  323.    udf_file = 1 // Global flag to determine if UDF file was created
  324.    return 1;
  325. enddef
  326.  
  327. //--------------------------------------------------------------
  328. define udf_header()
  329.     // Print Header in UDF program
  330.     print("*"+replicate("-",78)+crlf);}
  331. *-- Name....: {frame_path}u_{rtrim(substr(name,1,6))}.PRG
  332. *-- Date....: {ltrim(SUBSTR(date(),1,8))}
  333. *-- Version.: dBASE IV, Procedures for Format (.fmt) v{Frame_ver}.1
  334. *-- Notes...: Procedure file for VALID POPUPs and/or Context Sensitive Help
  335. *-- ........: for {filename(fmt_name)}FMT
  336. {print("*"+replicate("-",78)+crlf);
  337. enddef
  338.  
  339. //--------------------------------------------------------------
  340. define make_pop_code()
  341.      var lookup_dbf,  // store get_file(FLD_OK_COND) for faster processing
  342.          is_format,   // is there a format file
  343.          temp_name,   // store get_popname(FLD_OK_COND) for faster processing
  344.          ;
  345.          //              temp_key;    // store KEY field
  346.  
  347. //   Create the Procedure File for POPUP's if required
  348.      if is_popup then
  349. //          if !at("FORMBROW", upper(getenv("dtl_form"))) then
  350.              if !make_udf() then
  351.                   return 0;
  352.               endif
  353.             udf_header()
  354. //          endif
  355.           if workarea_cnt <= max_workareas then
  356. }
  357. PROCEDURE S_{lower(substr(name,1,7))}{tabto(40)}&& Open Lookup files for faster processing
  358. {           foreach FLD_ELEMENT flds
  359.                  if popup_or_browse(flds) then
  360.                     lookup_dbf = get_file(FLD_OK_COND)
  361.                     if not at(lookup_dbf, workarea_dbfs) then
  362.                        workarea_dbfs = workarea_dbfs + "," + lookup_dbf;
  363. }
  364.   USE {lookup_dbf} ORDER {get_key(FLD_OK_COND)} IN SELECT() \
  365. {                      if (upper(lookup_dbf) == FLD_FILENAME) then}
  366. AGAIN ALIAS {"A"+substr(lookup_dbf,1,7)}
  367. {                      else}
  368.  {//leave this space}
  369. {                      endif
  370.                     endif
  371.                  endif
  372.             next flds;
  373. }
  374. RETURN
  375. *-- EOP: S_{lower(substr(name,1,7))}
  376.  
  377. PROCEDURE C_{lower(substr(name,1,7))}{tabto(40)}&& Close Lookup files
  378. {           workarea_dbfs = ""
  379.             foreach FLD_ELEMENT flds
  380.                  if popup_or_browse(flds) then
  381.                     lookup_dbf = get_file(FLD_OK_COND);
  382.                     if not at(lookup_dbf, workarea_dbfs) then
  383.                        workarea_dbfs = workarea_dbfs + "," + lookup_dbf;
  384. }
  385.   USE IN ALIAS("{ upper(lookup_dbf) == FLD_FILENAME ? "A"+substr(lookup_dbf,1,7) : lookup_dbf }")
  386. {                   endif
  387.                  endif
  388.             next flds;
  389.           endif
  390. }
  391. RETURN
  392. *-- EOP: C_{lower(substr(name,1,7))}
  393.  
  394. FUNCTION Empty                       && Determine if the passed argument is NULL
  395. {lmarg(offset)}
  396. PARAMETER x
  397. PRIVATE retval, lc_type
  398. lc_type = TYPE("x")
  399. DO CASE
  400.   CASE lc_type = "C"
  401.     retval = (LEN(TRIM(x))=0)
  402.   CASE lc_type$"NF"
  403.     retval = (x=0)
  404.   CASE lc_type = "D"
  405.     retval = (" "$DTOC(x))
  406.   OTHERWISE lc_type = "U"
  407.     retval = .T.
  408. ENDCASE
  409. {lmarg(0)}
  410. RETURN (retval)
  411. *-- EOP: _Empty
  412.  
  413. {print("*"+replicate("-",78)+crlf);}
  414. PROCEDURE _DbfEmpty
  415.    *-- Error box if Lookup .dbf is empty
  416.    *-- Save the screen and setup window
  417.    PRIVATE ALL LIKE l?_*
  418.    DEFINE WINDOW u_error FROM 5,15 TO 11,55
  419.    SAVE SCREEN TO u_error
  420.    DO _Shadowg WITH 5,15,11,55
  421.  
  422.    *-- Activate the window and put up error message
  423.    ACTIVATE WINDOW u_error
  424.    lc_fpath = SET("fullpath")
  425.    SET FULLPATH OFF
  426.    @ 1,2 SAY "Lookup table: " + SUBSTR( DBF(),3) + " is empty!"
  427.    @ 2,2 SAY "{any_key}"
  428.    ln_errorky = INKEY(10)
  429.  
  430.    *-- Restore the screen and clean up
  431.    SET FULLPATH &lc_fpath.
  432.    RELEASE WINDOW u_error
  433.    RESTORE SCREEN FROM u_error
  434.    RELEASE SCREEN u_error
  435. RETURN
  436. *-- EOP: _DbfEmpty
  437.  
  438. {
  439.           line_cnt = 0
  440.           page_cnt = 1
  441.  
  442.           foreach FLD_ELEMENT flds
  443.  
  444.                at_pop = at("POPUP", upper(ltrim(FLD_OK_COND))) == "2" ? 1 : 0;
  445.  
  446.                new_page(flds)
  447.                if popup_or_browse(flds) then
  448.                     trow_positn = nul2zero(ROW_POSITN) - line_cnt
  449.                     tcol_positn = nul2zero(COL_POSITN)
  450.                     color = getcolor(FLD_DISPLAY, FLD_EDITABLE) // get color of element
  451.  
  452.                     if at_pop and !ok_coordinates(flds, 2, 0, "") then loop endif
  453.  
  454.                     print("*"+replicate("-",78)+crlf);
  455. }
  456. FUNCTION {get_udfname(FLD_FIELDNAME)}
  457. {lmarg(offset)}
  458. PARAMETER fld_name
  459. PRIVATE ALL LIKE l?_*
  460. PRIVATE fld_name, rtn_fld
  461.  
  462. ll_return = .T.                      && Declare return variable for function
  463. ln_row = ROW()                       && Current Row of Get
  464. ln_col = COL()                       && Current Column of Get
  465. rtn_fld = fld_name                   && Current Value of Get
  466.  
  467. {                   if !is_required(FLD_OK_COND) then}
  468. IF EMPTY(fld_name)                   && Not a required field
  469.   RETURN (.T.)                       && if null field
  470. ENDIF
  471.  
  472. {                    endif
  473.                      if is_help then}
  474.  
  475. ON KEY LABEL {on_key_help}
  476. {                    endif
  477.                      if is_recalc then}
  478. ON KEY LABEL {on_key_recalc}
  479. {                    endif
  480.                      if is_zoom then}
  481. ON KEY LABEL {on_key_zoom}
  482. {                    endif}
  483.  
  484. lc_alias = ALIAS()                   && Grab current workarea
  485. //--------------------------------------------------------------------------
  486. // kjn New design for Edit/Browse that will eliminate the @ GET code
  487. // Will allow this code to go away
  488. //--------------------------------------------------------------------------
  489.  
  490. IF ln_row = {row_positn} .AND. (ln_col >= {col_positn} .AND. ln_col <= {col_positn+FLD_LENGTH+6} )
  491.    ll_edit = .T.
  492. ELSE
  493.    ll_edit = .F.
  494. ENDIF
  495.  
  496. {                   lookup_dbf = get_file(FLD_OK_COND);
  497.                     temp_key = alltrim(get_key(FLD_OK_COND));
  498.  
  499.                     if workarea_cnt <= max_workareas then
  500. }
  501. SELECT ("{ upper(lookup_dbf) == FLD_FILENAME ? "A"+substr(lookup_dbf,1,7) : 
  502.                                                lookup_dbf }")
  503. {                   else}
  504. SELECT SELECT()
  505. IF FILE("{lookup_dbf}.dbf")
  506.    USE {lookup_dbf} ORDER {temp_key} \
  507. {                     if (upper(lookup_dbf) == FLD_FILENAME) then}
  508. AGAIN
  509. {                     else}
  510.  {//leave this space}
  511. {                     endif}
  512. ELSE
  513.    SET MESSAGE TO "{lookup_dbf}.dbf {use_err}  {any_key}"
  514.    ll_wait = INKEY(0)
  515.    SET MESSAGE TO
  516.    RETURN .F.
  517. ENDIF
  518. {                   endif  // workarea_cnt}
  519.  
  520. lc_exact = SET("EXACT")              && Store value of EXACT
  521. SET EXACT ON
  522. {                   if !at_pop then}
  523. lc_near =  SET("NEAR")               && Store value of NEAR
  524. SET NEAR ON                          && Do "soft" seek into "BROWSE"
  525.  
  526. {                   endif
  527.                     if chr(FLD_VALUE_TYPE) == "C" then}
  528. fld_name = IIF( EMPTY( TRIM( fld_name)), fld_name, TRIM( fld_name))
  529. {                   endif}
  530. SEEK fld_name
  531.  
  532. SET EXACT &lc_exact.                 && Restore SET EXACT to org. value
  533. {                   if !at_pop then}
  534. SET NEAR  &lc_near.                  && Restore SET NEAR  to org. value
  535. {                   endif}
  536.  
  537. IF .NOT. FOUND()
  538.  
  539. {                   temp_name = get_popname(FLD_OK_COND);
  540.  
  541.                     if at_pop then  // Gen for Popup lookup}
  542.    DEFINE POPUP {temp_name} FROM \
  543. {                      if trow_positn < max_pop_row then
  544.                           trow_positn + 1},{tcol_positn} ;
  545.     TO {scrn_size-1},{tcol_positn + len(FLD_TEMPLATE) + 1} ;
  546. {                      else
  547.                            trow_positn - 11},{tcol_positn} ;
  548.     TO {trow_positn - 1},{tcol_positn + len(FLD_TEMPLATE) + 1} ;
  549. {                      endif}
  550.     PROMPT FIELD {get_field(FLD_OK_COND)} ;
  551.     MESSAGE {select_msg1}
  552.  
  553.    ON SELECTION POPUP {temp_name} DEACTIVATE POPUP
  554.  
  555. {                      if chr(FLD_VALUE_TYPE) == "C" then}
  556.    KEYBOARD TRIM( fld_name ) CLEAR
  557.  
  558. {                      endif
  559.                     else
  560.                        // Gen for BROWSE lookup
  561.                        if (is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
  562.                        // If updateable and fields declared then check for no records
  563. }
  564. //  Currently BLOWS dbase UP kjn
  565. //
  566. //   IF RECCOUNT() = 0
  567. //      APPEND BLANK
  568. //      REPLACE {cap_first(FLD_FIELDNAME)} WITH \
  569. //{            cap_first(FLD_FILENAME)}->{cap_first(FLD_FIELDNAME)}
  570. //      KEYBOARD( CHR( kn_Tab)) CLEAR
  571. //   ENDIF
  572. //{                      else}
  573.    IF RECCOUNT() = 0
  574.       DO _DbfEmpty
  575.       ll_return = .F.
  576.    ENDIF
  577.  
  578.    IF ll_return
  579.  
  580. {                         lmarg(offset*2)
  581.                        endif}
  582.    DEFINE WINDOW {temp_name} FROM \
  583. {                      if is_window(FLD_OK_COND) then
  584.                           get_browse_window(flds)
  585.                        else
  586.                           print("14,0 TO 20,79")
  587.                        endif
  588. }
  589.  
  590. {                   endif}
  591.    SAVE SCREEN TO {temp_name}
  592.  
  593. {                   if is_shadow(FLD_OK_COND) then
  594.                        if at_pop and ok_coordinates( flds, 4, 1, bad_shadow ) then
  595. }
  596.    DO _Shadowg WITH {get_pop_shadow(FLD_TEMPLATE);}
  597. {                      endif
  598.                        if !at_pop then}
  599.    DO _Shadowg WITH \
  600. {                         if is_window(FLD_OK_COND) then
  601.                              get_browse_shadow(FLD_OK_COND)
  602.                           else
  603.                              print("14,0,20,77")
  604.                           endif
  605.                        endif
  606.                     endif
  607.                     if at_pop then}
  608.    ACTIVATE POPUP {temp_name}
  609.  
  610.    rtn_fld = PROMPT()               && Get user choice from Picklist
  611.  
  612.    RELEASE POPUP {temp_name}
  613. {                   else}
  614.  
  615.    lc_message = {select_msg1} +;
  616.                 {select_msg2}
  617.  
  618.    lc_message = IIF("500" $ VERSION(1), ;
  619.                  LEFT( lc_message, LEN( lc_message) - 17) , lc_message)
  620.    SET MESSAGE TO lc_message
  621.  
  622.    ON KEY LABEL Ctrl-M KEYBOARD( CHR( kn_CtrlEnd)) CLEAR   && Same as Enter send Ctrl-W
  623.  
  624. {                   is_format = is_format_file(flds, FLD_OK_COND);
  625.                     if is_format then}
  626.    IF FILE("{fileroot( get_format_file( FLD_OK_COND)) + ".FMT"}")
  627.       SET FORMAT TO {fileroot( get_format_file(FLD_OK_COND))}
  628.    ENDIF
  629.  
  630. {                   endif}
  631.    IF .NOT. "500" $ VERSION(1)
  632.       ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
  633.    ENDIF
  634.  
  635.    BROWSE WINDOW {temp_name} NOMENU COMPRESS NOFOLLOW NODELETE LOCK 1 \
  636. {                   if ( !is_update(FLD_OK_COND) or
  637.                          !is_fields(FLD_OK_COND) or
  638.                          ( upper(lookup_dbf) == FLD_FILENAME )
  639.                        ) then}
  640. ;
  641.       NOAPPEND NOEDIT \
  642. {                   endif
  643.                     if is_format then}
  644. ;
  645.       FORMAT \
  646. {                   endif
  647.                     if is_fields(FLD_OK_COND) then}
  648. ;
  649.       FIELDS {get_browse_fields_list(flds)} \
  650. //                                             outputs correct line spacing
  651. {                   endif}
  652.  
  653.  
  654. //  Currently BLOWS dbase UP kjn
  655. //{                   if is_update(FLD_OK_COND) then}
  656. //   IF EMPTY({cap_first(get_field(FLD_OK_COND))}) .AND. RECCOUNT() = 1
  657. //      lc_safety = SET("SAFETY")
  658. //      SET SAFETY OFF
  659. //      ZAP
  660. //      SET SAFETY &lc_safety.
  661. //   ENDIF
  662. //
  663. //{                   endif}
  664. {                   if is_format then}
  665.    SET FORMAT TO
  666. {                   endif}
  667.    ON KEY LABEL {on_key_move}
  668.    ON KEY LABEL Ctrl-M
  669.    SET MESSAGE TO
  670.  
  671.    RELEASE WINDOW {temp_name}
  672. {                   endif}
  673.  
  674.    RESTORE SCREEN FROM {temp_name}
  675.  
  676. {//  for code that blows up above kjn
  677.  //                   if !(is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
  678.                        // Need ENDIF for IF ll_return above
  679.  
  680.                       if (is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
  681.                       // for now gen endif for this, kjn.  if append works
  682.                       // delete this if and uncomment out the one right above
  683.                        lmarg(offset)
  684. }
  685.    ENDIF
  686. {                   endif}
  687.  
  688.    IF LASTKEY() <> kn_esc
  689. {                   if !at_pop then}
  690.      rtn_fld = {cap_first(get_field(FLD_OK_COND))}
  691. {                   endif}
  692. {                   if is_required(FLD_OK_COND) then}
  693.  
  694.      IF EMPTY(rtn_fld)             && Is a required field, so return .F.
  695.         ll_return = .F.
  696.      ELSE
  697. {                      lmarg(offset * 2)
  698.                     endif}
  699.  
  700. //--------------------------------------------------------------------------
  701. // kjn New design for Edit/Browse that will eliminate the @ GET code
  702. // Will allow this code to go away
  703. //--------------------------------------------------------------------------
  704.      IF ll_edit
  705.         @ {trow_positn},{tcol_positn} GET rtn_fld \
  706. {        if Ok_Template(flds) then}
  707. PICTURE "{picture_for_get(flds);}" \
  708. {           outcolor()}
  709. {        endif}
  710.  
  711.      ENDIF
  712. //--------------------------------------------------------------------------
  713.  
  714.      REPLACE {cap_first(FLD_FILENAME)}->{cap_first(FLD_FIELDNAME)} WITH \
  715. {                   if chr(FLD_VALUE_TYPE) == "C" or
  716.                        at("BROWSE", upper(ltrim(FLD_OK_COND))) == "2" then}
  717. rtn_fld
  718. {                   else}
  719. VAL(rtn_fld)
  720. {                   endif}
  721.  
  722.      ll_return = .T.
  723. {                   if is_required(FLD_OK_COND) then
  724.                        lmarg(offset)}
  725.      ENDIF
  726. {                   endif}
  727.    ELSE
  728.      ll_return = .F.
  729. {
  730.                     if !is_required(FLD_OK_COND) then
  731. }
  732.  
  733.      IF EMPTY(fld_name)             && Not a required field, so return .t.
  734.         ll_return = .T.
  735.      ENDIF
  736.  
  737. {                   endif}
  738.    ENDIF
  739.  
  740. ELSE
  741.   ll_return = .T.
  742. ENDIF
  743. {if is_replace(FLD_OK_COND) then}
  744.  
  745. IF ll_return
  746.    DO U_{lower(substr(FLD_FIELDNAME,1,7))} WITH ll_edit, \
  747. {                   if chr(FLD_VALUE_TYPE) == "C" or
  748.                        at("BROWSE", upper(ltrim(FLD_OK_COND))) == "2" then}
  749. rtn_fld
  750. {                   else}
  751. VAL(rtn_fld)
  752. {                   endif}
  753. ENDIF
  754. {endif}
  755.  
  756. {if workarea_cnt > max_workareas then}
  757. USE
  758.  
  759. {endif}
  760. SELECT (lc_alias)                    && Go back to the edit file
  761.  
  762. {if is_help then}
  763. ON KEY LABEL {on_key_help} \
  764. DO {"H_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Help code
  765. {endif
  766.  if is_recalc then}
  767. ON KEY LABEL {on_key_recalc} \
  768. DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Recalc code
  769. {endif
  770.  if is_zoom then}
  771. ON KEY LABEL {on_key_zoom} \
  772. DO {"Z_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Zoom code
  773. {endif
  774.  lmarg(0)}
  775. RETURN (ll_return)
  776. *-- EOP: {get_udfname(FLD_FIELDNAME)}
  777.  
  778. {              endif
  779.           next flds
  780.       endif   // there were POPUP VALID clauses
  781.  
  782.      return;
  783. // eof - make_pop_code()
  784. enddef
  785.  
  786. //--------------------------------------------------------------
  787. define make_shadow_proc()
  788.      // Make the dBASE code for shadowing
  789.      print("*"+replicate("-",78)+crlf);
  790. }
  791. PROCEDURE _Shadowg                      && displays shadow that grows
  792. {    lmarg(offset)}
  793. PARAMETER x1,y1,x2,y2
  794. PRIVATE   x1,y1,x2,y2
  795.  
  796. x0 = x2+1
  797. y0 = y2+2
  798. dx = 1
  799. dy = (y2-y1) / (x2-x1)
  800. DO WHILE x0 <> x1 .OR. y0 <> y1+2
  801.   @ x0,y0 FILL TO x2+1,y2+2 COLOR n+/n
  802.   x0 = IIF(x0<>x1,x0 - dx,x0)
  803.   y0 = IIF(y0<>y1+2,y0 - dy,y0)
  804.   y0 = IIF(y0<y1+2,y1+2,y0)
  805. ENDDO
  806. {    lmarg(0)}
  807. RETURN
  808. *-- EOP: _Shadowg
  809.  
  810. {print("*"+replicate("-",78)+crlf);}
  811. PROCEDURE _dbtrap                             && error routine for SET("dbtrap")
  812. {    var wcol1, wcol2, error_msg_length;
  813.       error_msg_length = len( dbtrap_err)
  814.       wcol1 = (screen_width/2) - ( error_msg_length/2) - 2
  815.       wcol2 = (screen_width/2) + ( error_msg_length/2) + 2
  816.      lmarg(offset);
  817. }
  818. SET CURSOR OFF
  819. PRIVATE ALL LIKE l?_*
  820. SAVE SCREEN TO _dbtrap
  821. DO _Shadowg WITH 10, {wcol1}, 15, {wcol2}
  822. DEFINE WINDOW _dbtrap FROM 10,{wcol1} TO 15,{wcol2} DOUBLE
  823. ACTIVATE WINDOW _dbtrap
  824. lc_error = "{dbtrap_err}"
  825. lc_error2 = "{any_key}"
  826. @ 1, CENTER( lc_error,  {wcol2 - wcol1}) SAY lc_error
  827. @ 2, CENTER( lc_error2, {wcol2 - wcol1}) SAY lc_error2
  828. lc_wait = INKEY(10)
  829. RELEASE WINDOW _dbtrap
  830. RESTORE SCREEN FROM _dbtrap
  831. RELEASE SCREEN _dbtrap
  832. SET CURSOR ON
  833. {    lmarg(0)}
  834. RETURN
  835. *-- EOP: _dbtrap
  836. {    return;
  837. enddef // make_shadow_proc()
  838.  
  839. //--------------------------------------------------------------
  840. define make_help_code()
  841.      //------------------------------------
  842.      // Make procedures for the help system
  843.      // called from form.gen
  844.      //------------------------------------
  845.       if is_help then
  846.          // If the udf file has not already been created, make it.
  847.         if !udf_file then
  848.            if !make_udf() then
  849.               return 0;
  850.            endif
  851.            // Put up the UDF header
  852.            udf_header()
  853.         endif
  854.         // Make procedures for the help system
  855.         make_help()
  856.       endif
  857. return;
  858. enddef
  859.  
  860. //--------------------------------------------------------------
  861. define make_help()
  862.    // Make the dBASE code for help
  863.    var help_name;
  864.    help_name = "H_" + lower(rtrim(substr(name,1,6)))
  865.    print("*"+replicate("-",78)+crlf);
  866. }
  867.  
  868. PROCEDURE {help_name}
  869. {    lmarg(offset)}
  870. *-- Activates the HELP window
  871. PARAMETER lc_var
  872. PRIVATE ALL LIKE l?_*
  873. IF .NOT. FILE("{fileroot(hlp_name)}.dbf")
  874.    *-- Help file has been deleted or can't be found
  875.    RETURN
  876. ENDIF
  877.  
  878. SET CURSOR OFF
  879. ON KEY LABEL {on_key_help}
  880.  
  881. *-- Select workarea and open Help dbf
  882. lc_area = ALIAS()
  883. SELECT SELECT()
  884. USE {fileroot(hlp_name)} ORDER fld_name NOUPDATE   && Open HELP .dbf
  885.  
  886. lc_exact = SET("EXACT")                && Store value of EXACT
  887. SET EXACT ON
  888. SEEK lc_var
  889. SET EXACT &lc_exact.
  890.  
  891. IF FOUND()                             && If found show Help
  892.   ln_t = 5
  893.   ln_l = 6
  894.   ln_b = 15
  895.   ln_r = 74
  896.   DEFINE WINDOW {lower(help_name)} FROM ln_t+1, ln_l+2 TO ln_b-1, ln_r-2 NONE
  897.   ON ERROR lc_error = error()
  898.   SAVE SCREEN TO {lower(help_name)}
  899.  
  900.   *-- Make Help Box
  901.   DO _Shadowg WITH ln_t, ln_l, ln_b, ln_r
  902.   @ ln_t+1, ln_l+1 CLEAR TO ln_b-1, ln_r-1
  903.   @ ln_t, ln_l TO ln_b, ln_r DOUBLE
  904.  
  905.   ln_memline = SET("MEMO")
  906.   SET MEMOWIDTH TO 65
  907.   IF MEMLINES(fld_help) > 9
  908.     @ ln_t+1,ln_r SAY CHR(24)
  909.     @ ln_b-1,ln_r SAY CHR(25)
  910.     SET CURSOR ON
  911.   ENDIF
  912.   lc_string = CHR(185)+ [ Help for ] + TRIM(fld_headng) +[ ] + CHR(204)
  913.   lc_message = IIF( MEMLINES(fld_help) > 9 , ;
  914.                     "{help_msg1}" , ;
  915.                     "" ;
  916. //                    "{help_msg1 + help_msg2}" , ;
  917. //                    "{help_msg2}" ;
  918.                   )
  919.  
  920.   @ ln_t,CENTER(lc_string,80) SAY lc_string
  921.   @ 0,0 GET fld_help OPEN WINDOW {lower(help_name)} MESSAGE lc_message
  922. //  ON KEY LABEL {on_key_toggle} DO _Toggle
  923. //  ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
  924.   READ
  925.   SET MEMOWIDTH TO ln_memline
  926.   ON ERROR
  927. //  ON KEY LABEL {on_key_toggle}
  928. //  ON KEY LABEL {on_key_move}
  929.   RELEASE WINDOW {lower(help_name)}
  930.   RESTORE SCREEN FROM {lower(help_name)}
  931.   RELEASE SCREEN {lower(help_name)}
  932. ENDIF
  933. SET MESSAGE TO
  934. SET CURSOR ON
  935. USE                                              && Close help file
  936. SELECT (lc_area)                                 && Back to edit work area
  937. ON KEY LABEL {on_key_help} DO {help_name} WITH VARREAD()
  938. {    lmarg(0)}
  939. RETURN
  940. *-- EOP: {help_name}
  941.  
  942. //{    print("*"+replicate("-",78)+crlf);}
  943. //PROCEDURE _Toggle
  944. //{    lmarg(offset)}
  945. //PRIVATE ln_wait
  946. //*-- Toggles the Help message back to the original screen
  947. //SAVE SCREEN TO Toggle
  948. //RESTORE SCREEN FROM {lower(help_name)}
  949. //{    if (scrn_size == 24 or scrn_size == 42) then}
  950. //@ {scrn_size}, 0
  951. //@ {scrn_size}, CENTER("{any_key}", {screen_width}) SAY "{any_key}"
  952. //{    else}
  953. //SET MESSAGE TO "{any_key}"
  954. //{    endif}
  955. //ln_wait = INKEY(15)
  956. //RESTORE SCREEN FROM Toggle
  957. //RELEASE SCREEN Toggle
  958. //SET MESSAGE TO lc_message
  959. //{    lmarg(0)}
  960. //RETURN
  961. //*-- EOP: _Toggle
  962. //
  963. {return;
  964. enddef
  965.  
  966. //--------------------------------------------------------------
  967. define make_other_udfs()
  968.     // Make other UDF's used durning form processing
  969.     print(crlf + "*"+replicate("-",78)+crlf);
  970. }
  971. PROCEDURE _Cut
  972. {    lmarg(offset)}
  973. *-- Cut data from a field
  974. PRIVATE ALL LIKE l?_*
  975.  
  976. lc_field = VARREAD()
  977. lc_type = TYPE( lc_field)
  978. SAVE SCREEN TO _cut
  979.  
  980. DO CASE
  981. CASE lc_type = "C"
  982.     gc_cut = TRIM( &lc_field.)
  983. CASE lc_type $ "NF"
  984.     ln_cnt = 0
  985.     ln_number = &lc_field.
  986.     DO WHILE _numdec( ln_number)
  987.        ln_number = ln_number * 10
  988.        ln_cnt = ln_cnt + 1
  989.     ENDDO
  990.     gc_cut = LTRIM( STR( &lc_field., 14, ln_cnt))
  991. CASE lc_type = "D"
  992.     gc_cut = DTOC( &lc_field.)
  993. CASE lc_type = "L"
  994.     gc_cut = IIF( &lc_field., "Y", "F")
  995. CASE lc_type = "M"
  996.     gc_cut = SUBSTR( &lc_field., 1, 254)
  997.     ln_len = LEN( TRIM( gc_cut))
  998.     ln_cnt = 1
  999.  
  1000.     DO WHILE ln_cnt <= ln_len
  1001.        *-- Get rid of MODI COMM's soft carriage returns characters
  1002.        IF ASC( SUBSTR( gc_cut, ln_cnt, 1)) = 141 .OR.;
  1003.           ASC( SUBSTR( gc_cut, ln_cnt, 1)) =  10 .OR.;
  1004.           ASC( SUBSTR( gc_cut, ln_cnt, 1)) =  13
  1005.  
  1006.           IF ASC( SUBSTR( gc_cut, ln_cnt, 1)) =  13
  1007.              gc_cut = STUFF( gc_cut, ln_cnt, 1, " ")
  1008.           ELSE
  1009.              gc_cut = STUFF( gc_cut, ln_cnt, 1, "")
  1010.           ENDIF
  1011.  
  1012.           ln_len = LEN( TRIM( gc_cut))             && Length of string can change
  1013.           LOOP
  1014.        ENDIF
  1015.        ln_cnt = ln_cnt + 1
  1016.       ENDDO
  1017. ENDCASE
  1018.  
  1019. lc_message = SUBSTR( gc_cut, 1, {(screen_width - 1) - len(paste_msg1)}) + "{paste_msg1}"
  1020. {    if (scrn_size == 24 or scrn_size == 42) then}
  1021. @ {scrn_size}, CENTER(lc_message, {screen_width}) SAY lc_message
  1022. {    else}
  1023. SET MESSAGE TO lc_message
  1024. {    endif}
  1025. ln_key = INKEY(2.5)
  1026. gc_cut = gc_cut + SPACE( 254 - LEN( gc_cut))
  1027. SET MESSAGE TO
  1028. RESTORE SCREEN FROM _cut
  1029. RELEASE SCREEN _cut
  1030. {    lmarg(0)}
  1031. RETURN
  1032.  
  1033. {    print("*"+replicate("-",78)+crlf);}
  1034. PROCEDURE _Paste
  1035. {    lmarg(offset)}
  1036. *-- Cut data to a field
  1037. PRIVATE ALL LIKE l?_*
  1038.  
  1039. lc_field = VARREAD()                               && Grab field we left from
  1040. lc_type = TYPE( lc_field)                          && Grab the data type
  1041. lc_cut = TRIM( gc_cut)                             && Trim blanks from cut data
  1042.  
  1043. IF lc_type = "D"
  1044.     *-- Remove "/" from character data so that KEYBOARD will work on a
  1045.     *-- date field
  1046. //  KJN "/" -> set("sepa")
  1047.     lc_cut = STUFF(lc_cut, AT("/", lc_cut), 1, "") && Get rid of first  "/"
  1048.     lc_cut = STUFF(lc_cut, AT("/", lc_cut), 1, "") && Get rid of second "/"
  1049. ENDIF
  1050. *-- Keyboard cut data into the field
  1051. DO CASE
  1052.    CASE lc_type $ "NFD"
  1053.       *-- Start at the beginning of the field and clear it.
  1054.       KEYBOARD ( CHR(kn_home) + CHR(kn_CtrlY) + lc_cut) CLEAR
  1055.    CASE lc_type <> "M"
  1056.       *-- Paste at the location of the cursor
  1057.       KEYBOARD (lc_cut) CLEAR
  1058.    OTHERWISE
  1059.       IF LEN( &lc_field.) > 0
  1060.          *-- Pad space to offset "scrap" from end of memo
  1061.          lc_cut = " " + lc_cut
  1062.       ENDIF
  1063.       REPLACE &lc_field. WITH lc_cut ADDITIVE         && Replace into memo field
  1064.       ln_keyboard = CHR(kn_ctrlhme) + CHR(kn_ctrlpdn) + ;
  1065.                     CHR(kn_space) + CHR(kn_bakspce)   && Makes EDIT think data has changed
  1066.       KEYBOARD (ln_keyboard) CLEAR                    && Move to bottom of memo
  1067. ENDCASE
  1068. {    lmarg(0)}
  1069. RETURN
  1070.  
  1071. {    print("*"+replicate("-",78)+crlf);}
  1072. PROCEDURE _Edpaste
  1073. {    lmarg(offset)}
  1074. *-- Edit Cut data
  1075. PRIVATE ALL LIKE l?_*
  1076.  
  1077. lc_deli = SET("DELIMITERS")
  1078. lc_form = SET("FORMAT")
  1079. SET DELIMITERS OFF
  1080. SET FORMAT TO
  1081. SAVE SCREEN TO _edpaste
  1082. DEFINE WINDOW _edpaste FROM \
  1083. {    if !(scrn_size == 24 or scrn_size == 42) then
  1084.         scrn_size-2},0 TO {scrn_size},79
  1085. {    else
  1086.         scrn_size-3},0 TO {scrn_size-1},79
  1087. {    endif}
  1088.  
  1089. lc_message = "{paste_msg2}"
  1090. lc_message = IIF("500" $ VERSION(1), ;
  1091.                  LEFT( lc_message, LEN( lc_message) - 17) , lc_message)
  1092. IF .NOT. "500" $ VERSION(1)
  1093.    ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
  1094. ENDIF
  1095. ACTIVATE WINDOW _edpaste
  1096. SET MESSAGE TO lc_message
  1097. @ 0,0 GET gc_cut PICTURE "@S78"
  1098. READ
  1099. ON KEY LABEL {on_key_move}
  1100. SET MESSAGE TO
  1101. RELEASE WINDOW _edpaste
  1102. RESTORE SCREEN FROM _edpaste
  1103. RELEASE SCREEN _edpaste
  1104. SET DELIMITERS &lc_deli.
  1105. SET FORM TO (lc_form)
  1106. {    lmarg(0)}
  1107. RETURN
  1108.  
  1109. {    print("*"+replicate("-",78)+crlf);}
  1110. PROCEDURE _MoveWind
  1111. PARAMETER wind_name, message
  1112. {    lmarg(offset)}
  1113. *----------------------------------------------------------
  1114. *- Move the &wind_name. window based on arrow keys.  Any 
  1115. *- other key stops the move process.
  1116. *----------------------------------------------------------
  1117. ON KEY LABEL {on_key_move}
  1118. ON ERROR ?? CHR(7)
  1119. SET MESSAGE TO
  1120. DO WHILE .T.
  1121.   SET MESSAGE TO {wind_msg1}
  1122.   ln_keyhit = INKEY(0)
  1123.   IF ln_keyhit <> 0
  1124.     DO CASE
  1125.       CASE ln_keyhit = kn_RghtArw               && Right arrow
  1126.          MOVE WINDOW &wind_name. BY 0,1
  1127.       CASE ln_keyhit = kn_UpArw                 && Up arrow
  1128.          MOVE WINDOW &wind_name. BY -1,0
  1129.       CASE ln_keyhit = kn_LeftArw               && Left arrow
  1130.          MOVE WINDOW &wind_name. BY 0,-1
  1131.       CASE ln_keyhit = kn_DownArw               && Down Arrow
  1132.          MOVE WINDOW &wind_name. BY 1,0
  1133.       OTHERWISE
  1134.          EXIT
  1135.     ENDCASE
  1136.   ENDIF
  1137. ENDDO
  1138. ON ERROR
  1139. ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), "&message."
  1140. SET MESSAGE TO message
  1141. {    lmarg(0)}
  1142. RETURN
  1143. *-- EOP: _MoveWind
  1144.  
  1145. {    print("*"+replicate("-",78)+crlf);}
  1146. FUNCTION _numdec
  1147. PARAMETER ln_dec
  1148. IF ln_dec - INT(ln_dec) > 0
  1149.    RETURN .T.
  1150. ELSE
  1151.    RETURN .F.
  1152. ENDIF
  1153. *-- EOF: _numdec
  1154.  
  1155. {    print("*"+replicate("-",78)+crlf);}
  1156. FUNCTION Center
  1157. *-- UDF to center a string.
  1158. *-- lc_string = String to center
  1159. *-- ln_width = Width of screen to center in
  1160. *--
  1161. *-- Ex. @ 15,center(string,80) say string
  1162. *-- Will center the <string> withing 80 columns
  1163. PARAMETER lc_string, ln_width
  1164. RETURN ((ln_width/2)-(LEN(lc_string)/2))
  1165. *-- EOP: Center()
  1166.  
  1167. {print("*"+replicate("-",78)+crlf);}
  1168. PROCEDURE _key_vars
  1169. *----------------------------------------------------------------------------
  1170. * Enumerate the key values for LASTKEY() and INKEY() functions
  1171. *
  1172. * To check for the Escape key after the INKEY()
  1173. *   ln_key = INKEY(0)   && Wait for any key press
  1174. *   IF ln_key = kn_Esc  && Escape was pressed
  1175. *     DO esc_hand
  1176. *   ENDIF
  1177. *
  1178. *----------------------------------------------------------------------------
  1179. IF TYPE("kn_end") = "U"
  1180. {lmarg(offset)}
  1181. PUBLIC kn_End     , kn_Tab     , kn_Enter   , kn_CtrlEnd , kn_CtrlY   , ;
  1182.        kn_Home    , kn_Esc     , kn_CtrlHme , kn_CtrlPDn , kn_CtrlPUp , ;
  1183.        kn_Space   , kn_BakSpce , kn_RghtArw , kn_UpArw   , kn_LeftArw , ;
  1184.        kn_DownArw , kn_PgDn    , kn_PgUp    , kn_F1      , kn_Del     , ;
  1185.        kn_CtrLArw , kn_CtrRArw , kn_f7      , kn_ShftF7
  1186.  
  1187.   kn_End     =   2      && Ctrl-B
  1188.   kn_Tab     =   9      && Ctrl-I
  1189.   kn_Enter   =  13      && Ctrl-M
  1190.   kn_CtrlEnd =  23      && Ctrl-W
  1191.   kn_CtrlY   =  25
  1192.   kn_Home    =  26      && Ctrl-Z
  1193.   kn_Esc     =  27      && Ctrl-[
  1194.   kn_CtrlHme =  29      && Ctrl-]
  1195.   kn_CtrlPDn =  30      && Ctrl-PgDn
  1196.   kn_CtrlPUp =  31      && Ctrl-PgUp
  1197.   kn_Space   =  32
  1198.   kn_BakSpce = 127
  1199.   kn_RghtArw =   4      && Ctrl-D
  1200.   kn_UpArw   =   5      && Ctrl-E
  1201.   kn_LeftArw =  19      && Ctrl-S
  1202.   kn_DownArw =  24      && Ctrl-X
  1203.   kn_PgDn    =   3      && Ctrl-C
  1204.   kn_PgUp    =  18      && Ctrl-R
  1205.   kn_F1      =  28      && Ctrl-\
  1206.   kn_Del     =   7      && Ctrl-G
  1207.   kn_CtrLArw =   1      && Ctrl-A
  1208.   kn_CtrRArw =   6      && Ctrl-F
  1209.   kn_F7      =  -6
  1210.   kn_ShftF7   = -26
  1211.  
  1212. *----------------------------------------------------------------------------
  1213. * Enumerate the key values for READKEY()
  1214. *
  1215. * To check to see if data has changed
  1216. *
  1217. *   IF READKEY() >= rn_updated   && Data has changed
  1218. *     REPLACE name WITH m->name
  1219. *   ENDIF
  1220. *
  1221. * To check for page down regardless of data change
  1222. *
  1223. *   ln_readkey = READKEY()
  1224. *   IF ln_readkey = rn_PgDn .OR. ln_readkey = rn_PgDn+rn_Updated
  1225. *     DO pgdn_hand
  1226. *   ENDIF
  1227. *
  1228. *----------------------------------------------------------------------------
  1229. PUBLIC rn_Updated , rn_LeftArw , rn_BakSpce , rn_RghtArw , rn_CtrLArw , ;
  1230.        rn_CtrRArw , rn_UpArw   , rn_DownArw , rn_PgUp    , rn_PgDn    , ;
  1231.        rn_Esc     , rn_CtrlEnd , rn_Enter   , rn_EnterA  , rn_CtrlHme , ;
  1232.        rn_CtrlPUp , rn_CtrlPDn , rn_F1
  1233.  
  1234.   rn_Updated = 256      && Add to rn_key value for updated condition
  1235.   rn_LeftArw =   0      && Includes Ctrl-S and Ctrl-H - backward one character
  1236.   rn_BakSpce =   0      && backward one character                                   
  1237.   rn_RghtArw =   1      && Includes Ctrl-D and Ctrl-L - forward one character
  1238.   rn_CtrLArw =   2      && Ctrl-Left Arrow, includes Ctrl-A - previous word
  1239.   rn_CtrRArw =   3      && Ctrl-Right Arrow, includes Ctrl-F - next word
  1240.   rn_UpArw   =   4      && Includes Ctrl-E and Ctrl-K - backward one field
  1241.   rn_DownArw =   5      && Includes Ctrl-J and Ctrl-X - forward one field
  1242.   rn_PgUp    =   6      && Includes Ctrl-R - backward one screen
  1243.   rn_PgDn    =   7      && Includes Ctrl-C - forward one screen
  1244.   rn_Esc     =  12      && Includes Ctrl-Q - Terminate w/o save
  1245.   rn_CtrlEnd =  14 + rn_updated  && Includes Ctrl-W - Terminate w/save
  1246.   rn_Enter   =  15      && Includes Ctrl-M  RETURN of fill last record
  1247.   rn_EnterA  =  16      && Enter at the beginning of a record in APPEND
  1248.   rn_CtrlHme =  33      && Ctrl-Home - Menu display toggle
  1249.   rn_CtrlPUp =  34      && Ctrl-PgUp - Zoom Out
  1250.   rn_CtrlPDn =  35      && Ctrl-PgDn - Zoom In
  1251.   rn_F1      =  36      && Help function key
  1252. {lmarg(0)}
  1253. ENDIF
  1254.  
  1255. RETURN
  1256. *-- EOP: _key_vars
  1257.  
  1258. {return;
  1259. enddef
  1260.  
  1261. //--------------------------------------------------------------
  1262.  
  1263. define check_for_gen_extensions()
  1264.    // Check for all the different extensions to forms support for this fmt file
  1265.    // Help extension
  1266.    var dbf_name;
  1267.    // next line modified to include rtrim statement per Bill Ramos
  1268.    hlp_name = frame_path + rtrim(substr( fileroot( fmt_name), 1, 6)) + "_H"
  1269.    if fileexist(hlp_name + ".DBF") and fileexist(hlp_name + ".DBT") then
  1270.       is_help = 1      // Global flag for help support
  1271.    // Following lines added by Barry Fox to prompt user for the name of the
  1272.    // the database to check for help support.  This allows the generation 
  1273.    // help support when the form name differs from the parent database 
  1274.    // name.  
  1275.      else
  1276.    dbf_name = askuser("Enter dbf name for help support or press ENTER to continue ","",12)
  1277.    hlp_name = frame_path + rtrim(substr( fileroot( dbf_name), 1, 6)) + "_H"
  1278.    if fileexist(hlp_name + ".DBF") and fileexist(hlp_name+ ".DBT" ) then
  1279.       is_help = 1
  1280.  endif
  1281. endif
  1282.    foreach FLD_ELEMENT flds
  1283.        // Popup or Browse support
  1284.        if popup_or_browse(flds) then
  1285.           is_popup = 1
  1286.           workarea_cnt = workarea_cnt + 1
  1287.        endif
  1288.        // Zoom support
  1289.        if is_zoom(FLD_OK_COND) then
  1290.           is_zoom = 1
  1291.        endif
  1292.        // Recalc support
  1293.        if is_recalc(FLD_DESCRIPT) then
  1294.           is_recalc = 1
  1295.        endif
  1296.        // Replace lookup support
  1297.        if is_replace(FLD_OK_COND) then 
  1298.           is_replace = 1
  1299.        endif
  1300.    next flds
  1301.    if is_help or is_popup or is_zoom or is_recalc or is_replace then
  1302.       return 1;
  1303.    else
  1304.       return 0;
  1305.    endif
  1306. enddef
  1307.  
  1308. //--------------------------------------------------------------
  1309. define popup_or_browse(cur)             // Pass in foreach cursor
  1310.    // Check for "popup" or "browse" string for this fmt file
  1311.    if at("POPUP",  upper(ltrim(cur.FLD_OK_COND))) == "2" or
  1312.       at("BROWSE", upper(ltrim(cur.FLD_OK_COND))) == "2" then
  1313.       return 1;
  1314.    else
  1315.       return 0;
  1316.    endif
  1317. enddef
  1318.  
  1319. //--------------------------------------------------------------
  1320. define new_page(cur)               // Pass in foreach cursor
  1321.    // Checks for a page break and adjusts line_cnt and page_cnt
  1322.    if nul2zero(cur.ROW_POSITN) - line_cnt > scrn_size then
  1323.       line_cnt = line_cnt + scrn_size + 1;
  1324.       ++page_cnt;
  1325.       return 1;
  1326.    endif
  1327. return 0;
  1328. enddef
  1329.  
  1330. //--------------------------------------------------------------
  1331. define parse_line( before,         // Out: chars before the look_for string
  1332.                    input,          // In:  line being parsed
  1333.                    look_for        // In:  string searched for
  1334.                  )                 // Rtn: chars after the look_for string
  1335.      // If the look_for sting is not found, the before sting will equal the
  1336.      // input string, and the returned value will be NUL
  1337.      var location, after;
  1338.  
  1339.      location = at(look_for, upper(input))
  1340.      if location == 0 then
  1341.           before = input
  1342.           return ( "" );
  1343.      endif
  1344.  
  1345.      before = substr( input, 1, location-1)
  1346.      after  = substr( input, location)
  1347.      after  = substr( after, 1, len(after) - 1)
  1348.  
  1349.      return ( alltrim( substr( after,
  1350.                                 1 + len(look_for),
  1351.                                 get_next_key_word(
  1352.                                                   substr( after,
  1353.                                                           1 + len( look_for)
  1354.                                                         )
  1355.                                                   )
  1356.                              )
  1357.                      )
  1358.             );
  1359. // end: parse_line()
  1360. enddef
  1361.  
  1362. //--------------------------------------------------------------
  1363. define get_next_key_word(rest_of_str)   // String to search for keyword
  1364.    var str_length;
  1365.  
  1366.    str_length = len(rest_of_str)
  1367.    rest_of_str = upper(rest_of_str)
  1368.  
  1369.    for cnt = 1 to str_length
  1370.  
  1371.       if at(" ORDER", substr(rest_of_str, cnt)) == 1  or
  1372.          at(" REQ",   substr(rest_of_str, cnt)) == 1  or
  1373.          at(" SHADOW",substr(rest_of_str, cnt)) == 1  or
  1374.          at(" FIELDS",substr(rest_of_str, cnt)) == 1  or
  1375.          at(" UPDATE",substr(rest_of_str, cnt)) == 1  or
  1376.          at(" FORMAT",substr(rest_of_str, cnt)) == 1  or
  1377.          at(" FROM",  substr(rest_of_str, cnt)) == 1  or
  1378.          at(" REPLACE",  substr(rest_of_str, cnt)) == 1  or
  1379.          at(" ZOOM",  substr(rest_of_str, cnt)) == 1  then
  1380.            exit
  1381.       endif
  1382.  
  1383.    next
  1384.    return cnt - 1;
  1385. enddef
  1386.  
  1387. //--------------------------------------------------------------
  1388. // Parsing routines for pulling objects out of the VALID string
  1389. // "POPUP" = "file->fld_name ORDER key_fld REQ"
  1390. // 1234567890123456789012345678901234567890123
  1391. //            1         2         3         4
  1392. define get_file(valid_str)
  1393.      var  s_arrow,            // String "->"
  1394.           test,
  1395.           s_equal,            // String "="
  1396.           next_alpha,
  1397.           at_alias,
  1398.           s_before,           // String before the searched for item
  1399.           r_target,           // Remainder of the target string after item
  1400.           use_name;           // Return for file
  1401.  
  1402.      s_arrow = "->"
  1403.      s_equal = "="
  1404.      r_target = parse_line( s_before, valid_str, s_equal )      // ' "file->...'
  1405.      next_alpha = atalpha(r_target)                             // 3
  1406.      at_alias = at(s_arrow, r_target)                           // 7
  1407.      use_name = substr(r_target,next_alpha,at_alias-next_alpha) // 'file'
  1408.  
  1409.      return cap_first(use_name);
  1410. enddef
  1411.  
  1412. //--------------------------------------------------------------
  1413. define get_udfname(fld_str)
  1414.      // Create UDF name
  1415.      return cap_first( "l_" + substr( fld_str,1,6) );
  1416. enddef
  1417.  
  1418. //--------------------------------------------------------------
  1419. define get_key(valid_str)
  1420.      var  s_order,            // String "ORDER "
  1421.           at_space,
  1422.           s_before,           // String before the searched for item
  1423.           r_target,           // Remainder of the target string after item
  1424.           order_tag;          // Search TAG to ORDER BY
  1425.  
  1426.      s_order = "ORDER "
  1427.      r_target = parse_line( s_before, valid_str, s_order ) // 'key_fld REQ'
  1428.      at_space = at(" ",r_target)
  1429.      if at_space == 0 then
  1430.           order_tag = substr(r_target, 1, len(r_target)) // 'key_fld"'
  1431.      else
  1432.           order_tag = substr(r_target, 1, at_space)
  1433.      endif
  1434.      return cap_first(order_tag);
  1435. enddef
  1436.  
  1437. //--------------------------------------------------------------
  1438. define get_field(valid_str)
  1439.      var  s_arrow,            // String "->"
  1440.           at_space,
  1441.           s_before,           // String before the searched for item
  1442.           r_target,           // Remainder of the target string after item
  1443.           fld_name;           // Field name to lookup in target file
  1444.  
  1445.      s_arrow = "->"
  1446.      r_target = parse_line( s_before,
  1447.                             valid_str, s_arrow ) // 'fld_name ORDER...'
  1448.      at_space = at(" ",r_target)
  1449.  
  1450.      fld_name = ( at_space == 0 ? r_target : substr(r_target, 1, at_space-1) );
  1451.  
  1452.      return cap_first(fld_name);
  1453. enddef
  1454.  
  1455. //--------------------------------------------------------------
  1456. define get_popname(valid_str)
  1457.      // Create popup name
  1458.      return ( lower( "l_" + substr( get_field( valid_str),1,6) ) );
  1459. enddef
  1460.  
  1461. //--------------------------------------------------------------
  1462. define is_required(valid_str)
  1463.      // Determines if the field is required before moving to the next field
  1464.      return ( ( at(" REQ ",  upper(valid_str)) ? 1 : 0 ) or
  1465.               ( at(" REQ\"", upper(valid_str)) ? 1 : 0 )
  1466.             );
  1467. enddef
  1468.  
  1469. //--------------------------------------------------------------
  1470. define is_shadow(valid_str)
  1471.      // Determines if the user wants shadowing for popup
  1472.      return ( ( at(" SHADOW ",  upper(valid_str)) ? 1 : 0 ) or
  1473.               ( at(" SHADOW\"", upper(valid_str)) ? 1 : 0 )
  1474.             );
  1475. enddef
  1476.  
  1477. //--------------------------------------------------------------
  1478. define is_update(valid_str)
  1479.      // Determines if the user wants updating in the BROWSE
  1480.      return ( ( at(" UPDATE ",  upper(valid_str)) ? 1 : 0 ) or
  1481.               ( at(" UPDATE\"", upper(valid_str)) ? 1 : 0 )
  1482.             );
  1483. enddef
  1484.  
  1485. //--------------------------------------------------------------
  1486. define is_format_file(k, valid_str)
  1487.     // Determines if the user has a format file entered and is valid
  1488.     var is_format, format_file;
  1489.  
  1490.     is_format = ( at(" FORMAT ", upper(valid_str)) ? 1 : 0 );
  1491.  
  1492.     if is_format then
  1493.        format_file = parse_line("", k.FLD_OK_COND, "FORMAT ")
  1494.        format_file = (at(".", format_file) ? format_file : format_file + ".fmt");
  1495.        is_format = ( fileexist(format_file) ? 1 : 0 );
  1496.      endif
  1497.  
  1498.      return is_format;
  1499. enddef
  1500.  
  1501. //--------------------------------------------------------------
  1502. define is_window(valid_str)
  1503.      // Determines if the user wants windowing for BROWSE
  1504.      return ( at(" FROM ",upper(valid_str)) ? 1 : 0 );
  1505. enddef
  1506.  
  1507. //--------------------------------------------------------------
  1508. define is_fields(valid_str)
  1509.      // Determines if the user wants to set fields for BROWSE
  1510.      return ( at(" FIELDS ",upper(valid_str)) ? 1 : 0 );
  1511. enddef
  1512.  
  1513. //--------------------------------------------------------------
  1514. define is_zoom(valid_str)
  1515.      // Determines if the field wants zoom before moving to the next field    
  1516.      return ( ( at(" ZOOM ",  upper(valid_str)) ? 1 : 0 ) or
  1517.               ( at(" ZOOM\"", upper(valid_str)) ? 1 : 0 )
  1518.             );
  1519. enddef
  1520.  
  1521. //--------------------------------------------------------------
  1522. define is_recalc(descrip_str)
  1523.      // Determines if the users wants recalc on calculated fields
  1524.      return  ( at("RECALC",  upper(descrip_str)) ? 1 : 0 );
  1525. enddef
  1526.  
  1527. //--------------------------------------------------------------
  1528. define is_replace(valid_str)
  1529.      // Determines if the users wants recalc on calculated fields
  1530.      return  ( at(" REPLACE ",  upper(valid_str)) ? 1 : 0 );
  1531. enddef
  1532.  
  1533. //--------------------------------------------------------------
  1534. define get_pop_shadow(field_template)   // Pass in FLD_TEMPLATE to deter. shadow
  1535.      if trow_positn < max_pop_row then
  1536.         trow_positn + 1},{tcol_positn},{scrn_size-1},{tcol_positn+len(Field_template)+1}
  1537. {    else
  1538.         trow_positn - 11},{tcol_positn},{trow_positn - 1},{tcol_positn+len(Field_template)+1}
  1539. {    endif
  1540.      return;
  1541. enddef
  1542.  
  1543. //--------------------------------------------------------------
  1544. define get_browse_shadow(from_to)
  1545.      // Determine shadow coordinates for BROWSE
  1546.  
  1547.      var from_clause, from_coord, to_coord, r1, c1, r2, c2;
  1548.  
  1549.      // Get From clause for the DEFINE WINDOW
  1550.      from_clause = alltrim( upper( parse_line("", from_to, "FROM ")))
  1551.  
  1552.      if !from_clause then return ""; endif
  1553.  
  1554.      // Get FROM coordinates
  1555.      from_coord = alltrim( substr( from_clause, 1, at("TO", from_clause) - 1))
  1556.      r1 = substr( from_coord, 1, at(",", from_coord)-1)
  1557.      c1 = substr( from_coord, at(",", from_coord)+1)
  1558.  
  1559.      // Get TO coordinates
  1560.      to_coord   = alltrim( substr( from_clause, at("TO", from_clause) + 2))
  1561.      r2 = substr( to_coord, 1, at(",", to_coord)-1)
  1562.      // Check shadow height and adjust if necessary
  1563.      r2 = (val( r2) + 1) <= scrn_size ? r2 : str( scrn_size - 1) ;
  1564.  
  1565.      c2 = substr( to_coord, at(",", to_coord)+1)
  1566.      // Check shadow width and adjust if necessary
  1567.      c2 = (val(c2)+2) <= 79 ? c2 : str(77) ;
  1568.  
  1569.      print( r1 + "," + c1 + "," + r2 + "," + c2)
  1570.      return;
  1571. enddef
  1572.  
  1573. //--------------------------------------------------------------
  1574. define get_browse_fields_list(k)
  1575.   // Search for "FIELDS" in FLD_OK_COND and return the field list for BROWSE
  1576.   var field_list, key_length;
  1577.  
  1578.   field_list = parse_line("", k.FLD_OK_COND, "FIELDS ")
  1579.   key_length = len( temp_key)
  1580.  
  1581.   if is_update(k.FLD_OK_COND) then
  1582.     // Add /R readonly flag to KEY field of lookup table, if updateable
  1583.     return substr( field_list, 1, at( upper(temp_key), upper(field_list)) + key_length -1)
  1584.             + " /R" +
  1585.           substr( field_list, at( upper(temp_key), upper(field_list)) + key_length);
  1586.   else
  1587.     return field_list;
  1588.   endif
  1589. enddef
  1590.  
  1591. //--------------------------------------------------------------
  1592. define get_browse_window(k)
  1593.   // Search for "FROM" in FLD_OK_COND and return the list for BROWSE
  1594.   return parse_line("", k.FLD_OK_COND, "FROM ");
  1595. enddef
  1596.  
  1597. //--------------------------------------------------------------
  1598. define get_format_file(_file)
  1599.   // Search for "FORMAT" in FLD_OK_COND and return the NAME for BROWSE
  1600.   return cap_first(parse_line("", _file, "FORMAT "))
  1601. enddef
  1602.  
  1603. define get_zoom_format_file(_file)
  1604.  // Search for "ZOOM" in FLD_OK_COND and return the FORMAT NAME for EDIT
  1605.   return cap_first(parse_line("", _file, "ZOOM "));
  1606. enddef
  1607.  
  1608. define make_zoom_to_form()
  1609.   var zoom_name, lookup_dbf;
  1610.   zoom_name = "Z_" + lower(rtrim(substr(name,1,6)))
  1611.   if !is_zoom then
  1612.     return 0;
  1613.   endif
  1614.   print(crlf + "*"+replicate("-",78)+crlf);
  1615. }
  1616. PROCEDURE {zoom_name}
  1617. *-- Branch to another EDIT form based on lc_var
  1618. PARAMETER lc_var
  1619. PRIVATE ALL LIKE l?_*
  1620.  
  1621. ON KEY LABEL {on_key_zoom}
  1622. SAVE SCREEN TO {zoom_name}
  1623. lc_area = ALIAS()
  1624. ll_edit = .F.
  1625. SELECT SELECT()
  1626. DO CASE
  1627. {  foreach FLD_ELEMENT flds
  1628.       if is_zoom( FLD_OK_COND) then
  1629.         lookup_dbf = get_file( FLD_OK_COND);
  1630. }
  1631.    CASE lc_var = "{FLD_FIELDNAME}"
  1632. {        if workarea_cnt > max_workareas then}
  1633.       IF FILE("{lookup_dbf}.dbf")
  1634.          USE {lookup_dbf} ORDER {alltrim(get_key( FLD_OK_COND))}
  1635. {            if chr( FLD_VALUE_TYPE) == "C" then}
  1636.          lc_var = IIF( EMPTY( TRIM( lc_var)), lc_var, TRIM( lc_var))
  1637. {            endif
  1638.          else
  1639. }
  1640.          SELECT ("{ upper(lookup_dbf) == FLD_FILENAME ? 
  1641.                                               "A"+substr(lookup_dbf,1,7) : 
  1642.                                                lookup_dbf}")
  1643. {         endif   }
  1644.          SEEK &lc_area.->&lc_var.
  1645.  
  1646.          IF FILE("{fileroot( get_zoom_format_file( FLD_OK_COND)) + ".FMT"}")
  1647.              SET FORMAT TO {fileroot( get_zoom_format_file(FLD_OK_COND))}
  1648.          ENDIF
  1649.          ll_edit = .T.
  1650. {        if workarea_cnt > max_workareas then}
  1651.       ENDIF
  1652. {         endif
  1653.       endif       
  1654.    next
  1655. }
  1656.    OTHERWISE
  1657.        KEYBOARD CHR( kn_CtrlHme ) CLEAR          && Gets user into memo field
  1658. ENDCASE
  1659.  
  1660. IF ll_edit
  1661.    EDIT NEXT 1                                   && Edit the Zoomed record
  1662. ENDIF
  1663.  
  1664. {  if workarea_cnt > max_workareas then}
  1665. USE
  1666. {  endif}
  1667. SELECT (lc_area)                                 && Back to edit work area
  1668. RESTORE SCREEN FROM {zoom_name}
  1669. RELEASE SCREEN {zoom_name}
  1670. {  if is_help then}
  1671. ON KEY LABEL {on_key_help} DO {"H_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
  1672. {  endif
  1673.    if is_recalc then}
  1674. ON KEY LABEL {on_key_recalc} DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
  1675. {  endif}
  1676. ON KEY LABEL {on_key_cut} DO _Cut
  1677. ON KEY LABEL {on_key_paste} DO _Paste
  1678. ON KEY LABEL {on_key_edpaste} DO _Edpaste
  1679. ON KEY LABEL {on_key_zoom} DO {zoom_name} WITH VARREAD()
  1680. RETURN
  1681. *-- EOP: {zoom_name}
  1682. {enddef
  1683.  
  1684. define make_recalc_code()
  1685.   var recalc_name;
  1686.   recalc_name = "R_" + lower(rtrim(substr(name,1,6)))
  1687.   if !is_recalc then
  1688.     return 0;
  1689.   endif
  1690.   if !udf_file then
  1691.      if !make_udf() then
  1692.         return 0;
  1693.      endif
  1694.      // Put up the UDF header
  1695.      udf_header()
  1696.   endif
  1697.   print(crlf + "*"+replicate("-",78)+crlf);
  1698. }
  1699. PROCEDURE {recalc_name}
  1700. *-- Recalculate calculated fields
  1701. PARAMETER lc_var
  1702. PRIVATE ALL LIKE l?_*
  1703. ON KEY LABEL {on_key_recalc}
  1704.  
  1705. {textopen( fmt_name + ".tmp")
  1706.  temp = textgetl();
  1707.  if page_cnt > 1 then
  1708. }
  1709. DO CASE
  1710.    CASE lc_var $ "{temp}"
  1711. {   lmarg(offset*2)
  1712.  endif
  1713.  color_flg = line_cnt = 0;
  1714.  foreach FLD_ELEMENT k
  1715.    if new_page(k) then
  1716.       temp = textgetl();
  1717.       lmarg(offset)
  1718. }
  1719.  
  1720.  CASE lc_var $ "{temp}"
  1721. {     lmarg(offset*2)
  1722.    endif
  1723.    color = getcolor(FLD_DISPLAY, FLD_EDITABLE) // get color of element
  1724.    if FLD_FIELDTYPE == calc and is_recalc(FLD_DESCRIPT) then}
  1725. *-- Calculated field: {cap_first(FLD_FIELDNAME)} - {FLD_DESCRIPT}
  1726. @ {nul2zero(ROW_POSITN) - line_cnt},{nul2zero(COL_POSITN)} SAY \
  1727. {  // Loop thru expression in case it is longer than 237
  1728.        foreach FLD_EXPRESSION fcursor in k
  1729.           FLD_EXPRESSION}
  1730. {      next}
  1731. // Output a space after the Fld_expression and get ready for picture clause
  1732.  \
  1733. {      if Ok_Template(k) then}
  1734. PICTURE "{picture_for_say(k);}" \
  1735. {      endif
  1736.        outcolor()}
  1737.  
  1738. {  endif
  1739.  next k;
  1740.  if page_cnt > 1 then
  1741.    lmarg(0)
  1742. }
  1743. ENDCASE
  1744. {endif}
  1745.  
  1746. ON KEY LABEL {on_key_recalc} DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
  1747. RETURN
  1748. *-- EOP: {recalc_name}
  1749. { textclose()
  1750.   fileerase( fmt_name + ".tmp")
  1751. enddef
  1752.  
  1753. define write_recalc_get_list()
  1754.  if is_recalc then                // Write get list out for each page
  1755.     append( fmt_name + ".tmp")    // Used for "recalc" option
  1756.     print( get_list + crlf)
  1757.     append( fmt_name + ".fmt")
  1758.  endif
  1759. enddef
  1760.  
  1761. //--------------------------------------------------------------
  1762. define make_replace_code()
  1763.   // Make REPLACE and @ GET statements for other fields related to the LOOKUP
  1764.   var replace_field_name, field_list, temp2;
  1765.  
  1766.   if !is_replace then
  1767.     return 0;
  1768.   endif
  1769.  
  1770.   color_flg = line_cnt = 0;
  1771.  
  1772.   foreach FLD_ELEMENT x
  1773.     if is_replace( FLD_OK_COND ) then  // found a field with REPLACE
  1774.       replace_field_name = "U_" + lower( rtrim( substr( FLD_FIELDNAME, 1, 7)));
  1775.       print(crlf + "*"+replicate("-",78)+crlf);
  1776. }
  1777. PROCEDURE {replace_field_name} 
  1778.    PARAMETER is_edit, key_field
  1779.    *-- Update Look'ed up fields for {cap_first( FLD_FIELDNAME )}
  1780.  
  1781. {     if  at("POPUP", upper(ltrim(FLD_OK_COND))) then}
  1782.    SEEK key_field
  1783.  
  1784. {     endif
  1785.       lmarg(4)
  1786.       get_replace_fields_list(x) 
  1787.       get_memvar_fields_list(x) 
  1788.       lmarg(0)
  1789. }
  1790.  
  1791.    IF is_edit
  1792. {     foreach FLD_ELEMENT y
  1793.          if is_replace( y.FLD_OK_COND) and x == y then
  1794.  
  1795.              field_list = upper( parse_line( "", y.FLD_OK_COND, "REPLACE ") )
  1796.              do while len(field_list) > 0
  1797.                 temp = upper( substr( field_list, 1, at(" WITH", field_list) - 1 ))
  1798.                 temp2 = at("M->",  upper(temp)) ?
  1799.                        substr( temp, at("M->", upper(temp)) + 3 ) :
  1800.                        temp;
  1801.                 foreach FLD_ELEMENT z
  1802.                    if FLD_FIELDNAME == alltrim( temp2 ) then
  1803.                       color = getcolor(z.FLD_DISPLAY, z.FLD_EDITABLE); // get color of element
  1804. }
  1805.       @ {z.ROW_POSITN},{z.COL_POSITN} GET \
  1806. {                     if at("M->",  upper(temp)) then
  1807.                          temp}
  1808. {                     else
  1809.                          cap_first(z.FLD_FILENAME)}->\
  1810. {                        cap_first(z.FLD_FIELDNAME)}\
  1811. {                     endif
  1812.                       if Ok_Template(z) then}
  1813.  PICTURE "{picture_for_get(z);}" \
  1814. {                        outcolor()}
  1815. {                     endif}
  1816.  
  1817. {                     exit
  1818.                    endif
  1819.                 next z
  1820.                 if at( ",", field_list) > 0 then
  1821.                    field_list = substr( field_list, at( ",", field_list) + 1 )
  1822.                 else
  1823.                    field_list = ""
  1824.                 endif
  1825.              enddo
  1826. }
  1827.    ENDIF
  1828. RETURN
  1829. *-- EOP: {replace_field_name}
  1830.  
  1831. {            exit
  1832.          endif
  1833.       next y 
  1834.     endif
  1835.   next x
  1836.  return;
  1837. enddef
  1838.  
  1839. //--------------------------------------------------------------
  1840. define get_replace_fields_list(k)
  1841.   // Search for "REPLACE" in FLD_OK_COND and return the field list for REPLACE
  1842.   var field_list, key_length, first_loop;
  1843.  
  1844.   first_loop = 1;
  1845.   // Get REPLACE field data
  1846.   field_list = upper( parse_line( "",k.FLD_OK_COND, "REPLACE ") )
  1847.  
  1848.   // Fix the data up and print on multiple lines
  1849.   do while len( field_list) > 0
  1850.      if !at("M->", upper(substr(field_list, 1, at(" WITH", field_list) - 1 ))) then
  1851.         if first_loop then
  1852.            print("REPLACE ")
  1853.            first_loop = 0
  1854.         else
  1855.            print( ", ;" + crlf + space( 7))
  1856.         endif
  1857.         print( cap_first( k.FLD_FILENAME) + "->" +
  1858.                 cap_first(alltrim(substr(field_list, 1, at(" WITH", field_list) - 1 ))) +
  1859.                 " WITH "
  1860.              )
  1861.  
  1862.         temp = cap_first( alltrim( substr( field_list, at( "WITH", field_list) + 4 )))
  1863.         if at( ",", temp) > 0 then
  1864.            temp = substr( temp, 1, at( ",", temp) - 1 )
  1865.         endif
  1866.  
  1867.         print( temp)
  1868.      endif
  1869.      if at( ",", field_list) > 0 then
  1870.         field_list = substr( field_list, at(",", field_list) + 1 );
  1871.         if len( alltrim( field_list) ) == 0 then
  1872.            field_list = ""
  1873.         endif
  1874.      else
  1875.         field_list = ""
  1876.      endif
  1877.   enddo
  1878.   print( crlf )
  1879.   return ;
  1880. enddef
  1881.  
  1882. define get_memvar_fields_list(k)
  1883.   // Search for "REPLACE" in FLD_OK_COND and return the field list for MEMVAR
  1884.   // declaration
  1885.   var field_list, key_length;
  1886.  
  1887.   field_list = upper( parse_line( "",k.FLD_OK_COND, "REPLACE ") )
  1888.   // Produce memvar statements instead of replace statements
  1889.   do while len( field_list) > 0
  1890.      if at("M->", upper(substr(field_list, 1, at(" WITH", field_list) - 1 ))) then
  1891.         // Before "WITH"
  1892.         print( cap_first( alltrim( substr(field_list, 1, 
  1893.                        at(" WITH", field_list) - 1 ))) +
  1894.                 " = "
  1895.              )
  1896.         // After "WITH"
  1897.         temp = cap_first( alltrim( substr( field_list, at( "WITH", field_list) + 4 )))
  1898.         if at( ",", temp) > 0 then
  1899.            temp = substr( temp, 1, at( ",", temp) - 1 )
  1900.         endif
  1901.         print( temp + crlf)
  1902.      endif
  1903.  
  1904.      if at( ",", field_list) > 0 then
  1905.          field_list = substr( field_list, at(",", field_list) + 1 )
  1906.         if len( alltrim( field_list) ) == 0 then
  1907.            field_list = ""
  1908.         endif
  1909.      else
  1910.         field_list = ""
  1911.      endif
  1912.   enddo
  1913.   return ;
  1914. enddef
  1915.  
  1916. define make_memvar_declarations()
  1917.     // Make memvars for lookups
  1918.     foreach FLD_ELEMENT 
  1919.        if FLD_FIELDTYPE == memvar then
  1920. }
  1921. IF TYPE("M->{FLD_FIELDNAME}") = "U"
  1922.    m->{FLD_FIELDNAME} = \
  1923. {          if chr(FLD_VALUE_TYPE) == "C" then
  1924.                print("SPACE(" + len(FLD_TEMPLATE) + ")")
  1925.            endif
  1926.           if at(chr(FLD_VALUE_TYPE), "NF") then
  1927.                print("0")
  1928.            endif
  1929.           if chr(FLD_VALUE_TYPE) == "D" then
  1930.                print("{  \  \  }")
  1931.            endif
  1932.           if chr(FLD_VALUE_TYPE) == "L" then
  1933.                print(".F.")
  1934.            endif     //
  1935.            print(crlf)
  1936. }
  1937. ENDIF
  1938. {
  1939.        endif
  1940.      next
  1941. return ;     
  1942. enddef
  1943. }
  1944.