home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / epm603a.zip / EPMMAC.ZIP / MOUSE.E < prev    next >
Text File  |  1995-05-25  |  48KB  |  1,190 lines

  1. compile if EVERSION < 5
  2.    *** Error:  This file supports EPM only, not earlier versions of E.
  3. compile endif
  4.  
  5. compile if not defined(SMALL)  -- If SMALL not defined, then being separately compiled
  6.    include 'stdconst.e'
  7.    include 'colors.e'
  8.  define INCLUDING_FILE = 'MOUSE.E'
  9.    tryinclude 'MYCNF.E'        -- Include the user's configuration customizations.
  10.  
  11.  compile if not defined(SITE_CONFIG)
  12.     const SITE_CONFIG = 'SITECNF.E'
  13.  compile endif
  14.  compile if SITE_CONFIG
  15.     tryinclude SITE_CONFIG
  16.  compile endif
  17.  
  18. const
  19.  compile if not defined(WANT_CUA_MARKING)
  20.    WANT_CUA_MARKING = 0
  21.  compile endif
  22.  compile if not defined(WANT_STREAM_MODE)
  23.    WANT_STREAM_MODE = 0
  24.  compile endif
  25.  compile if not defined(NLS_LANGUAGE)
  26.    NLS_LANGUAGE = 'ENGLISH'
  27.  compile endif
  28.  compile if not defined(WANT_KEYWORD_HELP)
  29.    WANT_KEYWORD_HELP = 0
  30.  compile endif
  31.  compile if not defined(WANT_CHAR_OPS)
  32.    WANT_CHAR_OPS = 1
  33.  compile endif
  34.  include NLS_LANGUAGE'.e'
  35. compile endif
  36.  
  37. const
  38. compile if not defined(EPM_POINTER)
  39.  compile if EVERSION < 5.50
  40.    EPM_POINTER = SYSTEM_POINTER    -- AVIO version gets arrow pointer
  41.  compile else
  42.    EPM_POINTER = TEXT_POINTER      -- GPI version gets text pointer
  43.  compile endif
  44. compile endif
  45. compile if not defined(LOCAL_MOUSE_SUPPORT)
  46.    LOCAL_MOUSE_SUPPORT = 0
  47. compile endif
  48. compile if not defined(TOP_OF_FILE_VALID)
  49.    TOP_OF_FILE_VALID = 1       -- Can be '0', '1', or 'STREAM' (dependant on STREAM_MODE)
  50. compile endif
  51. compile if not defined(DRAG_ALWAYS_MARKS)
  52.    DRAG_ALWAYS_MARKS = 0
  53. compile endif
  54. compile if not defined(WANT_MMEDIA)
  55.    WANT_MMEDIA = 0
  56. compile endif
  57. ;compile if not defined(WANT_SPEECH)  -- Speech support removed from mouse.e; totally separate now.
  58. ;   WANT_SPEECH = 0
  59. ;compile endif
  60. compile if not defined(UNDERLINE_CURSOR)
  61.    UNDERLINE_CURSOR = 0
  62. compile endif
  63. compile if not defined(INCLUDE_STANDARD_CONTEXT_MENU)
  64.    INCLUDE_STANDARD_CONTEXT_MENU = 1
  65. compile endif
  66. compile if not defined(CLICK_ONLY_GIVES_FOCUS)  -- Can be 0, ADVANCED, CUA, or 1
  67.    CLICK_ONLY_GIVES_FOCUS = 'ADVANCED'
  68. compile endif
  69.  
  70. compile if (EPM_POINTER < 1 | EPM_POINTER > 14) & EPM_POINTER <> 'SWITCH'
  71.  *** Invalid value for EPM_POINTER - must be 1 - 14
  72. compile endif
  73.  
  74. const
  75.   BlankMouseHandler = "BlankMouseHandler"
  76.   TransparentMouseHandler = "TransparentMouseHandler"
  77.  
  78. define
  79. compile if EVERSION < 5.50
  80.    CHARG_MARK =  'CHAR'
  81.    BLOCKG_MARK = 'BLOCK'
  82. compile else                -- New mark types
  83.    CHARG_MARK =  'CHARG'
  84.    BLOCKG_MARK = 'BLOCKG'
  85. compile endif
  86.  
  87. compile if EVERSION >= 5.20
  88. defproc prestore_pos2(save_pos)
  89.    parse value save_pos with svline svcol svsx svsy
  90.    compile if EVERSION >= 5.50
  91.       .lineg = min(svline, .last);                       -- set .line
  92.    compile else
  93.       min(svline, .last);                       -- set .line
  94.    compile endif
  95.    .col = svcol;
  96.    .scrollx = svsx;
  97.    compile if EVERSION >= 5.50
  98.       .cursoryg= svsy;
  99.    compile else
  100.       .scrolly = svsy;
  101.    compile endif
  102.  
  103. defproc psave_pos2(var save_pos)
  104.    compile if EVERSION >= 5.50
  105.       save_pos=.line .col .scrollx .cursoryg
  106.    compile else
  107.       save_pos=.line .col .scrollx .scrolly
  108.    compile endif
  109. compile endif
  110.  
  111. defproc MouseLineColOff(var MouseLine, var MouseCol, var MouseOff, minline)
  112.                         -- MIN = 0 for positioning, 1 for marking.
  113.    xxx = .mousex; mx = xxx
  114.    yyy = .mousey
  115.  
  116.    -- saying 5.21, below, but not sure if it will work for that.
  117.    --    it will work for 5.50.
  118.  
  119.    compile if EVERSION >= 5.21
  120.       --call messagenwait("xxx1="xxx "yyy1="yyy);
  121.       map_point 5, xxx, yyy, off, comment;  -- map screen to line
  122.       --call messagenwait("doc xxx2="xxx "yyy2="yyy);
  123.    compile else
  124.       --call messagenwait("xxx1="xxx "yyy1="yyy);
  125.       map_point 1, xxx, yyy, off, comment;  -- map screen to doc
  126.       --call messagenwait("doc xxx2="xxx "yyy2="yyy);
  127.       map_point 2, xxx, yyy, off, comment;  -- map doc to line/col/offset
  128.       --call messagenwait("line="xxx "col="yyy "off="off);
  129.    compile endif
  130.    MouseLine = min(max(xxx, minline), .last)
  131.    MouseOff  = off
  132. compile if EVERSION >= 5.50  -- can go to MAXCOL+1 for GPI-style marking
  133.    if arg(6) then  -- Flag we want character we're on, not nearest intersection.
  134.       lne = xxx
  135.       col = yyy
  136.       map_point 6, lne, col, off, comment;  -- map line/col/offset to screen
  137.       if lne>mx then  -- The intersection selected is to the right of the mouse pointer;
  138.          yyy = yyy - 1  -- the character clicked on is the one to the left.
  139.       endif             -- Note:  could get col. 0 this way, the but following takes care of that.
  140.    endif
  141.    MouseCol  = min(max(yyy, 1), MAXCOL + (rightstr(arg(5),1)='G' and minline))
  142. compile else
  143.    MouseCol  = min(max(yyy, 1), MAXCOL)
  144. compile endif
  145.    return xxx
  146.  
  147. defproc SetMouseSet(IsGlobal, NewMSName)
  148.    universal GMousePrefix
  149.    universal LMousePrefix
  150.    universal EPM_utility_array_ID
  151.    if IsGlobal then
  152.       GMousePrefix = NewMSName"."
  153. compile if LOCAL_MOUSE_SUPPORT
  154.    else
  155.       LMousePrefix = NewMSName"."
  156.       -- Remember Local MouseSet
  157.       getfileid ThisFile;
  158.       do_array 2, EPM_utility_array_ID, "LocalMausSet."ThisFile, NewMSName
  159. compile endif
  160.    endif
  161.  
  162. compile if 0  -- Now in SELECT.E, only if LOCAL_MOUSE_SUPPORT = 1
  163. defselect
  164.    universal LMousePrefix
  165.    universal EPM_utility_array_ID
  166.    getfileid ThisFile
  167.    OldRC = Rc
  168.    rc = get_array_value(EPM_utility_array_ID, "LocalMausSet."ThisFile, NewMSName)
  169.    if RC then
  170.       if rc=-330 then
  171.          -- no mouseset bound to file yet, assume blank.
  172.          LMousePrefix = TransparentMouseHandler"."
  173.       else
  174.          call messagenwait('RC='RC)
  175.       endif
  176.       RC = OldRC
  177.    else
  178.       LMousePrefix = NewMSName"."
  179.    endif
  180. compile endif
  181.  
  182. defc processmousedropping
  183.    call psave_pos(savepos)
  184.    'MH_gotoposition'
  185.    'GetSharBuff'     -- See clipbrd.e for details
  186.    call prestore_pos(savepos)
  187.  
  188. defc processmouse
  189.    universal EPM_utility_array_ID
  190.    universal GMousePrefix
  191.    universal LMousePrefix
  192. compile if EVERSION >= '6.03'
  193.    universal WindowHadFocus
  194.    parse arg WindowHadFocus arg1
  195. compile else
  196.    arg1 = arg(1)
  197. compile endif
  198.    if LMousePrefix<>BlankMouseHandler"." then
  199.       OldRc = rc
  200. compile if LOCAL_MOUSE_SUPPORT
  201.       rc = get_array_value(EPM_utility_array_ID, LMousePrefix||arg1, CommandString)
  202.       if not rc then
  203.          -- Found it.
  204.          Rc = oldRC
  205.          if CommandString<>'' then
  206.             CommandString
  207.             return
  208.          endif
  209.       else
  210.          if rc<>-330 then
  211.             sayerror UNKNOWN_MOUSE_ERROR__MSG rc
  212.             rc = OldRc
  213.             return
  214.          endif
  215.          -- rc==-330 (no local handler found), now try to find a global one.
  216.       endif
  217. compile endif
  218.       if GMousePrefix<>BlankMouseHandler"." then
  219.          rc = get_array_value(EPM_utility_array_ID, GMousePrefix||arg1, CommandString)
  220.          if not rc then
  221.             -- Found it.
  222.             Rc = oldRC
  223.             if CommandString<>'' then
  224.                CommandString
  225.             endif
  226.             return
  227.          else
  228.             if rc<>-330 then
  229.                sayerror UNKNOWN_MOUSE_ERROR__MSG rc
  230.             else
  231.                -- nothing assigned to that action
  232.             endif
  233.             rc = OldRc
  234.             return
  235.          endif
  236.       endif
  237.    endif
  238.  
  239.  
  240. defproc register_mousehandler(IsGlobal, event, mcommand)
  241.    universal EPM_utility_array_ID
  242.    universal GMousePrefix
  243.    universal LMousePrefix
  244.    if IsGlobal then
  245.       MousePrefix = GMousePrefix
  246.    else
  247. compile if LOCAL_MOUSE_SUPPORT
  248.       if (LMousePrefix=BlankMouseHandler".") or
  249.          (LMousePrefix=TransparentMouseHandler".") then
  250.          -- can't assign to that mouse handler.
  251. compile endif
  252.          return
  253. compile if LOCAL_MOUSE_SUPPORT
  254.       endif
  255.       MousePrefix = LMousePrefix
  256. compile endif
  257.    endif
  258.    do_array 2, EPM_utility_array_ID, MousePrefix||event, mcommand   -- assign
  259.  
  260. compile if EVERSION >= '6.03' & (CLICK_ONLY_GIVES_FOCUS = 1 | CLICK_ONLY_GIVES_FOCUS = 'ADVANCED')
  261. defc MH_gotoposition2
  262.    universal WindowHadFocus
  263.    if WindowHadFocus then
  264.       'MH_gotoposition'
  265.    endif
  266. compile endif
  267.  
  268. defc MH_gotoposition
  269. compile if WANT_STREAM_MODE = 'SWITCH'
  270.    universal stream_mode
  271. compile endif
  272.    -- this procedure moves the cursor to the current mouse location.
  273. ;;
  274. ;;  Old way
  275. ;;
  276. ;;   .cursory = .mousey
  277. ;;   .cursorx = .mousex
  278. ;;
  279. compile if TOP_OF_FILE_VALID = 'STREAM' & WANT_STREAM_MODE = 'SWITCH'
  280.  compile if UNDERLINE_CURSOR
  281.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, stream_mode, '', 1)
  282.  compile else
  283.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, stream_mode)
  284.  compile endif
  285. compile elseif TOP_OF_FILE_VALID
  286.  compile if UNDERLINE_CURSOR
  287.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, 0, '', 1)
  288.  compile else
  289.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, 0)
  290.  compile endif
  291. compile else
  292.  compile if UNDERLINE_CURSOR
  293.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, 1, '', 1)
  294.  compile else
  295.    ml = MouseLineColOff(MouseLine, MouseCol, MouseOff, 1)
  296.  compile endif
  297. compile endif
  298. compile if EVERSION >= 5.20
  299.    oldsx = .scrollx;
  300.  compile if EVERSION >= 5.50
  301.    .lineg = MouseLine
  302.  compile else
  303.    oldsy = .scrolly;
  304.    MouseLine
  305.  compile endif
  306. compile else
  307.    MouseLine
  308. compile endif
  309. compile if WANT_STREAM_MODE
  310.  compile if WANT_STREAM_MODE = 'SWITCH'
  311.    if stream_mode & ml > .last then
  312.  compile else
  313.    if ml > .last then      -- If click below "Bottom of File",
  314.  compile endif
  315.       end_line             --   go to end of last line.
  316.    else
  317. compile endif  -- WANT_STREAM_MODE
  318.       .col  = MouseCol
  319.       while MouseOff<0 do
  320.          left
  321.          MouseOff = MouseOff + 1
  322.       endwhile
  323.       while MouseOff>0 do
  324.          right
  325.          MouseOff = MouseOff - 1
  326.       endwhile
  327. compile if WANT_STREAM_MODE
  328.    endif
  329. compile endif  -- WANT_STREAM_MODE
  330. compile if WANT_STREAM_MODE
  331.  compile if WANT_STREAM_MODE = 'SWITCH'
  332.    if stream_mode then
  333.  compile endif
  334.    if .col > length(textline(.line)) then
  335.       end_line
  336.    endif
  337.  compile if WANT_STREAM_MODE = 'SWITCH'
  338.    endif
  339.  compile endif
  340. compile endif
  341. compile if EVERSION >= 5.20
  342.    .scrollx = oldsx;
  343.    compile if EVERSION >= 5.50
  344.    compile else
  345.       .scrolly = oldsy;
  346.    compile endif
  347. compile endif
  348.  
  349. defc MH_begin_mark
  350.    universal BeginningLineOfDrag
  351.    universal BeginningColOfDrag
  352. compile if WANT_CUA_MARKING = 'SWITCH'
  353.    universal CUA_marking_switch
  354. compile endif
  355. compile if WANT_STREAM_MODE = 'SWITCH'
  356.    universal stream_mode
  357. compile endif
  358. compile if 0
  359.    mt = upcase(arg(1))
  360.    if marktype() then
  361.       getfileid curfileid
  362.       getmark markfirstline,marklastline,markfirstcol,marklastcol,markfileid
  363.       if marktype() <> mt or markfileid <> curfileid then
  364.          sayerror -279  -- sayerror('Text already marked')
  365.          return
  366.       endif
  367.    endif
  368. compile elseif WANT_CUA_MARKING = 1 | DRAG_ALWAYS_MARKS
  369.    unmark
  370.    'ClearSharBuff'       /* Remove Content in EPM shared text buffer */
  371. compile else
  372.  compile if WANT_CUA_MARKING = 'SWITCH'
  373.    if CUA_marking_switch then
  374.       unmark
  375.       'ClearSharBuff'       /* Remove Content in EPM shared text buffer */
  376.    endif
  377.  compile endif
  378.    if marktype() then
  379.       sayerror-279  --  sayerror('Text already marked')
  380.       return
  381.    endif
  382. compile endif
  383.    ml = MouseLineColOff(BeginningLineOfDrag, BeginningColOfDrag, MouseOff, 1, arg(1));
  384. compile if WANT_STREAM_MODE
  385.  compile if WANT_STREAM_MODE = 'SWITCH'
  386.    if stream_mode & ml > .last then
  387.  compile else
  388.    if ml > .last then      -- If click below "Bottom of File" ...
  389.  compile endif
  390.       BeginningLineOfDrag = .last
  391.       BeginningColOfDrag = length(textline(.last))+1
  392.    endif
  393. compile endif  -- WANT_STREAM_MODE
  394.    call register_mousehandler(1, 'ENDDRAG',    'MH_end_mark '||arg(1))  -- shifted
  395.    call register_mousehandler(1, 'CANCELDRAG', 'MH_cancel_mark')  -- shifted
  396.    if upcase(arg(1))='LINE' then
  397.       .DragStyle = 2
  398.    elseif leftstr(upcase(arg(1)),5)='BLOCK' then
  399.       .DragStyle = 1
  400.    elseif leftstr(upcase(arg(1)),4)='CHAR' then
  401.       .DragStyle = 3
  402.    endif
  403.    mouse_setpointer MARK_POINTER
  404. compile if DRAGCOLOR<>''
  405.    .DragColor = DRAGCOLOR
  406. compile else
  407.    .DragColor = .markcolor
  408. compile endif
  409.  
  410. defc MH_end_mark
  411.    universal BeginningLineOfDrag
  412.    universal BeginningColOfDrag
  413. compile if EPM_POINTER = 'SWITCH'
  414.    universal vEPM_POINTER
  415. compile endif
  416. compile if WANT_CUA_MARKING = 'SWITCH'
  417.    universal CUA_marking_switch
  418. compile endif
  419. compile if WANT_STREAM_MODE = 'SWITCH'
  420.    universal stream_mode
  421. compile endif
  422.    ml = MouseLineColOff(endingline, endingcol, MouseOff, 1, arg(1));
  423. compile if WANT_STREAM_MODE
  424.  compile if WANT_STREAM_MODE = 'SWITCH'
  425.    if stream_mode & ml > .last then
  426.  compile else
  427.    if ml > .last then      -- If click below "Bottom of File" ...
  428.  compile endif
  429.       endingline = .last
  430.       endingcol = length(textline(.last))+1
  431.    endif
  432.    if not (ml > .last & BeginningLineOfDrag = endingline & BeginningColOfDrag = endingcol) then
  433. compile endif  -- WANT_STREAM_MODE
  434.       unmark
  435.       getfileid CurrentFile
  436.       call pset_mark(BeginningLineOfDrag, endingline,
  437.                      BeginningColOfDrag,  max(endingcol,1),  arg(1), CurrentFile)
  438.       /* Copy the marked area to the clipboard in case we want to copy it */
  439.       /* into a different editor window.                                  */
  440.       'Copy2SharBuff'
  441. compile if WANT_STREAM_MODE
  442.    else
  443.       refresh  -- Get rid of the drag-mark highlighting
  444.    endif
  445. compile endif  -- WANT_STREAM_MODE
  446. compile if EPM_POINTER = 'SWITCH'
  447.    mouse_setpointer vEPM_POINTER
  448. compile else
  449.    mouse_setpointer EPM_POINTER
  450. compile endif
  451. compile if WANT_CUA_MARKING
  452.  compile if WANT_CUA_MARKING = 'SWITCH'
  453.    if CUA_marking_switch then
  454.  compile endif
  455.  compile if EVERSION >= '5.50'  -- GPI version allows cursor to be off screen
  456.    if .cursorx > 0 & .cursorx <= .windowwidth & .cursory > 0 & .cursory <= .windowheight then
  457.  compile endif
  458.    getmark  firstline,lastline,firstcol,lastcol,fileid
  459.    if marktype()<>'LINE' then
  460.       .col=lastcol
  461.    endif
  462.    if lastline<>.line then
  463.       if lastline>.line then '+'lastline-.line; else lastline-.line; endif
  464.    endif
  465.  compile if EVERSION >= '5.50'
  466.    endif
  467.  compile endif
  468.    'MH_gotoposition'
  469.  compile if WANT_CUA_MARKING = 'SWITCH'
  470.    endif
  471.  compile endif
  472. compile endif
  473. ;  refresh                                          ???
  474.    call register_mousehandler(1, 'ENDDRAG', ' ')
  475.    call register_mousehandler(1, 'CANCELDRAG', ' ')
  476.  
  477. defc MH_cancel_mark
  478. compile if EPM_POINTER = 'SWITCH'
  479.    universal vEPM_POINTER
  480. compile endif
  481. compile if EPM_POINTER = 'SWITCH'
  482.    mouse_setpointer vEPM_POINTER
  483. compile else
  484.    mouse_setpointer EPM_POINTER
  485. compile endif
  486.    call register_mousehandler(1, 'ENDDRAG', ' ')
  487.    call register_mousehandler(1, 'CANCELDRAG', ' ')
  488.    refresh
  489.  
  490. defc markword
  491.    if arg(1) then
  492.       'MH_gotoposition'
  493.       unmark
  494.    endif
  495.    call pmark_word()
  496.  
  497. defc marktoken
  498.    if arg(1) then
  499.       'MH_gotoposition'
  500.    endif
  501.    if find_token(startcol, endcol) then
  502.       getfileid fid
  503. compile if WANT_CHAR_OPS
  504.       call pset_mark(.line, .line, startcol, endcol, 'CHAR', fid)
  505. compile else
  506.       call pset_mark(.line, .line, startcol, endcol, 'BLOCK', fid)
  507. compile endif
  508.       'Copy2SharBuff'       /* Copy mark to shared text buffer */
  509.    endif
  510.  
  511. defc findword
  512.    if arg(1) then
  513.       'MH_gotoposition'
  514.    endif
  515.    if find_token(startcol, endcol) then
  516.       .col = endcol
  517.       'l '\1 || substr(textline(.line), startcol, (endcol-startcol)+1)
  518.    endif
  519.  
  520. compile if WANT_CUA_MARKING
  521. defc MH_singleclick
  522.  compile if EVERSION >= '6.03' & (CLICK_ONLY_GIVES_FOCUS = 1 | CLICK_ONLY_GIVES_FOCUS = 'CUA')
  523.    universal WindowHadFocus
  524.    if WindowHadFocus then
  525.  compile endif
  526.       unmark
  527.       'ClearSharBuff'       /* Remove Content in EPM shared text buffer */
  528.       'MH_gotoposition'
  529.  compile if EVERSION >= '6.03' & (CLICK_ONLY_GIVES_FOCUS = 1 | CLICK_ONLY_GIVES_FOCUS = 'CUA')
  530.    endif
  531.  compile endif
  532.  
  533. defc MH_dblclick
  534.    unmark
  535.    if .line then
  536. ;;    call pmark_word()  -- pmark_word doesn't include white space; the following does:
  537.       call pbegin_word()
  538.       mark_char
  539.       startcol = .col
  540.       tab_word
  541. ;     if .col<>length(textline(.line)) then .col = .col - 1; endif
  542.       .col = .col - 1
  543.       mark_char
  544.       .col = startcol
  545.    endif
  546.    'Copy2SharBuff'       /* Copy mark to shared text buffer */
  547.  
  548. compile endif
  549.  
  550. defc MH_double  -- Used to be just 'dupmark U', but now overloaded in a DIR listing:
  551. compile if WANT_TREE
  552.    if upcase(subword(.filename,1,2)) = '.DOS DIR' | .filename = '.tree' then
  553. compile else
  554.    if upcase(subword(.filename,1,2)) = '.DOS DIR' then
  555. compile endif
  556.       executekey a_1  -- For simplicity, assume user hasn't redefined this key:
  557.    else
  558.       unmark
  559.       'ClearSharBuff'
  560.    endif
  561.  
  562. defc MH_shiftclick
  563.    if marktype() then
  564.       getmark markfirstline,marklastline,markfirstcol,marklastcol,markfileid
  565.    else
  566.       markfileid=''
  567.    endif
  568.    unmark
  569.    getfileid CurrentFile
  570.    if CurrentFile<>markfileid then
  571.       markfirstline=.line; markfirstcol=.col
  572.    elseif markfirstline=.line & markfirstcol=.col then
  573.       markfirstline=marklastline; markfirstcol=marklastcol
  574.    endif
  575.    call MouseLineColOff(MouseLine, MouseCol, MouseOff, 1, arg(1))
  576.    call pset_mark(markfirstline, MouseLine, markfirstcol, MouseCol, 'CHAR', CurrentFile)
  577.    'MH_gotoposition'
  578.    'Copy2SharBuff'
  579.  
  580. define
  581.    SUPPORT_DRAGDROP_FOR_BOTH = 1  -- Let's see if this works; make it easy to remove if not.
  582.  
  583. #define WM_BUTTON1UP            114 -- 0x0072
  584. #define WM_BUTTON1DBLCLK        115 -- 0x0073
  585. #define WM_BUTTON2UP            117 -- 0x0075
  586. #define WM_BUTTON2DBLCLK        118 -- 0x0076
  587. #define WM_BUTTON3UP            120 -- 0x0078
  588. #define WM_CHORD               1040 -- 0x0410
  589. #define WM_BUTTON1MOTIONSTART  1041 -- 0x0411
  590. #define WM_BUTTON1MOTIONEND    1042 -- 0x0412
  591. #define WM_BUTTON1CLICK        1043 -- 0x0413
  592. #define WM_BUTTON2MOTIONSTART  1044 -- 0x0414
  593. #define WM_BUTTON2MOTIONEND    1045 -- 0x0415
  594. #define WM_BUTTON2CLICK        1046 -- 0x0416
  595. #define WM_BUTTON3MOTIONSTART  1047 -- 0x0417
  596.  
  597. definit
  598. compile if EPM32
  599.    'postme mouse_init'
  600.  
  601. defc mouse_init
  602. compile endif
  603.    universal EPM_utility_array_ID, MouseStyle
  604. compile if EPM_POINTER = 'SWITCH'
  605.    universal vEPM_POINTER
  606. compile endif
  607. compile if WANT_MMEDIA
  608.    universal mmedia_font
  609.    mmedia_font = registerfont('Multimedia Icons', 0, 0)
  610. compile endif
  611. compile if EPM_POINTER = 'SWITCH'
  612.  compile if defined(MY_MOUSE_POINTER)  -- User has a preference for the default pointer
  613.    vEPM_POINTER = MY_MOUSE_POINTER
  614.   compile if (EVERSION < 5.50 & MY_MOUSE_POINTER<>SYSTEM_POINTER) | (EVERSION >= 5.50 & MY_MOUSE_POINTER<>TEXT_POINTER)
  615.    mouse_setpointer vEPM_POINTER
  616.   compile endif
  617.  compile elseif EVERSION < 5.50        -- No user preference?  Use the default for this version of EPM.
  618.    vEPM_POINTER = SYSTEM_POINTER    -- AVIO version gets arrow pointer
  619.  compile else
  620.    vEPM_POINTER = TEXT_POINTER      -- GPI version gets text pointer
  621.  compile endif
  622. compile elseif (EVERSION < 5.21 & EPM_POINTER<>SYSTEM_POINTER) | (EVERSION >= 5.21 & EPM_POINTER<>TEXT_POINTER)
  623.    mouse_setpointer EPM_POINTER
  624. compile endif
  625.    -- set initial mousesets
  626.    SetMouseSet(1, "BaseMouseHandlers") -- default global mouseset
  627. compile if LOCAL_MOUSE_SUPPORT
  628.    SetMouseSet(0, TransparentMouseHandler)  -- default local mouseset is blank.
  629. compile endif
  630. compile if SUPPORT_DRAGDROP_FOR_BOTH
  631.  compile if EPM32
  632.    res =  atol(dynalink32( 'PMWIN',
  633.                            '#829',           -- Win32QuerySysValue
  634.                             atol(1) ||       -- HWND_DESKTOP
  635.                             atol(75),        -- SV_BEGINDRAG
  636.                             2))
  637. ;  kc_flags = itoa(substr(res,3,2), 10)
  638.    msgid = itoa(substr(res, 1, 2), 10)
  639.    if MouseStyle = 1 then but_1 = BLOCKG_MARK; c_but_1 = CHARG_MARK
  640.                      else but_1 = CHARG_MARK;  c_but_1 = BLOCKG_MARK
  641.    endif
  642.    if msgid = WM_BUTTON1MOTIONSTART then
  643.       call register_mousehandler(1, '1 BEGINDRAG 0', 'MH_begin_drag_2 0' WM_BUTTON1UP but_1 CHARG_MARK)
  644.       call register_mousehandler(1, '1 BEGINDRAG 2', 'MH_begin_drag_2 1' WM_BUTTON1UP c_but_1 CHARG_MARK)
  645.    elseif msgid = WM_BUTTON2MOTIONSTART then
  646.       call register_mousehandler(1, '2 BEGINDRAG 0', 'MH_begin_drag_2 0' WM_BUTTON2UP 'LINE')
  647.       call register_mousehandler(1, '2 BEGINDRAG 2', 'MH_begin_drag_2 1' WM_BUTTON2UP 'LINE')
  648.    elseif msgid = WM_BUTTON3MOTIONSTART then
  649.       call register_mousehandler(1, '3 BEGINDRAG 0', 'MH_begin_drag_2 0' WM_BUTTON3UP  c_but_1)
  650.       call register_mousehandler(1, '3 BEGINDRAG 2', 'MH_begin_drag_2 1' WM_BUTTON3UP  but_1)
  651.    else
  652.       -- Huh?
  653.    endif
  654.  compile else
  655.    call register_mousehandler(1, '2 BEGINDRAG 0', 'MH_begin_drag_2 0')
  656.    call register_mousehandler(1, '2 BEGINDRAG 2', 'MH_begin_drag_2 1')
  657.  compile endif
  658. compile endif
  659. compile if WANT_MMEDIA
  660.    call register_mousehandler(1, '1 SECONDCLK 0', 'MH_MM_dblclick')
  661. ;compile elseif WANT_SPEECH
  662. ;   call register_mousehandler(1, '1 SECONDCLK 0', 'SPPopUp')
  663. compile endif
  664. ;compile if WANT_SPEECH
  665. ;   call register_mousehandler(1, '1 SECONDCLK 2', 'SPPlay')
  666. ;compile endif
  667. compile if WANT_CUA_MARKING = 'SWITCH'
  668.    call MH_set_Mouse(msgid)
  669.  
  670. defproc MH_set_mouse
  671.    universal CUA_marking_switch, MouseStyle
  672.  compile if EPM32
  673.    msgid = arg(1)
  674.    if msgid='' then
  675.       res =  atol(dynalink32( 'PMWIN',
  676.                               '#829',           -- Win32QuerySysValue
  677.                                atol(1) ||       -- HWND_DESKTOP
  678.                                atol(75),        -- SV_BEGINDRAG
  679.                                2))
  680. ;     kc_flags = itoa(substr(res,3,2), 10)
  681.       msgid = itoa(substr(res, 1, 2), 10)
  682.    endif
  683.  compile endif
  684.  
  685.    if CUA_marking_switch then
  686. compile endif
  687.  
  688.       -- 1 == shift, 2 = control, 4 = alt.
  689. compile if WANT_CUA_MARKING
  690.    call register_mousehandler(1, '1 CLICK 0',     'MH_singleclick')
  691.    call register_mousehandler(1, '1 CLICK 1',     'MH_shiftclick')
  692.    call register_mousehandler(1, '1 CLICK 2',     'MH_singleclick')
  693.    call register_mousehandler(1, '1 CLICK 3',     'MH_shiftclick')
  694.    call register_mousehandler(1, '1 CLICK 4',     'MH_singleclick')
  695.    call register_mousehandler(1, '1 CLICK 5',     'MH_shiftclick')
  696.    call register_mousehandler(1, '1 CLICK 6',     'MH_singleclick')
  697.    call register_mousehandler(1, '1 CLICK 7',     'MH_shiftclick')
  698. compile if not WANT_MMEDIA -- and not WANT_SPEECH
  699.    call register_mousehandler(1, '1 SECONDCLK 0', 'MH_dblclick')
  700. compile endif
  701. ;compile if not WANT_SPEECH
  702.    call register_mousehandler(1, '1 SECONDCLK 2', 'MH_dblclick')
  703. ;compile endif
  704.    call register_mousehandler(1, '1 SECONDCLK 4', 'MH_dblclick')
  705.    call register_mousehandler(1, '1 SECONDCLK 6', 'MH_dblclick')
  706.  compile if EPM32
  707.    if msgid <> WM_BUTTON1MOTIONSTART then
  708.  compile endif
  709.    call register_mousehandler(1, '1 BEGINDRAG 0', 'MH_begin_mark' CHARG_MARK)
  710.    call register_mousehandler(1, '1 BEGINDRAG 2', 'MH_begin_mark' CHARG_MARK)
  711.  compile if EPM32
  712.    endif -- msgid <> WM_BUTTON1MOTIONSTART
  713.  compile endif
  714.    call register_mousehandler(1, '1 BEGINDRAG 1', 'MH_begin_mark' CHARG_MARK)
  715.    call register_mousehandler(1, '1 BEGINDRAG 3', 'MH_begin_mark' CHARG_MARK)
  716.    call register_mousehandler(1, '1 BEGINDRAG 4', 'MH_begin_mark' CHARG_MARK)
  717.    call register_mousehandler(1, '1 BEGINDRAG 5', 'MH_begin_mark' CHARG_MARK)
  718.    call register_mousehandler(1, '1 BEGINDRAG 6', 'MH_begin_mark' CHARG_MARK)
  719.    call register_mousehandler(1, '1 BEGINDRAG 7', 'MH_begin_mark' CHARG_MARK)
  720. compile endif  -- WANT_CUA_MARKING
  721.  
  722. compile if WANT_CUA_MARKING = 'SWITCH'
  723.  compile if EPM32
  724.    if msgid <> WM_BUTTON2MOTIONSTART then
  725.       call register_mousehandler(1, '2 BEGINDRAG 0', '')  -- Delete the defs
  726.       call register_mousehandler(1, '2 BEGINDRAG 2', '')
  727.    endif
  728.  compile else  -- else not EPM32
  729.   compile if not SUPPORT_DRAGDROP_FOR_BOTH
  730.       call register_mousehandler(1, '2 BEGINDRAG 0', '')  -- Delete the defs
  731.    compile if EVERSION >= 5.50
  732.       call register_mousehandler(1, '2 BEGINDRAG 2', '')
  733.    compile endif
  734.   compile endif  -- not SUPPORT_DRAGDROP_FOR_BOTH
  735.  compile endif  -- EPM32
  736.  compile if EPM32
  737.    if msgid <> WM_BUTTON3MOTIONSTART then
  738.       call register_mousehandler(1, '3 BEGINDRAG 0', '')  -- Delete the defs
  739.    endif
  740.  compile else  -- else not EPM32
  741.       call register_mousehandler(1, '3 BEGINDRAG 0', '')  -- from the other style.
  742.  compile endif  -- EPM32
  743.  compile if EVERSION >= 5.60 & EVERSION < '6.00c'
  744.       call register_mousehandler(1, '2 CLICK 0',     '')
  745.  compile endif
  746.       call register_mousehandler(1, '2 SECONDCLK 0', '')
  747.       call register_mousehandler(1, '2 SECONDCLK 2', '')
  748.       call register_mousehandler(1, '2 SECONDCLK 1', '')
  749.    else
  750.  compile if EVERSION < 5.50
  751.       call register_mousehandler(1, '1 CLICK 2',     '')  -- (ditto)
  752.  compile endif
  753.       call register_mousehandler(1, '1 CLICK 4',     '')
  754.       call register_mousehandler(1, '1 CLICK 6',     '')
  755. ;compile if not WANT_SPEECH
  756.      call register_mousehandler(1, '1 SECONDCLK 2', '')
  757. ;compile endif
  758.       call register_mousehandler(1, '1 SECONDCLK 4', '')
  759.       call register_mousehandler(1, '1 SECONDCLK 6', '')
  760.       call register_mousehandler(1, '1 BEGINDRAG 1', '')
  761.       call register_mousehandler(1, '1 BEGINDRAG 3', '')
  762.       call register_mousehandler(1, '1 BEGINDRAG 4', '')
  763.       call register_mousehandler(1, '1 BEGINDRAG 5', '')
  764.       call register_mousehandler(1, '1 BEGINDRAG 6', '')
  765.       call register_mousehandler(1, '1 BEGINDRAG 7', '')
  766. compile endif
  767.  
  768. compile if WANT_CUA_MARKING = 'SWITCH' or WANT_CUA_MARKING = 0
  769.  compile if EVERSION >= '6.03' & (CLICK_ONLY_GIVES_FOCUS = 1 | CLICK_ONLY_GIVES_FOCUS = 'ADVANCED')
  770.    call register_mousehandler(1, '1 CLICK 0',     'MH_gotoposition2')
  771.  compile else
  772.    call register_mousehandler(1, '1 CLICK 0',     'MH_gotoposition')
  773.  compile endif
  774.    call register_mousehandler(1, '1 CLICK 1',     'MH_shiftclick')
  775.    if MouseStyle = 1 then but_1 = BLOCKG_MARK; c_but_1 = CHARG_MARK
  776.                      else but_1 = CHARG_MARK;  c_but_1 = BLOCKG_MARK
  777.    endif
  778.  compile if EPM32
  779.    if msgid <> WM_BUTTON1MOTIONSTART then
  780.  compile endif
  781.    call register_mousehandler(1, '1 BEGINDRAG 0', 'MH_begin_mark 'but_1)
  782.    call register_mousehandler(1, '1 BEGINDRAG 2', 'MH_begin_mark 'c_but_1)
  783.  compile if EPM32
  784.    endif
  785.  compile endif
  786.  compile if EPM32
  787.    if msgid <> WM_BUTTON2MOTIONSTART then
  788.       call register_mousehandler(1, '2 BEGINDRAG 0', 'MH_begin_mark LINE')
  789.    endif
  790.  compile elseif EVERSION < 5.50
  791.    call register_mousehandler(1, '2 BEGINDRAG 0', 'MH_begin_mark LINE')
  792.  compile else
  793.   compile if not SUPPORT_DRAGDROP_FOR_BOTH
  794.    call register_mousehandler(1, '2 BEGINDRAG 0', 'MH_begin_drag_2 0')
  795.    call register_mousehandler(1, '2 BEGINDRAG 2', 'MH_begin_drag_2 1')
  796.   compile endif  -- not SUPPORT_DRAGDROP_FOR_BOTH
  797.    call register_mousehandler(1, '1 CLICK 2',     'MH_gotoposition')
  798.  compile endif
  799.  compile if EPM32
  800.    if msgid <> WM_BUTTON3MOTIONSTART then
  801.  compile endif
  802.    call register_mousehandler(1, '3 BEGINDRAG 0', 'MH_begin_mark 'c_but_1)
  803.  compile if EPM32
  804.    endif
  805.  compile endif
  806.  compile if not WANT_MMEDIA -- and not WANT_SPEECH
  807.    call register_mousehandler(1, '1 SECONDCLK 0', 'MH_double')
  808.  compile endif
  809.  compile if EVERSION >= 5.60 & EVERSION < '6.00c'
  810.    call register_mousehandler(1, '2 CLICK 0',     'MH_popup')
  811.  compile endif
  812.    call register_mousehandler(1, '2 SECONDCLK 0', 'markword 1')
  813.    call register_mousehandler(1, '2 SECONDCLK 2', 'marktoken 1')
  814.    call register_mousehandler(1, '2 SECONDCLK 1', 'findword 1')
  815.  compile if WANT_KEYWORD_HELP -- and not WANT_SPEECH
  816.    call register_mousehandler(1, '1 SECONDCLK 2', 'kwhelp')
  817.  compile endif
  818. compile endif
  819.  
  820. compile if WANT_CUA_MARKING = 'SWITCH'
  821.    endif
  822. compile endif
  823.  
  824. compile if EVERSION >= '6.00c'
  825.    call register_mousehandler(1, 'CHORD',     'Ring_More')
  826.  
  827.    -- NOP out the default action associated with user's context button
  828.    res =  atol(dynalink32( 'PMWIN',
  829.                            '#829',           -- Win32QuerySysValue
  830.                             atol(1) ||       -- HWND_DESKTOP
  831.                             atol(79),        -- SV_CONTEXTMENU
  832.                             2))
  833.    kc_flags = itoa(substr(res,3,2), 10)
  834.    msgid = itoa(substr(res, 1, 2), 10)
  835.    if msgid = WM_CHORD then
  836.       event = 'CHORD'
  837.       call register_mousehandler(1, 'CHORD', '')
  838.    else
  839.       if msgid = WM_BUTTON1DBLCLK or msgid = WM_BUTTON2DBLCLK then
  840.          event = 'SECONDCLK'
  841.       elseif msgid = WM_BUTTON1CLICK or msgid = WM_BUTTON2CLICK then
  842.          event = 'CLICK'
  843.       else
  844.          return  -- Unexpected!
  845.       endif
  846.       if msgid = WM_BUTTON1CLICK or msgid = WM_BUTTON1DBLCLK then
  847.          button = 1
  848.       else  -- must be WM_BUTTON2CLICK or WM_BUTTON2DBLCLK
  849.          button = 2
  850.       endif
  851.       call register_mousehandler(1, button event (kc_flags / 8), '')
  852.    endif
  853.  
  854.    call register_mousehandler(1, 'CONTEXTMENU',   'MH_popup')
  855. compile endif
  856.  
  857. compile if EVERSION >= 5.50
  858. defc MH_begin_drag_2  -- Determine if a click is within the selected area
  859.  compile if WANT_CUA_MARKING = 'SWITCH'
  860.    universal CUA_marking_switch
  861.  compile endif
  862.  compile if EPM32
  863.    parse arg copy_flag buttonup_msg advanced_marking_marktype CUA_marking_marktype
  864.  compile endif
  865.    if mouse_in_mark() then
  866.       call WindowMessage(0,  getpminfo(EPMINFO_EDITCLIENT),
  867.                          5434,               -- EPM_DRAGDROP_DIRECTTEXTMANIP
  868.  compile if EPM32
  869.                          copy_flag,
  870.                          buttonup_msg)
  871.  compile else
  872.                          arg(1),
  873.                          0)
  874.  compile endif
  875.  compile if EPM32
  876.       return
  877.    endif
  878.    -- EPM32 doesn't give focus on a MB2 drag, in case it's direct text manipulation.
  879.    -- Here, we know it's not, so let's activate the window:
  880.    if buttonup_msg = WM_BUTTON2UP then
  881.       call dynalink32( 'PMWIN',
  882.                        '#851',                -- ordinal for Win32SetActiveWindow
  883.                        atol(1)     ||         -- HWND_DESKTOP
  884.                        gethwndc(EPMINFO_PARENTCLIENT), 2)
  885.    endif
  886.   compile if WANT_CUA_MARKING = 'SWITCH'
  887.    if CUA_marking_switch then  -- If 'SWITCH', we do advanced mark action if CUA switch is off
  888.   compile endif  -- WANT_CUA_MARKING = 'SWITCH'
  889.   compile if WANT_CUA_MARKING
  890.       if CUA_marking_marktype<>'' then   -- This can be blank
  891.          'MH_begin_mark' CUA_marking_marktype
  892.       endif
  893.   compile endif
  894.   compile if WANT_CUA_MARKING = 'SWITCH'
  895.    else       -- else, not CUA marking switch - do the standard EPM ('advanced marking') action
  896.   compile endif  -- WANT_CUA_MARKING = 'SWITCH'
  897.   compile if WANT_CUA_MARKING <> 1
  898.       'MH_begin_mark' advanced_marking_marktype
  899.   compile endif
  900.   compile if WANT_CUA_MARKING = 'SWITCH'
  901.    endif
  902.   compile endif  -- WANT_CUA_MARKING = 'SWITCH'
  903.  
  904.  compile else  -- else not EPM32
  905.   compile if WANT_CUA_MARKING <> 1      -- If 1, we never do a line mark
  906.    compile if WANT_CUA_MARKING = 'SWITCH'
  907.    elseif not CUA_marking_switch then  -- If 'SWITCH', we line mark if CUA switch is off
  908.    compile else                         -- Else WANT_CUA_MARKING = 0
  909.    else                                -- so if not drag/drop, we always line mark.
  910.    compile endif  -- WANT_CUA_MARKING = 'SWITCH'
  911.       'MH_begin_mark LINE'
  912.   compile endif  -- WANT_CUA_MARKING <> 1
  913.    endif
  914.  compile endif  -- EPM32
  915.  
  916. defproc mouse_in_mark()
  917.    -- First we query the position of the mouse
  918.    call MouseLineColOff(MouseLine, MouseCol, MouseOff, 0)
  919.    -- Now determine if the mouse is in the selected text area.
  920.    mt=leftstr(marktype(),1)
  921.    if mt then
  922.       getfileid curfileid
  923.       getmark markfirstline,marklastline,markfirstcol,marklastcol,markfileid
  924.       if  (markfileid == curfileid) and
  925.           (MouseLine >= markfirstline) and (MouseLine <= marklastline) then
  926.  
  927.           -- assert:  at this point the only case where the text is outside
  928.           --          the selected area is on a single line char mark and a
  929.           --          block mark.  Any place else is a valid selection
  930.           if not ((mt=='C' & (markfirstline=MouseLine & MouseCol < markfirstcol) or (marklastline=MouseLine & MouseCol > marklastcol)) or
  931.                   (mt=='B' & (MouseCol < markfirstcol or MouseCol > marklastcol)) ) then
  932.              return 1
  933.           endif
  934.       endif
  935.    endif
  936. compile endif
  937.  
  938. compile if WANT_MMEDIA
  939. defc MH_MM_dblclick
  940.    universal mmedia_font
  941.  compile if WANT_CUA_MARKING = 'SWITCH'
  942.    universal CUA_marking_switch
  943.  compile endif
  944.    -- First we query the position of the mouse
  945.    call MouseLineColOff(MouseLine, MouseCol, MouseOff, 0, '', 1)
  946.    class = 0; offst = -2
  947.    query_attribute class, val, IsPush, offst, MouseCol, MouseLine
  948.    if class=32 /* | (class=16 & val=mmedia_font & IsPush) */ then
  949. ;;    if class=16 then  -- If we got the font class, go for the mmedia class.
  950. ;;       offst = -2
  951. ;;       query_attribute class, val, IsPush, offst, MouseCol, MouseLine
  952. ;;    endif
  953.       .col = MouseCol
  954.       ch = asc(substr(textline(MouseLine), MouseCol, 1))
  955. ;;    sayerror 'selected MMedia type' ch 'with value' val
  956.       circleit 1, MouseLine, MouseCol-1, MouseCol+1, 16777220
  957.       -- Send a message to the owner of the EMLE: OBJEPM_LINKOBJ = 0x15A4 = 5540
  958.       call windowmessage(0,  getpminfo(EPMINFO_PARENTFRAME), 5540, val, ch)
  959. ;compile if WANT_SPEECH
  960. ;   else  -- not mmedia, so do the standard action
  961. ;      'SPPopUp'  -- Speech support always does this
  962. ;compile else
  963.   compile if WANT_CUA_MARKING = 'SWITCH'
  964.    elseif CUA_marking_switch then
  965.   compile else
  966.    else
  967.   compile endif
  968.   compile if WANT_CUA_MARKING
  969.       'MH_dblclick'  -- This is the CUA-marking-mode action
  970.   compile endif
  971.   compile if WANT_CUA_MARKING = 'SWITCH'
  972.    else
  973.   compile endif
  974.   compile if WANT_CUA_MARKING <> 1
  975.       'MH_Double'    -- This is the normal EPM marking mode action
  976.   compile endif
  977. ;compile endif  -- WANT_SPEECH
  978.    endif
  979. compile endif
  980.  
  981. compile if EVERSION >= 5.60
  982. const
  983.    FILL_MARK_MENU__MSG = 'Fill mark'
  984.    FILL_MARK_MENUP__MSG = \1'Fill marked region with a character, overlaying current contents.'
  985.    HP_POPUP_FILL = 0
  986.    REFLOW_MARK_MENU__MSG = 'Reflow mark'
  987.    REFLOW_MARK_MENUP__MSG = \1'Reflow text in marked region.'
  988.    HP_POPUP_REFLOW = 0
  989.    MARK_WORD_MENU__MSG = 'Mark word'
  990.    MARK_WORD_MENUP__MSG = \1'Mark space-delimited word under mouse pointer.'
  991.    HP_POPUP_MARKWORD = 0
  992.    MARK_TOKEN_MENU__MSG = 'Mark identifier'
  993.    MARK_TOKEN_MENUP__MSG = \1'Mark the C-language identifier under the mouse pointer.'
  994.    HP_POPUP_MARKTOKEN = 0
  995.    FIND_TOKEN_MENU__MSG = 'Find identifier'
  996.    FIND_TOKEN_MENUP__MSG = \1'Find the next occurrence of the identifier under the mouse pointer.'
  997.    HP_POPUP_FINDTOKEN = 0
  998.    UPCASE_MARK_MENU__MSG = 'Uppercase selection'
  999.    UPCASE_MARK_MENUP__MSG = \1'Translate selected text to upper case.'
  1000.    HP_POPUP_UPCASEMARK = 0
  1001.    LOCASE_MARK_MENU__MSG = 'Lowercase selection'
  1002.    LOCASE_MARK_MENUP__MSG = \1'Translate selected text to lower case.'
  1003.    HP_POPUP_LOCASEMARK = 0
  1004.    UPCASE_WORD_MENU__MSG = 'Uppercase word'
  1005.    UPCASE_WORD_MENUP__MSG = \1'Translate word under mouse pointer to upper case.'
  1006.    HP_POPUP_UPCASEWORD = 0
  1007.    LOCASE_WORD_MENU__MSG = 'Lowercase word'
  1008.    LOCASE_WORD_MENUP__MSG = \1'Translate word under mouse pointer to lower case.'
  1009.    HP_POPUP_LOCASEWORD = 0
  1010.    SHIFT_MENU__MSG = 'Shift'
  1011.    SHIFT_MENUP__MSG = \1'Shift marked text left or right.'
  1012.    HP_POPUP_SHIFT = 0
  1013.    SHIFTLEFT_MENU__MSG = 'Shift left 1'
  1014.    SHIFTLEFT_MENUP__MSG = \1'Shift marked text left 1 character.'
  1015.    HP_POPUP_SHIFTLEFT = 0
  1016.    SHIFTLEFT3_MENU__MSG = 'Shift left 3'
  1017.    SHIFTLEFT3_MENUP__MSG = \1'Shift marked text left 3 characters.'
  1018.    HP_POPUP_SHIFTLEFT3 = 0
  1019.    SHIFTLEFT8_MENU__MSG = 'Shift left 8'
  1020.    SHIFTLEFT8_MENUP__MSG = \1'Shift marked text left 8 characters.'
  1021.    HP_POPUP_SHIFTLEFT8 = 0
  1022.    SHIFTRIGHT_MENU__MSG = 'Shift right 1'
  1023.    SHIFTRIGHT_MENUP__MSG = \1'Shift marked text right 1 character.'
  1024.    HP_POPUP_SHIFTRIGHT = 0
  1025.    SHIFTRIGHT3_MENU__MSG = 'Shift right 3'
  1026.    SHIFTRIGHT3_MENUP__MSG = \1'Shift marked text right 3 characters.'
  1027.    HP_POPUP_SHIFTRIGHT3 = 0
  1028.    SHIFTRIGHT8_MENU__MSG = 'Shift right 8'
  1029.    SHIFTRIGHT8_MENUP__MSG = \1'Shift marked text right 8 characters.'
  1030.    HP_POPUP_SHIFTRIGHT8 = 0
  1031.    CENTER_LINE_MENU__MSG = 'Center line'
  1032.    CENTER_LINE_MENUP__MSG = \1'Center line under mouse pointer vertically in window.'
  1033.    HP_POPUP_CENTERLINE = 0
  1034.    CENTER_MARK_MENU__MSG = 'Center text'
  1035.    CENTER_MARK_MENUP__MSG = \1'Center marked text within margins or block mark.'
  1036.    HP_POPUP_CENTERMARK = 0
  1037.    SORT_MARK_MENU__MSG = 'Sort'
  1038.    SORT_MARK_MENUP__MSG = \1'Sort marked lines, using block mark (if present) as key.'
  1039.    HP_POPUP_SORT = 0
  1040.    TOP_LINE_MENU__MSG = 'Scroll to top'
  1041.    TOP_LINE_MENUP__MSG = \1'Scroll so line under mouse pointer is at top of window.'
  1042.    HP_POPUP_TOP = 0
  1043.  
  1044.  compile if WANT_TREE
  1045.    LOAD_FILE_MENU__MSG = '~Load file'
  1046.    SORT_ASCENDING_MENU__MSG = '~Sort ascending'
  1047.    SORT_DATE_MENU__MSG = 'Sort by ~date'
  1048.    SORT_TIME_MENU__MSG = 'Sort by ~time'
  1049.    SORT_SIZE_MENU__MSG = 'Sort by ~size'
  1050.    SORT_EASIZE_MENU__MSG = 'Sort by ~EA size'
  1051.    SORT_FULLNAME_MENU__MSG = 'Sort by ~fully-qualified filename'
  1052.    SORT_NAME_MENU__MSG = 'Sort by ~name'
  1053.    SORT_EXTENSION_MENU__MSG = 'Sort by ~extension'
  1054.    SORT_DESCENDING_MENU__MSG = 'Sort ~descending'
  1055.  
  1056.    LOAD_FILE_MENUP__MSG = \1'Load the file or list the directory under the cursor'
  1057.    SORT_ASCENDING_MENUP__MSG = \1'Sort the file or marked lines from smallest to largest'
  1058.    SORT_XXXX_MENUP__MSG = \1'Sort the file or marked lines by the indicated attribute'
  1059.    SORT_DESCENDING_MENUP__MSG = \1'Sort the file or marked lines from largest to smallest'
  1060.  compile endif
  1061.  
  1062.  
  1063. defc MH_popup
  1064.    universal activemenu, previouslyactivemenu
  1065.  compile if CHECK_FOR_LEXAM
  1066.    universal LEXAM_is_available
  1067.  compile endif
  1068.    if previouslyactivemenu = '' then
  1069.       previouslyactivemenu = activemenu
  1070.    endif
  1071.    menuname = 'popup1'
  1072.    activemenu = menuname
  1073.  
  1074.    deletemenu menuname, 0, 0, 0
  1075.    buildsubmenu  menuname, 80, '', '', 0 , 0
  1076.    mt = leftstr(marktype(),1)
  1077.    in_mark = mouse_in_mark()  -- Save in a variable so user's include file can test.
  1078.  
  1079.  compile if INCLUDE_STANDARD_CONTEXT_MENU
  1080.   compile if WANT_TREE
  1081.    if .filename = '.tree' then
  1082.       buildmenuitem menuname, 80, 8000, LOAD_FILE_MENU__MSG\9'Alt+1',   'dokey a_1'LOAD_FILE_MENUP__MSG, 0, 0
  1083.       buildmenuitem menuname, 80, 8001, SORT_ASCENDING_MENU__MSG,   ''SORT_ASCENDING_MENUP__MSG, 17, 0
  1084.       buildmenuitem menuname, 80, 8002, SORT_DATE_MENU__MSG,        'treesort' 'D'SORT_XXXX_MENUP__MSG, 1, 0
  1085.       buildmenuitem menuname, 80, 8003, SORT_TIME_MENU__MSG,        'treesort' 'T'SORT_XXXX_MENUP__MSG, 1, 0
  1086.       buildmenuitem menuname, 80, 8004, SORT_SIZE_MENU__MSG,        'treesort' 'S'SORT_XXXX_MENUP__MSG, 1, 0
  1087.       buildmenuitem menuname, 80, 8005, SORT_EASIZE_MENU__MSG,      'treesort' 'EA'SORT_XXXX_MENUP__MSG, 1, 0
  1088.       buildmenuitem menuname, 80, 8006, SORT_FULLNAME_MENU__MSG,    'treesort' 'F'SORT_XXXX_MENUP__MSG, 1, 0
  1089.       buildmenuitem menuname, 80, 8007, SORT_NAME_MENU__MSG,        'treesort' 'N'SORT_XXXX_MENUP__MSG, 1, 0
  1090.       buildmenuitem menuname, 80, 8008, SORT_EXTENSION_MENU__MSG,   'treesort' 'EX'SORT_XXXX_MENUP__MSG, 32769, 0
  1091.       buildmenuitem menuname, 80, 8011, SORT_DESCENDING_MENU__MSG,  ''SORT_DESCENDING_MENUP__MSG, 17, 0
  1092.       buildmenuitem menuname, 80, 8012, SORT_DATE_MENU__MSG,        'treesort' '/R' 'D'SORT_XXXX_MENUP__MSG, 1, 0
  1093.       buildmenuitem menuname, 80, 8013, SORT_TIME_MENU__MSG,        'treesort' '/R' 'T'SORT_XXXX_MENUP__MSG, 1, 0
  1094.       buildmenuitem menuname, 80, 8014, SORT_SIZE_MENU__MSG,        'treesort' '/R' 'S'SORT_XXXX_MENUP__MSG, 1, 0
  1095.       buildmenuitem menuname, 80, 8015, SORT_EASIZE_MENU__MSG,      'treesort' '/R' 'EA'SORT_XXXX_MENUP__MSG, 1, 0
  1096.       buildmenuitem menuname, 80, 8016, SORT_FULLNAME_MENU__MSG,    'treesort' '/R' 'F'SORT_XXXX_MENUP__MSG, 1, 0
  1097.       buildmenuitem menuname, 80, 8017, SORT_NAME_MENU__MSG,        'treesort' '/R' 'N'SORT_XXXX_MENUP__MSG, 1, 0
  1098.       buildmenuitem menuname, 80, 8018, SORT_EXTENSION_MENU__MSG,   'treesort' '/R' 'EX'SORT_XXXX_MENUP__MSG, 32769, 0
  1099.    elseif in_mark then  -- Build Inside-Mark pop-up
  1100.   compile else
  1101.    if in_mark then  -- Build Inside-Mark pop-up
  1102.   compile endif
  1103.       gray_if_charmark = 16384*(MT='C')
  1104.       buildmenuitem menuname, 80, 8000, UNMARK_MARK_MENU__MSG\9'Alt+U',   'DUPMARK U'UNMARK_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_UNMARK, 0)
  1105.       buildmenuitem menuname, 80, 8001, DELETE_MARK_MENU__MSG\9'Alt+D',   'DUPMARK D'DELETE_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_DELETE, 0)
  1106.       buildmenuitem menuname, 80, 8002, FILL_MARK_MENU__MSG\9'Alt+F',     'Fill'FILL_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_FILL, 0)
  1107.       buildmenuitem menuname, 80, 8003, REFLOW_MARK_MENU__MSG\9'Alt+P',   'key 1 a+P'REFLOW_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_REFLOW, gray_if_charmark)
  1108.       buildmenuitem menuname, 80, 8004, UPCASE_MARK_MENU__MSG\9'Ctrl+F3', 'key 1 c+f3'UPCASE_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_UPCASEMARK, 0)
  1109.       buildmenuitem menuname, 80, 8005, LOCASE_MARK_MENU__MSG\9'Ctrl+F4', 'key 1 c+f4'LOCASE_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_LOCASEMARK, 0)
  1110.       buildmenuitem menuname, 80, 8006, SORT_MARK_MENU__MSG,              'Sort'SORT_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_SORT, gray_if_charmark)
  1111.       buildmenuitem menuname, 80, 8007, \0,                               '',          4, 0
  1112.       buildmenuitem menuname, 80, 8008, SHIFT_MENU__MSG,   ''SHIFT_MENUP__MSG, 17, mpfrom2short(HP_POPUP_SHIFT, gray_if_charmark)
  1113.       nodismiss_gifc = gray_if_charmark + 32  -- 32 = MIA_NODISMISS
  1114.       buildmenuitem menuname, 80, 8009, SHIFTLEFT_MENU__MSG\9'Ctrl+F7',   'key 1 a+F7'SHIFTLEFT_MENUP__MSG, 1, mpfrom2short(HP_POPUP_SHIFTLEFT, nodismiss_gifc)
  1115.       buildmenuitem menuname, 80, 8010, SHIFTLEFT3_MENU__MSG,             'key 3 a+F7'SHIFTLEFT3_MENUP__MSG, 1, mpfrom2short(HP_POPUP_SHIFTLEFT3, nodismiss_gifc)
  1116.       buildmenuitem menuname, 80, 8011, SHIFTLEFT8_MENU__MSG,             'key 8 a+F7'SHIFTLEFT8_MENUP__MSG, 1, mpfrom2short(HP_POPUP_SHIFTLEFT8, nodismiss_gifc)
  1117.       buildmenuitem menuname, 80, 8013, SHIFTRIGHT_MENU__MSG\9'Ctrl+F8',  'key 1 a+F8'SHIFTRIGHT_MENUP__MSG, 2049, mpfrom2short(HP_POPUP_SHIFTRIGHT, nodismiss_gifc)
  1118.       buildmenuitem menuname, 80, 8014, SHIFTRIGHT3_MENU__MSG,            'key 3 a+F8'SHIFTRIGHT3_MENUP__MSG, 1, mpfrom2short(HP_POPUP_SHIFTRIGHT3, nodismiss_gifc)
  1119.       buildmenuitem menuname, 80, 8015, SHIFTRIGHT8_MENU__MSG,            'key 8 a+F8'SHIFTRIGHT8_MENUP__MSG, 32769, mpfrom2short(HP_POPUP_SHIFTRIGHT8, nodismiss_gifc)
  1120.       buildmenuitem menuname, 80, 8016, CENTER_MARK_MENU__MSG\9'Alt+T',   'key 1 a+t'CENTER_MARK_MENUP__MSG, 0, mpfrom2short(HP_POPUP_CENTERMARK, gray_if_charmark)
  1121.       buildmenuitem menuname, 80, 8017, \0,                               '',          4, 0
  1122.       buildmenuitem menuname, 80, 8018, CLIP_COPY_MENU__MSG\9 || CTRL_KEY__MSG'+'INSERT_KEY__MSG ,  'Copy2Clip'CLIP_COPY_MENUP__MSG, 0, mpfrom2short(HP_EDIT_COPY, 0)
  1123.       buildmenuitem menuname, 80, 8019, CUT_MENU__MSG\9 || SHIFT_KEY__MSG'+'DELETE_KEY__MSG, 'Cut'CUT_MENUP__MSG,       0, mpfrom2short(HP_EDIT_CUT, 0)
  1124.       buildmenuitem menuname, 80, 8020, \0,                               '',          4, 0
  1125.       buildmenuitem menuname, 80, 8021, STYLE_MENU__MSG\9'Ctrl+Y',        'fontlist'STYLE_MENUP__MSG,    0, mpfrom2short(HP_OPTIONS_STYLE, 0)
  1126.   compile if CHECK_FOR_LEXAM
  1127.    if LEXAM_is_available then
  1128.   compile endif
  1129.       buildmenuitem menuname, 80, 8022, \0,                               '',          4, 0
  1130.       buildmenuitem menuname, 80, 8023, PROOF_MENU__MSG,           'proof'PROOF_MENUP__MSG,     0, mpfrom2short(HP_OPTIONS_PROOF, 16384*(mt<>'L'))
  1131.   compile if CHECK_FOR_LEXAM
  1132.    endif
  1133.   compile endif
  1134.       buildmenuitem menuname, 80, 8024, \0,                               '',          4, 0
  1135.   compile if ENHANCED_PRINT_SUPPORT
  1136.       buildmenuitem menuname, 80, 8025, PRT_MARK_MENU__MSG'...',          'PRINTDLG M'ENHPRT_MARK_MENUP__MSG,0, mpfrom2short(HP_EDIT_ENHPRINT, 0)
  1137.   compile else
  1138.       buildmenuitem menuname, 80, 8025, PRT_MARK_MENU__MSG,               'DUPMARK P'PRT_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_PRINT, 0)
  1139.   compile endif
  1140.    elseif mt<>' ' then  -- Build Outside-Mark pop-up
  1141.       'MH_gotoposition'
  1142.       buildmenuitem menuname, 80, 8000, COPY_MARK_MENU__MSG\9'Alt+C',     'DUPMARK C'COPY_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_COPYMARK, 0)
  1143.       buildmenuitem menuname, 80, 8001, MOVE_MARK_MENU__MSG\9'Alt+M',     'DUPMARK M'MOVE_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_MOVE, 0)
  1144.       buildmenuitem menuname, 80, 8002, OVERLAY_MARK_MENU__MSG\9'Alt+O',  'DUPMARK O'OVERLAY_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_OVERLAY, 0)
  1145.       buildmenuitem menuname, 80, 8003, ADJUST_MARK_MENU__MSG\9'Alt+A',   'DUPMARK A'ADJUST_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_ADJUST, 0)
  1146.       buildmenuitem menuname, 80, 8004, \0,                       '',          4, 0
  1147.       buildmenuitem menuname, 80, 8005, UNMARK_MARK_MENU__MSG\9'Alt+U',   'DUPMARK U'UNMARK_MARK_MENUP__MSG, 0, mpfrom2short(HP_EDIT_UNMARK, 0)
  1148.    else  -- Build No-mark pop-up
  1149.       'MH_gotoposition'
  1150.       ch = substr(textline(.line), .col, 1)
  1151.       gray_if_space = 16384*(ch=' ' | not .line)
  1152.       buildmenuitem menuname, 80, 8000, MARK_WORD_MENU__MSG\9'Alt+W',      'MARKWORD'MARK_WORD_MENUP__MSG, 0, mpfrom2short(HP_POPUP_MARKWORD, gray_if_space)
  1153.       buildmenuitem menuname, 80, 8001, MARK_TOKEN_MENU__MSG\9'CtrL+W',    'MARKTOKEN'MARK_TOKEN_MENUP__MSG, 0, mpfrom2short(HP_POPUP_MARKTOKEN, gray_if_space)
  1154.       buildmenuitem menuname, 80, 8002, FIND_TOKEN_MENU__MSG,              'FINDWORD'FIND_TOKEN_MENUP__MSG, 0, mpfrom2short(HP_POPUP_FINDTOKEN, gray_if_space)
  1155.       buildmenuitem menuname, 80, 8003, \0,                       '',          4, 0
  1156.       buildmenuitem menuname, 80, 8004, UPCASE_WORD_MENU__MSG\9'Ctrl+F1',  'key 1 c+f1'UPCASE_WORD_MENUP__MSG, 0, mpfrom2short(HP_POPUP_UPCASEWORD, gray_if_space)
  1157.       buildmenuitem menuname, 80, 8005, LOCASE_WORD_MENU__MSG\9'Ctrl+F2',  'key 1 c+f2'LOCASE_WORD_MENUP__MSG, 0, mpfrom2short(HP_POPUP_LOCASEWORD, gray_if_space)
  1158.       buildmenuitem menuname, 80, 8006, \0,                       '',          4, 0
  1159.       buildmenuitem menuname, 80, 8007, CENTER_LINE_MENU__MSG\9'Shift+F5', 'key 1 s+f5'CENTER_LINE_MENUP__MSG, 0, mpfrom2short(HP_POPUP_CENTERLINE, 0)
  1160.       buildmenuitem menuname, 80, 8008, TOP_LINE_MENU__MSG,                'newtop'TOP_LINE_MENUP__MSG, 0, mpfrom2short(HP_POPUP_TOP, 0)
  1161.    endif
  1162.  compile endif -- INCLUDE_STANDARD_CONTEXT_MENU
  1163. tryinclude 'mymsemnu.e'  -- For user-added configuration
  1164.    showmenu menuname,1
  1165.  
  1166. ; The StatWndMouseCmd and MsgWndMouseCmd are invoked with the following argument
  1167. ; when the status or message windows receive the following event:
  1168. ; '1 SECONDCLK 0' - Double-click MB1 (in any shift combination).
  1169. ; 'CONTEXTMENU'   - The context menu action (by default, single-click MB2) is executed .
  1170. ; 'CHORD'         - Both mouse buttons are pressed together.
  1171.  
  1172. defc StatWndMouseCmd  -- do nothing; present to avoid "Unknown command"
  1173.  
  1174. defc MsgWndMouseCmd
  1175.    if arg(1)='1 SECONDCLK 0' then
  1176.       'messagebox'
  1177.    endif
  1178. compile endif  -- EVERSION >= 5.60
  1179.  
  1180. compile if EPM_POINTER = 'SWITCH'
  1181. defc SetMousePointer
  1182.    universal vEPM_POINTER
  1183.    if verify(arg(1), '0123456789') then  -- contained a non-numeric character
  1184.       sayerror INVALID_NUMBER__MSG
  1185.    else
  1186.       vEPM_POINTER = arg(1)
  1187.       mouse_setpointer vEPM_POINTER
  1188.    endif
  1189. compile endif
  1190.