1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-06-26 17:10:38 +00:00

Add contextual menu and overall improvements to menu system.

- Show a contextual menu upon right-clicking on the text area. Includes the Edit menu options as well as contextual search and help.
- Add hovering to menus items.
- Adjust case of menu items (CTRL and Ctrl were being used interchangeably without a pattern).
This commit is contained in:
FellippeHeitor 2016-01-04 21:13:02 -02:00
parent deb80bdec6
commit 2abab5a916
2 changed files with 303 additions and 59 deletions

View file

@ -185,8 +185,8 @@ DIM SHARED idefocusline 'simply stores the location of the line to highlight in
DIM SHARED ideautorun
DIM SHARED menu$(1 TO 10, 0 TO 20)
DIM SHARED menusize(1 TO 10)
DIM SHARED menus AS INTEGER
DIM SHARED menubar$
DIM SHARED menus AS INTEGER, idecontextualmenuID AS INTEGER
DIM SHARED menubar$, idecontextualSearch$
DIM SHARED ideundocombo, ideundocombochr, idenoundo, idemergeundo
DIM SHARED idealthighlight, ideentermenu
DIM SHARED ideautolayout, ideautoindent, ideautoindentsize, ideindentsubs, idebackupsize, idesortsubs

View file

@ -103,6 +103,7 @@ ide = ide2(0)
END FUNCTION
FUNCTION ide2 (ignore)
STATIC MenuLocations as STRING
c$ = idecommand$
@ -178,14 +179,14 @@ IF idelaunched = 0 THEN
m = m + 1: i = 0
menu$(m, i) = "Edit": i = i + 1
menu$(m, i) = "Cu#t Shift+Del or CTRL+X": i = i + 1
menu$(m, i) = "#Copy Ctrl+Ins or CTRL+C": i = i + 1
menu$(m, i) = "#Paste Shift+Ins or CTRL+V": i = i + 1
menu$(m, i) = "Cu#t Shift+Del or Ctrl+X": i = i + 1
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
menu$(m, i) = "#Paste Shift+Ins or Ctrl+V": i = i + 1
menu$(m, i) = "Cl#ear Del": i = i + 1
menu$(m, i) = "Select #All CTRL+A": i = i + 1
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "#Undo CTRL+Z": i = i + 1
menu$(m, i) = "#Redo CTRL+Y": i = i + 1
menu$(m, i) = "#Undo Ctrl+Z": i = i + 1
menu$(m, i) = "#Redo Ctrl+Y": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Comment (add ')": i = i + 1
menu$(m, i) = "Uncomment (remove ')": i = i + 1
@ -201,13 +202,13 @@ IF idelaunched = 0 THEN
m = m + 1: i = 0
menu$(m, i) = "Search": i = i + 1
menu$(m, i) = "#Find...": i = i + 1
menu$(m, i) = "#Find... Ctrl+F3": i = i + 1
menu$(m, i) = "#Repeat Last Find (Shift+) F3": i = i + 1
menu$(m, i) = "#Change...": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Add/Remove #Bookmark ALT+Left": i = i + 1
menu$(m, i) = "#Next Bookmark ALT+Down": i = i + 1
menu$(m, i) = "#Previous Bookmark ALT+Up": i = i + 1
menu$(m, i) = "Add/Remove #Bookmark Alt+Left": i = i + 1
menu$(m, i) = "#Next Bookmark Alt+Down": i = i + 1
menu$(m, i) = "#Previous Bookmark Alt+Up": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "#Go to line...": i = i + 1
@ -261,10 +262,12 @@ IF idelaunched = 0 THEN
menu$(m, i) = "#About...": i = i + 1
menusize(m) = i - 1
menus = m
'Hidden contextual menu (ID is retrieved for later use; allows expansion of the original menu system above):
m = m + 1
idecontextualmenuID = m
IF os$ = "WIN" THEN
idepathsep$ = "\"
END IF
@ -294,10 +297,13 @@ IF idelaunched = 0 THEN
menubar$ = " "
MenuLocations = ""
FOR i = 1 TO menus - 1
MenuLocations = MenuLocations + MKI$(LEN(menubar$))
menubar$ = menubar$ + menu$(i, 0) + " "
NEXT
menubar$ = menubar$ + SPACE$(idewx - LEN(menubar$) - LEN(menu$(i, 0)) - 2)
MenuLocations = MenuLocations + MKI$(LEN(menubar$))
menubar$ = menubar$ + menu$(i, 0) + " "
@ -623,7 +629,7 @@ idefocusline = 0
'main loop
DO
ideloop:
idecontextualmenu = 0
idedeltxt 'removes temporary strings (typically created by guibox commands) by setting an index to 0
STATIC ForceResize
if IDE_AutoPosition then
@ -1462,7 +1468,7 @@ DO
END IF
IF idehelp = 1 THEN 'switch windows?
IF mCLICK THEN
IF mCLICK OR mCLICK2 THEN
IF IdeSystem = 3 THEN
IF mY >= 2 AND mY < idewy THEN
IdeSystem = 1
@ -1523,9 +1529,10 @@ DO
GOTO specialchar
END IF
IF mCLICK THEN
IF mCLICK or mCLICK2 THEN
IF mX > 1 AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN 'inside text box
IdeSystem = 1
if mCLICK2 THEN goto invokecontextualmenu ELSE goto ideloop
END IF
END IF
@ -1938,6 +1945,7 @@ DO
IF KB = KEY_F1 THEN
contextualhelp:
'identify word or character at current cursor position
a$ = idegetline(idecy)
x = idecx
@ -2079,7 +2087,7 @@ DO
IF KALT AND (KB = KEY_DOWN OR KB = KEY_UP) THEN
IF IdeBmkN = 0 THEN
idemessagebox "Bookmarks", "No bookmarks exist (Use ALT+Left to create a bookmark)"
idemessagebox "Bookmarks", "No bookmarks exist (Use Alt+Left to create a bookmark)"
SCREEN , , 3, 0: idewait4mous: idewait4alt
idealthighlight = 0
LOCATE , , 0: COLOR 0, 7: LOCATE 1, 1: PRINT menubar$;
@ -2128,6 +2136,68 @@ DO
END IF
END IF
IF mCLICK2 THEN 'Second mouse button pressed.
invokecontextualmenu:
IF mX > 1 AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN 'inside text box
if ideselect = 0 then 'Right click only positions the cursor if no selection is active
idecx = mX - 1 + idesx - 1
idecy = mY - 2 + idesy - 1
IF idecy > iden THEN idecy = iden
else 'A selection is reported but it may be that the user only clicked the screen. Let's check:
IF ideselecty1 = idecy THEN 'single line selected
a$ = idegetline(idecy)
a2$ = ""
sx1 = ideselectx1: sx2 = idecx
IF sx2 < sx1 THEN SWAP sx1, sx2
FOR x = sx1 TO sx2 - 1
IF x <= LEN(a$) THEN a2$ = a2$ + MID$(a$, x, 1) ELSE a2$ = a2$ + " "
NEXT
IF a2$ = "" THEN
'Told ya.
ideselect = 0
idecx = mX - 1 + idesx - 1
idecy = mY - 2 + idesy - 1
IF idecy > iden THEN idecy = iden
ELSE
'Ok, there is a selection. But we'll override it if the click was outside it
IF mX - 1 + idesx - 1 < sx1 OR mX - 1 + idesx - 1 > sx2 THEN
ideselect = 0
idecx = mX - 1 + idesx - 1
idecy = mY - 2 + idesy - 1
IF idecy > iden THEN idecy = iden
ideshowtext
PCOPY 3, 0
END IF
IF mY - 2 + idesy - 1 < idecy OR mY - 2 + idesy - 1 > idecy THEN
ideselect = 0
idecx = mX - 1 + idesx - 1
idecy = mY - 2 + idesy - 1
IF idecy > iden THEN idecy = iden
ideshowtext
PCOPY 3, 0
END IF
END IF
ELSE 'Multiple lines selected
'We'll override the selection if the click was outside it
sy1 = ideselecty1
sy2 = idecy
IF sy1 > sy2 THEN SWAP sy1, sy2
IF mY - 2 + idesy - 1 < sy1 OR mY - 2 + idesy - 1 > sy2 THEN
ideselect = 0
idecx = mX - 1 + idesx - 1
idecy = mY - 2 + idesy - 1
IF idecy > iden THEN idecy = iden
ideshowtext
PCOPY 3, 0
END IF
END IF
end if
idecontextualmenu = 1
IdeMakeContextualMenu
GOTO showmenu
END IF
END IF
IF mCLICK THEN
IF mX = idewx THEN
IF iden > 1 THEN 'take no action if not slider available
@ -2880,6 +2950,20 @@ DO
lastaltheld = altheld
GetInput
if oldmx <> mX or oldmy <> mY then
IF mY = 1 and idecontextualmenu = 0 THEN 'Check if we're hovering on menu bar
lastm = m
FOR i = 1 to menus
x = CVI(MID$(MenuLocations, i * 2 - 1, 2))
x2 = CVI(MID$(MenuLocations, i * 2 - 1, 2)) + len(menu$(i, 0))
IF mX >= x and mX < x2 THEN
m = i
if m <> lastm then EXIT DO 'Update the menu bar to reflect the current mouse hover
END IF
NEXT
END IF
oldmx = mX: oldmy = mY
end if
IF iCHANGED = 0 THEN _LIMIT 100
IF KALT THEN altheld = 1 ELSE altheld = 0
@ -2891,20 +2975,20 @@ DO
IF mCLICK THEN
IF mY = 1 THEN
x = 3
FOR i = 1 TO menus
x2 = LEN(menu$(i, 0)) + 2
IF mX >= x AND mX < x + x2 THEN
FOR i = 1 to menus
x = CVI(MID$(MenuLocations, i * 2 - 1, 2))
x2 = CVI(MID$(MenuLocations, i * 2 - 1, 2)) + len(menu$(i, 0))
IF mX >= x and mX < x2 THEN
m = i
LOCATE 1, 1: COLOR 0, 7: PRINT menubar$;
PCOPY 3, 0
GOTO showmenu
END IF
x = x + x2
NEXT
END IF 'my=1
KB = KEY_ESC 'exit menu selection
END IF
LOOP UNTIL KB
K$ = UCASE$(K$)
@ -2925,7 +3009,7 @@ DO
GOTO ideloop
END IF
IF m < 1 THEN m = menus
IF m > menus THEN m = 1
IF m > menus and idecontextualmenu = 0 THEN m = 1
IF KB = KEY_UP OR KB = KEY_DOWN OR KB = KEY_ENTER THEN
LOCATE 1, 1: COLOR 0, 7: PRINT menubar$;
PCOPY 3, 0
@ -2950,14 +3034,18 @@ altheld = 1
PCOPY 0, 2
SCREEN , , 1, 0
r = 1
IF idecontextualmenu = 1 THEN idectxmenuX = mX: idectxmenuY = mY: m = idecontextualmenuID
oldmy = mY: oldmx = mX
DO
PCOPY 2, 1
'find pos of menu m
x = 4: FOR i = 1 TO m - 1: x = x + LEN(menu$(i, 0)) + 2
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 1
NEXT: xx = x
LOCATE 1, xx - 1: COLOR 7, 0: PRINT " " + menu$(m, 0) + " "
if idecontextualmenu = 0 then
'find pos of menu m
x = 4: FOR i = 1 TO m - 1: x = x + LEN(menu$(i, 0)) + 2
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 1
NEXT: xx = x
LOCATE 1, xx - 1: COLOR 7, 0: PRINT " " + menu$(m, 0) + " "
END IF
COLOR 0, 7
'calculate menu width
w = 0
@ -2968,18 +3056,25 @@ DO
IF INSTR(m$, " ") THEN l = l + 2 'min 4 spacing
IF l > w THEN w = l
NEXT
yy = 2
IF idecontextualmenu = 1 THEN
xx = idectxmenuX
if xx < 3 then xx = 3
yy = idectxmenuY
if yy + menusize(m) + 2 > idewy then yy = idewy - 2 - menusize(m)
END IF
IF xx > idewx - w - 3 THEN xx = idewx - w - 3
ideboxshadow xx - 2, 2, w + 4, menusize(m) + 2
ideboxshadow xx - 2, yy, w + 4, menusize(m) + 2
'draw menu items
FOR i = 1 TO menusize(m)
m$ = menu$(m, i)
IF m$ = "-" THEN
COLOR 0, 7: LOCATE i + 2, xx - 2: PRINT chr$(195) + STRING$(w + 2, chr$(196)) + chr$(180);
COLOR 0, 7: LOCATE i + yy, xx - 2: PRINT chr$(195) + STRING$(w + 2, chr$(196)) + chr$(180);
ELSE
IF r = i THEN LOCATE i + 2, xx - 1: COLOR 7, 0: PRINT SPACE$(w + 2);
LOCATE i + 2, xx
IF r = i THEN LOCATE i + yy, xx - 1: COLOR 7, 0: PRINT SPACE$(w + 2);
LOCATE i + yy, xx
h = -1: x = INSTR(m$, "#"): IF x THEN h = x: m$ = LEFT$(m$, x - 1) + RIGHT$(m$, LEN(m$) - x)
x = INSTR(m$, " "): IF x THEN m1$ = LEFT$(m$, x - 1): m2$ = RIGHT$(m$, LEN(m$) - x - 1): m$ = m1$ + SPACE$(w - LEN(m1$) - LEN(m2$)) + m2$
FOR x = 1 TO LEN(m$)
@ -3008,7 +3103,11 @@ DO
IF iCHANGED THEN
IF KB THEN change = 1
IF mCLICK THEN change = 1: mousedown = 1
IF mCLICK2 THEN change = 1
IF mRELEASE THEN change = 1: mouseup = 1
IF mWHEEL THEN change = 1
IF mX THEN change = 1
IF mY THEN change = 1
END IF
IF mB THEN change = 1
'revert to previous menuwhen alt pressed again
@ -3022,29 +3121,74 @@ DO
s = 0
IF mWHEEL THEN
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
END IF
IF mCLICK2 AND idecontextualmenu THEN 'A new right click in the text area repositions the contextual menu
IF mX > 1 AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN
PCOPY 3, 0: SCREEN , , 3, 0
GOTO invokecontextualmenu
ELSE
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
END IF
END IF
'mouse selection
IF mouseup THEN
'uses pre-calc xx & w
IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN
IF mY > 2 AND mY <= menusize(m) + 2 THEN
y = mY - 2
IF mY > yy AND mY <= menusize(m) + yy THEN
y = mY - yy
IF menu$(m, y) <> "-" THEN
s = r
END IF
END IF
END IF
IF mX < xx - 2 OR mX >= xx - 2 + w + 4 OR mY > menusize(m) + 3 THEN
IF mX < xx - 2 OR mX >= xx - 2 + w + 4 OR mY > yy + menusize(m) + 1 or (mY < yy and idecontextualmenu) THEN
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
END IF
END IF
IF not mouseup and not mousedown THEN 'Check if we're hovering on menu options
if oldmy <> mY then
IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN
IF mY > yy AND mY <= menusize(m) + yy THEN
y = mY - yy
IF menu$(m, y) <> "-" THEN
r = y
END IF
END IF
ELSE
IF mY = 1 THEN GOTO checkmenubarhover
END IF
oldmy = mY
end if
if oldmx <> mX then
checkmenubarhover:
IF mY = 1 and idecontextualmenu = 0 THEN 'Check if we're hovering on menu bar
lastm = m
FOR i = 1 to menus
x = CVI(MID$(MenuLocations, i * 2 - 1, 2))
x2 = CVI(MID$(MenuLocations, i * 2 - 1, 2)) + len(menu$(i, 0))
IF mX >= x and mX < x2 THEN
m = i
r = 1
EXIT FOR
END IF
NEXT
END IF
oldmx = mX
end if
END IF
IF mB THEN
'top row
IF mY = 1 THEN
idecontextualmenu = 0
lastm = m
x = 3
FOR i = 1 TO menus
@ -3062,18 +3206,18 @@ DO
'uses pre-calc xx & w
IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN
IF mY > 2 AND mY <= menusize(m) + 2 THEN
y = mY - 2
IF mY > yy AND mY <= menusize(m) + yy THEN
y = mY - yy
IF menu$(m, y) <> "-" THEN r = y
END IF
END IF
END IF 'mb
IF KB = KEY_LEFT THEN m = m - 1: r = 1
IF KB = KEY_RIGHT THEN m = m + 1: r = 1
IF KB = KEY_LEFT AND idecontextualmenu = 0 THEN m = m - 1: r = 1
IF KB = KEY_RIGHT AND idecontextualmenu = 0 THEN m = m + 1: r = 1
IF m < 1 THEN m = menus
IF m > menus THEN m = 1
IF m > menus AND idecontextualmenu = 0 THEN m = 1
IF KB = KEY_ESC THEN
PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop
@ -3232,7 +3376,7 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "Add/Remove #Bookmark ALT+Left" THEN
IF menu$(m, s) = "Add/Remove #Bookmark Alt+Left" THEN
PCOPY 2, 0
bmkremoved = 0
bmkremoveb:
@ -3258,10 +3402,10 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "#Next Bookmark ALT+Down" OR menu$(m, s) = "#Previous Bookmark ALT+Up" THEN
IF menu$(m, s) = "#Next Bookmark Alt+Down" OR menu$(m, s) = "#Previous Bookmark Alt+Up" THEN
PCOPY 2, 0
IF IdeBmkN = 0 THEN
idemessagebox "Bookmarks", "No bookmarks exist (Use ALT+Left to create a bookmark)"
idemessagebox "Bookmarks", "No bookmarks exist (Use Alt+Left to create a bookmark)"
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO ideloop
END IF
@ -3273,7 +3417,7 @@ DO
END IF
END IF
l = idecy
z = 0: IF menu$(m, s) = "#Next Bookmark ALT+Down" THEN z = 1
z = 0: IF menu$(m, s) = "#Next Bookmark Alt+Down" THEN z = 1
DO
IF z = 1 THEN l = l + 1 ELSE l = l - 1
IF l < 1 THEN l = iden
@ -3327,6 +3471,11 @@ DO
GOTO ideloop
END IF
IF left$(menu$(m, s), 10) = "#Help on '" THEN 'Contextual menu Help
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO contextualhelp
END IF
IF menu$(m, s) = "#Contents page" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
lnk$ = "QB64 Help Menu"
@ -3475,14 +3624,14 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "New #SUB..." THEN
IF LEFT$(menu$(m, s), 8) = "New #SUB" THEN
PCOPY 2, 0
idenewsf "SUB"
ideselect = 0
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO ideloop
END IF
IF menu$(m, s) = "New #FUNCTION..." THEN
IF LEFT$(menu$(m, s), 13) = "New #FUNCTION" THEN
PCOPY 2, 0
idenewsf "FUNCTION"
ideselect = 0
@ -3499,9 +3648,7 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "#Find..." THEN
IF menu$(m, s) = "#Find... Ctrl+F3" THEN
PCOPY 2, 0
idefindjmp:
r$ = idefind
@ -3510,6 +3657,13 @@ DO
GOTO ideloop
END IF
IF left$(menu$(m, s), 6) = "Find '" THEN 'Contextual menu Find
idefindtext = idecontextualSearch$
IdeAddSearched idefindtext
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemf3
END IF
IF menu$(m, s) = "#Change..." THEN
PCOPY 2, 0
r$ = idechange
@ -3670,18 +3824,18 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "#Paste Shift+Ins or CTRL+V" THEN
IF menu$(m, s) = "#Paste Shift+Ins or Ctrl+V" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idempaste
END IF
IF menu$(m, s) = "#Copy Ctrl+Ins or CTRL+C" THEN
IF menu$(m, s) = "#Copy Ctrl+Ins or Ctrl+C" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
IF ideselect = 1 THEN GOTO copy2clip
GOTO ideloop
END IF
IF menu$(m, s) = "Cu#t Shift+Del or CTRL+X" THEN
IF menu$(m, s) = "Cu#t Shift+Del or Ctrl+X" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
IF ideselect = 1 THEN
K$ = CHR$(0) + "S" 'tricks handler into del after copy
@ -3690,23 +3844,23 @@ DO
GOTO ideloop
END IF
IF menu$(m, s) = "#Undo CTRL+Z" THEN
IF menu$(m, s) = "#Undo Ctrl+Z" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemundo
END IF
IF menu$(m, s) = "#Redo CTRL+Y" THEN
IF menu$(m, s) = "#Redo Ctrl+Y" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemredo
END IF
IF menu$(m, s) = "Select #All CTRL+A" THEN
IF menu$(m, s) = "Select #All Ctrl+A" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemselectall
END IF
menu$(m, i) = "Select #All CTRL+A": i = i + 1
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
IF menu$(m, s) = "#Start F5" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
@ -9715,6 +9869,96 @@ menu$(m, i) = "E#xit": i = i + 1
menusize(m) = i - 1
END SUB
SUB IdeMakeContextualMenu
m = idecontextualmenuID: i = 0
menu$(m, i) = "Contextual": i = i + 1
'Figure out if the user wants to search for a selected term -- copied from idefind$
IF ideselect THEN
IF ideselecty1 = idecy THEN 'single line selected
a$ = idegetline(idecy)
a2$ = ""
sx1 = ideselectx1: sx2 = idecx
IF sx2 < sx1 THEN SWAP sx1, sx2
FOR x = sx1 TO sx2 - 1
IF x <= LEN(a$) THEN a2$ = a2$ + MID$(a$, x, 1) ELSE a2$ = a2$ + " "
NEXT
END IF
IF len(a2$) > 0 THEN
sela2$ = ucase$(a2$)
idecontextualSearch$ = a2$
IF LEN(a2$) > 22 THEN
a2$ = LEFT$(a2$, 19) + string$(3, 250)
END IF
menu$(m, i) = "Find '" + a2$ + "'": i = i + 1
END IF
END IF
'identify if word or character at current cursor position is in the help system -- copied from ide2
a$ = idegetline(idecy)
x = idecx
HelpOnSelection = 0
IF x <= LEN(a$) THEN
IF alphanumeric(ASC(a$, x)) THEN
x1 = x
DO WHILE x1 > 1
IF alphanumeric(ASC(a$, x1 - 1)) OR ASC(a$, x1 - 1) = 36 THEN x1 = x1 - 1 ELSE EXIT DO
LOOP
x2 = x
DO WHILE x2 < LEN(a$)
IF alphanumeric(ASC(a$, x2 + 1)) OR ASC(a$, x2 + 1) = 36 THEN x2 = x2 + 1 ELSE EXIT DO
LOOP
a2$ = MID$(a$, x1, x2 - x1 + 1)
ELSE
a2$ = CHR$(ASC(a$, x))
END IF
a2$ = UCASE$(a2$)
'check if F1 is in help links
fh = FREEFILE
OPEN "internal\help\links.bin" FOR INPUT AS #fh
lnks = 0: lnks$ = CHR$(0)
DO UNTIL EOF(fh)
LINE INPUT #fh, l$
c = INSTR(l$, ","): l1$ = LEFT$(l$, c - 1): l2$ = RIGHT$(l$, LEN(l$) - c)
IF a2$ = UCASE$(l1$) THEN
IF INSTR(lnks$, CHR$(0) + l2$ + CHR$(0)) = 0 THEN
lnks = lnks + 1
EXIT DO
END IF
END IF
LOOP
CLOSE #fh
IF lnks THEN
IF LEN(l2$) > 15 THEN
l2$ = LEFT$(l2$, 12) + string$(3, 250)
END IF
if instr(l2$, "Parenthesis") = 0 then
menu$(m, i) = "#Help on '" + l2$ + "'": i = i + 1
end if
END IF
END IF
IF i > 1 THEN
menu$(m, i) = "-": i = i + 1
END IF
menu$(m, i) = "Cu#t Shift+Del or Ctrl+X": i = i + 1
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
menu$(m, i) = "#Paste Shift+Ins or Ctrl+V": i = i + 1
menu$(m, i) = "Cl#ear Del": i = i + 1
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "#Undo Ctrl+Z": i = i + 1
menu$(m, i) = "#Redo Ctrl+Y": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Comment (add ')": i = i + 1
menu$(m, i) = "Uncomment (remove ')": i = i + 1
menu$(m, i) = "-": i = i + 1
menu$(m, i) = "New #SUB...": i = i + 1
menu$(m, i) = "New #FUNCTION...": i = i + 1
menusize(m) = i - 1
END SUB
SUB IdeAddRecent (f2$)
f$ = CRLF + f2$ + CRLF
fh = FREEFILE