home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / p2demo21.exe / PEL / GUI_SRCH.PEL < prev    next >
Text File  |  1995-03-16  |  34KB  |  1,018 lines

  1. # $Header:   P:\source\wmacros\gui_srch.pev   1.46   16 Mar 1995 15:20:06   NOBLE  $
  2. # $Tabs:4 7$
  3.  
  4. ##############################################################################
  5. #
  6. #       Compuware Corporation
  7. #         31440 Northwestern Highway
  8. #           Farmington Hills, Michigan 48334-2564
  9. #
  10. #   This source code listing contains information that is
  11. #   proprietary to Compuware Corporation and may not be copied
  12. #   duplicated, translated, transmitted, stored, retrieved
  13. #   or in any manner or by any method conveyed or disclosed
  14. #   to a third party or parties without express written
  15. #   permission from Compuware Corporation.
  16. #
  17. #  
  18. ##############################################################################
  19.  
  20. #### $Workfile:   gui_srch.pel  $: gui find and change
  21.  
  22.  
  23. #/* Options group -- for all options, use the ids from the search page
  24. #   of the settings notebook
  25. #*/ 
  26.  
  27. local ChangeDlg
  28. local FindDlg
  29. local search_fid
  30. local file_pattern
  31.  
  32. local HIGH_WORD = 0xFFFF0000
  33. local LOW_WORD  = 0x0000FFFF
  34. local base
  35. local initializing
  36.  
  37. local IDD
  38. local IDE
  39. local IDR
  40. local IDT
  41. local IDB
  42. local IDC
  43.  
  44. # this line causes init_constants to be called when globals are initialized
  45. local dummy = init_constants()
  46.  
  47. local function init_constants()
  48. {
  49. dummy++  # line to stop warning about variable declared and not used.
  50. IDD.FIND_DLG              = 1520
  51. IDE.FIND_STRING           = 1521
  52. IDR.FORWARD               = 1522
  53. IDR.BACKWARD              = 1523
  54. IDR.BLOCK                 = 1524
  55. IDR.SINGLE                = 1525
  56. IDR.MULTI                 = 1526
  57. IDR.FILES                 = 1527
  58. IDT.FILES                 = 1528
  59. IDE.FILES                 = 1529
  60. IDB.MORE                  = 1530
  61. IDB.FIND_NEXT             = 1531
  62. IDB.FIND_FIRST            = 1532
  63. IDB.FIND_LAST             = 1533
  64. IDB.FIND_ALL              = 1534
  65. #IDG.SEPARATOR             = 1535
  66. IDC.RECURSIVE             = 1536
  67.  
  68. IDD.CHANGE_DLG            = 1540
  69. IDE.CHANGE_STRING         = 1541
  70. IDB.CHANGE_FIND           = 1542
  71. IDB.CHANGE                = 1543
  72. IDB.CHANGE_ALL            = 1544
  73. }
  74.  
  75. function gui_find()
  76. {
  77.    local size, pos
  78.  
  79.    if ( !FindDlg.handle )
  80.    {
  81.       FindDlg.handle = create_mdialog( function_id("find_dlg_callback"),
  82.                                        mdi_mode == 2 ? -1 : 0, 
  83.                                        IDD.FIND_DLG, resource_dll )
  84.       FindDlg.name = "Find"
  85.  
  86.       make_dlg_object( FindDlg )
  87.  
  88.       add_dialog_item( FindDlg.handle, IDB.FIND_ALL, DCTRL_PUSH_BUTTON )
  89.       add_dialog_item( FindDlg.handle, IDE.FILES,    DCTRL_EDIT_KEY )
  90.       set_dialog_item( FindDlg.handle, IDE.FILES,    DAC_SET_TEXT_LEN, 512 )
  91.  
  92.       add_dialog_item( FindDlg.handle, IDR.FILES,    DCTRL_RADIO_BUTTON )
  93.       add_dialog_item( FindDlg.handle, IDR.MULTI,    DCTRL_RADIO_BUTTON )
  94.  
  95.       add_dialog_item( FindDlg.handle, IDB.FIND_FIRST,    DCTRL_PUSH_BUTTON )
  96.       add_dialog_item( FindDlg.handle, IDB.FIND_LAST,    DCTRL_PUSH_BUTTON )
  97.       add_dialog_item( FindDlg.handle, IDC.RECURSIVE,    DCTRL_CHECK_BOX )
  98.  
  99.       add_common_items( FindDlg.handle )
  100.       attach_help(editor_helpfile, FindDlg.handle)
  101.       base = FindDlg
  102.       more_dialog( 0 )
  103.    }
  104.  
  105.    if ( ChangeDlg.handle )
  106.    {
  107.       if ( query_dialog_window( ChangeDlg.handle, DWC_SHOW ) )
  108.          set_dialog_window( ChangeDlg.handle, DWC_HIDE)
  109.    }
  110.  
  111.    FindDlg.search_pattern = search_pattern 
  112.    FindDlg.replace_pattern = replace_pattern 
  113.    base = FindDlg
  114.    
  115. #  more_dialog( 0 )
  116.    initialize_find_dlg( FindDlg.handle )
  117.  
  118.    # set focus to the search string 
  119.    set_dialog_item( FindDlg.handle, IDE.FIND_STRING, DAC_SETFOCUS )
  120.  
  121.    begin_dialog( FindDlg.handle ) 
  122.    reinitialize_dialog_list() # add the Find Dialog to the dialog list
  123. }
  124.  
  125. local function initialize_find_dlg( handle )
  126. {
  127.    initializing = TRUE
  128.    if ( search_pattern )
  129.    {
  130.       set_dialog_item( handle, IDB.FIND_FIRST,   DAC_ENABLE)
  131.       set_dialog_item( handle, IDB.FIND_LAST,    DAC_ENABLE)
  132.    }
  133.    else
  134.    {
  135.       set_dialog_item( handle, IDB.FIND_FIRST,    DAC_DISABLE)
  136.       set_dialog_item( handle, IDB.FIND_LAST,    DAC_DISABLE)
  137.    }
  138.    initialize_common_dlg( handle )
  139.    initializing = FALSE
  140. }
  141.  
  142. global function find_dlg_callback()
  143. {
  144.    local retval, sflags, status, dlg_handle
  145.  
  146.    local call_hand   = callback_dialog_handle
  147.    local call_msg    = callback_msg
  148.    local call_idx    = callback_index
  149.  
  150.    if ( ( call_msg == DM_CLICK && call_idx == DI_HELP ) ||
  151.         ( call_msg == DM_HELPREQUESTED ) ) 
  152.    {   
  153.       display_help("find", call_hand)
  154.       return DRC_MSG_PROCESSED
  155.    } # end DI_HELP
  156.    else if ( call_msg == DM_ACTIVATE )
  157.    {
  158.       initialize_find_dlg( call_hand )
  159.       return DRC_MSG_PROCESSED
  160.    } # end DM_ACTIVATE
  161.    else if ( (call_msg == DM_CLICK) || (call_msg == DM_DOUBLE_CLICK) )
  162.    {
  163.       if ( call_idx == IDB.FIND_FIRST  )
  164.       {
  165.          setup_find(call_hand)
  166.          message("")
  167.  
  168.          save_position()
  169.  
  170.          if (search_fid == IDR.BLOCK && selection_type())
  171.             goto_mark(selection_mark_top())
  172.          else
  173.          {
  174.             remove_selection()
  175.             update_current_view()
  176.             goto_buffer_top()
  177.          }
  178.  
  179. #        search_forward(search_pattern)
  180.          sflags       = search_flags
  181.          search_flags = or( and(sflags, not(SEARCH_ADVANCE)), SEARCH_FORWARD)
  182.          status       = string_search( search_pattern, search_flags )
  183.          search_flags = sflags
  184.  
  185.          if ( status )
  186.             restore_position( 0 )
  187.          else 
  188.             restore_position( 1 )
  189.  
  190.          cleanup_find( status )
  191.          return DRC_MSG_PROCESSED
  192.       }
  193.       else if ( call_idx == IDB.FIND_LAST )
  194.       {
  195.          setup_find(call_hand)
  196.          message("")
  197.  
  198.          save_position()
  199.  
  200.          if (search_fid == IDR.BLOCK && selection_type())
  201.             goto_mark(selection_mark_bottom())
  202.          else
  203.             goto_buffer_bottom();
  204.  
  205. #        search_backward(search_pattern)
  206.          sflags       = search_flags
  207.          search_flags = and(sflags, not(SEARCH_ADVANCE+SEARCH_FORWARD))
  208.          status       = string_search( search_pattern, search_flags )
  209.          search_flags = sflags
  210.  
  211.          if ( status )
  212.             restore_position( 0 )
  213.          else 
  214.             restore_position( 1 )
  215.  
  216.          cleanup_find( status )
  217.          return DRC_MSG_PROCESSED
  218.       }
  219.       else if ( call_idx == IDB.FIND_ALL )
  220.       {
  221.          dlg_handle = call_hand
  222.          setup_find(call_hand)
  223.          if ( search_fid == IDR.BLOCK || search_fid == IDR.SINGLE )
  224.             status = grep(search_pattern)
  225.          else if ( search_fid == IDR.MULTI )
  226.             status = wgrep( search_pattern )
  227.          else if ( search_fid == IDR.FILES )
  228.             {
  229.             if ( query_dialog_item(call_hand, IDC.RECURSIVE, DAC_CHECK) )
  230.                status = fgrep( search_pattern, file_pattern, TRUE )
  231.             else
  232.                status = fgrep( search_pattern, file_pattern )
  233.             }
  234.          cleanup_find( status, dlg_handle )
  235.          return DRC_MSG_PROCESSED
  236.       }
  237.    }
  238.    else if ( call_msg == DM_CHANGE )
  239.    {
  240.       # turn off advance bit everytime pattern changes.  This is just to
  241.       # be safe
  242.       search_flags = and( search_flags, not( SEARCH_ADVANCE ) )
  243.       base.old = !!base.search_pattern
  244.       base.search_pattern = query_dialog_item( call_hand, IDE.FIND_STRING, DAC_TEXT) 
  245.       if ( !!base.search_pattern != base.old)
  246.          do_scope(call_hand, search_fid )
  247.  
  248.       return DRC_MSG_PROCESSED
  249.    }
  250.    return common_dlg_callback()
  251. }
  252.  
  253. ########### SEARCH AGAIN #############################
  254.  
  255. global function gui_search_again()
  256. {
  257.    if (and(search_flags, SEARCH_ALL_BUFFERS))
  258.       return wsearch_again()
  259.    else
  260.       return search_again()
  261. }
  262.  
  263. global function gui_context_find()
  264. {
  265.    search_pattern = symbol_under_cursor()
  266.    gui_find()
  267. }
  268.  
  269. ########### CHANGE DLG #############################
  270. function gui_change()
  271. {
  272.    if ( !ChangeDlg.handle )
  273.    {
  274.       ChangeDlg.handle = create_mdialog(function_id("change_dlg_callback"), 
  275.                                         mdi_mode == 2 ? -1 : 0, 
  276.                                         IDD.CHANGE_DLG, resource_dll )
  277.       ChangeDlg.name = "Change"
  278.  
  279.       make_dlg_object( ChangeDlg )
  280.  
  281.       add_dialog_item( ChangeDlg.handle, IDE.FILES,    DCTRL_EDIT_KEY )
  282.       set_dialog_item( ChangeDlg.handle, IDE.FILES,    DAC_SET_TEXT_LEN, 512 )
  283.  
  284.       add_dialog_item( ChangeDlg.handle, IDB.CHANGE_ALL, DCTRL_PUSH_BUTTON )
  285.       add_dialog_item( ChangeDlg.handle, IDE.CHANGE_STRING, DCTRL_EDIT_KEY )
  286.  
  287.       add_dialog_item( ChangeDlg.handle, IDR.FILES,    DCTRL_RADIO_BUTTON )
  288.       add_dialog_item( ChangeDlg.handle, IDR.MULTI,    DCTRL_RADIO_BUTTON )
  289.  
  290.       # set maximum text lenght of find edit box to 100 characters
  291.       set_dialog_item( ChangeDlg.handle, IDE.CHANGE_STRING, DAC_SET_TEXT_LEN, 100 )
  292.  
  293.       add_dialog_item( ChangeDlg.handle,  IDB.CHANGE_FIND,  DCTRL_PUSH_BUTTON )
  294.       add_dialog_item( ChangeDlg.handle,  IDB.CHANGE,       DCTRL_PUSH_BUTTON )
  295.       add_dialog_item( ChangeDlg.handle,  IDC.RECURSIVE,    DCTRL_CHECK_BOX )
  296.  
  297.       add_common_items( ChangeDlg.handle )
  298.       attach_help(editor_helpfile, ChangeDlg.handle)
  299.       base = ChangeDlg
  300.       more_dialog( 0 )
  301.    }
  302.  
  303.    if ( FindDlg.handle )
  304.    {
  305.       if ( query_dialog_window( FindDlg.handle, DWC_SHOW ) )
  306.          set_dialog_window(FindDlg.handle, DWC_HIDE)
  307.    }
  308.  
  309.    base = ChangeDlg
  310.    ChangeDlg.search_pattern = search_pattern 
  311.    ChangeDlg.replace_pattern = replace_pattern 
  312.    initialize_change_dlg( ChangeDlg.handle )
  313.  
  314.    set_dialog_item( ChangeDlg.handle, IDE.FIND_STRING, DAC_SETFOCUS )
  315.  
  316.    begin_dialog( ChangeDlg.handle )
  317.    reinitialize_dialog_list() # add the Find Dialog to the dialog list
  318. }
  319.  
  320. local function initialize_change_dlg( handle )
  321. {
  322.    local historyList
  323.    local i
  324.  
  325.    initializing = TRUE
  326.  
  327.    set_dialog_item( handle, IDE.CHANGE_STRING, DAC_EDIT_TEXT,
  328.                     base.replace_pattern , 1)
  329.  
  330.    initialize_common_dlg( handle )
  331. #   set_dialog_item( handle, IDR.MULTI, DAC_DISABLE )
  332. #   set_dialog_item( handle, IDR.FILES, DAC_DISABLE )
  333.    initializing = FALSE
  334. }
  335.  
  336. global function change_dlg_callback()
  337. {
  338.    local retval
  339.    local status
  340.    local call_hand
  341.    local recursive
  342.    local files
  343.  
  344.    call_hand = callback_dialog_handle
  345.  
  346. #  debug_find_dlg()
  347.    if ( initializing )
  348.       return DRC_CONTINUE
  349.    else if ( ( callback_msg == DM_CLICK && callback_index == DI_HELP ) ||
  350.              ( callback_msg == DM_HELPREQUESTED ) ) 
  351.    {   
  352.       display_help("change", callback_dialog_handle)
  353.       return DRC_MSG_PROCESSED
  354.    }
  355.    else if ( callback_msg == DM_ACTIVATE )
  356.    {
  357.       initialize_change_dlg( callback_dialog_handle )
  358.       return DRC_MSG_PROCESSED
  359.    }
  360.    else if ( (callback_msg == DM_CLICK) || (callback_msg == DM_DOUBLE_CLICK) )
  361.    {
  362.       if ( callback_index == IDB.CHANGE_FIND  )
  363.       {
  364.          setup_find(call_hand)
  365.  
  366.          search_flags = and( search_flags, not(SEARCH_ADVANCE) )
  367.  
  368.          search_count = 1
  369.          if ( search_fid == IDR.MULTI )
  370.             status = wreplace( search_pattern, replace_pattern )
  371.          else
  372.             status = sf_replace( search_pattern, replace_pattern )
  373.    
  374.          skipReplaceString( and( search_flags, SEARCH_FORWARD ) )
  375.    
  376.          cleanup_find( status )
  377.  
  378.          if (status)
  379.             {
  380.             setup_find( call_hand )
  381.  
  382.             if ( search_fid == IDR.MULTI )
  383.                status = wsearch( search_pattern, FindDlg.handle )
  384.             else
  385.                status = string_search( search_pattern )
  386.  
  387.             cleanup_find( status )
  388.             }
  389.  
  390.          return DRC_MSG_PROCESSED
  391.       }
  392.       else if ( callback_index == IDB.CHANGE  )
  393.       {
  394.          setup_find(call_hand)
  395.          search_count = 1
  396.  
  397.          search_flags = and(search_flags, not(SEARCH_ADVANCE) )           
  398.  
  399.          if ( search_fid == IDR.MULTI )
  400.             status = wreplace( search_pattern, replace_pattern )
  401.          else
  402.             status = sf_replace( search_pattern, replace_pattern )
  403.  
  404.          cleanup_find( status )
  405.          return DRC_MSG_PROCESSED
  406.       }
  407.       else if ( callback_index == IDB.CHANGE_ALL )
  408.       {
  409.          setup_find(call_hand)
  410.  
  411.          toggle_search_flags(SEARCH_GLOBAL, 1)
  412.          search_count = MAX_SEARCH
  413.  
  414.          if ( search_fid == IDR.MULTI )
  415.             status = wreplace( search_pattern, replace_pattern )
  416.          else if ( search_fid == IDR.FILES )
  417.             {
  418.             files       = query_dialog_item(callback_dialog_handle, IDE.FILES, DAC_TEXT)
  419.             recursive   = query_dialog_item(callback_dialog_handle, IDC.RECURSIVE, DAC_CHECK)
  420.  
  421.             status = freplace( search_pattern, replace_pattern, files, recursive )
  422.             }
  423.          else
  424.             status = sf_replace( search_pattern, replace_pattern )
  425.  
  426.          cleanup_find( status )
  427.  
  428.          if ( status )
  429.             message( "" )
  430.  
  431.          return DRC_MSG_PROCESSED
  432.       }
  433.    }
  434.    else if ( callback_msg == DM_CHANGE )
  435.    {
  436.       base.old = !!base.search_pattern
  437.       base.replace_pattern = query_dialog_item( callback_dialog_handle, IDE.CHANGE_STRING, DAC_TEXT) 
  438.       base.search_pattern  = query_dialog_item( callback_dialog_handle, IDE.FIND_STRING, DAC_TEXT) 
  439.  
  440.       # turn off advance bit everytime pattern changes.  This is just to
  441.       # be safe
  442.       search_flags = and( search_flags, not( SEARCH_ADVANCE ) )
  443.       if ( !!base.search_pattern != base.old)
  444.          do_scope(callback_dialog_handle, search_fid )
  445.  
  446.       return DRC_MSG_PROCESSED
  447.    }
  448.    return common_dlg_callback()
  449. }
  450.  
  451. ##################### COMMON DLG #######################33
  452. local function initialize_common_dlg( handle )
  453. {
  454.    set_dialog_item( handle, IDE.FIND_STRING, DAC_EDIT_TEXT,
  455.                     base.search_pattern, 1)
  456.  
  457.    if ( and( search_flags, SEARCH_FORWARD) )
  458.    {
  459.       set_dialog_item( handle, IDR.FORWARD, DAC_CHECK)
  460.       set_dialog_item( handle, IDR.BACKWARD, DAC_UNCHECK)
  461.    }
  462.    else
  463.    {
  464.       set_dialog_item( handle, IDR.FORWARD, DAC_UNCHECK)
  465.       set_dialog_item( handle, IDR.BACKWARD, DAC_CHECK)
  466.    }
  467.  
  468.    if ( and( search_flags, SEARCH_CASE) )
  469.       set_dialog_item( handle, IDC_SEARCH_CASE, DAC_CHECK)
  470.    else
  471.       set_dialog_item( handle, IDC_SEARCH_CASE, DAC_UNCHECK)
  472.    
  473.    if ( and( search_flags, SEARCH_MAXIMAL_MATCH) )
  474.       set_dialog_item( handle, IDC_SEARCH_MAX_MATCH, DAC_CHECK)
  475.    else
  476.       set_dialog_item( handle, IDC_SEARCH_MAX_MATCH, DAC_UNCHECK)
  477.    
  478.    if ( and( search_flags, SEARCH_REGEX) )
  479.    {
  480.       set_dialog_item( handle, IDC_SEARCH_REGEX, DAC_CHECK)
  481.       set_dialog_item( handle, IDC_SEARCH_MAX_MATCH, DAC_ENABLE)
  482.       set_dialog_item( handle, IDC_SEARCH_WORD, DAC_ENABLE)
  483.    }
  484.    else
  485.    {
  486.       set_dialog_item( handle, IDC_SEARCH_MAX_MATCH, DAC_DISABLE)
  487.       set_dialog_item( handle, IDC_SEARCH_WORD, DAC_DISABLE)
  488.       set_dialog_item( handle, IDC_SEARCH_REGEX, DAC_UNCHECK)
  489.    }
  490.  
  491.    if ( and( search_flags, SEARCH_WHOLE_WORD) )
  492.       set_dialog_item( handle, IDC_SEARCH_WORD, DAC_CHECK)
  493.    else
  494.       set_dialog_item( handle, IDC_SEARCH_WORD, DAC_UNCHECK)
  495.    
  496. #   if ( and( search_flags, SEARCH_ONCE_PER_LINE) )
  497. #      set_dialog_item( handle, IDC_SEARCH_ONCE, DAC_CHECK)
  498. #   else
  499. #      set_dialog_item( handle, IDC_SEARCH_ONCE, DAC_UNCHECK)
  500.  
  501.    if ( and( search_flags, SEARCH_WRAPS) )
  502.       set_dialog_item( handle, IDC_SEARCH_WRAP, DAC_CHECK)
  503.    else
  504.       set_dialog_item( handle, IDC_SEARCH_WRAP, DAC_UNCHECK)
  505.    
  506.    if ( and( search_flags, SEARCH_HIGHLIGHT) )
  507.       set_dialog_item( handle, IDC_SEARCH_HIGHLIGHT, DAC_CHECK)
  508.    else
  509.       set_dialog_item( handle, IDC_SEARCH_HIGHLIGHT, DAC_UNCHECK)
  510.    
  511.    if ( and( search_flags, SEARCH_CENTER_CURSOR) )
  512.       set_dialog_item( handle, IDC_SEARCH_CENTER, DAC_CHECK)
  513.    else
  514.       set_dialog_item( handle, IDC_SEARCH_CENTER, DAC_UNCHECK)
  515.  
  516.    unhilight_temp_selection()
  517.    if ( selection_type() )
  518.    {
  519.       set_dialog_item( handle, IDR.BLOCK, DAC_ENABLE)
  520.       do_scope(handle, search_fid ? search_fid : IDR.BLOCK)
  521.    }
  522.    else
  523.       do_scope(handle, search_fid ? search_fid                            \
  524.                                   : and(search_flags, SEARCH_ALL_BUFFERS) \
  525.                                     ? IDR.MULTI : IDR.SINGLE )
  526.  
  527. #   set_dialog_item( handle, IDE.FIND_STRING, DAC_SETFOCUS )
  528. }
  529.  
  530. global function common_dlg_callback()
  531. {
  532.    local old_prompt_response, status, check
  533.    local retval
  534.    local index, dlgid
  535.  
  536.    local call_hand   = callback_dialog_handle
  537.    local call_msg    = callback_msg
  538.    local call_idx    = callback_index
  539.  
  540.    if ( call_msg == DM_CLOSE || call_idx == DI_CANCEL)
  541.    {
  542.       set_dialog_item(call_hand, IDB.FIND_NEXT, DAC_SETFOCUS)
  543.       set_dialog_item(call_hand, IDE.FIND_STRING, DAC_SETFOCUS)
  544.       set_dialog_window(call_hand, DWC_HIDE)
  545.       update_current_view()
  546.       cleanup_prompt_history()
  547.       search_fid = 0
  548.       return DRC_EXIT
  549.    }
  550.    else if ( (call_msg == DM_CLICK) || (call_msg == DM_DOUBLE_CLICK) )
  551.    {
  552.       if ( call_idx == IDB.MORE  )
  553.       {
  554.          more_dialog()
  555.          return DRC_MSG_PROCESSED
  556.       }
  557.       else if ( call_idx == IDB.FIND_NEXT  )
  558.       {
  559.          setup_find(call_hand)
  560.          if ( search_fid == IDR.MULTI )
  561.             status = wsearch_again( 0, FindDlg.handle )
  562.          else
  563.             status = search_again()
  564.          cleanup_find( status )
  565.          return DRC_MSG_PROCESSED
  566.       }
  567.       else if ( call_idx == IDR.SINGLE || call_idx == IDR.BLOCK ||
  568.                 call_idx == IDR.MULTI  || call_idx == IDR.FILES )
  569.       {
  570.          do_scope( call_hand, call_idx )
  571.          return DRC_MSG_PROCESSED
  572.       }
  573.  
  574.       else if ( call_idx == IDR.FORWARD )                       
  575.       {
  576.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  577.          check = retval ? DAC_ENABLE : DAC_DISABLE
  578.          toggle_search_flags(SEARCH_FORWARD, retval)
  579.       }
  580.       else if ( call_idx == IDR.BACKWARD )                       
  581.       {
  582.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  583.          check = retval ? DAC_ENABLE : DAC_DISABLE
  584.          toggle_search_flags(SEARCH_FORWARD, !retval)
  585.       }
  586.       else if ( call_idx == IDC_SEARCH_CASE )
  587.       {
  588.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  589.          check = retval ? DAC_ENABLE : DAC_DISABLE
  590.          toggle_search_flags(SEARCH_CASE, retval)
  591.       }
  592.       else if ( call_idx == IDC_SEARCH_REGEX )
  593.       {
  594.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  595.          check = retval ? DAC_ENABLE : DAC_DISABLE
  596.          toggle_search_flags(SEARCH_REGEX, retval)
  597.          set_dialog_item( call_hand, IDC_SEARCH_WORD, check )
  598.          set_dialog_item( call_hand, IDC_SEARCH_MAX_MATCH, check)
  599.       }
  600.       else if ( call_idx == IDC_SEARCH_WORD )
  601.       {
  602.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  603.          check = retval ? DAC_ENABLE : DAC_DISABLE
  604.          toggle_search_flags(SEARCH_WHOLE_WORD, retval)
  605.       }
  606.       else if ( call_idx == IDC_SEARCH_MAX_MATCH )
  607.       {
  608.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  609.          check = retval ? DAC_ENABLE : DAC_DISABLE
  610.          toggle_search_flags(SEARCH_MAXIMAL_MATCH, retval)
  611.       }
  612.       else if ( call_idx == IDC_SEARCH_HIGHLIGHT )
  613.       {
  614.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  615.          check = retval ? DAC_ENABLE : DAC_DISABLE
  616.          toggle_search_flags(SEARCH_HIGHLIGHT, retval)
  617.       }
  618.       else if ( call_idx == IDC_SEARCH_CENTER )
  619.       {
  620.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  621.          check = retval ? DAC_ENABLE : DAC_DISABLE
  622.          toggle_search_flags(SEARCH_CENTER_CURSOR, retval)
  623.       }
  624.       else if ( call_idx == IDC_SEARCH_WRAP )                       
  625.       {
  626.          retval = query_dialog_item( call_hand, call_idx, DAC_CHECK) 
  627.          check = retval ? DAC_ENABLE : DAC_DISABLE
  628.          toggle_search_flags(SEARCH_WRAPS, retval)
  629.       }
  630.  
  631.       return DRC_MSG_PROCESSED
  632.    }
  633.    else if ( call_msg == DM_KILL_FOCUS ) 
  634.    {
  635.       if ( call_idx == IDE.FILES )
  636.       {
  637.          retval = query_dialog_item(call_hand, call_idx, DAC_EDIT_TEXT)
  638.  
  639.          if ( retval )
  640.          {
  641.             file_pattern = retval
  642.             set_dialog_item(call_hand, call_idx, DAC_EDIT_TEXT, file_pattern )
  643.          }
  644.       }
  645.       return DRC_MSG_PROCESSED
  646.    }
  647.    else if ( call_msg == DM_INVALID_PCHAR && 
  648.              ( call_idx == IDE.FIND_STRING   || 
  649.                call_idx == IDE.CHANGE_STRING || 
  650.                call_idx == IDE.FILES ) )
  651.    {
  652.       dlgid = call_hand
  653.       index = call_idx
  654.  
  655.       prompt_response = query_dialog_item(dlgid, index, DAC_EDIT_TEXT)
  656.       
  657.       # save prompt_response before the we execute the event
  658.       #
  659.       old_prompt_response = prompt_response
  660.  
  661.       if ( call_idx == IDE.FIND_STRING )
  662.          setup_prompt_history("SEARCH", base.SEARCH )
  663.       else if ( call_idx == IDE.CHANGE_STRING )
  664.          setup_prompt_history("REPLACE", base.REPLACE)
  665.       else if ( call_idx == IDE.FILES )
  666.          setup_prompt_history("SRCHFILES", base.SRCHFILES)
  667.  
  668.       execute_event_handler( EVENT.INVALID_PCHAR )
  669.  
  670.       if ( call_idx == IDE.FIND_STRING )
  671.          base.SEARCH = get_history_element()
  672.       else if ( call_idx == IDE.CHANGE_STRING )
  673.          base.REPLACE = get_history_element()
  674.       else if ( call_idx == IDE.FILES )
  675.          base.SRCHFILES = get_history_element()
  676.  
  677.       # only update edit box if any event handlers for EVENT.INVALID_PCHAR
  678.       # have changed the prompt_response variable.  Every time an edit box
  679.       # is updated the cursor is positioned at the end of the line.
  680.       if ( prompt_response != old_prompt_response )
  681.       {
  682.          set_dialog_item( dlgid, index, DAC_EDIT_TEXT, 
  683.                            prompt_response "", 1)
  684.       }
  685.  
  686.       return DRC_MSG_PROCESSED
  687.    }
  688.    return DRC_CONTINUE
  689. }
  690.  
  691. local function do_scope( handle, index )
  692. {
  693.    # first enable or disable all of the buttons by looking at the pattern
  694.    local enable = base.search_pattern ? DAC_ENABLE : DAC_DISABLE
  695.  
  696.    # Clear all of the search range radio buttons before setting
  697.    # the one we want
  698.  
  699.    set_dialog_item( handle, IDR.BLOCK, DAC_UNCHECK )
  700.    set_dialog_item( handle, IDR.SINGLE, DAC_UNCHECK )
  701.    set_dialog_item( handle, IDR.MULTI, DAC_UNCHECK )
  702.    set_dialog_item( handle, IDR.FILES, DAC_UNCHECK )
  703.  
  704.    set_dialog_item( handle, IDB.FIND_NEXT,   enable)
  705.    if ( FindDlg.handle == handle )
  706.    {
  707.       set_dialog_item( handle, IDB.FIND_FIRST,   enable)
  708.       set_dialog_item( handle, IDB.FIND_LAST,    enable)
  709.       set_dialog_item( handle, IDB.FIND_ALL,     enable)
  710.    }
  711.    else if ( ChangeDlg.handle == handle )
  712.    {
  713.       set_dialog_item( handle, IDB.CHANGE,         enable)
  714.       set_dialog_item( handle, IDB.CHANGE_FIND,    enable)
  715.       set_dialog_item( handle, IDB.CHANGE_ALL,     enable)
  716.    }
  717.  
  718.    # next, based on the scope, selectively disable buttons that can't 
  719.    # or shouldn't be used
  720.    #
  721.    if (search_selection_ok() || (selection_type() && index))
  722.       set_dialog_item( handle, IDR.BLOCK, DAC_ENABLE)
  723.    else
  724.       set_dialog_item( handle, IDR.BLOCK, DAC_DISABLE)
  725.  
  726.    if (index == IDR.BLOCK || !index)
  727.    {
  728.       if (search_selection_ok() || (selection_type() && index))
  729.       {
  730.          index = IDR.BLOCK
  731.       }
  732.       else
  733.          index = IDR.SINGLE  # if no selection, setup find for single buffer
  734.    }
  735.  
  736.    if ( index == IDR.SINGLE  || !index)
  737.    {
  738.       index = IDR.SINGLE
  739.    }
  740.    else if ( index == IDR.MULTI )
  741.    {
  742.       if ( FindDlg.handle == handle )
  743.       {
  744.          set_dialog_item( handle, IDB.FIND_FIRST, DAC_DISABLE)
  745.          set_dialog_item( handle, IDB.FIND_LAST,  DAC_DISABLE)
  746.       }
  747.    }
  748.    else if ( index == IDR.FILES )
  749.    {
  750.       set_dialog_item( handle, IDT.FILES,       DAC_ENABLE)
  751.       set_dialog_item( handle, IDT.FILES,       DAC_ENABLE)
  752.       set_dialog_item( handle, IDE.FILES,       DAC_ENABLE)
  753.  
  754.       set_dialog_item( handle, IDB.FIND_NEXT,   DAC_DISABLE)
  755.  
  756.       if ( FindDlg.handle == handle )
  757.       {
  758.          set_dialog_item( handle, IDB.FIND_FIRST,  DAC_DISABLE)
  759.          set_dialog_item( handle, IDB.FIND_LAST,   DAC_DISABLE)
  760.       }
  761.       else
  762.       {
  763.          set_dialog_item( handle, IDB.CHANGE_FIND, DAC_DISABLE)
  764.          set_dialog_item( handle, IDB.CHANGE,      DAC_DISABLE)
  765.       }
  766.  
  767.       set_dialog_item( handle, IDC.RECURSIVE,   DAC_ENABLE )
  768.    }
  769.  
  770.    if ( index != IDR.FILES )
  771.       {
  772.       set_dialog_item( handle, IDC.RECURSIVE,   DAC_DISABLE )
  773.       set_dialog_item( handle, IDT.FILES,       DAC_DISABLE)
  774.       set_dialog_item( handle, IDE.FILES,       DAC_DISABLE)
  775.       }
  776.  
  777.    set_dialog_item( handle, index, DAC_CHECK)
  778.    search_fid = index
  779.    return DRC_MSG_PROCESSED
  780. }
  781.  
  782. local find_search_flags
  783. local old_search_in_block
  784. local function setup_find(handle)
  785. {
  786.    local sel_type 
  787.  
  788.    old_search_in_block = and(search_flags, SEARCH_BLOCK)
  789.  
  790.    unhilight_temp_selection();
  791.  
  792.    if ( search_fid == IDR.BLOCK )
  793.    {
  794.       search_flags = or(search_flags, SEARCH_BLOCK)
  795.       search_flags = and(search_flags, not(SEARCH_ALL_BUFFERS))
  796.  
  797.       sel_type = selection_type()
  798.  
  799.       if ( search_selection_ok() && !sel_type )
  800.          {
  801.          if ( !and(search_flags, SEARCH_ADVANCE) )
  802.             restore_search_selection()
  803.          }
  804.       else if ( sel_type )
  805.          save_search_selection()
  806.    }
  807.    else if ( search_fid == IDR.MULTI )
  808.    {
  809.       if ( search_selection_ok() )
  810.          delete_search_selection()
  811.  
  812.       search_flags = and(search_flags, not(SEARCH_BLOCK))
  813.       search_flags = or(search_flags, SEARCH_ALL_BUFFERS)
  814.       remove_selection()
  815.       update_current_view()
  816.    }
  817.    else
  818.    {
  819.       if ( search_selection_ok() )
  820.          delete_search_selection()
  821.  
  822.       search_flags = and(search_flags, not(SEARCH_BLOCK+SEARCH_ALL_BUFFERS))
  823.       remove_selection()
  824.       update_current_view()
  825.    }
  826.  
  827.    find_search_flags = search_flags
  828.    if ( FindDlg.handle == handle )
  829.    {
  830.       file_pattern      = query_dialog_item(handle, IDE.FILES, DAC_TEXT)
  831.    }
  832.  
  833.    search_pattern    = query_dialog_item(handle, IDE.FIND_STRING, DAC_TEXT) 
  834.  
  835.    if ( ChangeDlg.handle && query_dialog_window( ChangeDlg.handle, DAC_SHOW ) )
  836.       replace_pattern = query_dialog_item(handle, IDE.CHANGE_STRING, DAC_TEXT) 
  837. }
  838.  
  839. # if doRestore is a 1, then there was a successful search and the position
  840. # doesn't need to be restored.
  841. #
  842. local function cleanup_find( doRestore, dlg_handle )
  843. {
  844.    if (and(find_search_flags, SEARCH_BLOCK))
  845.    {
  846.       search_flags = or(search_flags, SEARCH_BLOCK)
  847.       search_flags = and(search_flags, not(SEARCH_ALL_BUFFERS))
  848.    }
  849.    else if (and(find_search_flags, SEARCH_ALL_BUFFERS))
  850.    {
  851.       search_flags = and(search_flags, not(SEARCH_BLOCK))
  852.       search_flags = or(search_flags, SEARCH_ALL_BUFFERS)
  853.    }
  854.    else
  855.       search_flags = and(search_flags, not(SEARCH_BLOCK+SEARCH_ALL_BUFFERS))
  856.  
  857.    if ( search_fid == IDR.BLOCK )
  858.    {
  859.       if (argcount() < 2 || !dlg_handle)
  860.          dlg_handle = callback_dialog_handle
  861.  
  862.       do_scope(dlg_handle, 0)
  863.    }
  864.  
  865. #  restore_position( !doRestore )
  866.    display_update()
  867.  
  868.    if ( old_search_in_block )
  869.       or( search_flags, SEARCH_BLOCK )
  870.    else
  871.       and( search_flags, not(SEARCH_BLOCK) )
  872. }
  873.  
  874. #*********************** MORE page *****************************************
  875. local function more_dialog( big )
  876. {
  877.    local pos
  878.  
  879.    if ( argcount() < 1 )
  880.       base.big = !base.big 
  881.    else
  882.       base.big = 0+big
  883.    
  884.    if ( base.big )
  885.    {
  886.       # find the end position of dialog
  887.       #
  888.       pos = query_dialog_window( base.handle, DWC_POSITION )
  889.       base.x  = shiftr( and(pos, HIGH_WORD), 16 )
  890.       base.diff = base.x + base.big_width - screen_width
  891.       base.y = and(pos, LOW_WORD)
  892.  
  893.      if ( base.diff > 0 )
  894.         set_dialog_window( base.handle, DWC_POSITION, base.x - base.diff, base.y)
  895.  
  896.       set_dialog_item( base.handle, IDB.MORE, DAC_TEXT, "~Options <<")
  897.       set_dialog_window( base.handle, DWC_SIZE, base.big_width, base.height )
  898.       set_dialog_item( base.handle, IDC_SEARCH_WORD,      DAC_SHOW )
  899.       set_dialog_item( base.handle, IDC_SEARCH_CENTER,    DAC_SHOW )
  900.       set_dialog_item( base.handle, IDC_SEARCH_MAX_MATCH, DAC_SHOW )
  901. #     set_dialog_item( base.handle, IDC_SEARCH_ONCE,      DAC_SHOW )
  902.       set_dialog_item( base.handle, IDC_SEARCH_WRAP,      DAC_SHOW )
  903.       set_dialog_item( base.handle, IDC_SEARCH_HIGHLIGHT, DAC_SHOW )
  904. #      set_dialog_item( base.handle, IDG.SEPARATOR,        DAC_SHOW )
  905.    }
  906.    else
  907.    {
  908.       set_dialog_item( base.handle, IDB.MORE, DAC_TEXT, "~Options >>")
  909.       set_dialog_window( base.handle, DWC_SIZE, base.small_width, base.height )
  910.       set_dialog_item( base.handle, IDC_SEARCH_WORD,      DAC_HIDE )
  911.       set_dialog_item( base.handle, IDC_SEARCH_CENTER,    DAC_HIDE )
  912.       set_dialog_item( base.handle, IDC_SEARCH_MAX_MATCH, DAC_HIDE )
  913. #     set_dialog_item( base.handle, IDC_SEARCH_ONCE,      DAC_HIDE )
  914.       set_dialog_item( base.handle, IDC_SEARCH_WRAP,      DAC_HIDE )
  915.       set_dialog_item( base.handle, IDC_SEARCH_HIGHLIGHT, DAC_HIDE )
  916. #      set_dialog_item( base.handle, IDG.SEPARATOR,        DAC_HIDE )
  917.    }
  918. }
  919. local FIND_CUSHION = 30
  920. local function make_dlg_object( dlg )
  921. {
  922.    local x, pos, size, width
  923.    local end_item = DI_HELP
  924.  
  925.    # find height and width of expanded dlg
  926.    #
  927.    size = query_dialog_window( dlg.handle, DWC_SIZE )
  928.    dlg.big_width  = shiftr( and(size, HIGH_WORD), 16 )
  929.    dlg.height = and(size, LOW_WORD )
  930.    
  931.    # determine the width of the shrinked dlg by finding the x coordinate
  932.    # and width of the "Options" button and add some space 
  933.    #
  934.    size = query_dialog_item(dlg.handle, end_item, DAC_SIZE)
  935.    width  = shiftr( and(size, HIGH_WORD), 16 )
  936.    pos = query_dialog_item(dlg.handle, end_item, DAC_POSITION)
  937.    x  = shiftr( and(pos, HIGH_WORD), 16 )
  938.    dlg.small_width = x + width + FIND_CUSHION
  939.    
  940.    # position dialog at the lower-right corner
  941.    #
  942.    set_dialog_window(dlg.handle, DWC_POSITION, screen_width - dlg.small_width, 0)
  943.    
  944.    # set big state of dlg
  945.    #
  946.    dlg.big = 1
  947. }
  948.  
  949. # this function is just a safeguard since if items are hidden or shown
  950. # they are assumed to be DCTRL_STATIC_TEXT
  951. #              
  952. local function add_common_items( handle )
  953. {
  954.    add_dialog_item( handle, DI_HELP,             DCTRL_PUSH_BUTTON )
  955.    add_dialog_item( handle, IDB.FIND_NEXT,        DCTRL_DEFAULT_PUSH_BUTTON )
  956.    add_dialog_item( handle, IDE.FIND_STRING,      DCTRL_EDIT_KEY )
  957.  
  958.    # set maximum text lenght of find edit box to 100 characters
  959.    set_dialog_item( handle, IDE.FIND_STRING, DAC_SET_TEXT_LEN, 100 )
  960.  
  961.    add_dialog_item( handle, IDR.SINGLE,           DCTRL_RADIO_BUTTON )
  962.    add_dialog_item( handle, IDR.BLOCK,            DCTRL_RADIO_BUTTON )
  963.    add_dialog_item( handle, IDR.FORWARD,          DCTRL_RADIO_BUTTON )
  964.    add_dialog_item( handle, IDR.BACKWARD,         DCTRL_RADIO_BUTTON )
  965.    add_dialog_item( handle, IDC_SEARCH_MAX_MATCH, DCTRL_CHECK_BOX )
  966.    add_dialog_item( handle, IDC_SEARCH_WORD,      DCTRL_CHECK_BOX )
  967.    add_dialog_item( handle, IDC_SEARCH_CENTER,    DCTRL_CHECK_BOX )
  968. #  add_dialog_item( handle, IDC_SEARCH_ONCE,      DCTRL_CHECK_BOX )
  969.    add_dialog_item( handle, IDC_SEARCH_WRAP,      DCTRL_CHECK_BOX )
  970.    add_dialog_item( handle, IDC_SEARCH_HIGHLIGHT, DCTRL_CHECK_BOX )
  971. }
  972.  
  973. #local function debug_find_dlg()
  974. #{
  975. #   local indx
  976. #
  977. #   if ( callback_index == IDE.FIND_STRING ){
  978. #      indx = "IDE.FIND_STRING"
  979. #   } else if ( callback_index == IDE.CHANGE_STRING ){
  980. #      indx = "IDE.CHANGE_STRING"
  981. #   } else if ( callback_index == IDR.FORWARD ){
  982. #      indx = "IDR.FORWARD"
  983. #   } else if ( callback_index == IDR.BACKWARD ){
  984. #      indx = "IDR.BACKWARD"
  985. #   } else if ( callback_index == IDR.BLOCK ){
  986. #      indx = "IDR.BLOCK"
  987. #   } else if ( callback_index == IDR.SINGLE ){
  988. #      indx = "IDR.SINGLE"
  989. #   } else if ( callback_index == IDR.MULTI ){
  990. #      indx = "IDR.MULTI"
  991. #   } else if ( callback_index == IDR.FILES ){
  992. #      indx = "IDR.FILES"
  993. #   } else if ( callback_index == IDE.FILES ){
  994. #      indx = "IDE.FILES"
  995. #   } else if ( callback_index == IDT.FILES ){
  996. #      indx = "IDT.FILES"
  997. #   } else if ( callback_index == IDB.MORE ){
  998. #      indx = "IDB.MORE"
  999. #   } else if ( callback_index == IDB.FIND_NEXT ){
  1000. #      indx = "IDB.FIND_NEXT"
  1001. #   } else if ( callback_index == IDB.FIND_FIRST ){
  1002. #      indx = "IDB.FIND_FIRST"
  1003. #   } else if ( callback_index == IDB.FIND_LAST ){
  1004. #      indx = "IDB.FIND_LAST"
  1005. #   } else if ( callback_index == IDB.FIND_ALL ){
  1006. #      indx = "IDB.FIND_ALL"
  1007. #   } else if ( callback_index == IDB.CHANGE ){
  1008. #      indx = "IDB.CHANGE" 
  1009. #   } else if ( callback_index == IDB.CHANGE_FIND ){
  1010. #      indx = "IDB.CHANGE_FIND"
  1011. #   } else if ( callback_index == IDB.CHANGE_ALL ){
  1012. #      indx = "IDB.CHANGE_ALL"
  1013. #   } else
  1014. #      indx = "?unknown(" callback_index ")"
  1015. #
  1016. #   cvdebug("%s indx = (%s) init(%d)", identMsg(), indx, initializing)
  1017. #}
  1018.