1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-06-29 11:40: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 ideautorun
DIM SHARED menu$(1 TO 10, 0 TO 20) DIM SHARED menu$(1 TO 10, 0 TO 20)
DIM SHARED menusize(1 TO 10) DIM SHARED menusize(1 TO 10)
DIM SHARED menus AS INTEGER DIM SHARED menus AS INTEGER, idecontextualmenuID AS INTEGER
DIM SHARED menubar$ DIM SHARED menubar$, idecontextualSearch$
DIM SHARED ideundocombo, ideundocombochr, idenoundo, idemergeundo DIM SHARED ideundocombo, ideundocombochr, idenoundo, idemergeundo
DIM SHARED idealthighlight, ideentermenu DIM SHARED idealthighlight, ideentermenu
DIM SHARED ideautolayout, ideautoindent, ideautoindentsize, ideindentsubs, idebackupsize, idesortsubs DIM SHARED ideautolayout, ideautoindent, ideautoindentsize, ideindentsubs, idebackupsize, idesortsubs

View file

@ -103,6 +103,7 @@ ide = ide2(0)
END FUNCTION END FUNCTION
FUNCTION ide2 (ignore) FUNCTION ide2 (ignore)
STATIC MenuLocations as STRING
c$ = idecommand$ c$ = idecommand$
@ -178,14 +179,14 @@ IF idelaunched = 0 THEN
m = m + 1: i = 0 m = m + 1: i = 0
menu$(m, i) = "Edit": i = i + 1 menu$(m, i) = "Edit": i = i + 1
menu$(m, i) = "Cu#t Shift+Del or CTRL+X": 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) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
menu$(m, i) = "#Paste Shift+Ins or CTRL+V": 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) = "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) = "-": i = i + 1
menu$(m, i) = "#Undo CTRL+Z": i = i + 1 menu$(m, i) = "#Undo Ctrl+Z": i = i + 1
menu$(m, i) = "#Redo CTRL+Y": i = i + 1 menu$(m, i) = "#Redo Ctrl+Y": i = i + 1
menu$(m, i) = "-": i = i + 1 menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Comment (add ')": i = i + 1 menu$(m, i) = "Comment (add ')": i = i + 1
menu$(m, i) = "Uncomment (remove ')": i = i + 1 menu$(m, i) = "Uncomment (remove ')": i = i + 1
@ -201,13 +202,13 @@ IF idelaunched = 0 THEN
m = m + 1: i = 0 m = m + 1: i = 0
menu$(m, i) = "Search": i = i + 1 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) = "#Repeat Last Find (Shift+) F3": i = i + 1
menu$(m, i) = "#Change...": i = i + 1 menu$(m, i) = "#Change...": i = i + 1
menu$(m, i) = "-": i = i + 1 menu$(m, i) = "-": i = i + 1
menu$(m, i) = "Add/Remove #Bookmark ALT+Left": 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) = "#Next Bookmark Alt+Down": i = i + 1
menu$(m, i) = "#Previous Bookmark ALT+Up": i = i + 1 menu$(m, i) = "#Previous Bookmark Alt+Up": i = i + 1
menu$(m, i) = "-": i = i + 1 menu$(m, i) = "-": i = i + 1
menu$(m, i) = "#Go to line...": 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 menu$(m, i) = "#About...": i = i + 1
menusize(m) = i - 1 menusize(m) = i - 1
menus = m 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 IF os$ = "WIN" THEN
idepathsep$ = "\" idepathsep$ = "\"
END IF END IF
@ -294,10 +297,13 @@ IF idelaunched = 0 THEN
menubar$ = " " menubar$ = " "
MenuLocations = ""
FOR i = 1 TO menus - 1 FOR i = 1 TO menus - 1
MenuLocations = MenuLocations + MKI$(LEN(menubar$))
menubar$ = menubar$ + menu$(i, 0) + " " menubar$ = menubar$ + menu$(i, 0) + " "
NEXT NEXT
menubar$ = menubar$ + SPACE$(idewx - LEN(menubar$) - LEN(menu$(i, 0)) - 2) menubar$ = menubar$ + SPACE$(idewx - LEN(menubar$) - LEN(menu$(i, 0)) - 2)
MenuLocations = MenuLocations + MKI$(LEN(menubar$))
menubar$ = menubar$ + menu$(i, 0) + " " menubar$ = menubar$ + menu$(i, 0) + " "
@ -623,7 +629,7 @@ idefocusline = 0
'main loop 'main loop
DO DO
ideloop: ideloop:
idecontextualmenu = 0
idedeltxt 'removes temporary strings (typically created by guibox commands) by setting an index to 0 idedeltxt 'removes temporary strings (typically created by guibox commands) by setting an index to 0
STATIC ForceResize STATIC ForceResize
if IDE_AutoPosition then if IDE_AutoPosition then
@ -1462,7 +1468,7 @@ DO
END IF END IF
IF idehelp = 1 THEN 'switch windows? IF idehelp = 1 THEN 'switch windows?
IF mCLICK THEN IF mCLICK OR mCLICK2 THEN
IF IdeSystem = 3 THEN IF IdeSystem = 3 THEN
IF mY >= 2 AND mY < idewy THEN IF mY >= 2 AND mY < idewy THEN
IdeSystem = 1 IdeSystem = 1
@ -1523,9 +1529,10 @@ DO
GOTO specialchar GOTO specialchar
END IF 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 IF mX > 1 AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN 'inside text box
IdeSystem = 1 IdeSystem = 1
if mCLICK2 THEN goto invokecontextualmenu ELSE goto ideloop
END IF END IF
END IF END IF
@ -1938,6 +1945,7 @@ DO
IF KB = KEY_F1 THEN IF KB = KEY_F1 THEN
contextualhelp:
'identify word or character at current cursor position 'identify word or character at current cursor position
a$ = idegetline(idecy) a$ = idegetline(idecy)
x = idecx x = idecx
@ -2079,7 +2087,7 @@ DO
IF KALT AND (KB = KEY_DOWN OR KB = KEY_UP) THEN IF KALT AND (KB = KEY_DOWN OR KB = KEY_UP) THEN
IF IdeBmkN = 0 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 SCREEN , , 3, 0: idewait4mous: idewait4alt
idealthighlight = 0 idealthighlight = 0
LOCATE , , 0: COLOR 0, 7: LOCATE 1, 1: PRINT menubar$; LOCATE , , 0: COLOR 0, 7: LOCATE 1, 1: PRINT menubar$;
@ -2128,6 +2136,68 @@ DO
END IF END IF
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 mCLICK THEN
IF mX = idewx THEN IF mX = idewx THEN
IF iden > 1 THEN 'take no action if not slider available IF iden > 1 THEN 'take no action if not slider available
@ -2880,6 +2950,20 @@ DO
lastaltheld = altheld lastaltheld = altheld
GetInput 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 iCHANGED = 0 THEN _LIMIT 100
IF KALT THEN altheld = 1 ELSE altheld = 0 IF KALT THEN altheld = 1 ELSE altheld = 0
@ -2891,20 +2975,20 @@ DO
IF mCLICK THEN IF mCLICK THEN
IF mY = 1 THEN IF mY = 1 THEN
x = 3 FOR i = 1 to menus
FOR i = 1 TO menus x = CVI(MID$(MenuLocations, i * 2 - 1, 2))
x2 = LEN(menu$(i, 0)) + 2 x2 = CVI(MID$(MenuLocations, i * 2 - 1, 2)) + len(menu$(i, 0))
IF mX >= x AND mX < x + x2 THEN IF mX >= x and mX < x2 THEN
m = i m = i
LOCATE 1, 1: COLOR 0, 7: PRINT menubar$; LOCATE 1, 1: COLOR 0, 7: PRINT menubar$;
PCOPY 3, 0 PCOPY 3, 0
GOTO showmenu GOTO showmenu
END IF END IF
x = x + x2
NEXT NEXT
END IF 'my=1 END IF 'my=1
KB = KEY_ESC 'exit menu selection KB = KEY_ESC 'exit menu selection
END IF END IF
LOOP UNTIL KB LOOP UNTIL KB
K$ = UCASE$(K$) K$ = UCASE$(K$)
@ -2925,7 +3009,7 @@ DO
GOTO ideloop GOTO ideloop
END IF END IF
IF m < 1 THEN m = menus 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 IF KB = KEY_UP OR KB = KEY_DOWN OR KB = KEY_ENTER THEN
LOCATE 1, 1: COLOR 0, 7: PRINT menubar$; LOCATE 1, 1: COLOR 0, 7: PRINT menubar$;
PCOPY 3, 0 PCOPY 3, 0
@ -2950,14 +3034,18 @@ altheld = 1
PCOPY 0, 2 PCOPY 0, 2
SCREEN , , 1, 0 SCREEN , , 1, 0
r = 1 r = 1
IF idecontextualmenu = 1 THEN idectxmenuX = mX: idectxmenuY = mY: m = idecontextualmenuID
oldmy = mY: oldmx = mX
DO DO
PCOPY 2, 1 PCOPY 2, 1
'find pos of menu m if idecontextualmenu = 0 then
x = 4: FOR i = 1 TO m - 1: x = x + LEN(menu$(i, 0)) + 2 'find pos of menu m
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 1 x = 4: FOR i = 1 TO m - 1: x = x + LEN(menu$(i, 0)) + 2
NEXT: xx = x IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 1
LOCATE 1, xx - 1: COLOR 7, 0: PRINT " " + menu$(m, 0) + " " NEXT: xx = x
LOCATE 1, xx - 1: COLOR 7, 0: PRINT " " + menu$(m, 0) + " "
END IF
COLOR 0, 7 COLOR 0, 7
'calculate menu width 'calculate menu width
w = 0 w = 0
@ -2968,18 +3056,25 @@ DO
IF INSTR(m$, " ") THEN l = l + 2 'min 4 spacing IF INSTR(m$, " ") THEN l = l + 2 'min 4 spacing
IF l > w THEN w = l IF l > w THEN w = l
NEXT 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 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 'draw menu items
FOR i = 1 TO menusize(m) FOR i = 1 TO menusize(m)
m$ = menu$(m, i) m$ = menu$(m, i)
IF m$ = "-" THEN 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 ELSE
IF r = i THEN LOCATE i + 2, xx - 1: COLOR 7, 0: PRINT SPACE$(w + 2); IF r = i THEN LOCATE i + yy, xx - 1: COLOR 7, 0: PRINT SPACE$(w + 2);
LOCATE i + 2, xx LOCATE i + yy, xx
h = -1: x = INSTR(m$, "#"): IF x THEN h = x: m$ = LEFT$(m$, x - 1) + RIGHT$(m$, LEN(m$) - x) 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$ 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$) FOR x = 1 TO LEN(m$)
@ -3008,7 +3103,11 @@ DO
IF iCHANGED THEN IF iCHANGED THEN
IF KB THEN change = 1 IF KB THEN change = 1
IF mCLICK THEN change = 1: mousedown = 1 IF mCLICK THEN change = 1: mousedown = 1
IF mCLICK2 THEN change = 1
IF mRELEASE THEN change = 1: mouseup = 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 END IF
IF mB THEN change = 1 IF mB THEN change = 1
'revert to previous menuwhen alt pressed again 'revert to previous menuwhen alt pressed again
@ -3022,29 +3121,74 @@ DO
s = 0 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 'mouse selection
IF mouseup THEN IF mouseup THEN
'uses pre-calc xx & w
IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN
IF mY > 2 AND mY <= menusize(m) + 2 THEN IF mY > yy AND mY <= menusize(m) + yy THEN
y = mY - 2 y = mY - yy
IF menu$(m, y) <> "-" THEN IF menu$(m, y) <> "-" THEN
s = r s = r
END IF END IF
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop GOTO ideloop
END IF 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 END IF
IF mB THEN IF mB THEN
'top row 'top row
IF mY = 1 THEN IF mY = 1 THEN
idecontextualmenu = 0
lastm = m lastm = m
x = 3 x = 3
FOR i = 1 TO menus FOR i = 1 TO menus
@ -3062,18 +3206,18 @@ DO
'uses pre-calc xx & w 'uses pre-calc xx & w
IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN IF mX >= xx - 2 AND mX < xx - 2 + w + 4 THEN
IF mY > 2 AND mY <= menusize(m) + 2 THEN IF mY > yy AND mY <= menusize(m) + yy THEN
y = mY - 2 y = mY - yy
IF menu$(m, y) <> "-" THEN r = y IF menu$(m, y) <> "-" THEN r = y
END IF END IF
END IF END IF
END IF 'mb END IF 'mb
IF KB = KEY_LEFT THEN m = m - 1: r = 1 IF KB = KEY_LEFT AND idecontextualmenu = 0 THEN m = m - 1: r = 1
IF KB = KEY_RIGHT 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 < 1 THEN m = menus
IF m > menus THEN m = 1 IF m > menus AND idecontextualmenu = 0 THEN m = 1
IF KB = KEY_ESC THEN IF KB = KEY_ESC THEN
PCOPY 3, 0: SCREEN , , 3, 0 PCOPY 3, 0: SCREEN , , 3, 0
GOTO ideloop GOTO ideloop
@ -3232,7 +3376,7 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 PCOPY 2, 0
bmkremoved = 0 bmkremoved = 0
bmkremoveb: bmkremoveb:
@ -3258,10 +3402,10 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 PCOPY 2, 0
IF IdeBmkN = 0 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)"
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO ideloop GOTO ideloop
END IF END IF
@ -3273,7 +3417,7 @@ DO
END IF END IF
END IF END IF
l = idecy 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 DO
IF z = 1 THEN l = l + 1 ELSE l = l - 1 IF z = 1 THEN l = l + 1 ELSE l = l - 1
IF l < 1 THEN l = iden IF l < 1 THEN l = iden
@ -3327,6 +3471,11 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 IF menu$(m, s) = "#Contents page" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
lnk$ = "QB64 Help Menu" lnk$ = "QB64 Help Menu"
@ -3475,14 +3624,14 @@ DO
GOTO ideloop GOTO ideloop
END IF END IF
IF menu$(m, s) = "New #SUB..." THEN IF LEFT$(menu$(m, s), 8) = "New #SUB" THEN
PCOPY 2, 0 PCOPY 2, 0
idenewsf "SUB" idenewsf "SUB"
ideselect = 0 ideselect = 0
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO ideloop GOTO ideloop
END IF END IF
IF menu$(m, s) = "New #FUNCTION..." THEN IF LEFT$(menu$(m, s), 13) = "New #FUNCTION" THEN
PCOPY 2, 0 PCOPY 2, 0
idenewsf "FUNCTION" idenewsf "FUNCTION"
ideselect = 0 ideselect = 0
@ -3499,9 +3648,7 @@ DO
GOTO ideloop GOTO ideloop
END IF END IF
IF menu$(m, s) = "#Find... Ctrl+F3" THEN
IF menu$(m, s) = "#Find..." THEN
PCOPY 2, 0 PCOPY 2, 0
idefindjmp: idefindjmp:
r$ = idefind r$ = idefind
@ -3510,6 +3657,13 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 IF menu$(m, s) = "#Change..." THEN
PCOPY 2, 0 PCOPY 2, 0
r$ = idechange r$ = idechange
@ -3670,18 +3824,18 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idempaste GOTO idempaste
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
IF ideselect = 1 THEN GOTO copy2clip IF ideselect = 1 THEN GOTO copy2clip
GOTO ideloop GOTO ideloop
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
IF ideselect = 1 THEN IF ideselect = 1 THEN
K$ = CHR$(0) + "S" 'tricks handler into del after copy K$ = CHR$(0) + "S" 'tricks handler into del after copy
@ -3690,23 +3844,23 @@ DO
GOTO ideloop GOTO ideloop
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemundo GOTO idemundo
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemredo GOTO idemredo
END IF 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 PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
GOTO idemselectall GOTO idemselectall
END IF 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 IF menu$(m, s) = "#Start F5" THEN
PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt PCOPY 3, 0: SCREEN , , 3, 0: idewait4mous: idewait4alt
@ -9715,6 +9869,96 @@ menu$(m, i) = "E#xit": i = i + 1
menusize(m) = i - 1 menusize(m) = i - 1
END SUB 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$) SUB IdeAddRecent (f2$)
f$ = CRLF + f2$ + CRLF f$ = CRLF + f2$ + CRLF
fh = FREEFILE fh = FREEFILE