mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-08-30 11:50:16 +00:00
- reset .gitignore to disallow any internal\help uploads again (folder is created during build now) - get rid of old changelog (changes can better be summarized at release pages) - added a change by @dkearns from the old QB64Team repository (comment highlighting after `REM`)
20158 lines
796 KiB
QBasic
20158 lines
796 KiB
QBasic
FUNCTION ide (ignore)
|
|
'Note: ide is a function which optimizes the interaction between the IDE and compiler (ide2)
|
|
' by avoiding unnecessary bloat associated with entering the main IDE function 'ide2'
|
|
ignore = ignore 'just to clear warnings of unused variables
|
|
IF idecommand$ <> "" THEN cmd = ASC(idecommand$)
|
|
IF cmd = 3 THEN 'request next line (compiler->ide)
|
|
IF idecompiledline < iden THEN
|
|
IF idecompiledline < idesy OR idecompiledline > idesy + (idewy - 9) THEN 'off screen?
|
|
IF _EXIT AND 1 THEN ideexit = 1
|
|
IF ideexit = 0 THEN
|
|
GetInput 'check for new input
|
|
IF iCHANGED = 0 AND mB = 0 THEN
|
|
|
|
'-------------------- layout considerations --------------------
|
|
'previous line was OK, so use layout if available
|
|
IF ideautolayout <> 0 OR ideautoindent <> 0 THEN
|
|
IF LEN(layout$) THEN
|
|
|
|
'calculate recommended indent level
|
|
l = LEN(layout$)
|
|
FOR i = 1 TO l
|
|
IF ASC(layout$, i) <> 32 OR i = l THEN
|
|
IF ASC(layout$, i) = 32 THEN
|
|
layout$ = "": indent = i
|
|
ELSE
|
|
indent = i - 1
|
|
layout$ = RIGHT$(layout$, LEN(layout$) - i + 1)
|
|
END IF
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
|
|
IF ideautolayout THEN
|
|
layout2$ = layout$: i2 = 1
|
|
ignoresp = 0
|
|
FOR i = 1 TO LEN(layout$)
|
|
a = ASC(layout$, i)
|
|
IF a = 34 THEN
|
|
ignoresp = ignoresp + 1: IF ignoresp = 2 THEN ignoresp = 0
|
|
END IF
|
|
IF ignoresp = 0 THEN
|
|
IF a = sp_asc THEN ASC(layout2$, i2) = 32: i2 = i2 + 1: GOTO skipchar
|
|
IF a = sp2_asc THEN GOTO skipchar
|
|
END IF
|
|
ASC(layout2$, i2) = a: i2 = i2 + 1
|
|
skipchar:
|
|
NEXT
|
|
layout$ = LEFT$(layout2$, i2 - 1)
|
|
END IF
|
|
|
|
IF ideautoindent = 0 THEN
|
|
'note: can assume auto-format
|
|
'calculate old indent (if any)
|
|
indent = 0
|
|
l = LEN(idecompiledline$)
|
|
FOR i = 1 TO l
|
|
IF ASC(idecompiledline$, i) <> 32 OR i = l THEN
|
|
indent = i - 1
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
indent$ = SPACE$(indent)
|
|
ELSE
|
|
indent$ = SPACE$(indent * ideautoindentsize)
|
|
END IF
|
|
|
|
IF ideautolayout = 0 THEN
|
|
'note: can assume auto-indent
|
|
l = LEN(idecompiledline$)
|
|
layout$ = ""
|
|
FOR i = 1 TO l
|
|
IF ASC(idecompiledline$, i) <> 32 OR i = l THEN
|
|
layout$ = RIGHT$(idecompiledline$, l - i + 1)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
IF LEN(layout$) THEN
|
|
layout$ = indent$ + layout$
|
|
IF idecompiledline$ <> layout$ THEN
|
|
idesetline idecompiledline, layout$
|
|
END IF
|
|
END IF 'len(layout$) after modification
|
|
|
|
END IF 'len(layout$)
|
|
|
|
END IF 'using layout/indent
|
|
'---------------------------------------------------------------
|
|
|
|
idecompiledline = idecompiledline + 1
|
|
idecompiledline$ = idegetline(idecompiledline)
|
|
ide = 4
|
|
idereturn$ = idecompiledline$
|
|
|
|
'Update compilation progress on the status bar
|
|
IF ideautorun <> 0 THEN
|
|
IF prepass THEN
|
|
status.progress$ = str2$(INT((idecompiledline * 100) / (iden * 2)))
|
|
status.progress$ = STRING$(3 - LEN(status.progress$), 32) + status.progress$ + "%"
|
|
ELSE
|
|
status.progress$ = str2$(INT(((iden + idecompiledline) * 100) / (iden * 2)))
|
|
status.progress$ = STRING$(3 - LEN(status.progress$), 32) + status.progress$ + "%"
|
|
END IF
|
|
IdeInfo = CHR$(0) + status.progress$
|
|
'ELSE
|
|
' STATIC p AS _BYTE, lastUpdateDots AS SINGLE
|
|
' IF TIMER - lastUpdateDots > .5 THEN
|
|
' lastUpdateDots = TIMER
|
|
' p = p + 1
|
|
' temp$ = STRING$(3, 250) '"..."
|
|
' IF p > 3 THEN p = 1
|
|
' ASC(temp$, p) = 254
|
|
' COLOR 7, 1
|
|
' _PRINTSTRING (2, idewy - 3), temp$ 'compilation progress indicator
|
|
' END IF
|
|
END IF
|
|
UpdateIdeInfo
|
|
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF iCHANGED THEN iCHECKLATER = 1
|
|
END IF 'ideexit
|
|
END IF 'not on screen
|
|
ELSE
|
|
IF IdeSystem <> 3 OR LEFT$(IdeInfo, 19) <> "Selection length = " THEN IdeInfo = ""
|
|
UpdateIdeInfo
|
|
END IF 'idecompiledline<iden
|
|
END IF
|
|
|
|
ide = ide2(0)
|
|
END FUNCTION
|
|
|
|
FUNCTION ide2 (ignore)
|
|
STATIC MenuLocations AS STRING
|
|
STATIC idesystem2.issel AS _BYTE
|
|
STATIC idesystem2.sx1 AS LONG
|
|
STATIC idesystem2.v1 AS LONG
|
|
STATIC AttemptToLoadRecent AS _BYTE
|
|
STATIC old.mX, old.mY
|
|
STATIC last.TBclick#, wholeword.select AS _BYTE
|
|
STATIC wholeword.selectx1, wholeword.idecx
|
|
STATIC wholeword.selecty1, wholeword.idecy
|
|
STATIC ForceResize, IDECompilationRequested AS _BYTE
|
|
STATIC QuickNavHover AS _BYTE, FindFieldHover AS _BYTE
|
|
STATIC VersionInfoHover AS _BYTE, LineNumberHover AS _BYTE
|
|
STATIC waitingForVarList AS _BYTE
|
|
|
|
ignore = ignore 'just to clear warnings of unused variables
|
|
|
|
char.sep$ = CHR$(34) + " =<>+-/\^:;,*()."
|
|
|
|
c$ = idecommand$
|
|
debugnextline = 0
|
|
|
|
IDEerrorMessage:
|
|
'report any IDE errors which have occurred
|
|
IF ideerror THEN
|
|
IF IdeDebugMode THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
END IF
|
|
mustdisplay = 1
|
|
IF ideerror = 1 THEN errorat$ = "Internal IDE error"
|
|
IF ideerror = 2 THEN errorat$ = "File not found"
|
|
IF ideerror = 3 THEN errorat$ = "File access error": CLOSE #150
|
|
IF ideerror = 4 THEN errorat$ = "Path not found"
|
|
IF ideerror = 5 THEN errorat$ = "Cannot create folder"
|
|
IF ideerror = 6 THEN errorat$ = "Cannot save file"
|
|
IF ideerror = -1 THEN GOTO errorReportDone 'fail quietly - like ON ERROR RESUME NEXT
|
|
|
|
qberrorcode = ERR
|
|
IF qberrorcode THEN
|
|
ideerrormessageTITLE$ = "Error " + str2$(qberrorcode)
|
|
ELSE
|
|
ideerrormessageTITLE$ = "Error"
|
|
END IF
|
|
|
|
IF (ideerror > 1) THEN
|
|
'Don't show too much detail if user just tried loading an invalid file
|
|
ideerrormessageTITLE$ = ideerrormessageTITLE$ + " ("
|
|
IF _ERRORLINE > 0 OR _INCLERRORLINE > 0 THEN
|
|
ideerrormessageTITLE$ = ideerrormessageTITLE$ + str2$(_ERRORLINE) + "-" + str2$(_INCLERRORLINE)
|
|
END IF
|
|
IF IsCiVersion THEN ideerrormessageTITLE$ = ideerrormessageTITLE$ + "-" + Version$
|
|
ideerrormessageTITLE$ = ideerrormessageTITLE$ + ")"
|
|
IF ideerrormessageTITLE$ = "Error ()" THEN ideerrormessageTITLE$ = "Error"
|
|
IF AttemptToLoadRecent = -1 THEN
|
|
'Offer to cleanup recent file list, removing invalid entries
|
|
PCOPY 2, 0
|
|
result = idemessagebox(ideerrormessageTITLE$, errorat$ + "." + CHR$(10) + CHR$(10) + "Remove broken links from recent files?", "#Yes;#No")
|
|
IF result = 1 THEN
|
|
GOSUB CleanUpRecentList
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO errorReportDone
|
|
END IF
|
|
ELSE
|
|
'a more serious error; let's report something that'll help bug reporting
|
|
inclerrorline = _INCLERRORLINE
|
|
IF inclerrorline THEN
|
|
errorat$ = errorat$ + CHR$(10) + " " + CHR$(10) + "(module: " + _
|
|
RemoveFileExtension$(LEFT$(_INCLERRORFILE$, 60))
|
|
errorat$ = errorat$ + ", on line: " + str2$(inclerrorline)
|
|
IF IsCiVersion THEN errorat$ = errorat$ + ", " + Version$
|
|
errorat$ = errorat$ + ")"
|
|
ELSE
|
|
errorat$ = errorat$ + CHR$(10) + " " + CHR$(10) + "(on line: " + str2$(_ERRORLINE)
|
|
IF IsCiVersion THEN errorat$ = errorat$ + ", " + Version$
|
|
errorat$ = errorat$ + ")"
|
|
END IF
|
|
END IF
|
|
|
|
PCOPY 3, 0
|
|
result = idemessagebox(ideerrormessageTITLE$, errorat$, "")
|
|
errorReportDone:
|
|
END IF
|
|
|
|
ideerror = 1 'unknown IDE error
|
|
AttemptToLoadRecent = 0
|
|
|
|
IF LEFT$(c$, 1) = CHR$(12) THEN
|
|
f$ = RIGHT$(c$, LEN(c$) - 1)
|
|
LOCATE , , 0
|
|
clearStatusWindow 0
|
|
|
|
dummy = DarkenFGBG(1)
|
|
BkpIdeSystem = IdeSystem: IdeSystem = 2: UpdateTitleOfMainWindow: IdeSystem = BkpIdeSystem
|
|
COLOR 1, 7: _PRINTSTRING ((idewx - 8) / 2, idewy - 4), " Status "
|
|
COLOR 15, 1
|
|
|
|
IF os$ = "WIN" THEN
|
|
_PRINTSTRING (2, idewy - 3), "Creating .EXE file named " + CHR$(34) + f$ + extension$ + CHR$(34) + "..."
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), "Creating executable file named " + CHR$(34) + f$ + extension$ + CHR$(34) + "..."
|
|
END IF
|
|
|
|
PCOPY 3, 0
|
|
ide2 = 9: idereturn$ = f$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF c$ = CHR$(100) THEN 'special call for next line (usually for the purpose of line continuation)
|
|
idecompiledline = idecompiledline + 1 'must increment (to trigger no more lines avail. message later)
|
|
IF idecompiledline < iden THEN
|
|
idecompiledline$ = idegetline(idecompiledline)
|
|
idereturn$ = idecompiledline$
|
|
ELSE
|
|
idecompiledline$ = ""
|
|
idereturn$ = idecompiledline$ 'no more lines
|
|
END IF
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF idelaunched = 0 THEN
|
|
idelaunched = 1
|
|
|
|
WIDTH idewx, idewy
|
|
IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
|
|
|
|
'change codepage
|
|
IF idecpindex THEN
|
|
FOR x = 128 TO 255
|
|
u = VAL("&H" + MID$(idecp(idecpindex), x * 8 + 1, 8) + "&")
|
|
IF u = 0 THEN u = 9744
|
|
_MAPUNICODE u TO x
|
|
NEXT
|
|
END IF
|
|
|
|
IF idecustomfont THEN
|
|
idecustomfonthandle = _LOADFONT(idecustomfontfile$, idecustomfontheight, "MONOSPACE")
|
|
IF idecustomfonthandle = -1 THEN
|
|
'failed! - revert to default settings
|
|
idecustomfont = 0: idecustomfontfile$ = "C:\Windows\Fonts\lucon.ttf": idecustomfontheight = 21
|
|
ELSE
|
|
_FONT idecustomfonthandle
|
|
END IF
|
|
END IF
|
|
|
|
m = 1: i = 0
|
|
IdeMakeFileMenu
|
|
|
|
m = m + 1: i = 0
|
|
ideeditmenuID = m
|
|
IdeMakeEditMenu
|
|
|
|
m = m + 1: i = 0: ViewMenuID = m
|
|
menu$(m, i) = "View": i = i + 1
|
|
menu$(m, i) = "#SUBs... F2": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays a list of SUB/FUNCTION procedures"
|
|
menu$(m, i) = "#Line Numbers " + CHR$(16): i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles and customizes line numbers (side bar)"
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
ViewMenuCompilerWarnings = i
|
|
menu$(ViewMenuID, ViewMenuCompilerWarnings) = "Compiler #Warnings... Ctrl+W": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays a list of recent code warnings"
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0: SearchMenuID = m
|
|
menu$(m, i) = "Search": i = i + 1
|
|
menu$(m, i) = "#Find... Ctrl+F3": i = i + 1
|
|
menuDesc$(m, i - 1) = "Finds specified text"
|
|
menu$(m, i) = "#Repeat Last Find (Shift+) F3": i = i + 1
|
|
menuDesc$(m, i - 1) = "Finds next occurrence of text specified in previous search"
|
|
menu$(m, i) = "#Change... Alt+F3": i = i + 1
|
|
menuDesc$(m, i - 1) = "Finds and changes specified text"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Clear Search #History...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Clears history of searched text items"
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
SearchMenuEnableQuickNav = i
|
|
menu$(m, i) = "#Quick Navigation": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles Quick Navigation (back arrow)"
|
|
IF EnableQuickNav THEN
|
|
menu$(SearchMenuID, SearchMenuEnableQuickNav) = CHR$(7) + menu$(SearchMenuID, SearchMenuEnableQuickNav)
|
|
END IF
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Add/Remove #Bookmark Alt+Left": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles a bookmark in the current line"
|
|
menu$(m, i) = "#Next Bookmark Alt+Down": i = i + 1
|
|
menuDesc$(m, i - 1) = "Navigates to the next bookmark"
|
|
menu$(m, i) = "#Previous Bookmark Alt+Up": i = i + 1
|
|
menuDesc$(m, i - 1) = "Navigates to the previous bookmark"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Go To Line... Ctrl+G": i = i + 1
|
|
menuDesc$(m, i - 1) = "Jumps to the specified line number"
|
|
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0: RunMenuID = m
|
|
menu$(m, i) = "Run": i = i + 1
|
|
menu$(m, i) = "#Start F5": i = i + 1
|
|
menu$(m, i) = "Run only (No exe)": i = i + 1
|
|
menuDesc$(m, i - 1) = "Compiles current program and runs it"
|
|
menu$(m, i) = "Modify #COMMAND$...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets string returned by COMMAND$ function"
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
RunMenuSaveExeWithSource = i
|
|
menu$(m, i) = "Output EXE to Source #Folder": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles compiling program to QB64-PE's folder or to source folder"
|
|
IF SaveExeWithSource THEN
|
|
menu$(RunMenuID, RunMenuSaveExeWithSource) = CHR$(7) + menu$(RunMenuID, RunMenuSaveExeWithSource)
|
|
END IF
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
IF os$ = "LNX" THEN
|
|
menu$(m, i) = "Make E#xecutable Only F11": i = i + 1
|
|
ELSE
|
|
menu$(m, i) = "Make E#XE Only F11": i = i + 1
|
|
END IF
|
|
menuDesc$(m, i - 1) = "Compiles current program without running it"
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0: DebugMenuID = m
|
|
menu$(m, i) = "Debug": i = i + 1
|
|
menu$(m, i) = "Start #Paused F7 or F8": i = i + 1
|
|
menuDesc$(m, i - 1) = "Compiles current program and starts it in pause mode"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Toggle #Breakpoint F9": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets/clears breakpoint at cursor location"
|
|
menu$(m, i) = "#Clear All Breakpoints F10": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes all breakpoints"
|
|
menu$(m, i) = "Toggle #Skip Line Ctrl+P": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets/clears flag to skip line"
|
|
menu$(m, i) = "#Unskip All Lines Ctrl+F10": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes all line skip flags"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Watch List... F4": i = i + 1
|
|
menuDesc$(m, i - 1) = "Adds variables to watch list"
|
|
DebugMenuCallStack = i
|
|
menu$(DebugMenuID, DebugMenuCallStack) = "Call #Stack... F12": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays the call stack of the current program's last execution"
|
|
menu$(m, i) = "-": i = i + 1
|
|
DebugMenuAutoAddCommand = i
|
|
menu$(m, i) = "Auto-add $#Debug Metacommand": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles whether the IDE will auto-add the $Debug metacommand as required"
|
|
IF AutoAddDebugCommand THEN
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = CHR$(7) + menu$(DebugMenuID, DebugMenuAutoAddCommand)
|
|
END IF
|
|
DebugMenuWatchListToConsole = i
|
|
menu$(m, i) = "#Output Watch List to Console": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles directing the output of the watch list to the console window"
|
|
IF WatchListToConsole THEN
|
|
menu$(DebugMenuID, DebugMenuWatchListToConsole) = CHR$(7) + menu$(DebugMenuID, DebugMenuWatchListToConsole)
|
|
END IF
|
|
menu$(m, i) = "Set Base #TCP/IP Port Number...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets the initial port number for TCP/IP communication with the debuggee"
|
|
menu$(m, i) = "Purge C++ #Libraries": i = i + 1
|
|
menuDesc$(m, i - 1) = "Purges all pre-compiled content"
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0: OptionsMenuID = m
|
|
menu$(m, i) = "Options": i = i + 1
|
|
menu$(m, i) = "#Display...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Changes screen size and font"
|
|
menu$(m, i) = "IDE C#olors...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Changes or customizes IDE color scheme"
|
|
menu$(m, i) = "#Code Layout...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Changes auto-format features"
|
|
menu$(m, i) = "C++ Co#mpiler Settings...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Change settings for compiling the C++ code"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Language...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Changes code page to use with TTF fonts"
|
|
menu$(m, i) = "#Backup/Undo...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets size of backup/undo buffer"
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
OptionsMenuDisableSyntax = i
|
|
menu$(m, i) = "Syntax #Highlighter": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles syntax highlighter"
|
|
IF NOT DisableSyntaxHighlighter THEN
|
|
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = CHR$(7) + menu$(OptionsMenuID, OptionsMenuDisableSyntax)
|
|
END IF
|
|
|
|
OptionsMenuSwapMouse = i
|
|
menu$(m, i) = "#Swap Mouse Buttons": i = i + 1
|
|
menuDesc$(m, i - 1) = "Swaps functionality of left/right mouse buttons"
|
|
IF MouseButtonSwapped THEN
|
|
menu$(OptionsMenuID, OptionsMenuSwapMouse) = CHR$(7) + menu$(OptionsMenuID, OptionsMenuSwapMouse)
|
|
END IF
|
|
|
|
OptionsMenuPasteCursor = i
|
|
menu$(m, i) = "Cursor After #Paste": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles placing the cursor before/after the pasted content"
|
|
IF PasteCursorAtEnd THEN
|
|
menu$(OptionsMenuID, OptionsMenuPasteCursor) = CHR$(7) + menu$(OptionsMenuID, OptionsMenuPasteCursor)
|
|
END IF
|
|
|
|
OptionsMenuShowErrorsImmediately = i
|
|
menu$(m, i) = "Syntax Ch#ecker": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles instant syntax checker (status area)"
|
|
IF IDEShowErrorsImmediately THEN
|
|
menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately) = CHR$(7) + menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately)
|
|
END IF
|
|
|
|
OptionsMenuIgnoreWarnings = i
|
|
menu$(m, i) = "Ignore #Warnings": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles display of warning messages (unused variables, etc)"
|
|
IF IgnoreWarnings THEN menu$(OptionsMenuID, OptionsMenuIgnoreWarnings) = CHR$(7) + "Ignore #Warnings"
|
|
|
|
'OptionsMenuAutoComplete = i
|
|
'menu$(m, i) = "Code Suggest#ions": i = i + 1
|
|
'menuDesc$(m, i - 1) = "Toggles code suggestions/auto-complete"
|
|
'IF IdeAutoComplete THEN menu$(OptionsMenuID, OptionsMenuAutoComplete) = CHR$(7) + "Code Suggest#ions"
|
|
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0
|
|
menu$(m, i) = "Tools": i = i + 1
|
|
menu$(m, i) = "#ASCII Chart...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays ASCII characters and allows inserting in current program"
|
|
menu$(m, i) = "Insert Quick #Keycode Ctrl+K": i = i + 1
|
|
menuDesc$(m, i - 1) = "Captures key codes and inserts in current program"
|
|
menu$(m, i) = "#Math Evaluator...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays the math evaluator dialog"
|
|
menu$(m, i) = "#RGB Color Mixer...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Allows mixing colors to edit/insert _RGB statements"
|
|
menusize(m) = i - 1
|
|
|
|
m = m + 1: i = 0
|
|
menu$(m, i) = "Help": i = i + 1
|
|
menu$(m, i) = "#View Shift+F1": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays help window"
|
|
menu$(m, i) = "#Contents Page": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays help contents page"
|
|
menu$(m, i) = "Keyword #Index": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays keyword index page"
|
|
menu$(m, i) = "#Keywords by Usage": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays keywords index by usage"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Update Current Page": i = i + 1
|
|
menuDesc$(m, i - 1) = "Downloads the latest version of an article from the wiki"
|
|
menu$(m, i) = "Update All #Pages...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Downloads the latest version of all articles from the wiki"
|
|
menu$(m, i) = "View Current Page On #Wiki": i = i + 1
|
|
menuDesc$(m, i - 1) = "Launches the default browser and navigates to the current article on the wiki"
|
|
menu$(m, i) = "-": i = i + 1
|
|
'menu$(m, i) = "Check for #Newer Version...": i = i + 1
|
|
'menuDesc$(m, i - 1) = "Displays the current version of QB64-PE"
|
|
menu$(m, i) = "#About...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays the current version of QB64-PE"
|
|
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
|
|
|
|
'View Menu sub menu for Line Numbers options
|
|
m = m + 1: i = 0
|
|
menu$(m, i) = "ViewMenuShowLineNumbersSubMenu": i = i + 1
|
|
ViewMenuShowLineNumbersSubMenuID = m
|
|
IF ShowLineNumbers THEN menu$(m, i) = "#Hide Line Numbers" ELSE menu$(m, i) = "#Show Line Numbers"
|
|
menuDesc$(m, i) = "Toggles displaying line numbers (side bar)"
|
|
i = i + 1
|
|
menu$(m, i) = "#Background Color": IF ShowLineNumbersUseBG THEN menu$(m, i) = CHR$(7) + menu$(m, i)
|
|
menuDesc$(m, i) = "Toggles displaying a different background (side bar)"
|
|
ViewMenuShowBGID = i
|
|
IF ShowLineNumbers = 0 THEN menu$(m, i) = "~" + menu$(m, i)
|
|
i = i + 1
|
|
menu$(m, i) = "Sho#w Separator": IF ShowLineNumbersSeparator THEN menu$(m, i) = CHR$(7) + menu$(m, i)
|
|
menuDesc$(m, i) = "Toggles showing a separator line (side bar)"
|
|
ViewMenuShowSeparatorID = i
|
|
IF ShowLineNumbers = 0 THEN menu$(m, i) = "~" + menu$(m, i)
|
|
i = i + 1
|
|
menusize(m) = i - 1
|
|
|
|
IF os$ = "WIN" THEN
|
|
idepathsep$ = "\"
|
|
END IF
|
|
IF os$ = "LNX" THEN
|
|
idepathsep$ = "/"
|
|
END IF
|
|
|
|
ideroot$ = idezgetroot$
|
|
idepath$ = _STARTDIR$
|
|
|
|
'new blank text field
|
|
idet$ = MKL$(0) + MKL$(0): idel = 1: ideli = 1: iden = 1: IdeBmkN = 0
|
|
REDIM IdeBreakpoints(iden) AS _BYTE
|
|
REDIM IdeSkipLines(iden) AS _BYTE
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "": REDIM backupUsedVariableList(1000) AS usedVarList
|
|
backupTypeDefinitions$ = ""
|
|
watchpointList$ = ""
|
|
callstacklist$ = "": callStackLength = 0
|
|
ideunsaved = -1
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
|
|
redraweverything:
|
|
ideselect = 0
|
|
idesx = 1
|
|
idesy = 1
|
|
idecx = 1
|
|
idecy = 1
|
|
|
|
redraweverything2:
|
|
GOSUB redrawItAll
|
|
|
|
IF retval = 1 THEN GOTO skipload
|
|
|
|
'restore autosave?
|
|
'undo/redo
|
|
OPEN tmpdir$ + "autosave.bin" FOR BINARY AS #150
|
|
IF LOF(150) = 1 THEN
|
|
CLOSE #150
|
|
r$ = iderestore$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF r$ = "Y" THEN
|
|
'restore
|
|
OPEN tmpdir$ + "undo2.bin" FOR BINARY AS #150
|
|
IF LOF(150) THEN
|
|
ideunsaved = 1
|
|
h$ = SPACE$(12): GET #150, , h$: p1 = CVL(MID$(h$, 1, 4)): p2 = CVL(MID$(h$, 5, 4)): plast = CVL(MID$(h$, 9, 4))
|
|
'get backup
|
|
SEEK #150, p2
|
|
GET #150, , l&
|
|
GET #150, , idesx: GET #150, , idesy
|
|
GET #150, , idecx: GET #150, , idecy
|
|
GET #150, , ideselect: GET #150, , ideselectx1: GET #150, , ideselecty1
|
|
GET #150, , iden
|
|
GET #150, , idel
|
|
GET #150, , ideli
|
|
'bookmark info [v2]
|
|
GET #150, , IdeBmkN: REDIM IdeBmk(IdeBmkN + 1) AS IdeBmkType
|
|
FOR bi = 1 TO IdeBmkN: GET #150, , IdeBmk(bi).y: GET #150, , IdeBmk(bi).x: NEXT
|
|
GET #150, , x&: idet$ = SPACE$(x&): GET #150, , idet$
|
|
END IF
|
|
CLOSE #150
|
|
END IF
|
|
ELSE
|
|
CLOSE #150
|
|
END IF
|
|
|
|
IF ideunsaved <> 1 THEN 'no file restored (takes priority over loading file from command line)
|
|
IF LEFT$(c$, 1) = CHR$(1) THEN 'load file
|
|
f$ = RIGHT$(c$, LEN(c$) - 1)
|
|
IF FileHasExtension(f$) = 0 THEN f$ = f$ + ".bas"
|
|
path$ = idezgetfilepath$(ideroot$, f$)
|
|
IF ideerror > 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO IDEerrorMessage
|
|
|
|
'(copied from ideopen)
|
|
ideerror = 2
|
|
IF _FILEEXISTS(path$ + idepathsep$ + f$) = 0 THEN GOTO IDEerrorMessage
|
|
PCOPY 3, 0
|
|
IF BinaryFormatCheck%(path$, idepathsep$, f$) > 0 THEN GOTO skipload
|
|
ideerror = 3
|
|
idepath$ = path$
|
|
lineinput3load path$ + idepathsep$ + f$
|
|
idet$ = SPACE$(LEN(lineinput3buffer) * 8)
|
|
i2 = 1
|
|
n = 0
|
|
chrtab$ = CHR$(9)
|
|
space1$ = " ": space2$ = " ": space3$ = " ": space4$ = " "
|
|
chr7$ = CHR$(7): chr11$ = CHR$(11): chr12$ = CHR$(12): chr28$ = CHR$(28): chr29$ = CHR$(29): chr30$ = CHR$(30): chr31$ = CHR$(31)
|
|
DO
|
|
a$ = lineinput3$
|
|
l = LEN(a$)
|
|
IF l THEN asca = ASC(a$) ELSE asca = -1
|
|
IF asca <> 13 THEN
|
|
IF asca <> -1 THEN
|
|
'fix tabs
|
|
ideopenfixtabsx:
|
|
x = INSTR(a$, chrtab$)
|
|
IF x THEN
|
|
x2 = (x - 1) MOD 4
|
|
IF x2 = 0 THEN a$ = LEFT$(a$, x - 1) + space4$ + RIGHT$(a$, l - x): l = l + 3: GOTO ideopenfixtabsx
|
|
IF x2 = 1 THEN a$ = LEFT$(a$, x - 1) + space3$ + RIGHT$(a$, l - x): l = l + 2: GOTO ideopenfixtabsx
|
|
IF x2 = 2 THEN a$ = LEFT$(a$, x - 1) + space2$ + RIGHT$(a$, l - x): l = l + 1: GOTO ideopenfixtabsx
|
|
IF x2 = 3 THEN a$ = LEFT$(a$, x - 1) + space1$ + RIGHT$(a$, l - x): GOTO ideopenfixtabsx
|
|
END IF
|
|
END IF 'asca<>-1
|
|
MID$(idet$, i2, l + 8) = MKL$(l) + a$ + MKL$(l): i2 = i2 + l + 8: n = n + 1
|
|
END IF
|
|
LOOP UNTIL asca = 13
|
|
lineinput3buffer = ""
|
|
iden = n: IF n = 0 THEN idet$ = MKL$(0) + MKL$(0): iden = 1 ELSE idet$ = LEFT$(idet$, i2 - 1)
|
|
REDIM IdeBreakpoints(iden) AS _BYTE
|
|
REDIM IdeSkipLines(iden) AS _BYTE
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "": REDIM backupUsedVariableList(1000) AS usedVarList
|
|
backupTypeDefinitions$ = ""
|
|
watchpointList$ = ""
|
|
callstacklist$ = "": callStackLength = 0
|
|
IF ideStartAtLine > 0 AND ideStartAtLine <= iden THEN
|
|
idecy = ideStartAtLine
|
|
IF idecy - 10 >= 1 THEN idesy = idecy - 10
|
|
idegotobox_LastLineNum = ideStartAtLine
|
|
ideStartAtLine = 0
|
|
END IF
|
|
IdeBmkN = 0
|
|
ideerror = 1
|
|
ideprogname = f$: _TITLE ideprogname + " - " + WindowTitle
|
|
IdeImportBookmarks idepath$ + idepathsep$ + ideprogname$
|
|
IdeAddRecent idepath$ + idepathsep$ + ideprogname$
|
|
END IF 'message 1
|
|
|
|
END IF 'no restore
|
|
|
|
skipload:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
END IF 'idelaunched
|
|
|
|
IF c$ = CHR$(3) THEN
|
|
skipdisplay = 1 'assume .../starting already displayed
|
|
sendnextline = 1
|
|
|
|
'previous line was OK, so use layout if available
|
|
|
|
IF ideautolayout = 0 AND ideautoindent = 0 THEN
|
|
|
|
layout$ = ""
|
|
idelayoutallow = 0
|
|
|
|
ELSE
|
|
|
|
IF LEN(layout$) THEN
|
|
|
|
'calculate recommended indent level
|
|
FOR i = 1 TO LEN(layout$)
|
|
IF ASC(layout$, i) <> 32 OR i = LEN(layout$) THEN
|
|
indent = i - 1
|
|
layout$ = RIGHT$(layout$, LEN(layout$) - i + 1)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
|
|
IF ideautolayout THEN
|
|
spacelayout:
|
|
ignoresp = 0
|
|
FOR i = 1 TO LEN(layout$)
|
|
IF ASC(layout$, i) = 34 THEN
|
|
ignoresp = ignoresp + 1: IF ignoresp = 2 THEN ignoresp = 0
|
|
END IF
|
|
IF ignoresp = 0 THEN
|
|
IF MID$(layout$, i, 1) = sp THEN MID$(layout$, i, 1) = " "
|
|
IF MID$(layout$, i, 1) = sp2 THEN layout$ = LEFT$(layout$, i - 1) + RIGHT$(layout$, LEN(layout$) - i): GOTO spacelayout
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
IF ideautoindent = 0 THEN
|
|
'note: can assume auto-format
|
|
'calculate old indent (if any)
|
|
a$ = idecompiledline$
|
|
indent = 0
|
|
FOR i = 1 TO LEN(a$)
|
|
IF ASC(a$, i) <> 32 OR i = LEN(a$) THEN
|
|
indent = i - 1
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
indent$ = SPACE$(indent)
|
|
ELSE
|
|
indent$ = SPACE$(indent * ideautoindentsize)
|
|
END IF
|
|
|
|
IF ideautolayout = 0 THEN
|
|
'note: can assume auto-indent
|
|
a$ = idecompiledline$
|
|
layout$ = ""
|
|
FOR i = 1 TO LEN(a$)
|
|
IF ASC(a$, i) <> 32 OR i = LEN(a$) THEN
|
|
layout$ = RIGHT$(a$, LEN(a$) - i + 1)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
layout$ = indent$ + layout$
|
|
|
|
IF idecy <> idecompiledline OR idelayoutallow <> 0 THEN
|
|
idelayoutallow = 0
|
|
|
|
IF idecompiledline$ <> layout$ THEN
|
|
idesetline idecompiledline, layout$
|
|
IF idecompiledline >= idesy AND idecompiledline <= (idesy + 16) THEN skipdisplay = 0
|
|
END IF
|
|
|
|
ELSE
|
|
|
|
IF idecompiledline$ <> layout$ THEN
|
|
idecurrentlinelayout = layout$
|
|
idecurrentlinelayouti = idecy
|
|
END IF
|
|
|
|
END IF
|
|
|
|
END IF 'len(layout$)
|
|
|
|
END IF 'using layout/indent
|
|
|
|
END IF '3
|
|
|
|
IF c$ = CHR$(6) THEN
|
|
idecompiling = 0
|
|
ready = 1
|
|
IF ideautorun THEN ideautorun = 0: GOTO idemrunspecial
|
|
END IF
|
|
|
|
STATIC AS _BYTE attemptToHost, changingTcpPort
|
|
IF vWatchOn = 1 AND attemptToHost = 0 THEN
|
|
IF host& = 0 THEN
|
|
hostport$ = _TRIM$(STR$(idebaseTcpPort + tempfolderindex))
|
|
ENVIRON "QB64DEBUGPORT=" + hostport$
|
|
host& = _OPENHOST("TCP/IP:" + hostport$)
|
|
attemptToHost = -1
|
|
END IF
|
|
IF changingTcpPort AND (host& = 0) THEN
|
|
result = idemessagebox("$DEBUG MODE", "Cannot receive connections on port" + STR$(idebaseTcpPort) + ".\nCheck your firewall permissions.", "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
END IF
|
|
changingTcpPort = 0
|
|
END IF
|
|
|
|
IF IdeDebugMode THEN
|
|
idecompiling = 0
|
|
ready = 1
|
|
GOSUB redrawItAll
|
|
GOTO ExitDebugMode 'IdeDebugMode must be 0 here, if not, DebugMode errored.
|
|
END IF
|
|
|
|
IF c$ = CHR$(254) THEN
|
|
'$DEBUG mode on
|
|
IdeDebugMode = 1
|
|
|
|
REDIM vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$)) 'empty data array
|
|
|
|
EnterDebugMode:
|
|
IF idehelp THEN
|
|
idewy = idewy + idesubwindow
|
|
idehelp = 0
|
|
idesubwindow = 0
|
|
skipdisplay = 0
|
|
IdeSystem = 1
|
|
retval = 1
|
|
END IF
|
|
|
|
GOSUB redrawItAll
|
|
idecompiling = 0
|
|
ready = 1
|
|
_RESIZE OFF
|
|
DebugMode
|
|
ExitDebugMode:
|
|
IF WatchListToConsole THEN _CONSOLE OFF
|
|
UpdateMenuHelpLine ""
|
|
SELECT CASE IdeDebugMode
|
|
CASE 1 'clean exit
|
|
IdeDebugMode = 0
|
|
idefocusline = 0
|
|
debugnextline = 0
|
|
CASE 2 'right-click detected; invoke contextual menu
|
|
PCOPY 3, 0
|
|
IdeMakeContextualMenu
|
|
idecontextualmenu = 1
|
|
GOTO showmenu
|
|
END SELECT
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
IF idesubwindow <> 0 THEN _RESIZE OFF ELSE _RESIZE ON
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF c$ = CHR$(11) THEN
|
|
idecompiling = 0
|
|
ready = 1
|
|
ideautorun = 0
|
|
showexecreated = 1
|
|
END IF
|
|
|
|
IF c$ = CHR$(7) THEN
|
|
skipdisplay = 1 'assume .../starting already displayed
|
|
idecompiledline = 0
|
|
sendnextline = 1
|
|
END IF
|
|
|
|
IF LEFT$(c$, 1) = CHR$(8) THEN
|
|
idecompiling = 0
|
|
failed = 1
|
|
ideautorun = 0
|
|
END IF
|
|
|
|
passback = 0
|
|
IF LEFT$(c$, 1) = CHR$(10) THEN 'passback
|
|
skipdisplay = 1 'assume .../starting already displayed
|
|
sendnextline = 1
|
|
idecompiledline = idecompiledline - 1
|
|
passback = 1
|
|
passback$ = RIGHT$(c$, LEN(c$) - 1)
|
|
END IF
|
|
|
|
IF mustdisplay THEN skipdisplay = 0
|
|
|
|
IF skipdisplay = 0 THEN
|
|
|
|
LOCATE , , 0
|
|
|
|
'note: menu bar shouldn't need repairing!
|
|
'COLOR 0, 7: _PRINTSTRING (1, 1), menubar$ 'repair menu bar
|
|
|
|
IF c$ <> CHR$(3) THEN
|
|
clearStatusWindow 0
|
|
IF ready THEN
|
|
IF IDEShowErrorsImmediately THEN
|
|
_PRINTSTRING (2, idewy - 3), "OK" 'report OK status
|
|
statusarealink = 0
|
|
IF totalWarnings > 0 AND showexecreated = 0 THEN
|
|
COLOR 11, 1
|
|
msg$ = " (" + LTRIM$(STR$(totalWarnings)) + " warning"
|
|
IF totalWarnings > 1 THEN msg$ = msg$ + "s"
|
|
msg$ = msg$ + " - click here or Ctrl+W to view)"
|
|
_PRINTSTRING (4, idewy - 3), msg$
|
|
statusarealink = 4
|
|
END IF
|
|
IF waitingForVarList THEN GOSUB showVarListReady
|
|
END IF
|
|
END IF
|
|
IF showexecreated THEN
|
|
showexecreated = 0
|
|
|
|
IF os$ = "LNX" THEN
|
|
_PRINTSTRING (2, idewy - 3), "Executable file created"
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), ".EXE file created"
|
|
END IF
|
|
|
|
IF SaveExeWithSource THEN
|
|
COLOR 11, 1
|
|
location$ = lastBinaryGenerated$
|
|
IF path.exe$ = "" THEN location$ = _STARTDIR$ + pathsep$ + location$
|
|
msg$ = "Location: " + location$
|
|
IF 2 + LEN(msg$) > idewx THEN
|
|
msg$ = "Location: " + STRING$(3, 250) + RIGHT$(location$, idewx - 15)
|
|
END IF
|
|
_PRINTSTRING (2, idewy - 2), msg$
|
|
statusarealink = 3
|
|
END IF
|
|
|
|
END IF
|
|
END IF
|
|
|
|
END IF 'skipdisplay
|
|
|
|
idefocusline = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'main loop
|
|
DO
|
|
ideloop:
|
|
IF ShowLineNumbers THEN maxLineNumberLength = LEN(STR$(iden)) + 1 ELSE maxLineNumberLength = 0
|
|
idecontextualmenu = 0
|
|
idedeltxt 'removes temporary strings (typically created by guibox commands) by setting an index to 0
|
|
IF idesubwindow <> 0 THEN _RESIZE OFF ELSE _RESIZE ON
|
|
|
|
IF (_RESIZE OR ForceResize) AND timeElapsedSince(QB64_uptime!) > 1.5 THEN
|
|
IF idesubwindow <> 0 THEN 'If there's a subwindow up, don't resize as it screws all sorts of things up.
|
|
ForceResize = -1
|
|
ELSE
|
|
retval = 0
|
|
ForceResize = 0
|
|
DO
|
|
tooSmall%% = 0
|
|
v% = _RESIZEWIDTH \ _FONTWIDTH: IF v% < 80 OR v% > 1000 THEN v% = 80: tooSmall%% = -1
|
|
IF v% <> idewx THEN retval = 1: idewx = v%
|
|
v% = _RESIZEHEIGHT \ _FONTHEIGHT: IF v% < 25 OR v% > 1000 THEN v% = 25: tooSmall%% = -1
|
|
IF v% <> idewy THEN retval = 1: idewy = v%
|
|
|
|
tempf& = _FONT
|
|
WIDTH idewx, idewy
|
|
_FONT tempf&
|
|
|
|
_PALETTECOLOR 1, IDEBackgroundColor, 0
|
|
_PALETTECOLOR 2, _RGB32(84, 84, 84), 0 'dark gray - help system and interface details
|
|
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
|
_PALETTECOLOR 6, IDEBackgroundColor2, 0
|
|
_PALETTECOLOR 7, IDEChromaColor, 0
|
|
_PALETTECOLOR 8, IDENumbersColor, 0
|
|
_PALETTECOLOR 10, IDEMetaCommandColor, 0
|
|
_PALETTECOLOR 11, IDECommentColor, 0
|
|
_PALETTECOLOR 12, IDEKeywordColor, 0
|
|
_PALETTECOLOR 13, IDETextColor, 0
|
|
_PALETTECOLOR 14, IDEQuoteColor, 0
|
|
|
|
SCREEN , , 3, 0
|
|
'static background
|
|
COLOR 0, 7
|
|
_PRINTSTRING (1, 1), SPACE$(idewx)
|
|
_PRINTSTRING (1, 1), LEFT$(menubar$, idewx)
|
|
COLOR 7, 1: idebox 1, 2, idewx, idewy - 5
|
|
|
|
COLOR 7, 1: idebox 1, idewy - 4, idewx, 5
|
|
'edit corners
|
|
COLOR 7, 1: _PRINTSTRING (1, idewy - 4), CHR$(195): _PRINTSTRING (idewx, idewy - 4), CHR$(180)
|
|
|
|
GOSUB UpdateSearchBar
|
|
|
|
'status bar
|
|
COLOR 0, 3: _PRINTSTRING (1, idewy + idesubwindow), SPACE$(idewx)
|
|
UpdateIdeInfo
|
|
q = idevbar(idewx, idewy - 3, 3, 1, 1)
|
|
q = idevbar(idewx, 3, idewy - 8, 1, 1)
|
|
q = idehbar(2, idewy - 5, idewx - 2, 1, 1)
|
|
|
|
UpdateTitleOfMainWindow
|
|
|
|
COLOR 7, 1
|
|
_PRINTSTRING (2, idewy - 3), "Resizing..."
|
|
IF tooSmall%% THEN
|
|
COLOR 14, 1
|
|
_PRINTSTRING (2, 3), "ERROR: Minimum window size is 80x25"
|
|
ELSE
|
|
ideshowtext
|
|
END IF
|
|
|
|
PCOPY 3, 0
|
|
|
|
_DISPLAY
|
|
_LIMIT 15
|
|
LOOP WHILE _RESIZE
|
|
|
|
IF retval = 1 THEN 'screen dimensions have changed and everything must be redrawn/reapplied
|
|
WriteConfigSetting windowSettingsSection$, "IDE_Width", STR$(idewx)
|
|
WriteConfigSetting windowSettingsSection$, "IDE_Height", STR$(idewy)
|
|
END IF
|
|
|
|
retval = 1
|
|
_AUTODISPLAY
|
|
GOSUB redrawItAll
|
|
END IF
|
|
ELSE
|
|
_AUTODISPLAY
|
|
END IF
|
|
|
|
IF skipdisplay = 0 THEN
|
|
|
|
LOCATE , , 0
|
|
|
|
'update title of main window
|
|
UpdateTitleOfMainWindow
|
|
|
|
'Draw navigation buttons (QuickNav)
|
|
IF EnableQuickNav THEN GOSUB DrawQuickNav
|
|
|
|
'update search bar
|
|
GOSUB UpdateSearchBar
|
|
|
|
'alter cursor style to match insert mode
|
|
IF ideinsert THEN LOCATE , , , 0, 31 ELSE LOCATE , , , IDENormalCursorStart, IDENormalCursorEnd
|
|
|
|
'display error message (if necessary)
|
|
IF failed THEN
|
|
IF IDEShowErrorsImmediately <> 0 OR IDECompilationRequested <> 0 OR compfailed <> 0 THEN
|
|
IF LEFT$(IdeInfo, 19) <> "Selection length = " THEN IdeInfo = ""
|
|
UpdateIdeInfo
|
|
|
|
clearStatusWindow 0
|
|
'scrolling unavailable, but may span multiple lines
|
|
IF compfailed THEN
|
|
a$ = MID$(c$, 2, LEN(c$) - 5)
|
|
x = 2
|
|
y = idewy - 3
|
|
printWrapStatus x, y, x, a$
|
|
statusarealink = 1
|
|
ELSE
|
|
a$ = MID$(c$, 2, LEN(c$) - 5)
|
|
|
|
l = CVL(RIGHT$(c$, 4)): IF l <> 0 THEN idefocusline = l
|
|
|
|
x = 2
|
|
y = idewy - 3
|
|
|
|
IF l <> 0 AND idecy = l THEN onCurrentLine = LEN(a$): a$ = a$ + CHR$(1) + " on current line"
|
|
|
|
hasReference = INSTR(a$, " - Reference: ")
|
|
IF hasReference THEN
|
|
hasReference = hasReference + 13
|
|
a$ = LEFT$(a$, hasReference) + CHR$(2) + MID$(a$, hasReference + 1)
|
|
ELSE
|
|
hasReference = INSTR(a$, "Expected ")
|
|
IF hasReference THEN
|
|
hasReference = hasReference + 8
|
|
a$ = LEFT$(a$, hasReference) + CHR$(2) + MID$(a$, hasReference + 1)
|
|
END IF
|
|
END IF
|
|
|
|
printWrapStatus x, y, x, a$
|
|
|
|
IF l <> 0 AND idecy <> l THEN
|
|
a$ = " on line" + STR$(l) + " (click here or Ctrl+Shift+G to jump there)"
|
|
COLOR 11, 1
|
|
printWrapStatus POS(0), CSRLIN, 2, a$
|
|
statusarealink = 2
|
|
END IF
|
|
|
|
y = CSRLIN
|
|
IF y < idewy - 1 AND linefragment <> "[INFORMATION UNAVAILABLE]" THEN
|
|
temp$ = linefragment
|
|
FOR i = 1 TO LEN(temp$)
|
|
IF MID$(temp$, i, 1) = sp$ THEN MID$(temp$, i, 1) = " "
|
|
NEXT
|
|
temp$ = _TRIM$(temp$)
|
|
IF LEN(temp$) THEN
|
|
y = y + 1: x = 1
|
|
temp$ = "Caused by (or after): " + CHR$(1) + temp$
|
|
|
|
COLOR 7, 1
|
|
FOR i = 1 TO LEN(temp$)
|
|
x = x + 1: IF x = idewx THEN x = 2: y = y + 1
|
|
IF y > idewy - 1 THEN EXIT FOR
|
|
IF ASC(temp$, i) = 1 THEN i = i + 1: COLOR 11, 1
|
|
_PRINTSTRING (x, y), CHR$(ASC(temp$, i))
|
|
NEXT
|
|
END IF
|
|
END IF
|
|
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF idechangemade THEN
|
|
IF IDEShowErrorsImmediately OR IDECompilationRequested THEN
|
|
clearStatusWindow 0
|
|
IdeInfo = ""
|
|
_PRINTSTRING (2, idewy - 3), STRING$(3, 250) 'assume new compilation will begin "..."
|
|
END IF
|
|
END IF
|
|
|
|
ideshowtext
|
|
|
|
IF idehelp THEN
|
|
|
|
|
|
|
|
|
|
Help_ShowText
|
|
|
|
q = idehbar(2, idewy + idesubwindow - 1, idewx - 2, Help_cx, help_w + 1)
|
|
q = idevbar(idewx, idewy + 1, idesubwindow - 2, Help_cy, help_h + 1)
|
|
|
|
'COLOR 0, 7: LOCATE idewy, (idewx - 6) / 2: PRINT " Help "
|
|
'create and draw back string
|
|
GOSUB HelpAreaShowBackLinks
|
|
|
|
'Help_Search_Str
|
|
IF IdeSystem = 3 AND LEFT$(IdeInfo, 1) <> CHR$(0) THEN
|
|
a$ = ""
|
|
IF LEN(Help_Search_Str) THEN
|
|
a$ = Help_Search_Str
|
|
IF LEN(a$) > 20 THEN a$ = STRING$(3, 250) + RIGHT$(a$, 17)
|
|
a$ = "[" + a$ + "] (TAB=next)"
|
|
IdeInfo = a$
|
|
ELSE
|
|
IdeInfo = "Start typing to search for text in this help page"
|
|
END IF
|
|
UpdateIdeInfo
|
|
END IF
|
|
ELSE
|
|
Help_Search_Str = ""
|
|
END IF
|
|
|
|
IF IdeSystem = 2 THEN 'override cursor position
|
|
SCREEN , , 0, 0
|
|
tx = idesystem2.v1
|
|
IF LEN(idefindtext) > idesystem2.w THEN
|
|
IF idesystem2.v1 > idesystem2.w THEN
|
|
tx = idesystem2.w
|
|
ELSE
|
|
tx = idesystem2.v1
|
|
END IF
|
|
END IF
|
|
LOCATE idewy - 4, idewx - (idesystem2.w + 8) + 4 + tx
|
|
SCREEN , , 3, 0
|
|
END IF
|
|
|
|
IF IdeSystem = 3 THEN 'override cursor position
|
|
SCREEN , , 0, 0
|
|
LOCATE Help_cy - Help_sy + Help_wy1, Help_cx - Help_sx + Help_wx1
|
|
SCREEN , , 3, 0
|
|
END IF
|
|
|
|
LOCATE , , 1
|
|
|
|
|
|
PCOPY 3, 0
|
|
|
|
END IF 'skipdisplay
|
|
|
|
IF WhiteListQB64FirstTimeMsg = 0 THEN
|
|
IF INSTR(_OS$, "WIN") THEN whiteListProcess$ = "and the process 'qb64pe.exe' " ELSE whiteListProcess$ = ""
|
|
result = idemessagebox("Welcome to QB64-PE", "QB64-PE is an independently distributed program, and as such" + CHR$(10) + _
|
|
"both 'qb64pe" + extension$ + "' and the programs you create with it may" + CHR$(10) + _
|
|
"eventually be flagged as false positives by your" + CHR$(10) + _
|
|
"antivirus/antimalware software." + CHR$(10) + CHR$(10) + _
|
|
"It is advisable to whitelist your whole 'qb64pe' folder" + CHR$(10) + _
|
|
whiteListProcess$ + "to avoid operation errors.", "#OK;#Don't show this again")
|
|
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF result = 2 THEN
|
|
WriteConfigSetting generalSettingsSection$, "WhiteListQB64FirstTimeMsg", "True"
|
|
END IF
|
|
WhiteListQB64FirstTimeMsg = -1
|
|
END IF
|
|
|
|
IF idechangemade THEN
|
|
|
|
IF idelayoutallow THEN idelayoutallow = idelayoutallow - 1
|
|
|
|
watchpointList$ = ""
|
|
idecurrentlinelayouti = 0 'invalidate
|
|
idefocusline = 0
|
|
idechangemade = 0
|
|
IDECompilationRequested = 0
|
|
compfailed = 0
|
|
IF ideunsaved = -1 THEN ideunsaved = 0 ELSE ideunsaved = 1
|
|
|
|
IF idenoundo = 0 THEN
|
|
|
|
'undo/redo
|
|
'build data so it can be written in a single write (a backup requirement)
|
|
a$ = ""
|
|
a$ = a$ + MKL$(idesx) + MKL$(idesy) 'screen position
|
|
a$ = a$ + MKL$(idecx) + MKL$(idecy) 'cursor position
|
|
a$ = a$ + MKL$(ideselect) + MKL$(ideselectx1) + MKL$(ideselecty1) 'selection state & position
|
|
a$ = a$ + MKL$(iden) 'number of lines
|
|
a$ = a$ + MKL$(idel) 'selected line in buffer
|
|
a$ = a$ + MKL$(ideli) 'selected line offset in buffer
|
|
'bookmark info [v2]
|
|
a$ = a$ + MKL$(IdeBmkN)
|
|
FOR bi = 1 TO IdeBmkN: a$ = a$ + MKL$(IdeBmk(bi).y) + MKL$(IdeBmk(bi).x): NEXT
|
|
l& = LEN(idet$)
|
|
a$ = a$ + MKL$(l&) 'data size
|
|
a$ = MKL$(l& + LEN(a$)) + a$ + idet$ + MKL$(l& + LEN(a$)) 'header, data & encapsulation (reverse navigatable list)
|
|
|
|
'add undo event
|
|
|
|
OPEN tmpdir$ + "undo2.bin" FOR BINARY AS #150
|
|
'[oldest state entry][newest state entry][top-most entry(ignore if no wrapping required)]
|
|
h$ = SPACE$(12): GET #150, , h$: p1 = CVL(MID$(h$, 1, 4)): p2 = CVL(MID$(h$, 5, 4)): plast = CVL(MID$(h$, 9, 4))
|
|
|
|
IF idemergeundo THEN
|
|
idemergeundo = 0
|
|
IF p2 <> p1 THEN 'can it be moved back?
|
|
IF p2 = 13 THEN
|
|
p2 = plast
|
|
ELSE
|
|
'get offset of previous message
|
|
GET #150, p2 - 4, pp2l
|
|
p2 = p2 - 4 - pp2l - 4
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF p1 = 0 THEN 'not init
|
|
p1 = 13: p2 = 13
|
|
ELSE
|
|
IF p2 >= p1 THEN
|
|
'no wrap
|
|
'should we extend?
|
|
IF p2 >= idebackupsize * 1000000 THEN
|
|
'can't extend
|
|
'set p2 as top-most
|
|
plast = p2
|
|
p2 = 13
|
|
'can new state (a$) fit before p1?
|
|
DO WHILE (p2 + LEN(a$) - 1) >= p1
|
|
IF p1 = ideundobase THEN ideundobase = -1
|
|
'no, so move p1 to next entry
|
|
'note: it can be assumed that p1, being near/at beginning, won't have to wrap when being moved forward
|
|
GET #150, p1, p1l
|
|
p1 = p1 + 4 + p1l + 4
|
|
LOOP
|
|
'p1 & p2 ready
|
|
ELSE
|
|
'extend
|
|
'find size of p2 event
|
|
GET #150, p2, p2l
|
|
p2 = p2 + 4 + p2l + 4
|
|
'p1 & p2 ready
|
|
END IF
|
|
ELSE
|
|
'wrap
|
|
'find size of p2 event
|
|
GET #150, p2, p2l
|
|
op2 = p2
|
|
p2 = p2 + 4 + p2l + 4
|
|
'can new state (a$) fit before p1?
|
|
DO WHILE (p2 + LEN(a$) - 1) >= p1
|
|
IF p1 = ideundobase THEN ideundobase = -1
|
|
'no, so move p1 to next entry
|
|
IF p1 = plast THEN
|
|
p1 = 13
|
|
EXIT DO
|
|
ELSE
|
|
GET #150, p1, p1l
|
|
p1 = p1 + 4 + p1l + 4
|
|
END IF
|
|
LOOP
|
|
'should we extend?
|
|
IF p2 >= idebackupsize * 1000000 THEN
|
|
'can't extend
|
|
'set op2 as top-most
|
|
plast = op2
|
|
p2 = 13
|
|
'can new state (a$) fit before p1?
|
|
DO WHILE (p2 + LEN(a$) - 1) >= p1
|
|
IF p1 = ideundobase THEN ideundobase = -1
|
|
'no, so move p1 to next entry
|
|
'note: it can be assumed that p1, being near/at beginning, won't have to wrap when being moved forward
|
|
GET #150, p1, p1l
|
|
p1 = p1 + 4 + p1l + 4
|
|
LOOP
|
|
END IF
|
|
'p1 & p2 ready
|
|
END IF
|
|
END IF
|
|
|
|
'update p1,p2,plast
|
|
h$ = MKL$(p1) + MKL$(p2) + MKL$(plast)
|
|
PUT #150, 1, h$
|
|
|
|
'add new state
|
|
PUT #150, p2, a$
|
|
|
|
CLOSE #150
|
|
|
|
ideundopos = p2
|
|
IF ideundobase = 0 THEN ideundobase = ideundopos
|
|
|
|
|
|
|
|
'set undo flag once
|
|
IF ideundoflag = 0 THEN
|
|
ideundoflag = 1
|
|
OPEN tmpdir$ + "autosave.bin" FOR BINARY AS #150: a$ = CHR$(1): PUT #150, , a$: CLOSE #150 'set flag
|
|
END IF
|
|
|
|
ELSE
|
|
idenoundo = 0
|
|
END IF
|
|
|
|
'begin new compilation
|
|
IF IDEBuildModeChanged = 0 THEN
|
|
ideautorun = 0
|
|
END IF
|
|
IDEBuildModeChanged = 0
|
|
|
|
idecompiling = 1
|
|
ide2 = 2
|
|
idecompiledline$ = idegetline(1)
|
|
idereturn$ = idecompiledline$
|
|
idecompiledline = 1
|
|
EXIT FUNCTION
|
|
END IF 'idechangemade
|
|
|
|
|
|
change = 0
|
|
waitforinput:
|
|
IF startPausedPending THEN GOTO idemrun
|
|
IF idecurrentlinelayouti THEN
|
|
IF idecy <> idecurrentlinelayouti THEN
|
|
idesetline idecurrentlinelayouti, idecurrentlinelayout$
|
|
idecurrentlinelayouti = 0
|
|
change = 1 'simulate a change to force a screen update
|
|
END IF
|
|
END IF
|
|
|
|
exitvalue = _EXIT
|
|
IF (exitvalue AND 1) <> 0 OR ideexit <> 0 THEN ideexit = 0: GOTO quickexit
|
|
|
|
GetInput
|
|
IF iCHANGED THEN
|
|
STATIC mox, moy
|
|
IF (mX <> mox OR mY <> moy) AND mB <> 0 THEN 'dragging mouse
|
|
mox = mX
|
|
moy = mY
|
|
change = 1
|
|
END IF
|
|
IF mB <> mOB THEN change = 1 'button changed
|
|
IF mB2 <> mOB2 THEN change = 1 'button changed
|
|
IF mCLICK <> 0 OR mCLICK2 <> 0 THEN change = 1
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF KSTATECHANGED THEN change = 1
|
|
END IF
|
|
IF mB <> 0 AND idembmonitor = 1 THEN change = 1
|
|
IF mB = 0 THEN idemouseselect = 0: idembmonitor = 0: wholeword.select = 0
|
|
|
|
IF _RESIZE THEN
|
|
ForceResize = -1: skipdisplay = 0: GOTO ideloop
|
|
END IF
|
|
|
|
IF IDE_AutoPosition THEN
|
|
IF IDE_TopPosition <> _SCREENY OR IDE_LeftPosition <> _SCREENX THEN
|
|
IF _SCREENY >= -_HEIGHT * _FONTHEIGHT AND _SCREENX >= -_WIDTH * _FONTWIDTH THEN 'Don't record the position if it's off the screen, past the point where we can drag it back into a different position.
|
|
WriteConfigSetting windowSettingsSection$, "IDE_TopPosition", STR$(_SCREENY)
|
|
WriteConfigSetting windowSettingsSection$, "IDE_LeftPosition", STR$(_SCREENX)
|
|
IDE_TopPosition = _SCREENY: IDE_LeftPosition = _SCREENX
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF _TOTALDROPPEDFILES > 0 THEN
|
|
IF _FILEEXISTS(_DROPPEDFILE$(1)) THEN
|
|
IdeOpenFile$ = _DROPPEDFILE$(1)
|
|
_FINISHDROP
|
|
GOTO ctrlOpen
|
|
END IF
|
|
_FINISHDROP
|
|
END IF
|
|
|
|
'Hover/click (QuickNav, "Find" field, version number, line number)
|
|
updateHover = 0
|
|
IF QuickNavTotal > 0 THEN
|
|
DO UNTIL QuickNavHistory(QuickNavTotal).idecy <= iden
|
|
'make sure that the line number in history still exists
|
|
QuickNavTotal = QuickNavTotal - 1
|
|
IF QuickNavTotal = 0 THEN EXIT DO
|
|
LOOP
|
|
END IF
|
|
|
|
IF IdeSystem = 1 AND QuickNavTotal > 0 AND EnableQuickNav THEN
|
|
IF mY = 2 THEN
|
|
IF mX >= 4 AND mX <= 6 THEN
|
|
IF QuickNavHover = 0 THEN
|
|
QuickNavHover = -1
|
|
COLOR 15, 3
|
|
popup$ = " " + CHR$(17) + " back to line " + str2$(QuickNavHistory(QuickNavTotal).idecy) + " "
|
|
_PRINTSTRING (4, 2), popup$
|
|
|
|
'shadow
|
|
COLOR 2, 0
|
|
FOR x2 = 6 TO 4 + LEN(popup$)
|
|
_PRINTSTRING (x2, 3), CHR$(SCREEN(3, x2))
|
|
NEXT
|
|
updateHover = -1
|
|
END IF
|
|
|
|
IF mCLICK THEN
|
|
ideselect = 0
|
|
idecy = QuickNavHistory(QuickNavTotal).idecy
|
|
idecx = QuickNavHistory(QuickNavTotal).idecx
|
|
idesx = QuickNavHistory(QuickNavTotal).idesx
|
|
idecentercurrentline
|
|
QuickNavTotal = QuickNavTotal - 1
|
|
GOTO ideloop
|
|
END IF
|
|
ELSE
|
|
GOTO RestoreBGQuickNav
|
|
END IF
|
|
ELSE
|
|
RestoreBGQuickNav:
|
|
IF QuickNavHover = -1 THEN
|
|
QuickNavHover = 0
|
|
UpdateTitleOfMainWindow
|
|
GOSUB DrawQuickNav
|
|
ideshowtext
|
|
updateHover = -1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mY = idewy - 4 AND mX > idewx - (idesystem2.w + 10) AND mX <= idewx - (idesystem2.w + 8) + 2 THEN '"Find" button
|
|
IF FindFieldHover = 0 THEN
|
|
'Highlight "Find"
|
|
COLOR 1, 3
|
|
_PRINTSTRING (idewx - (idesystem2.w + 9), idewy - 4), "Find"
|
|
updateHover = -1
|
|
FindFieldHover = -1
|
|
END IF
|
|
ELSE
|
|
IF FindFieldHover = -1 THEN
|
|
'Restore "Find" bg
|
|
FindFieldHover = 0
|
|
COLOR 3, 1
|
|
_PRINTSTRING (idewx - (idesystem2.w + 9), idewy - 4), "Find"
|
|
updateHover = -1
|
|
END IF
|
|
END IF
|
|
|
|
IF mY = idewy + idesubwindow AND mX >= idewx - 21 - LEN(versionStringStatus$) AND mX < idewx - 21 THEN
|
|
'Highlight Version Number
|
|
IF VersionInfoHover = 0 THEN
|
|
COLOR 13, 6
|
|
_PRINTSTRING (idewx - 21 - LEN(versionStringStatus$), idewy + idesubwindow), versionStringStatus$
|
|
updateHover = -1
|
|
VersionInfoHover = -1
|
|
END IF
|
|
IF mCLICK THEN PCOPY 0, 2: GOTO helpabout
|
|
ELSE
|
|
IF VersionInfoHover = -1 THEN
|
|
'Restore "Find" bg
|
|
VersionInfoHover = 0
|
|
COLOR 2, 3
|
|
_PRINTSTRING (idewx - 21 - LEN(versionStringStatus$), idewy + idesubwindow), versionStringStatus$
|
|
updateHover = -1
|
|
END IF
|
|
END IF
|
|
|
|
IF mY = idewy + idesubwindow AND mX >= idewx - 20 AND mX =< idewx THEN
|
|
'Highlight line number
|
|
IF LineNumberHover = 0 THEN
|
|
COLOR 13, 6
|
|
_PRINTSTRING (idewx - 20, idewy + idesubwindow), lineNumberStatus$
|
|
LineNumberHover = -1
|
|
updateHover = -1
|
|
END IF
|
|
IF mCLICK THEN
|
|
PCOPY 0, 2
|
|
idegotobox
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
ELSE
|
|
IF LineNumberHover = -1 THEN
|
|
'Restore "Find" bg
|
|
LineNumberHover = 0
|
|
COLOR 0, 3
|
|
_PRINTSTRING (idewx - 20, idewy + idesubwindow), lineNumberStatus$
|
|
updateHover = -1
|
|
END IF
|
|
END IF
|
|
|
|
IF os$ = "WIN" OR MacOSX = 1 THEN
|
|
IF _WINDOWHASFOCUS THEN
|
|
LOCATE , , 1
|
|
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
|
_PALETTECOLOR 6, IDEBackgroundColor2, 0
|
|
ELSE
|
|
LOCATE , , 0
|
|
_PALETTECOLOR 5, IDEBackgroundColor, 0
|
|
_PALETTECOLOR 6, IDEBackgroundColor, 0
|
|
END IF
|
|
END IF
|
|
|
|
IF KALT THEN 'alt held
|
|
|
|
IF idealthighlight = 0 AND KALTPRESS = -1 AND NOT KCTRL THEN
|
|
'highlist first letter of each menu item
|
|
idealthighlight = 1
|
|
LOCATE , , 0: COLOR 15, 7: x = 4
|
|
FOR i = 1 TO menus
|
|
_PRINTSTRING (x, 1), LEFT$(menu$(i, 0), 1)
|
|
x = x + LEN(menu$(i, 0)) + 2
|
|
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 1
|
|
NEXT
|
|
ideentermenu = 1 'alt has just been pressed, so any next keystroke could enter a menu)
|
|
'IF change = 0 THEN
|
|
skipdisplay = 0: GOTO ideloop 'force update so cursor will be restored to correct position
|
|
END IF
|
|
|
|
ELSE 'alt not held
|
|
IF idealthighlight = 1 THEN
|
|
'remove highlight
|
|
idealthighlight = 0
|
|
LOCATE , , 0: COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
IF ideentermenu = 1 AND KCONTROL = 0 THEN 'alt was pressed then released
|
|
IF _WINDOWHASFOCUS OR os$ = "LNX" THEN
|
|
LOCATE , , , IDENormalCursorStart, IDENormalCursorEnd
|
|
skipdisplay = 0
|
|
ideentermenu = 0
|
|
GOTO startmenu
|
|
ELSE
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
END IF 'alt not held
|
|
|
|
IF updateHover THEN PCOPY 3, 0
|
|
|
|
IF change = 0 THEN
|
|
|
|
'continue compilation?
|
|
IF idecompiling THEN
|
|
IF sendnextline THEN
|
|
IF idecompiledline < iden THEN
|
|
idecompiledline = idecompiledline + 1
|
|
ide2 = 4
|
|
IF passback THEN
|
|
idecompiledline$ = passback$
|
|
idereturn$ = idecompiledline$
|
|
ELSE
|
|
idecompiledline$ = idegetline(idecompiledline)
|
|
idereturn$ = idecompiledline$
|
|
END IF
|
|
EXIT FUNCTION
|
|
ELSE
|
|
'finished compilation
|
|
ide2 = 5 'end of program reached, what next?
|
|
'could return:
|
|
'i) 6 code ready for export/run
|
|
'ii) 7 repass required (if so send data from the beginning again)
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
_LIMIT 16
|
|
GOTO waitforinput
|
|
END IF 'change=0
|
|
|
|
ideentermenu = 0
|
|
|
|
ideundocombo = ideundocombo - 1
|
|
IF ideundocombo < 0 THEN ideundocombo = 0
|
|
|
|
skipdisplay = 0
|
|
|
|
'IdeSystem independent routines
|
|
|
|
IF mCLICK THEN
|
|
IF mX >= 2 AND mX <= idewx AND mY >= idewy - 3 AND mY <= idewy - 1 THEN
|
|
IF SCREEN(mY, mX, 1) = 11 + 1 * 16 THEN 'if the text clicked is in COLOR 11 it's a link
|
|
'Status area links
|
|
SELECT CASE statusarealink
|
|
CASE 1
|
|
'1- Link to compilelog.txt:
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
SHELL _DONTWAIT QuotedFilename$(compilelog$)
|
|
ELSEIF INSTR(_OS$, "MAC") THEN
|
|
SHELL _DONTWAIT "open " + QuotedFilename$(compilelog$)
|
|
ELSE
|
|
SHELL _DONTWAIT "xdg-open " + QuotedFilename$(compilelog$)
|
|
END IF
|
|
GOTO specialchar
|
|
CASE 2
|
|
'2- Link to the line that has a compiler error:
|
|
idecx = 1
|
|
AddQuickNavHistory
|
|
idecy = idefocusline
|
|
ideselect = 0
|
|
GOTO specialchar
|
|
CASE 3
|
|
'3- Link to the output folder when "Output EXE to source #folder" is checked:
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
SHELL _DONTWAIT "explorer /select," + QuotedFilename$(lastBinaryGenerated$)
|
|
ELSEIF INSTR(_OS$, "MAC") THEN
|
|
SHELL _DONTWAIT "open " + QuotedFilename$(path.exe$)
|
|
ELSE
|
|
SHELL _DONTWAIT "xdg-open " + QuotedFilename$(path.exe$)
|
|
END IF
|
|
GOTO specialchar
|
|
CASE 4
|
|
'4- Link to Warnings dialog:
|
|
retval = idewarningbox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO specialchar
|
|
END SELECT
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF KB = KEY_F7 OR KB = KEY_F8 THEN
|
|
GOTO startPausedMenuHandler
|
|
END IF
|
|
|
|
IF KB = KEY_F9 THEN 'toggle breakpoint
|
|
GOTO toggleBreakpoint
|
|
END IF
|
|
|
|
IF KB = KEY_F10 THEN 'clear all breakpoints
|
|
IF KCTRL THEN
|
|
GOTO unskipAllLines
|
|
ELSE
|
|
GOTO clearAllBreakpoints
|
|
END IF
|
|
END IF
|
|
|
|
IF KB = KEY_F11 THEN 'make exe only
|
|
idemexe:
|
|
iderunmode = 2
|
|
GOTO idemrunspecial
|
|
END IF
|
|
|
|
IF KB = KEY_F12 THEN 'show call stack
|
|
IF callStackLength > 0 THEN
|
|
GOTO showCallStackDialog
|
|
ELSE
|
|
result = idemessagebox("$DEBUG MODE", "No call stack log available.", "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF KB = KEY_F4 THEN 'variable watch
|
|
GOTO showWatchList
|
|
END IF
|
|
|
|
IF KB = KEY_F5 THEN 'Note: F5 or SHIFT+F5 accepted
|
|
startPaused = 0
|
|
idemrun:
|
|
startPausedPending = 0
|
|
iderunmode = 1 'run detached; = 0 'standard run
|
|
idemrunspecial:
|
|
|
|
IDECompilationRequested = -1
|
|
|
|
IF ExeToSourceFolderFirstTimeMsg = 0 THEN
|
|
IF SaveExeWithSource THEN
|
|
result = idemessagebox("Run", "Your program will be compiled to the same folder where your" + CHR$(10) + _
|
|
"source code is saved. You can change that by unchecking the" + CHR$(10) + _
|
|
"option 'Output EXE to Source Folder' in the Run menu.", "#OK;#Don't show this again;#Cancel")
|
|
ELSE
|
|
result = idemessagebox("Run", "Your program will be compiled to your 'qb64pe' folder. You can" + CHR$(10) + _
|
|
"change that by checking the option 'Output EXE to Source" + CHR$(10) + _
|
|
"Folder' in the Run menu.", "#OK;#Don't show this again;#Cancel")
|
|
END IF
|
|
IF result = 2 THEN
|
|
WriteConfigSetting generalSettingsSection$, "ExeToSourceFolderFirstTimeMsg", "True"
|
|
ExeToSourceFolderFirstTimeMsg = -1
|
|
ELSEIF result = 3 THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
LOCATE , , 0
|
|
clearStatusWindow 0
|
|
_PRINTSTRING (2, idewy - 3), "Compilation request canceled."
|
|
GOTO specialchar
|
|
END IF
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
|
|
'run program
|
|
IF ready <> 0 AND idechangemade = 0 THEN
|
|
|
|
LOCATE , , 0
|
|
clearStatusWindow 0
|
|
If NoExeSaved then idecompiled = 0: GOTO mustGenerateExe
|
|
IF idecompiled THEN
|
|
|
|
IF iderunmode = 2 AND _FILEEXISTS(lastBinaryGenerated$) THEN
|
|
IF os$ = "LNX" THEN
|
|
_PRINTSTRING (2, idewy - 3), "Already created executable file!"
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), "Already created .EXE file!"
|
|
END IF
|
|
|
|
COLOR 11, 1
|
|
location$ = lastBinaryGenerated$
|
|
IF path.exe$ = "" THEN location$ = _STARTDIR$ + pathsep$ + location$
|
|
msg$ = "Location: " + location$
|
|
IF 2 + LEN(msg$) > idewx THEN
|
|
msg$ = "Location: " + STRING$(3, 250) + RIGHT$(location$, idewx - 15)
|
|
END IF
|
|
_PRINTSTRING (2, idewy - 2), msg$
|
|
statusarealink = 3
|
|
|
|
|
|
GOTO specialchar
|
|
ELSEIF _FILEEXISTS(lastBinaryGenerated$) = 0 THEN
|
|
idecompiled = 0
|
|
GOTO mustGenerateExe
|
|
END IF
|
|
|
|
dummy = DarkenFGBG(1)
|
|
BkpIdeSystem = IdeSystem: IdeSystem = 2: UpdateTitleOfMainWindow: IdeSystem = BkpIdeSystem
|
|
COLOR 1, 7: _PRINTSTRING ((idewx - 8) / 2, idewy - 4), " Status "
|
|
COLOR 15, 1
|
|
_PRINTSTRING (2, idewy - 3), "Starting program..."
|
|
ELSE
|
|
mustGenerateExe:
|
|
dummy = DarkenFGBG(1)
|
|
BkpIdeSystem = IdeSystem: IdeSystem = 2: UpdateTitleOfMainWindow: IdeSystem = BkpIdeSystem
|
|
COLOR 1, 7: _PRINTSTRING ((idewx - 8) / 2, idewy - 4), " Status "
|
|
COLOR 15, 1
|
|
IF os$ = "LNX" THEN
|
|
_PRINTSTRING (2, idewy - 3), "Creating executable file..."
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), "Creating .EXE file..."
|
|
END IF
|
|
|
|
END IF
|
|
PCOPY 3, 0
|
|
|
|
'send run request
|
|
'prepare name
|
|
IF ideprogname$ = "" THEN
|
|
f$ = "untitled" + tempfolderindexstr$
|
|
ELSE
|
|
f$ = ideprogname$
|
|
f$ = RemoveFileExtension$(f$)
|
|
END IF
|
|
ide2 = 9: idereturn$ = f$
|
|
EXIT FUNCTION
|
|
END IF
|
|
'not ready!
|
|
IF failed = 1 THEN GOTO specialchar
|
|
'assume still compiling ...
|
|
ideautorun = 1
|
|
|
|
'correct status message
|
|
LOCATE , , 0
|
|
clearStatusWindow 0
|
|
|
|
_PRINTSTRING (2, idewy - 3), "Checking program... (editing program will cancel request)"
|
|
|
|
'must move the cursor back to its correct location
|
|
ideshowtext
|
|
LOCATE , , 1
|
|
PCOPY 3, 0
|
|
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
LOCATE , , 0
|
|
LOCATE , , , IDENormalCursorStart, IDENormalCursorEnd
|
|
|
|
IF (mCLICK OR mCLICK2) AND idemouseselect = 0 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
|
|
m = i
|
|
GOTO showmenu
|
|
END IF
|
|
x = x + x2
|
|
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 2
|
|
NEXT
|
|
END IF
|
|
END IF
|
|
|
|
FOR i = 1 TO menus
|
|
a$ = UCASE$(LEFT$(menu$(i, 0), 1))
|
|
IF KALT AND UCASE$(K$) = a$ THEN
|
|
m = i
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0
|
|
GOTO showmenu
|
|
END IF
|
|
NEXT
|
|
|
|
IF KCTRL AND UCASE$(K$) = "F" THEN
|
|
K$ = ""
|
|
IdeSystem = 2
|
|
IF LEN(idefindtext) THEN idesystem2.issel = -1: idesystem2.sx1 = 0: idesystem2.v1 = LEN(idefindtext)
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KCTRL AND UCASE$(K$) = "K" THEN
|
|
K$ = ""
|
|
GOTO ideQuickKeycode
|
|
END IF
|
|
|
|
|
|
IF KCTRL AND KB = KEY_F3 THEN
|
|
IF IdeSystem = 3 THEN IdeSystem = 1
|
|
GOTO idefindjmp
|
|
END IF
|
|
|
|
IF KALT AND KB = KEY_F3 THEN
|
|
IF IdeSystem = 3 THEN IdeSystem = 1
|
|
GOTO idefindchangejmp
|
|
END IF
|
|
|
|
IF KB = KEY_F3 OR K$ = CHR$(28) THEN
|
|
IF IdeSystem = 3 THEN IdeSystem = 1
|
|
idemf3:
|
|
IF idefindtext <> "" THEN
|
|
IF IdeSystem = 2 THEN
|
|
idesystem2.sx1 = 0
|
|
idesystem2.v1 = LEN(idefindtext)
|
|
idesystem2.issel = -1
|
|
END IF
|
|
GOSUB UpdateSearchBar
|
|
IF KSHIFT THEN idefindinvert = 1
|
|
IdeAddSearched idefindtext
|
|
idefindagain -1
|
|
ELSE
|
|
GOTO idefindjmp
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KSHIFT AND KB = KEY_F1 THEN
|
|
IF idehelp = 0 THEN
|
|
idesubwindow = idewy \ 2: idewy = idewy - idesubwindow
|
|
Help_wx1 = 2: Help_wy1 = idewy + 1: Help_wx2 = idewx - 1: Help_wy2 = idewy + idesubwindow - 2: Help_ww = Help_wx2 - Help_wx1 + 1: Help_wh = Help_wy2 - Help_wy1 + 1
|
|
idehelp = 1
|
|
skipdisplay = 0
|
|
IdeSystem = 3
|
|
retval = 1: GOSUB redrawItAll
|
|
END IF
|
|
IdeSystem = 3
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
'Scroll bar code goes here
|
|
STATIC Help_Scrollbar, Help_Scrollbar_Method
|
|
'1=arrow less, 2=arrow more, 3=dragging 'bit', 4=clicking in space
|
|
IF mB = 0 THEN Help_Scrollbar = 0
|
|
IF idehelp THEN
|
|
IF IdeSystem = 3 THEN
|
|
'q = idehbar(2, idewy + idesubwindow - 1, idewx - 2, Help_cx, help_w + 1)
|
|
'q = idevbar(idewx, idewy + 1, idesubwindow - 2, Help_cy, help_h + 1)
|
|
IF mCLICK THEN
|
|
IF mX >= 2 AND mX <= idewx - 1 AND mY = idewy + idesubwindow - 1 THEN
|
|
Help_Scrollbar = 1
|
|
v = idehbar(2, idewy + idesubwindow - 1, idewx - 2, Help_cx, help_w + 1)
|
|
IF v <> mX THEN Help_Scrollbar_Method = 3 ELSE Help_Scrollbar_Method = 4
|
|
IF mX = 2 THEN Help_Scrollbar_Method = 1
|
|
IF mX = idewx - 1 THEN Help_Scrollbar_Method = 2
|
|
END IF
|
|
IF mY >= idewy + 1 AND mY <= idewy + idesubwindow - 2 AND mX = idewx THEN
|
|
Help_Scrollbar = 2
|
|
v = idevbar(idewx, idewy + 1, idesubwindow - 2, Help_cy, help_h + 1)
|
|
IF v <> mY THEN Help_Scrollbar_Method = 3 ELSE Help_Scrollbar_Method = 4
|
|
IF mY = idewy + 1 THEN Help_Scrollbar_Method = 1
|
|
IF mY = idewy + idesubwindow - 2 THEN Help_Scrollbar_Method = 2
|
|
END IF
|
|
END IF 'mclick
|
|
|
|
IF Help_Scrollbar THEN
|
|
idembmonitor = 1
|
|
IF Help_Scrollbar_Method = 1 THEN
|
|
IF Help_Scrollbar = 1 THEN KB = KEY_LEFT: idewait 'fall through...
|
|
IF Help_Scrollbar = 2 THEN KB = KEY_UP: idewait 'fall through...
|
|
END IF
|
|
IF Help_Scrollbar_Method = 2 THEN
|
|
IF Help_Scrollbar = 1 THEN KB = KEY_RIGHT: idewait 'fall through...
|
|
IF Help_Scrollbar = 2 THEN KB = KEY_DOWN: idewait 'fall through...
|
|
END IF
|
|
IF Help_Scrollbar_Method = 3 THEN
|
|
IF Help_Scrollbar = 1 THEN
|
|
v = idehbar(2, idewy + idesubwindow - 1, idewx - 2, Help_cx, help_w + 1)
|
|
IF mX < v THEN
|
|
Help_cx = Help_cx - 8
|
|
IF Help_cx < 1 THEN Help_cx = 1
|
|
IF Help_sx > Help_cx THEN Help_sx = Help_cx
|
|
idewait
|
|
END IF
|
|
IF mX > v THEN
|
|
Help_cx = Help_cx + 8
|
|
IF Help_cx > help_w + 1 THEN Help_cx = help_w + 1
|
|
idewait
|
|
END IF
|
|
END IF
|
|
IF Help_Scrollbar = 2 THEN
|
|
v = idevbar(idewx, idewy + 1, idesubwindow - 2, Help_cy, help_h + 1)
|
|
IF mY < v THEN KB = KEY_PAGEUP: idewait 'fall through...
|
|
IF mY > v THEN KB = KEY_PAGEDOWN: idewait 'fall through...
|
|
END IF
|
|
|
|
END IF
|
|
|
|
|
|
|
|
IF Help_Scrollbar_Method = 4 THEN
|
|
IF Help_Scrollbar = 1 THEN
|
|
IF help_w > 1 THEN
|
|
IF mX <= 3 THEN
|
|
Help_sx = 1: Help_cx = 1
|
|
ELSEIF mX >= idewx - 2 THEN
|
|
Help_sx = help_w + 1: Help_cx = help_w + 1
|
|
ELSE
|
|
x = mX
|
|
p! = x - 4 + .5 '4 (the min pos) becomes .5
|
|
p! = p! / (idewx - 3 - 3)
|
|
i = p! * (help_w) + 1
|
|
Help_sx = i: Help_cx = i
|
|
END IF
|
|
END IF
|
|
END IF
|
|
IF Help_Scrollbar = 2 THEN
|
|
IF help_h > 1 THEN
|
|
|
|
IF mY <= idewy + 2 THEN
|
|
Help_cy = 1
|
|
ELSEIF mY >= idewy + idesubwindow - 3 THEN
|
|
Help_cy = help_h + 1
|
|
ELSE
|
|
y = mY
|
|
p! = y - idewy - 3 + .5
|
|
p! = p! / (idesubwindow - 3 - 3)
|
|
i = p! * (help_h) + 1
|
|
Help_cy = i
|
|
END IF
|
|
'fix cursor
|
|
IF Help_cx < 1 THEN Help_cx = 1
|
|
IF Help_cx > help_w + 1 THEN Help_cx = help_w + 1
|
|
IF Help_cy < 1 THEN Help_cy = 1
|
|
IF Help_cy > help_h + 1 THEN Help_cy = help_h + 1
|
|
'screen follows cursor
|
|
IF Help_cx < Help_sx THEN Help_sx = Help_cx
|
|
IF Help_cx >= Help_sx + Help_ww THEN Help_sx = Help_cx - Help_ww + 1
|
|
IF Help_cy < Help_sy THEN Help_sy = Help_cy
|
|
IF Help_cy >= Help_sy + Help_wh THEN Help_sy = Help_cy - Help_wh + 1
|
|
'fix screen
|
|
IF Help_sx < 1 THEN Help_sx = 1
|
|
IF Help_sy < 1 THEN Help_sy = 1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'IF mB AND idemouseselect = 2 THEN
|
|
' 'move vbar scroller (idecy) to appropriate position
|
|
' IF iden > 1 THEN
|
|
' IF mY <= 4 THEN idecy = 1
|
|
' IF mY >= idewy - 7 THEN idecy = iden
|
|
' IF mY > 4 AND mY < idewy - 7 THEN
|
|
' y = mY
|
|
' p! = y - 3 - 2 + .5
|
|
' p! = p! / ((idewy - 8) - 4)
|
|
' i = p! * (iden - 1) + 1
|
|
' idecy = i
|
|
' END IF
|
|
' END IF
|
|
'END IF
|
|
|
|
|
|
IF mCLICK THEN mCLICK = 0
|
|
END IF
|
|
|
|
END IF 'system=3
|
|
END IF 'idehelp
|
|
|
|
|
|
|
|
|
|
'IdeSystem specific code goes here
|
|
|
|
IF mCLICK THEN 'Find [...] search field (IdeSystem = 2)
|
|
IF mY = idewy - 4 AND mX > idewx - (idesystem2.w + 10) AND mX < idewx - 1 THEN 'inside text box
|
|
IF mX <= idewx - (idesystem2.w + 8) + 2 THEN
|
|
IF LEN(idefindtext) = 0 THEN
|
|
IdeSystem = 2 'no search string, so begin editing
|
|
idesystem2.issel = 0: idesystem2.v1 = 0
|
|
ELSE
|
|
IdeAddSearched idefindtext
|
|
IdeSystem = 1: GOTO idemf3 'F3 functionality
|
|
END IF
|
|
ELSE
|
|
IF mX = idewx - 3 THEN
|
|
showrecentlysearchedbox:
|
|
PCOPY 0, 3
|
|
GOSUB UpdateSearchBar
|
|
f$ = idesearchedbox
|
|
IF LEN(f$) THEN idefindtext = f$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
idealthighlight = 0
|
|
LOCATE , , 0: COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
IdeSystem = 1
|
|
IF LEN(f$) THEN GOTO idemf3 'F3 functionality
|
|
GOTO ideloop
|
|
ELSE
|
|
IF IdeSystem = 2 THEN
|
|
IF idesystem2.issel THEN idesystem2.issel = 0
|
|
|
|
IF LEN(idefindtext) <= idesystem2.w THEN
|
|
idesystem2.v1 = mX - (idewx - (idesystem2.w + 4))
|
|
ELSE
|
|
IF idesystem2.v1 > idesystem2.w THEN
|
|
idesystem2.v1 = (mX - (idewx - (idesystem2.w + 4))) + (idesystem2.v1 - idesystem2.w)
|
|
ELSE
|
|
idesystem2.v1 = mX - (idewx - (idesystem2.w + 4))
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
IdeSystem = 2
|
|
IF LEN(idefindtext) THEN idesystem2.issel = -1: idesystem2.sx1 = 0: idesystem2.v1 = LEN(idefindtext)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'IdeSystem
|
|
|
|
IF KB = KEY_F6 THEN 'switch windows
|
|
IF idehelp = 1 THEN
|
|
IF IdeSystem = 3 THEN
|
|
IdeSystem = 1
|
|
ELSE
|
|
IdeSystem = 3
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF idehelp = 1 THEN 'switch windows?
|
|
IF mCLICK OR mCLICK2 THEN
|
|
IF IdeSystem = 3 THEN
|
|
IF mY >= 2 AND mY < idewy THEN
|
|
IdeSystem = 1
|
|
END IF
|
|
ELSE
|
|
IF mY >= idewy AND mY < idewy + idesubwindow THEN
|
|
IdeSystem = 3
|
|
END IF
|
|
END IF
|
|
|
|
IF mCLICK2 THEN
|
|
GOTO invokecontextualmenu
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF IdeSystem = 2 THEN 'certain keys transfer control
|
|
z = 0
|
|
IF (KALT AND KB = KEY_UP) OR (KALT AND KB = KEY_DOWN) THEN GOTO showrecentlysearchedbox
|
|
IF KB = KEY_UP THEN z = 1
|
|
IF KB = KEY_DOWN THEN z = 1
|
|
IF KB = KEY_PAGEUP THEN z = 1
|
|
IF KB = KEY_PAGEDOWN THEN z = 1
|
|
IF mWHEEL THEN z = 1
|
|
IF z = 1 THEN IdeSystem = 1
|
|
END IF
|
|
|
|
IF IdeSystem = 2 THEN
|
|
a$ = idefindtext
|
|
IF LEN(K$) = 1 OR (KB = KEY_INSERT OR KB = KEY_DELETE) THEN
|
|
IF LEN(K$) = 1 THEN k = ASC(K$)
|
|
IF (KSHIFT AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(K$) = "V") THEN 'paste from clipboard
|
|
pasteIntoSearchField:
|
|
clip$ = _CLIPBOARD$ 'read clipboard
|
|
x = INSTR(clip$, CHR$(13))
|
|
IF x THEN clip$ = LEFT$(clip$, x - 1)
|
|
x = INSTR(clip$, CHR$(10))
|
|
IF x THEN clip$ = LEFT$(clip$, x - 1)
|
|
IF LEN(clip$) THEN
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
a$ = LEFT$(a$, sx1) + clip$ + RIGHT$(a$, LEN(a$) - sx2)
|
|
idesystem2.v1 = sx1
|
|
IF PasteCursorAtEnd THEN
|
|
idesystem2.v1 = sx1 + LEN(clip$)
|
|
END IF
|
|
idesystem2.issel = 0
|
|
END IF
|
|
ELSE
|
|
a$ = LEFT$(a$, idesystem2.v1) + clip$ + RIGHT$(a$, LEN(a$) - idesystem2.v1)
|
|
IF PasteCursorAtEnd THEN idesystem2.v1 = idesystem2.v1 + LEN(clip$)
|
|
END IF
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF (KCONTROL AND UCASE$(K$) = "A") THEN 'select all
|
|
selectAllInSearchField:
|
|
IF LEN(a$) > 0 THEN
|
|
idesystem2.issel = -1
|
|
idesystem2.sx1 = 0
|
|
idesystem2.v1 = LEN(a$)
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF ((KCTRL AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(K$) = "C")) THEN 'copy to clipboard
|
|
copysearchterm2clip:
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN _CLIPBOARD$ = MID$(a$, sx1 + 1, sx2 - sx1)
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF ((KSHIFT AND KB = KEY_DELETE) OR (KCONTROL AND UCASE$(K$) = "X")) THEN 'cut to clipboard
|
|
cutToClipboardSearchField:
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
_CLIPBOARD$ = MID$(a$, sx1 + 1, sx2 - sx1)
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idesystem2.v1 = sx1
|
|
idesystem2.issel = 0
|
|
END IF
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF k = 8 THEN
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idefindtext = a$
|
|
idesystem2.v1 = sx1
|
|
idesystem2.issel = 0
|
|
END IF
|
|
ELSEIF idesystem2.v1 > 0 THEN
|
|
a1$ = LEFT$(a$, idesystem2.v1 - 1)
|
|
IF idesystem2.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - idesystem2.v1) ELSE a2$ = ""
|
|
a$ = a1$ + a2$: idesystem2.v1 = idesystem2.v1 - 1
|
|
idefindtext = a$
|
|
END IF
|
|
END IF
|
|
IF k = 27 THEN
|
|
IdeSystem = 1
|
|
GOTO specialchar
|
|
END IF
|
|
IF k = 9 THEN
|
|
IdeSystem = 1
|
|
GOTO specialchar
|
|
END IF
|
|
IF k = 13 THEN
|
|
IF LEN(idefindtext) THEN
|
|
IdeAddSearched idefindtext
|
|
GOTO idemf3 'F3 functionality
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
IF k <> 8 AND k <> 9 AND k <> 0 AND k <> 10 AND k <> 13 AND k <> 26 AND k <> 255 THEN
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'replace selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idefindtext = a$
|
|
idesystem2.issel = 0
|
|
idesystem2.v1 = sx1
|
|
END IF
|
|
END IF
|
|
IF idesystem2.v1 > 0 THEN a1$ = LEFT$(a$, idesystem2.v1) ELSE a1$ = ""
|
|
IF idesystem2.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - idesystem2.v1) ELSE a2$ = ""
|
|
a$ = a1$ + K$ + a2$: idesystem2.v1 = idesystem2.v1 + 1
|
|
END IF
|
|
idefindtext = a$
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(60) THEN 'F2
|
|
IdeSystem = 1
|
|
GOTO idesubsjmp
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + "S" THEN 'DEL
|
|
deleteSelectionSearchField:
|
|
IF idesystem2.issel THEN
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idefindtext = a$
|
|
idesystem2.v1 = sx1
|
|
idesystem2.issel = 0
|
|
END IF
|
|
ELSE
|
|
IF idesystem2.v1 > 0 THEN a1$ = LEFT$(a$, idesystem2.v1) ELSE a1$ = ""
|
|
IF idesystem2.v1 < LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - idesystem2.v1 - 1) ELSE a2$ = ""
|
|
a$ = a1$ + a2$
|
|
idefindtext = a$
|
|
END IF
|
|
END IF
|
|
|
|
'cursor control
|
|
IF K$ = CHR$(0) + "K" THEN GOSUB selectcheck: idesystem2.v1 = idesystem2.v1 - 1
|
|
IF K$ = CHR$(0) + "M" THEN GOSUB selectcheck: idesystem2.v1 = idesystem2.v1 + 1
|
|
IF K$ = CHR$(0) + "G" THEN GOSUB selectcheck: idesystem2.v1 = 0
|
|
IF K$ = CHR$(0) + "O" THEN GOSUB selectcheck: idesystem2.v1 = LEN(a$)
|
|
IF idesystem2.v1 < 0 THEN idesystem2.v1 = 0
|
|
IF idesystem2.v1 > LEN(a$) THEN idesystem2.v1 = LEN(a$)
|
|
IF idesystem2.v1 = idesystem2.sx1 THEN idesystem2.issel = 0
|
|
|
|
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
|
|
ELSEIF mY >= idewy AND mY < idewy + idesubwindow THEN 'inside help
|
|
IdeSystem = 3
|
|
IF mCLICK2 THEN GOTO invokecontextualmenu ELSE GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF IdeSystem = 3 THEN
|
|
|
|
IF mCLICK OR K$ = CHR$(27) THEN
|
|
IF (mY = idewy AND (mX >= idewx - 3 AND mX <= idewx - 1)) OR K$ = CHR$(27) THEN 'close help
|
|
closeHelp:
|
|
idewy = idewy + idesubwindow
|
|
idehelp = 0
|
|
idesubwindow = 0
|
|
skipdisplay = 0
|
|
IdeSystem = 1
|
|
retval = 1: GOSUB redrawItAll
|
|
END IF
|
|
END IF
|
|
|
|
|
|
IF mCLICK THEN
|
|
IF (mY = idewy AND (mX >= idewx - 17 AND mX <= idewx - 4)) THEN 'view on wiki
|
|
launchWiki:
|
|
url$ = wikiBaseAddress$ + "/index.php?title=" + Back$(Help_Back_Pos)
|
|
url$ = StrReplace$(url$, " ", "%20"): url$ = StrReplace$(url$, "&", "%26")
|
|
url$ = StrReplace$(url$, "+", "%2B")
|
|
IF INSTR(_OS$, "WIN") = 0 THEN
|
|
url$ = StrReplace$(url$, "$", "\$")
|
|
url$ = StrReplace$(url$, "&", "\&")
|
|
url$ = StrReplace$(url$, "(", "\(")
|
|
url$ = StrReplace$(url$, ")", "\)")
|
|
END IF
|
|
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
SHELL _HIDE _DONTWAIT "start " + url$
|
|
ELSEIF INSTR(_OS$, "MAC") THEN
|
|
SHELL _HIDE _DONTWAIT "open " + url$
|
|
ELSE
|
|
SHELL _HIDE _DONTWAIT "xdg-open " + url$
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF mY = idewy THEN
|
|
|
|
sx = 2
|
|
FOR x = Back_Str_Pos TO Back_Str_Pos + idewx - 6
|
|
IF mX = sx THEN
|
|
i = CVL(MID$(Back_Str_I$, (x - 1) * 4 + 1, 4))
|
|
a = ASC(Back_Str$, x)
|
|
IF a <> 0 AND i <> Help_Back_Pos THEN
|
|
Help_Back(Help_Back_Pos).sx = Help_sx 'update position
|
|
Help_Back(Help_Back_Pos).sy = Help_sy
|
|
Help_Back(Help_Back_Pos).cx = Help_cx
|
|
Help_Back(Help_Back_Pos).cy = Help_cy
|
|
Help_Back_Pos = i
|
|
Help_Select = 0: Help_MSelect = 0
|
|
Help_sx = Help_Back(Help_Back_Pos).sx
|
|
Help_sy = Help_Back(Help_Back_Pos).sy
|
|
Help_cx = Help_Back(Help_Back_Pos).cx
|
|
Help_cy = Help_Back(Help_Back_Pos).cy
|
|
a$ = Wiki$(Back$(Help_Back_Pos))
|
|
WikiParse a$
|
|
GOTO newpageparsed
|
|
END IF
|
|
END IF
|
|
sx = sx + 1
|
|
NEXT
|
|
|
|
'LOCATE idewy, 2
|
|
'FOR x = Back_Str_Pos TO Back_Str_Pos + idewx - 5
|
|
' i = CVL(MID$(Back_Str_I$, (x - 1) * 4 + 1, 4))
|
|
' a = ASC(Back_Str$, x)
|
|
' IF a THEN
|
|
' COLOR 0, 7
|
|
' IF i < Help_Back_Pos THEN COLOR 9, 7
|
|
' IF i > Help_Back_Pos THEN COLOR 9, 7
|
|
' PRINT CHR$(a);
|
|
' ELSE
|
|
' COLOR 7, 0
|
|
' PRINT chr$(196);
|
|
' END IF
|
|
'NEXT
|
|
|
|
|
|
END IF
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "A" THEN 'select all
|
|
selectAllInHelp:
|
|
IF help_h THEN
|
|
Help_Select = 2
|
|
Help_SelX1 = 1
|
|
Help_SelY1 = 1
|
|
Help_SelX2 = 10000000
|
|
Help_SelY2 = help_h
|
|
Help_cx = 1: Help_cy = help_h + 1
|
|
GOTO keep_select
|
|
END IF
|
|
END IF
|
|
|
|
IF ((KCTRL AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(K$) = "C")) AND Help_Select = 2 THEN 'copy to clipboard
|
|
copyhelp2clip:
|
|
ideerror = -1 'if it fails, just carry on
|
|
clip$ = ""
|
|
FOR y = Help_SelY1 TO Help_SelY2
|
|
IF y <> Help_SelY1 THEN clip$ = clip$ + CHR$(13) + CHR$(10)
|
|
a$ = ""
|
|
IF y <= help_h THEN
|
|
l = CVL(MID$(Help_Line$, (y - 1) * 4 + 1, 4))
|
|
x = l
|
|
x3 = 1
|
|
c = ASC(Help_Txt$, x)
|
|
DO UNTIL c = 13
|
|
IF Help_Select = 2 THEN
|
|
IF y >= Help_SelY1 AND y <= Help_SelY2 THEN
|
|
IF x3 >= Help_SelX1 AND x3 <= Help_SelX2 THEN
|
|
a$ = a$ + CHR$(c)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
x3 = x3 + 1: x = x + 4: c = ASC(Help_Txt$, x)
|
|
LOOP
|
|
END IF
|
|
clip$ = clip$ + a$
|
|
NEXT
|
|
IF Help_SelY1 = Help_SelY2 AND Help_cy > Help_cy1 THEN clip$ = clip$ + CHR$(13) + CHR$(10)
|
|
IF clip$ <> "" THEN _CLIPBOARD$ = clip$
|
|
ideerror = 1
|
|
GOTO keep_select
|
|
END IF
|
|
|
|
|
|
IF mX >= Help_wx1 AND mY >= Help_wy1 AND mX <= Help_wx2 AND mY <= Help_wy2 THEN
|
|
IF mCLICK THEN
|
|
Help_cx = Help_sx + (mX - Help_wx1)
|
|
Help_cy = Help_sy + (mY - Help_wy1)
|
|
Help_Select = 1
|
|
Help_MSelect = 1
|
|
Help_cx1 = Help_cx: Help_cy1 = Help_cy
|
|
GOTO keep_select
|
|
END IF
|
|
IF (mB AND Help_Scrollbar = 0) THEN
|
|
Help_cx = Help_sx + (mX - Help_wx1)
|
|
Help_cy = Help_sy + (mY - Help_wy1)
|
|
IF Help_Select THEN GOTO keep_select
|
|
END IF
|
|
ELSE
|
|
'outside field
|
|
IF (mB AND Help_Scrollbar = 0) AND Help_MSelect = 1 AND Help_Select = 2 THEN
|
|
IF mX < Help_wx1 THEN Help_cx = Help_cx - 1
|
|
IF mX > Help_wx2 THEN Help_cx = Help_cx + 1
|
|
IF mY < Help_wy1 THEN Help_cy = Help_cy - 1
|
|
IF mY > Help_wy2 THEN Help_cy = Help_cy + 1
|
|
GOTO keep_select
|
|
END IF
|
|
END IF
|
|
|
|
IF KSHIFT THEN
|
|
IF Help_Select = 0 THEN
|
|
Help_Select = 1
|
|
Help_MSelect = 0
|
|
Help_cx1 = Help_cx: Help_cy1 = Help_cy
|
|
END IF
|
|
ELSE
|
|
IF (KB > 0 OR mWHEEL <> 0) AND KSTATECHANGED = 0 THEN Help_Select = 0
|
|
END IF
|
|
keep_select:
|
|
|
|
IF KB = 9 THEN
|
|
IF LEN(Help_Search_Str) THEN norep = 1: GOTO delsrchagain
|
|
END IF
|
|
|
|
IF LEN(K$) = 1 AND KCONTROL = 0 THEN
|
|
k = ASC(K$)
|
|
IF alphanumeric(k) OR k = 36 OR k = 32 THEN
|
|
norep = 0
|
|
t# = TIMER(0.001)
|
|
oldk = 0: IF LEN(Help_Search_Str) THEN oldk = ASC(Help_Search_Str, LEN(Help_Search_Str))
|
|
IF t# > Help_Search_Time + 1 OR t# < Help_Search_Time OR (k = oldk AND LEN(Help_Search_Str) = 1) THEN
|
|
IF k = oldk THEN norep = 1
|
|
Help_Search_Str = K$
|
|
ELSE
|
|
Help_Search_Str = Help_Search_Str + K$
|
|
END IF
|
|
Help_Search_Time = t#
|
|
'search for next appropriate link
|
|
delsrchagain:
|
|
ox = Help_cx
|
|
oy = Help_cy
|
|
IF oy > help_h THEN oy = 1
|
|
cy = oy
|
|
cx = ox
|
|
IF norep = 1 THEN cx = cx + 1
|
|
looped = 0
|
|
DO
|
|
'build the line
|
|
l = CVL(MID$(Help_Line$, (cy - 1) * 4 + 1, 4))
|
|
x = l
|
|
a$ = ""
|
|
c = ASC(Help_Txt$, x)
|
|
DO UNTIL c = 13
|
|
lnk = CVI(MID$(Help_Txt$, x + 2, 2))
|
|
IF lnk THEN a$ = a$ + CHR$(c) ELSE a$ = a$ + CHR$(0) 'only add text with links
|
|
x = x + 4: c = ASC(Help_Txt$, x)
|
|
LOOP
|
|
|
|
helpscanrow:
|
|
px = INSTR(cx, UCASE$(a$), UCASE$(Help_Search_Str))
|
|
px2 = INSTR(cx, UCASE$(a$), UCASE$("_" + Help_Search_Str))
|
|
IF px2 < px AND px2 <> 0 AND LEFT$(Help_Search_Str, 1) <> "_" THEN px = px2
|
|
|
|
IF looped = 1 AND cy = oy AND px = 0 THEN GOTO strnotfound
|
|
IF px THEN
|
|
'isolate and REVERSE select link
|
|
l = CVL(MID$(Help_Line$, (cy - 1) * 4 + 1, 4))
|
|
x = l
|
|
x2 = 1
|
|
a$ = ""
|
|
c = ASC(Help_Txt$, x)
|
|
oldlnk = 0
|
|
lnkx1 = 0: lnkx2 = 0
|
|
DO UNTIL c = 13
|
|
lnk = CVI(MID$(Help_Txt$, x + 2, 2))
|
|
IF lnkx1 = 0 AND lnk <> 0 AND oldlnk = 0 AND px = x2 THEN lnkx1 = x2
|
|
IF lnkx1 <> 0 AND lnk = 0 AND lnkx2 = 0 THEN lnkx2 = x2 - 1
|
|
x = x + 4: c = ASC(Help_Txt$, x)
|
|
x2 = x2 + 1
|
|
oldlnk = lnk
|
|
LOOP
|
|
|
|
IF Back_Name$(Help_Back_Pos) = "Alphabetical" OR Back_Name$(Help_Back_Pos) = "By Usage" THEN
|
|
IF lnkx1 <> 3 THEN
|
|
cx = px + 1
|
|
GOTO helpscanrow
|
|
END IF
|
|
END IF
|
|
|
|
IF lnkx1 THEN
|
|
IF lnkx2 = 0 THEN lnkx2 = x2 - 1
|
|
Help_Select = 2
|
|
Help_cx1 = lnkx2 + 1
|
|
Help_cx = lnkx1
|
|
Help_cy = cy
|
|
Help_cy1 = cy
|
|
GOTO foundsstr
|
|
END IF
|
|
|
|
cx = px + 1
|
|
GOTO helpscanrow
|
|
END IF
|
|
cx = 1
|
|
cy = cy + 1
|
|
IF cy > help_h THEN cy = 1: looped = 1
|
|
LOOP
|
|
END IF
|
|
END IF
|
|
foundsstr:
|
|
strnotfound:
|
|
|
|
IF KB = KEY_HOME AND KCONTROL THEN
|
|
Help_cx = 1: Help_cy = 1
|
|
END IF
|
|
IF KB = KEY_END AND KCONTROL THEN
|
|
Help_cx = 1: Help_cy = help_h + 1
|
|
END IF
|
|
|
|
IF KB = KEY_HOME AND KCONTROL = 0 THEN Help_cx = 1
|
|
IF KB = KEY_END AND KCONTROL = 0 THEN
|
|
Help_cx = Help_LineLen(Help_cy - Help_sy) + 1
|
|
END IF
|
|
|
|
IF KB = KEY_PAGEUP THEN
|
|
Help_cy = Help_cy - (Help_wh - 1)
|
|
END IF
|
|
|
|
IF KB = KEY_PAGEDOWN THEN
|
|
Help_cy = Help_cy + (Help_wh - 1)
|
|
END IF
|
|
|
|
IF KB = KEY_DOWN THEN Help_cy = Help_cy + 1
|
|
IF KB = KEY_UP THEN Help_cy = Help_cy - 1
|
|
IF KB = KEY_LEFT THEN Help_cx = Help_cx - 1
|
|
IF KB = KEY_RIGHT THEN Help_cx = Help_cx + 1
|
|
|
|
'move relative to top/bottom
|
|
IF mWHEEL < 0 THEN Help_cy = Help_sy
|
|
IF mWHEEL > 0 THEN Help_cy = Help_sy + (Help_wh - 1)
|
|
Help_cy = Help_cy + mWHEEL * 3
|
|
|
|
'fix cursor
|
|
IF Help_cx < 1 THEN Help_cx = 1
|
|
IF Help_cx > help_w + 1 THEN Help_cx = help_w + 1
|
|
IF Help_cy < 1 THEN Help_cy = 1
|
|
IF Help_cy > help_h + 1 THEN Help_cy = help_h + 1
|
|
|
|
'screen follows cursor
|
|
IF Help_cx < Help_sx THEN Help_sx = Help_cx
|
|
IF Help_cx >= Help_sx + Help_ww THEN Help_sx = Help_cx - Help_ww + 1
|
|
|
|
IF Help_cy < Help_sy THEN Help_sy = Help_cy
|
|
IF Help_cy >= Help_sy + Help_wh THEN Help_sy = Help_cy - Help_wh + 1
|
|
|
|
'fix screen
|
|
IF Help_sx < 1 THEN Help_sx = 1
|
|
IF Help_sy < 1 THEN Help_sy = 1
|
|
|
|
IF K$ = CHR$(8) THEN
|
|
IF Help_Back_Pos > 1 THEN
|
|
Help_Back(Help_Back_Pos).sx = Help_sx 'update position
|
|
Help_Back(Help_Back_Pos).sy = Help_sy
|
|
Help_Back(Help_Back_Pos).cx = Help_cx
|
|
Help_Back(Help_Back_Pos).cy = Help_cy
|
|
Help_Back_Pos = Help_Back_Pos - 1
|
|
Help_Select = 0: Help_MSelect = 0
|
|
Help_sx = Help_Back(Help_Back_Pos).sx
|
|
Help_sy = Help_Back(Help_Back_Pos).sy
|
|
Help_cx = Help_Back(Help_Back_Pos).cx
|
|
Help_cy = Help_Back(Help_Back_Pos).cy
|
|
a$ = Wiki$(Back$(Help_Back_Pos))
|
|
WikiParse a$
|
|
GOTO newpageparsed
|
|
END IF
|
|
END IF
|
|
|
|
IF Help_cy >= 1 AND Help_cy <= help_h THEN
|
|
l = CVL(MID$(Help_Line$, (Help_cy - 1) * 4 + 1, 4))
|
|
x = l
|
|
x2 = 1
|
|
c = ASC(Help_Txt$, x)
|
|
DO UNTIL c = 13
|
|
|
|
IF x2 = Help_cx THEN
|
|
lnk = CVI(MID$(Help_Txt$, x + 2, 2))
|
|
IF lnk THEN
|
|
'retrieve lnk info
|
|
l1 = 1
|
|
FOR lx = 1 TO lnk - 1
|
|
l1 = INSTR(l1, Help_Link$, Help_Link_Sep$) + 1
|
|
NEXT
|
|
l2 = INSTR(l1, Help_Link$, Help_Link_Sep$) - 1
|
|
l$ = MID$(Help_Link$, l1, l2 - l1 + 1)
|
|
|
|
IF mCLICK OR K$ = CHR$(13) THEN
|
|
mCLICK = 0
|
|
|
|
IF LEFT$(l$, 5) = "EXTL:" THEN
|
|
IF (K$ = CHR$(13)) OR (mY = Help_cy - Help_sy + Help_wy1 AND mX = Help_cx - Help_sx + Help_wx1) THEN
|
|
l$ = RIGHT$(l$, LEN(l$) - 5)
|
|
l$ = StrReplace$(l$, " ", "%20")
|
|
l$ = StrReplace$(l$, "&", "%26")
|
|
IF INSTR(_OS$, "WIN") = 0 THEN
|
|
l$ = StrReplace$(l$, "$", "\$")
|
|
l$ = StrReplace$(l$, "&", "\&")
|
|
l$ = StrReplace$(l$, "(", "\(")
|
|
l$ = StrReplace$(l$, ")", "\)")
|
|
END IF
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
SHELL _HIDE _DONTWAIT "start " + l$
|
|
ELSEIF INSTR(_OS$, "MAC") THEN
|
|
SHELL _HIDE _DONTWAIT "open " + l$
|
|
ELSE
|
|
SHELL _HIDE _DONTWAIT "xdg-open " + l$
|
|
END IF
|
|
END IF
|
|
GOTO specialchar
|
|
ELSEIF LEFT$(l$, 5) = "PAGE:" THEN
|
|
l$ = RIGHT$(l$, LEN(l$) - 5)
|
|
IF Back$(Help_Back_Pos) <> l$ THEN
|
|
Help_Select = 0: Help_MSelect = 0
|
|
'COLOR 7, 0
|
|
|
|
Help_Back(Help_Back_Pos).sx = Help_sx 'update position
|
|
Help_Back(Help_Back_Pos).sy = Help_sy
|
|
Help_Back(Help_Back_Pos).cx = Help_cx
|
|
Help_Back(Help_Back_Pos).cy = Help_cy
|
|
|
|
top = UBOUND(back$)
|
|
|
|
IF Help_Back_Pos < top THEN
|
|
IF Back$(Help_Back_Pos + 1) = l$ THEN
|
|
GOTO usenextentry
|
|
END IF
|
|
END IF
|
|
|
|
top = top + 1
|
|
REDIM _PRESERVE Back(top) AS STRING
|
|
REDIM _PRESERVE Help_Back(top) AS Help_Back_Type
|
|
REDIM _PRESERVE Back_Name(top) AS STRING
|
|
'Shuffle array upwards after current pos
|
|
FOR x = top - 1 TO Help_Back_Pos + 1 STEP -1
|
|
Back_Name$(x + 1) = Back_Name$(x)
|
|
Back$(x + 1) = Back$(x)
|
|
Help_Back(x + 1).sx = Help_Back(x).sx
|
|
Help_Back(x + 1).sy = Help_Back(x).sy
|
|
Help_Back(x + 1).cx = Help_Back(x).cx
|
|
Help_Back(x + 1).cy = Help_Back(x).cy
|
|
NEXT
|
|
usenextentry:
|
|
Help_Back_Pos = Help_Back_Pos + 1
|
|
Back$(Help_Back_Pos) = l$
|
|
Back_Name$(Help_Back_Pos) = Back2BackName$(l$)
|
|
Help_Back(Help_Back_Pos).sx = 1
|
|
Help_Back(Help_Back_Pos).sy = 1
|
|
Help_Back(Help_Back_Pos).cx = 1
|
|
Help_Back(Help_Back_Pos).cy = 1
|
|
Help_sx = 1: Help_sy = 1: Help_cx = 1: Help_cy = 1
|
|
a$ = Wiki$(l$)
|
|
WikiParse a$
|
|
GOTO newpageparsed
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
END IF
|
|
END IF
|
|
x = x + 4: c = ASC(Help_Txt$, x)
|
|
x2 = x2 + 1
|
|
LOOP
|
|
END IF
|
|
|
|
IF Help_Select THEN
|
|
Help_Select = 1 'revert to non-selected if cursor moved to neutral pos
|
|
IF Help_cx <> Help_cx1 OR Help_cy <> Help_cy1 THEN Help_Select = 2
|
|
END IF
|
|
|
|
'Determine the exact region selected
|
|
IF Help_Select = 2 THEN
|
|
IF Help_cy = Help_cy1 THEN
|
|
Help_SelY1 = Help_cy: Help_SelY2 = Help_cy
|
|
IF Help_cx > Help_cx1 THEN
|
|
Help_SelX1 = Help_cx1: Help_SelX2 = Help_cx - 1
|
|
ELSE
|
|
Help_SelX1 = Help_cx: Help_SelX2 = Help_cx1 - 1
|
|
END IF
|
|
ELSE
|
|
Help_SelX1 = 1: Help_SelX2 = 10000000
|
|
IF Help_cy > Help_cy1 THEN
|
|
Help_SelY1 = Help_cy1: Help_SelY2 = Help_cy
|
|
IF Help_cx = 1 THEN Help_SelY2 = Help_cy - 1
|
|
ELSE
|
|
Help_SelY1 = Help_cy: Help_SelY2 = Help_cy1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
newpageparsed:
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
|
|
IF KB = KEY_F1 THEN
|
|
contextualhelp:
|
|
IdeContextHelpSF = 0
|
|
'identify word or character at current cursor position
|
|
a2$ = UCASE$(getWordAtCursor$)
|
|
lnks = 0
|
|
lnks$ = findHelpTopic$(a2$, lnks, 0)
|
|
|
|
IF lnks THEN
|
|
lnks$ = MID$(lnks$, 2, LEN(lnks$) - 2)
|
|
lnk$ = lnks$
|
|
IF lnks > 1 THEN
|
|
'clarify context
|
|
lnk$ = idef1box$(lnks$, lnks)
|
|
IF lnk$ = "C" THEN GOTO ideloop
|
|
END IF
|
|
|
|
IF INSTR(UCASE$(lnk$), "PARENTHESIS") THEN GOTO ideloop
|
|
|
|
OpenHelpLnk:
|
|
|
|
|
|
Help_Back(Help_Back_Pos).sx = Help_sx 'update position
|
|
Help_Back(Help_Back_Pos).sy = Help_sy
|
|
Help_Back(Help_Back_Pos).cx = Help_cx
|
|
Help_Back(Help_Back_Pos).cy = Help_cy
|
|
|
|
top = UBOUND(back$)
|
|
|
|
|
|
IF Back$(Help_Back_Pos) = lnk$ THEN Help_Back_Pos = Help_Back_Pos - 1: GOTO usenextentry2
|
|
IF Help_Back_Pos < top THEN
|
|
IF Back$(Help_Back_Pos + 1) = lnk$ THEN
|
|
GOTO usenextentry2
|
|
END IF
|
|
END IF
|
|
|
|
|
|
top = top + 1
|
|
REDIM _PRESERVE Back(top) AS STRING
|
|
REDIM _PRESERVE Help_Back(top) AS Help_Back_Type
|
|
REDIM _PRESERVE Back_Name(top) AS STRING
|
|
'Shuffle array upwards after current pos
|
|
FOR x = top - 1 TO Help_Back_Pos + 1 STEP -1
|
|
Back_Name$(x + 1) = Back_Name$(x)
|
|
Back$(x + 1) = Back$(x)
|
|
Help_Back(x + 1).sx = Help_Back(x).sx
|
|
Help_Back(x + 1).sy = Help_Back(x).sy
|
|
Help_Back(x + 1).cx = Help_Back(x).cx
|
|
Help_Back(x + 1).cy = Help_Back(x).cy
|
|
NEXT
|
|
usenextentry2:
|
|
Help_Back_Pos = Help_Back_Pos + 1
|
|
Back$(Help_Back_Pos) = lnk$
|
|
Back_Name$(Help_Back_Pos) = Back2BackName$(lnk$)
|
|
Help_Back(Help_Back_Pos).sx = 1
|
|
Help_Back(Help_Back_Pos).sy = 1
|
|
Help_Back(Help_Back_Pos).cx = 1
|
|
Help_Back(Help_Back_Pos).cy = 1
|
|
Help_sx = 1: Help_sy = 1: Help_cx = 1: Help_cy = 1
|
|
|
|
a$ = Wiki$(lnk$)
|
|
|
|
IF idehelp = 0 THEN
|
|
IF idesubwindow THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
idesubwindow = idewy \ 2: idewy = idewy - idesubwindow
|
|
Help_wx1 = 2: Help_wy1 = idewy + 1: Help_wx2 = idewx - 1: Help_wy2 = idewy + idesubwindow - 2: Help_ww = Help_wx2 - Help_wx1 + 1: Help_wh = Help_wy2 - Help_wy1 + 1
|
|
WikiParse a$
|
|
idehelp = 1
|
|
skipdisplay = 0
|
|
IdeSystem = 3
|
|
retval = 1
|
|
ELSE
|
|
WikiParse a$
|
|
IdeSystem = 3
|
|
END IF
|
|
|
|
GOSUB redrawitall
|
|
GOTO specialchar
|
|
|
|
ELSE
|
|
'No help found; Does the user want help for a SUB or FUNCTION?
|
|
a2$ = LTRIM$(RTRIM$(a2$))
|
|
IF LEN(a2$) THEN
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(a2$, 1)))
|
|
a2$ = LEFT$(a2$, LEN(a2$) - 1) 'removes sigil, if any
|
|
IF LEN(a2$) = 0 THEN GOTO NoKeywordFound
|
|
LOOP
|
|
|
|
FOR y = 1 TO iden
|
|
a$ = idegetline(y)
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
sf = 0
|
|
nca$ = UCASE$(a$)
|
|
IF LEFT$(nca$, 4) = "SUB " THEN sf = 1: sf$ = "SUB "
|
|
IF LEFT$(nca$, 9) = "FUNCTION " THEN sf = 2: sf$ = "FUNCTION "
|
|
IF sf THEN
|
|
IF RIGHT$(nca$, 7) = " STATIC" THEN
|
|
a$ = RTRIM$(LEFT$(a$, LEN(a$) - 7))
|
|
END IF
|
|
|
|
IF sf = 1 THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - 4)
|
|
ELSE
|
|
a$ = RIGHT$(a$, LEN(a$) - 9)
|
|
END IF
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
x = INSTR(a$, "(")
|
|
IF x THEN
|
|
n$ = RTRIM$(LEFT$(a$, x - 1))
|
|
args$ = RIGHT$(a$, LEN(a$) - x + 1)
|
|
x = INSTR(args$, ")"): IF x THEN args$ = LEFT$(args$, x)
|
|
ELSE
|
|
n$ = a$
|
|
args$ = ""
|
|
cleanSubName n$
|
|
END IF
|
|
|
|
backupn$ = n$
|
|
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(n$, 1)))
|
|
n$ = LEFT$(n$, LEN(n$) - 1) 'removes sigil, if any
|
|
LOOP
|
|
|
|
IF UCASE$(n$) = a2$ THEN
|
|
a$ = "{{DISPLAYTITLE:agp@" + backupn$ + "}}" + CHR$(10)
|
|
a$ = a$ + "This is a subroutine or function that is used in your program as follows:" + CHR$(10)
|
|
a$ = a$ + CHR$(10) + CHR$(10) + "{{PageSyntax}}" + CHR$(10)
|
|
a$ = a$ + ": [[" + LEFT$(sf$, LEN(sf$) - 1) + "]] '''" + backupn$ + "''' " + args$ + CHR$(10)
|
|
a$ = a$ + CHR$(10) + CHR$(10) + "{{PageSeeAlso}}" + CHR$(10)
|
|
a$ = a$ + "* [[Sub (explanatory)]]" + CHR$(10)
|
|
a$ = a$ + "* [[Function (explanatory)]]" + CHR$(10)
|
|
|
|
IdeContextHelpSF = -1
|
|
|
|
IF idehelp = 0 THEN
|
|
IF idesubwindow THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
idesubwindow = idewy \ 2: idewy = idewy - idesubwindow
|
|
Help_wx1 = 2: Help_wy1 = idewy + 1: Help_wx2 = idewx - 1: Help_wy2 = idewy + idesubwindow - 2: Help_ww = Help_wx2 - Help_wx1 + 1: Help_wh = Help_wy2 - Help_wy1 + 1
|
|
WikiParse a$
|
|
idehelp = 1
|
|
skipdisplay = 0
|
|
IdeSystem = 3
|
|
retval = 1
|
|
END IF
|
|
|
|
WikiParse a$
|
|
IdeSystem = 3
|
|
GOSUB redrawItAll
|
|
GOTO specialchar
|
|
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
NoKeywordFound:
|
|
END IF 'lnks
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
|
|
IF KALT AND KB = KEY_LEFT THEN
|
|
bmkremoved = 0
|
|
bmkremove:
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y = idecy THEN
|
|
FOR b2 = b TO IdeBmkN - 1
|
|
IdeBmk(b2) = IdeBmk(b2 + 1)
|
|
NEXT
|
|
IdeBmkN = IdeBmkN - 1
|
|
bmkremoved = 1
|
|
ideunsaved = 1
|
|
GOTO bmkremove
|
|
END IF
|
|
NEXT
|
|
IF bmkremoved = 0 THEN
|
|
IdeBmkN = IdeBmkN + 1
|
|
IF IdeBmkN > UBOUND(IdeBmk) THEN x = UBOUND(IdeBmk) * 2: REDIM _PRESERVE IdeBmk(x) AS IdeBmkType
|
|
IdeBmk(IdeBmkN).y = idecy
|
|
IdeBmk(IdeBmkN).x = idecx
|
|
IdeBmk(IdeBmkN).reserved = 0: IdeBmk(IdeBmkN).reserved2 = 0
|
|
ideunsaved = 1
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KALT AND (KB = KEY_DOWN OR KB = KEY_UP) THEN
|
|
IF IdeBmkN = 0 THEN
|
|
result = idemessagebox("Bookmarks", "No bookmarks exist (Use Alt+Left to create a bookmark)", "")
|
|
SCREEN , , 3, 0
|
|
idealthighlight = 0
|
|
LOCATE , , 0: COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
GOTO specialchar
|
|
END IF
|
|
IF IdeBmkN = 1 THEN
|
|
IF idecy = IdeBmk(1).y THEN
|
|
result = idemessagebox("Bookmarks", "No other bookmarks exist", "")
|
|
SCREEN , , 3, 0
|
|
idealthighlight = 0
|
|
LOCATE , , 0: COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
GOTO specialchar
|
|
END IF
|
|
END IF
|
|
l = idecy
|
|
DO
|
|
IF KB = KEY_DOWN THEN l = l + 1 ELSE l = l - 1
|
|
IF l < 1 THEN l = iden
|
|
IF l > iden THEN l = 1
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y = l THEN EXIT DO
|
|
NEXT
|
|
LOOP
|
|
AddQuickNavHistory
|
|
idecy = l
|
|
idecx = IdeBmk(b).x
|
|
ideselect = 0
|
|
idecentercurrentline
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KALT AND KB = KEY_RIGHT THEN
|
|
'***RESERVED***
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
IF KALT AND KB >= 48 AND KB <= 57 THEN GOTO specialchar ' Steve Edit on 07-04-2014 to add support for ALT-numkey combos to produce ASCII codes
|
|
|
|
IF ideselect = 1 AND wholeword.select < 0 AND mY = old.mY THEN
|
|
'Mouse button has been held down since the last double-click word selection
|
|
'and the user has moved the mouse only horizontally. Attempt to keep
|
|
'selecting words to the left or right.
|
|
IF wholeword.select = -2 THEN
|
|
'we had a snap selection but moved up or down.
|
|
'now we're back in the same line.
|
|
wholeword.select = -1
|
|
idemouseselect = 0
|
|
ideselectx1 = wholeword.selectx1
|
|
idecx = wholeword.idecx
|
|
ideselecty1 = wholeword.selecty1
|
|
idecy = wholeword.idecy
|
|
END IF
|
|
newposition = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
a$ = idegetline$(idecy)
|
|
IF newposition > LEN(a$) THEN idecx = newposition: GOTO DoneWholeWord
|
|
IF newposition = 1 THEN ideselectx1 = 1: GOTO DoneWholeWord
|
|
char.clicked$ = MID$(a$, newposition, 1)
|
|
IF LEN(char.clicked$) > 0 THEN
|
|
IF newposition < wholeword.idecx THEN
|
|
'To the left, to the left.
|
|
FOR i = newposition TO 1 STEP -1
|
|
IF INSTR(char.sep$, MID$(a$, i, 1)) THEN EXIT FOR
|
|
NEXT i
|
|
ideselectx1 = i + 1
|
|
ELSEIF newposition > wholeword.selectx1 THEN
|
|
'To the right.
|
|
FOR i = newposition TO LEN(a$)
|
|
IF INSTR(char.sep$, MID$(a$, i, 1)) THEN EXIT FOR
|
|
NEXT i
|
|
idecx = i
|
|
END IF
|
|
END IF
|
|
ELSEIF ideselect = 1 AND wholeword.select = -1 AND mY <> old.mY THEN
|
|
idemouseselect = 1
|
|
wholeword.select = -2
|
|
END IF
|
|
|
|
IF mCLICK THEN
|
|
IF mX > 1 + maxLineNumberLength AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN 'inside text box
|
|
IF old.mX = mX AND old.mY = mY THEN
|
|
IF timeElapsedSince(last.TBclick#) > .5 THEN GOTO regularTextBox_click
|
|
'Double-click on text box: attempt to select "word" clicked
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN
|
|
GOTO regularTextBox_click
|
|
ELSEIF ActiveINCLUDELink > 0 THEN
|
|
'Double-click on an $INCLUDE statement launches that file in
|
|
'a separate instance of QB64-PE:
|
|
p$ = idepath$ + pathsep$
|
|
f$ = p$ + ActiveINCLUDELinkFile
|
|
IF _FILEEXISTS(f$) = 0 THEN f$ = ActiveINCLUDELinkFile
|
|
IF _FILEEXISTS(f$) THEN
|
|
backupIncludeFile = FREEFILE
|
|
OPEN f$ FOR BINARY AS #backupIncludeFile
|
|
tempInclude1$ = SPACE$(LOF(backupIncludeFile))
|
|
GET #backupIncludeFile, 1, tempInclude1$
|
|
CLOSE #backupIncludeFile
|
|
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 0
|
|
COLOR 15, 1
|
|
_PRINTSTRING (2, idewy - 3), "Editing $INCLUDE file..."
|
|
dummy = DarkenFGBG(1)
|
|
PCOPY 3, 0
|
|
|
|
_DELAY .2
|
|
p$ = QuotedFilename$(COMMAND$(0)) + " " + QuotedFilename$(f$)
|
|
IF errorLineInInclude > 0 AND idefocusline = idecy THEN
|
|
p$ = p$ + " -l:" + str2$(errorLineInInclude)
|
|
ELSEIF warningInIncludeLine > 0 AND warningInInclude = idecy THEN
|
|
p$ = p$ + " -l:" + str2$(warningInIncludeLine)
|
|
END IF
|
|
SHELL p$
|
|
|
|
OPEN f$ FOR BINARY AS #backupIncludeFile
|
|
tempInclude2$ = SPACE$(LOF(backupIncludeFile))
|
|
GET #backupIncludeFile, 1, tempInclude2$
|
|
CLOSE #backupIncludeFile
|
|
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
|
|
IF tempInclude1$ = tempInclude2$ THEN
|
|
IF IDEShowErrorsImmediately THEN
|
|
IF idecompiling = 1 THEN
|
|
_PRINTSTRING (2, idewy - 3), STRING$(3, 250) '"..."
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), "OK" 'report OK status
|
|
statusarealink = 0
|
|
IF totalWarnings > 0 THEN
|
|
COLOR 11, 1
|
|
msg$ = " (" + LTRIM$(STR$(totalWarnings)) + " warning"
|
|
IF totalWarnings > 1 THEN msg$ = msg$ + "s"
|
|
msg$ = msg$ + " - click here or Ctrl+W to view)"
|
|
_PRINTSTRING (4, idewy - 3), msg$
|
|
statusarealink = 4
|
|
END IF
|
|
IF waitingForVarList THEN GOSUB showVarListReady
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
|
|
PCOPY 3, 0
|
|
|
|
tempInclude1$ = ""
|
|
tempInclude2$ = ""
|
|
END IF
|
|
ELSE
|
|
a$ = idegetline$(idecy)
|
|
IF LEN(a$) = 0 THEN GOTO regularTextBox_click
|
|
char.clicked$ = MID$(a$, idecx, 1)
|
|
ideselect = 1
|
|
ideselecty1 = idecy
|
|
IF LEN(char.clicked$) > 0 AND char.clicked$ <> CHR$(32) THEN
|
|
FOR i = idecx TO 1 STEP -1
|
|
IF INSTR(char.sep$, MID$(a$, i, 1)) THEN EXIT FOR
|
|
NEXT i
|
|
ideselectx1 = i + 1
|
|
wholeword.selectx1 = ideselectx1
|
|
FOR i = idecx TO LEN(a$)
|
|
IF INSTR(char.sep$, MID$(a$, i, 1)) THEN EXIT FOR
|
|
NEXT i
|
|
idecx = i
|
|
wholeword.idecx = idecx
|
|
wholeword.select = -1
|
|
wholeword.idecy = idecy
|
|
wholeword.selecty1 = ideselecty1
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
regularTextBox_click:
|
|
old.mX = mX: old.mY = mY: last.TBclick# = TIMER
|
|
ideselect = 1
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
ideselect = 1
|
|
IF (NOT KSHIFT) THEN ideselectx1 = idecx: ideselecty1 = idecy
|
|
idemouseselect = 1
|
|
wholeword.select = 0
|
|
END IF
|
|
ELSEIF (mX > 1 AND mX <= 1 + maxLineNumberLength AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers) OR _
|
|
(mX = 1 AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers = 0) THEN
|
|
'line numbers are visible and have been clicked or
|
|
'line numbers are hidden and the left border has been clicked
|
|
IF AutoAddDebugCommand <> 0 OR vWatchOn <> 0 THEN
|
|
ideselect = 0
|
|
idecytemp = mY - 2 + idesy - 1
|
|
IF idecytemp =< iden THEN
|
|
idecy = idecytemp
|
|
IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN
|
|
GOTO toggleSkipLine
|
|
ELSE
|
|
GOTO toggleBreakpoint
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
ideselect = 1
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy < iden THEN
|
|
IF (NOT KSHIFT) THEN ideselectx1 = 1: ideselecty1 = idecy
|
|
idecy = idecy + 1
|
|
idecx = 1
|
|
ELSEIF idecy = iden THEN
|
|
a$ = idegetline$(idecy)
|
|
IF (NOT KSHIFT) THEN ideselectx1 = 1: ideselecty1 = idecy
|
|
idecx = LEN(a$) + 1
|
|
ELSEIF idecy > iden THEN
|
|
idecy = iden
|
|
ideselect = 0
|
|
idecx = 1
|
|
END IF
|
|
wholeword.select = 0
|
|
idemouseselect = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
DoneWholeWord:
|
|
|
|
IF mCLICK2 THEN 'Second mouse button pressed.
|
|
invokecontextualmenu:
|
|
IF mX > 1 + maxLineNumberLength AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN 'inside text box
|
|
IdeSystem = 1
|
|
IF ideselect = 0 THEN 'Right click only positions the cursor if no selection is active
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
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) - maxLineNumberLength
|
|
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) - maxLineNumberLength < sx1 OR (mX - 1 + idesx - 1) - maxLineNumberLength > sx2 THEN
|
|
ideselect = 0
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
END IF
|
|
IF mY - 2 + idesy - 1 < idecy OR mY - 2 + idesy - 1 > idecy THEN
|
|
ideselect = 0
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
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) - maxLineNumberLength
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
END IF
|
|
END IF
|
|
END IF
|
|
ideshowtext
|
|
PCOPY 3, 0
|
|
IdeMakeContextualMenu
|
|
idecontextualmenu = 1
|
|
GOTO showmenu
|
|
ELSEIF idehelp = 1 AND mY >= idewy AND mY < idewy + idesubwindow THEN 'inside help area
|
|
IdeSystem = 3
|
|
ideshowtext
|
|
PCOPY 3, 0
|
|
IdeMakeContextualMenu
|
|
idecontextualmenu = 1
|
|
GOTO showmenu
|
|
END IF
|
|
END IF
|
|
|
|
IF mCLICK THEN
|
|
IF mX = idewx THEN
|
|
IF iden > 1 THEN 'take no action if not slider available
|
|
y = idevbar(idewx, 3, idewy - 8, idecy, iden)
|
|
IF y = mY THEN
|
|
idemouseselect = 2
|
|
ideselect = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mCLICK THEN
|
|
IF mY = idewy - 5 THEN
|
|
x = idehbar(2, idewy - 5, idewx - 2, idesx, 608)
|
|
IF x = mX THEN
|
|
idemouseselect = 3
|
|
ideselect = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND idemouseselect = 0 THEN
|
|
IF mX = idewx AND mY > 2 AND mY < idewy - 5 THEN 'inside vbar
|
|
ideselect = 0
|
|
IF mY = 3 THEN KB = KEY_UP: idewait: idembmonitor = 1
|
|
IF mY = idewy - 6 THEN KB = KEY_DOWN: idewait: idembmonitor = 1
|
|
IF mY > 3 AND mY < (idewy - 6) THEN
|
|
'assume not on slider
|
|
IF iden > 1 THEN 'take no action if not slider available
|
|
y = idevbar(idewx, 3, idewy - 8, idecy, iden)
|
|
IF y <> mY THEN
|
|
IF mY < y THEN
|
|
KB = KEY_PAGEUP: idewait: idembmonitor = 1
|
|
ELSE
|
|
KB = KEY_PAGEDOWN: idewait: idembmonitor = 1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND idemouseselect = 0 THEN
|
|
IF mY = idewy - 5 AND mX > 1 AND mX < idewx THEN 'inside hbar
|
|
ideselect = 0
|
|
IF mX = 2 THEN KB = KEY_LEFT: idewait: idembmonitor = 1
|
|
IF mX = idewx - 1 THEN KB = KEY_RIGHT: idewait: idembmonitor = 1
|
|
IF mX > 2 AND mX < idewx - 1 THEN
|
|
'assume not on slider
|
|
x = idehbar(2, idewy - 5, idewx - 2, idesx, 608)
|
|
IF x <> mX THEN
|
|
IF mX < x THEN
|
|
idecx = idecx - 8
|
|
IF idecx < 1 THEN idecx = 1
|
|
idewait: idembmonitor = 1
|
|
ELSE
|
|
idecx = idecx + 8
|
|
idewait: idembmonitor = 1
|
|
END IF
|
|
END IF
|
|
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND idemouseselect = 2 THEN
|
|
'move vbar scroller (idecy) to appropriate position
|
|
IF iden > 1 THEN
|
|
IF mY <= 4 THEN idecy = 1
|
|
IF mY >= idewy - 7 THEN idecy = iden
|
|
IF mY > 4 AND mY < idewy - 7 THEN
|
|
y = mY
|
|
p! = y - 3 - 2 + .5
|
|
p! = p! / ((idewy - 8) - 4)
|
|
i = p! * (iden - 1) + 1
|
|
idecy = i
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND idemouseselect = 3 THEN
|
|
'move hbar scroller (idecx) to appropriate position
|
|
IF mX <= 3 THEN idesx = 1: idecx = idesx
|
|
IF mX >= idewx - 2 THEN idesx = 608: idecx = idesx
|
|
IF mX > 3 AND mX < idewx - 2 THEN
|
|
x = mX
|
|
p! = x - 2 - 2 + .5
|
|
p! = p! / ((idewx - 2) - 4)
|
|
i = p! * (608 - 1) + 1
|
|
idesx = i
|
|
idecx = idesx
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND idemouseselect <= 1 THEN
|
|
IF mX > 1 + maxLineNumberLength AND mX < idewx AND mY > 2 AND mY < idewy - 5 THEN 'inside text box
|
|
IF idemouseselect = 1 THEN
|
|
idecx = (mX - 1 + idesx - 1) - maxLineNumberLength
|
|
IF idecx < 1 THEN idecx = 1
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF mB THEN
|
|
IF ((mX = 1 AND ShowLineNumbers = 0) OR (mX <= 1 + maxLineNumberLength AND ShowLineNumbers)) OR mX = idewx OR mY <= 2 OR mY >= idewy - 5 THEN 'off text window area
|
|
IF idemouseselect = 1 THEN
|
|
|
|
'scroll window
|
|
IF mY >= idewy - 5 THEN idecy = idecy + 1: IF idecy > iden THEN idecy = iden
|
|
IF mY <= 2 THEN idecy = idecy - 1: IF idecy < 1 THEN idecy = 1
|
|
IF ((mX = 1 AND ShowLineNumbers = 0) OR (mX <= 1 + maxLineNumberLength AND ShowLineNumbers)) THEN idecx = idecx - 1: IF idecx < 1 THEN idecx = 1
|
|
IF mX = idewx THEN idecx = idecx + 1
|
|
idewait
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "A" THEN 'select all
|
|
idemselectall:
|
|
ideselect = 1: ideselectx1 = 1: ideselecty1 = 1
|
|
idecy = iden
|
|
a$ = idegetline(idecy)
|
|
idecx = LEN(a$) + 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "G" THEN 'goto line
|
|
IF KSHIFT AND idefocusline > 0 THEN
|
|
idecx = 1
|
|
AddQuickNavHistory
|
|
idecy = idefocusline
|
|
ideselect = 0
|
|
ELSE
|
|
idegotobox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "N" THEN 'File -> #New
|
|
GOTO ctrlNew
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "O" THEN 'File -> #Open
|
|
IdeOpenFile$ = ""
|
|
GOTO ctrlOpen
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "P" THEN 'Debug -> Toggle Skip Line
|
|
GOTO toggleSkipLine
|
|
END IF
|
|
|
|
IF (NOT KSHIFT) AND KCONTROL AND UCASE$(K$) = "R" THEN 'Comment (add ') - R for REMark
|
|
GOTO ctrlAddComment
|
|
END IF
|
|
|
|
IF (NOT KSHIFT) AND KCONTROL AND UCASE$(K$) = "T" THEN 'Toggle comment
|
|
GOTO ctrlToggleComment
|
|
END IF
|
|
|
|
IF KSHIFT AND KCONTROL AND UCASE$(K$) = "R" THEN 'uncomment (remove ')
|
|
GOTO ctrlRemoveComment
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "S" THEN 'File -> #Save
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
a$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
a$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
IF ideerror > 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO IDEerrorMessage
|
|
ELSE
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(60) THEN 'F2
|
|
IF KCONTROL THEN
|
|
IF QuickNavTotal > 0 THEN
|
|
ideselect = 0
|
|
idecy = QuickNavHistory(QuickNavTotal).idecy
|
|
idecx = QuickNavHistory(QuickNavTotal).idecx
|
|
idesy = QuickNavHistory(QuickNavTotal).idesy
|
|
idesx = QuickNavHistory(QuickNavTotal).idesx
|
|
QuickNavTotal = QuickNavTotal - 1
|
|
GOTO ideloop
|
|
END IF
|
|
ELSE
|
|
GOTO idesubsjmp
|
|
END IF
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "W" THEN 'goto line
|
|
IF totalWarnings > 0 THEN
|
|
retval = idewarningbox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO specialchar
|
|
ELSE
|
|
result = idemessagebox("Compilation status", "No warnings to display.", "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "Z" THEN 'undo (CTRL+Z)
|
|
idemundo:
|
|
IF ideundopos THEN
|
|
OPEN tmpdir$ + "undo2.bin" FOR BINARY AS #150
|
|
h$ = SPACE$(12): GET #150, , h$: p1 = CVL(MID$(h$, 1, 4)): p2 = CVL(MID$(h$, 5, 4)): plast = CVL(MID$(h$, 9, 4))
|
|
|
|
'does something exist to undo?
|
|
u = 0
|
|
IF p2 >= p1 THEN
|
|
'linear
|
|
IF ideundopos > p1 THEN
|
|
GET #150, ideundopos - 4, upl
|
|
u = ideundopos - 4 - upl - 4
|
|
END IF
|
|
ELSE
|
|
'wrapped
|
|
IF ideundopos > p1 THEN
|
|
GET #150, ideundopos - 4, upl
|
|
u = ideundopos - 4 - upl - 4
|
|
END IF
|
|
IF ideundopos <= p2 THEN
|
|
IF ideundopos = 13 THEN
|
|
u = plast
|
|
ELSE
|
|
GET #150, ideundopos - 4, upl
|
|
u = ideundopos - 4 - upl - 4
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF u THEN
|
|
|
|
IF ideundopos = ideundobase THEN
|
|
'if not untitled, then we MUST switch to a special state
|
|
'warn
|
|
PCOPY 3, 0
|
|
what$ = ideyesnobox("Undo", "Undo through previous program content?")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF what$ = "N" THEN
|
|
CLOSE #150
|
|
GOTO skipundo
|
|
END IF
|
|
IF ideunsaved = 1 AND ideprogname <> "" THEN
|
|
PCOPY 3, 0
|
|
r$ = idesavenow
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF r$ = "C" THEN CLOSE #150: GOTO skipundo
|
|
IF r$ = "Y" THEN
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
END IF
|
|
ideunsaved = 1
|
|
ideprogname$ = ""
|
|
_TITLE WindowTitle
|
|
ideundobase = -1 'release base restriction
|
|
END IF
|
|
|
|
ideundopos = u 'set new current state
|
|
|
|
'get backup
|
|
SEEK #150, u
|
|
GET #150, , l2& 'should be the same as l&
|
|
GET #150, , idesx: GET #150, , idesy
|
|
GET #150, , idecx: GET #150, , idecy
|
|
GET #150, , ideselect: GET #150, , ideselectx1: GET #150, , ideselecty1
|
|
GET #150, , iden
|
|
GET #150, , idel
|
|
GET #150, , ideli
|
|
'bookmark info [v2]
|
|
GET #150, , IdeBmkN: REDIM IdeBmk(IdeBmkN + 1) AS IdeBmkType
|
|
FOR bi = 1 TO IdeBmkN: GET #150, , IdeBmk(bi).y: GET #150, , IdeBmk(bi).x: NEXT
|
|
GET #150, , x&: idet$ = SPACE$(x&): GET #150, , idet$
|
|
|
|
idechangemade = 1: idenoundo = 1: startPausedPending = 0
|
|
|
|
END IF 'u
|
|
|
|
skipundo:
|
|
CLOSE #150
|
|
END IF
|
|
GOTO specialchar
|
|
|
|
END IF
|
|
|
|
|
|
IF KCONTROL AND UCASE$(K$) = "Y" THEN 'redo (CTRL+Y)
|
|
idemredo:
|
|
IF ideundopos THEN
|
|
OPEN tmpdir$ + "undo2.bin" FOR BINARY AS #150
|
|
h$ = SPACE$(12): GET #150, , h$: p1 = CVL(MID$(h$, 1, 4)): p2 = CVL(MID$(h$, 5, 4)): plast = CVL(MID$(h$, 9, 4))
|
|
|
|
'does something exist to redo?
|
|
u = 0
|
|
IF p2 >= p1 THEN
|
|
'linear
|
|
IF ideundopos < p2 THEN
|
|
GET #150, ideundopos, upl
|
|
u = ideundopos + 4 + upl + 4
|
|
END IF
|
|
ELSE
|
|
'wrapped
|
|
IF ideundopos >= p1 THEN
|
|
IF ideundopos = plast THEN
|
|
u = 13
|
|
ELSE
|
|
GET #150, ideundopos, upl
|
|
u = ideundopos + 4 + upl + 4
|
|
END IF
|
|
ELSE
|
|
IF ideundopos < p2 THEN
|
|
GET #150, ideundopos, upl
|
|
u = ideundopos + 4 + upl + 4
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF u THEN
|
|
|
|
ideundopos = u 'set new current state
|
|
|
|
'get backup
|
|
SEEK #150, u
|
|
GET #150, , l2& 'should be the same as l&
|
|
GET #150, , idesx: GET #150, , idesy
|
|
GET #150, , idecx: GET #150, , idecy
|
|
GET #150, , ideselect: GET #150, , ideselectx1: GET #150, , ideselecty1
|
|
GET #150, , iden
|
|
GET #150, , idel
|
|
GET #150, , ideli
|
|
'bookmark info [v2]
|
|
GET #150, , IdeBmkN: REDIM IdeBmk(IdeBmkN + 1) AS IdeBmkType
|
|
FOR bi = 1 TO IdeBmkN: GET #150, , IdeBmk(bi).y: GET #150, , IdeBmk(bi).x: NEXT
|
|
GET #150, , x&: idet$ = SPACE$(x&): GET #150, , idet$
|
|
|
|
idechangemade = 1: idenoundo = 1: startPausedPending = 0
|
|
|
|
END IF 'u
|
|
|
|
CLOSE #150
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
IF ((KSHIFT AND KB = KEY_DELETE) OR (KCONTROL AND UCASE$(K$) = "X")) AND ideselect = 1 THEN 'cut to clipboard
|
|
idemcut:
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
GOTO copy2clip
|
|
END IF
|
|
|
|
IF (KB = KEY_DELETE OR KB = 8) AND ideselect = 1 THEN 'delete selection
|
|
IF ideselecty1 <> idecy OR ideselectx1 <> idecx THEN
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
delselect
|
|
GOTO specialchar
|
|
ELSE
|
|
ideselect = 0
|
|
END IF
|
|
END IF
|
|
|
|
|
|
IF (KSHIFT AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(K$) = "V") THEN 'paste from clipboard
|
|
idempaste:
|
|
|
|
clip$ = _CLIPBOARD$ 'read clipboard
|
|
|
|
IF LEN(clip$) THEN
|
|
IF INSTR(clip$, CHR$(13)) OR INSTR(clip$, CHR$(10)) THEN
|
|
|
|
'full lines paste
|
|
IF ideselect THEN delselect
|
|
|
|
idelayoutallow = 2
|
|
a$ = clip$
|
|
x3 = 1 'scan from position
|
|
i = 0 'lines counter
|
|
|
|
fullpastenextline:
|
|
|
|
x = INSTR(x3, a$, CHR$(13))
|
|
x2 = INSTR(x3, a$, CHR$(10))
|
|
IF x = 0 THEN x = x2
|
|
IF x2 = 0 THEN x2 = x
|
|
IF x2 < x THEN SWAP x, x2
|
|
IF x2 > x + 1 THEN x2 = x 'if seperated by more than one character, they are seperate line terminators
|
|
'x to x2 is the range of the next line terminator (1 or 2 characters)
|
|
|
|
IF x THEN
|
|
ideinsline idecy + i, converttabs$(MID$(a$, x3, x - x3))
|
|
i = i + 1
|
|
x3 = x2 + 1
|
|
ELSE
|
|
ideinsline idecy + i, converttabs$(MID$(a$, x3, LEN(a$) - x3 + 1))
|
|
i = i + 1
|
|
x3 = LEN(a$) + 1
|
|
END IF
|
|
|
|
IF x3 <= LEN(a$) GOTO fullpastenextline
|
|
|
|
IF PasteCursorAtEnd THEN
|
|
'Place the cursor at the end of the pasted content:
|
|
idecy = idecy + i - 1
|
|
idecx = LEN(idegetline(idecy)) + 1
|
|
IF RIGHT$(clip$, 1) = CHR$(10) THEN
|
|
idecy = idecy + 1
|
|
idecx = 1
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
'insert single line paste
|
|
insertAtCursor clip$
|
|
END IF
|
|
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF ((KCTRL AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(K$) = "C")) AND ideselect = 1 THEN 'copy to clipboard
|
|
copy2clip:
|
|
clip$ = getSelectedText$(-1)
|
|
IF clip$ <> "" THEN _CLIPBOARD$ = clip$
|
|
IF (K$ = CHR$(0) + "S") OR (KSHIFT AND KB = KEY_DELETE) OR (KCONTROL AND UCASE$(K$) = "X") THEN delselect
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_INSERT THEN 'toggle INSERT mode
|
|
ideinsert = ideinsert + 1
|
|
IF ideinsert = 2 THEN ideinsert = 0
|
|
END IF
|
|
|
|
IF KB = KEY_UP THEN
|
|
IF KCONTROL THEN 'scroll the window, instead of moving the cursor
|
|
idesy = idesy - 1
|
|
IF idesy < 1 THEN idesy = 1
|
|
IF idecy > idesy + (idewy - 9) THEN idecy = idesy + (idewy - 9)
|
|
ELSE
|
|
GOSUB selectcheck
|
|
idecy = idecy - 1
|
|
IF idecy < 1 THEN idecy = 1
|
|
GOTO specialchar
|
|
END IF
|
|
END IF
|
|
|
|
IF KB = KEY_DOWN THEN
|
|
IF KCONTROL THEN 'scroll the window, instead of moving the cursor
|
|
idesy = idesy + 1
|
|
IF idesy > iden THEN idesy = iden
|
|
IF idecy < idesy THEN idecy = idesy
|
|
ELSE
|
|
GOSUB selectcheck
|
|
idecy = idecy + 1
|
|
IF idecy > iden THEN idecy = iden
|
|
GOTO specialchar
|
|
END IF
|
|
END IF
|
|
|
|
IF mWHEEL THEN
|
|
GOSUB selectcheck
|
|
'move relative to top/bottom
|
|
IF mWHEEL < 0 THEN idecy = idesy
|
|
IF mWHEEL > 0 THEN idecy = idesy + (idewy - 9)
|
|
idecy = idecy + mWHEEL * 3
|
|
IF idecy < 1 THEN idecy = 1
|
|
IF idecy > iden THEN idecy = iden
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_LEFT THEN
|
|
GOSUB selectcheck
|
|
|
|
IF KCONTROL THEN 'move forward to next beginning alphanumeric
|
|
|
|
a$ = idegetline(idecy)
|
|
IF idecx > LEN(a$) THEN idecx = LEN(a$) + 1
|
|
|
|
skipping = 1
|
|
DO
|
|
'move
|
|
idecx = idecx - 1
|
|
'latch onto prev character
|
|
IF idecx < 1 THEN
|
|
DO
|
|
IF idecy = 1 THEN idecx = 1: GOTO specialchar
|
|
idecy = idecy - 1
|
|
a$ = idegetline(idecy)
|
|
idecx = LEN(a$) + 1
|
|
LOOP UNTIL LEN(a$)
|
|
GOTO specialchar 'stop at the end of the previous line
|
|
END IF
|
|
'check character
|
|
IF alphanumeric(ASC(a$, idecx)) THEN
|
|
IF idecx = 1 THEN GOTO specialchar
|
|
x = idecx: y = idecy
|
|
skipping = 0
|
|
ELSE
|
|
IF skipping = 0 THEN idecx = x: idecy = y: GOTO specialchar
|
|
END IF
|
|
LOOP
|
|
|
|
ELSE
|
|
|
|
idecx = idecx - 1
|
|
IF idecx < 1 THEN idecx = 1
|
|
|
|
END IF
|
|
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_RIGHT THEN
|
|
GOSUB selectcheck
|
|
|
|
IF KCONTROL THEN 'move forward to next beginning alphanumeric
|
|
|
|
a$ = idegetline(idecy)
|
|
skipping = 0
|
|
first = 1
|
|
DO
|
|
'move
|
|
IF first = 0 THEN idecx = idecx + 1
|
|
'latch onto next character
|
|
IF first = 0 AND idecx = LEN(a$) + 1 THEN GOTO specialchar 'stop at the end of the line
|
|
IF idecx > LEN(a$) THEN
|
|
DO
|
|
IF idecy = iden THEN GOTO specialchar
|
|
idecy = idecy + 1: idecx = 1
|
|
a$ = idegetline(idecy)
|
|
LOOP UNTIL LEN(a$)
|
|
skipping = 0
|
|
first = 0
|
|
END IF
|
|
'check character
|
|
IF alphanumeric(ASC(a$, idecx)) THEN
|
|
IF first THEN
|
|
skipping = 1
|
|
ELSE
|
|
IF skipping = 0 THEN GOTO specialchar
|
|
END IF
|
|
ELSE
|
|
skipping = 0
|
|
END IF
|
|
first = 0
|
|
LOOP
|
|
|
|
ELSE
|
|
|
|
idecx = idecx + 1
|
|
|
|
END IF
|
|
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KCONTROL AND KB = KEY_HOME THEN
|
|
GOSUB selectcheck
|
|
idecx = 1
|
|
idecy = 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KCONTROL AND KB = KEY_END THEN
|
|
GOSUB selectcheck
|
|
idecy = iden
|
|
a$ = idegetline(idecy)
|
|
idecx = LEN(a$) + 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_HOME THEN
|
|
GOSUB selectcheck
|
|
IF idecx <> 1 THEN
|
|
idecx = 1
|
|
ELSE
|
|
a$ = idegetline(idecy)
|
|
idecx = 1
|
|
FOR x = 1 TO LEN(a$)
|
|
IF ASC(a$, x) <> 32 THEN idecx = x: EXIT FOR
|
|
NEXT
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_END THEN
|
|
GOSUB selectcheck
|
|
a$ = idegetline(idecy)
|
|
idecx = LEN(a$) + 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_PAGEUP THEN
|
|
GOSUB selectcheck
|
|
idecy = idecy - (idewy - 9)
|
|
IF idecy < 1 THEN idecy = 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF KB = KEY_PAGEDOWN THEN
|
|
GOSUB selectcheck
|
|
idecy = idecy + (idewy - 9)
|
|
IF idecy > iden THEN idecy = iden
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
GOTO skipgosubs
|
|
|
|
selectcheck:
|
|
IF IdeSystem = 1 THEN
|
|
IF KSHIFT AND ideselect = 0 THEN ideselect = 1: ideselectx1 = idecx: ideselecty1 = idecy
|
|
IF KSHIFT = 0 THEN ideselect = 0
|
|
ELSEIF IdeSystem = 2 THEN
|
|
IF KSHIFT AND idesystem2.issel = 0 THEN idesystem2.issel = -1: idesystem2.sx1 = idesystem2.v1
|
|
IF KSHIFT = 0 THEN idesystem2.issel = 0
|
|
END IF
|
|
RETURN
|
|
|
|
skipgosubs:
|
|
|
|
IF K$ = CHR$(13) THEN
|
|
IF KSHIFT THEN
|
|
retval$ = ""
|
|
a$ = idegetline(idecy)
|
|
IF EnteringRGB THEN 'The "Shift+ENTER" message is being shown
|
|
oldkeywordHighlight = keywordHighlight
|
|
keywordHighlight = 0
|
|
HideBracketHighlight
|
|
keywordHighlight = oldkeywordHighlight
|
|
retval$ = idergbmixer$(0)
|
|
ELSE
|
|
IF ideselect THEN
|
|
IF ideselecty1 <> idecy THEN GOTO specialchar 'multi line selected
|
|
END IF
|
|
|
|
Found_RGB = 0
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGB(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGB32(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGBA(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGBA32(")
|
|
IF Found_RGB THEN
|
|
oldkeywordHighlight = keywordHighlight
|
|
keywordHighlight = 0
|
|
HideBracketHighlight
|
|
keywordHighlight = oldkeywordHighlight
|
|
retval$ = idergbmixer$(-1)
|
|
ELSE
|
|
GOTO RegularEnter
|
|
END IF
|
|
END IF
|
|
IF LEN(retval$) THEN
|
|
'the mixer dialog could not insert the value, so let's do it here
|
|
IF EnteringRGB THEN
|
|
insertAtCursor MID$(retval$, INSTR(retval$, "(") + 1)
|
|
ELSE
|
|
insertAtCursor retval$
|
|
END IF
|
|
END IF
|
|
GOTO specialchar
|
|
ELSE
|
|
a$ = idegetline(idecy)
|
|
RegularEnter:
|
|
ideselect = 0
|
|
desiredcolumn = 1
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
IF idecx > LEN(a$) THEN
|
|
ideinsline idecy + 1, ""
|
|
IF LEN(a$) = 0 THEN
|
|
desiredcolumn = idecx
|
|
ELSE
|
|
desiredcolumn = LEN(a$) - LEN(LTRIM$(a$)) + 1
|
|
END IF
|
|
ELSE
|
|
a2$ = LEFT$(a$, idecx - 1)
|
|
idesetline idecy, a2$
|
|
IF LEN(LTRIM$(a2$)) > 0 THEN
|
|
IF idecx > 1 THEN desiredcolumn = LEN(a$) - LEN(LTRIM$(a$)) ELSE desiredcolumn = 0
|
|
ideinsline idecy + 1, SPACE$(desiredcolumn) + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
IF desiredcolumn = 0 THEN desiredcolumn = 1 ELSE desiredcolumn = desiredcolumn + 1
|
|
ELSE
|
|
desiredcolumn = idecx
|
|
ideinsline idecy + 1, SPACE$(desiredcolumn - 1) + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
END IF
|
|
END IF
|
|
|
|
IF idecx = 1 THEN
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y = idecy THEN IdeBmk(b).y = IdeBmk(b).y + 1
|
|
NEXT
|
|
END IF
|
|
|
|
idecy = idecy + 1
|
|
idecx = desiredcolumn
|
|
GOTO specialchar
|
|
END IF
|
|
END IF
|
|
|
|
IF KB = KEY_DELETE AND KCONTROL = 0 THEN
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
a$ = idegetline(idecy)
|
|
IF idecx <= LEN(a$) THEN
|
|
a$ = LEFT$(a$, idecx - 1) + RIGHT$(a$, LEN(a$) - idecx)
|
|
idesetline idecy, a$
|
|
ELSE
|
|
a$ = a$ + SPACE$(idecx - LEN(a$) - 1)
|
|
a$ = a$ + LTRIM$(idegetline(idecy + 1))
|
|
idesetline idecy, a$
|
|
idedelline idecy + 1
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
'Ctrl+Backspace erases a word at a time
|
|
'In Windows it's currently reported as Control+Delete;
|
|
'In Mac it's properly delivered as Control+Backspace.
|
|
'Key combo not yet supported in Linux.
|
|
IF (INSTR(_OS$, "WIN") > 0 AND KCONTROL AND K$ = CHR$(0) + CHR$(83)) OR _
|
|
(INSTR(_OS$, "MAC") > 0 AND K$ = CHR$(8) AND KCONTROL) THEN
|
|
ideselect = 0
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
|
|
'undocombos
|
|
IF ideundocombochr <> 8 THEN
|
|
ideundocombo = 2
|
|
ELSE
|
|
ideundocombo = ideundocombo + 1
|
|
IF ideundocombo = 2 THEN idemergeundo = 1
|
|
END IF
|
|
ideundocombochr = 8
|
|
|
|
'Attempt to go back erasing a "word" at a time
|
|
a$ = idegetline(idecy)
|
|
IF idecx = 1 THEN GOTO RegularBackspaceIdecx1
|
|
IF idecx > LEN(a$) + 2 THEN
|
|
idecx = LEN(a$) + 1
|
|
GOTO specialchar
|
|
ELSEIF idecx = LEN(a$) + 2 THEN
|
|
idecx = LEN(a$) + 1
|
|
END IF
|
|
|
|
IF LEN(RTRIM$(MID$(a$, 1, idecx - 1))) = 0 THEN
|
|
'Erase all spaces behind at once if no text before the cursor
|
|
a$ = MID$(a$, idecx)
|
|
idesetline idecy, a$
|
|
idecx = 1
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
'Go back in a$ and find the first non blank char
|
|
i = idecx
|
|
DO
|
|
i = i - 1
|
|
FirstChar$ = MID$(a$, i, 1)
|
|
IF FirstChar$ <> CHR$(32) THEN EXIT DO
|
|
LOOP
|
|
IF INSTR(char.sep$, FirstChar$) THEN
|
|
DO
|
|
IF i = 0 THEN EXIT DO
|
|
IF MID$(a$, i, 1) <> FirstChar$ THEN EXIT DO
|
|
i = i - 1
|
|
LOOP
|
|
ELSE
|
|
DO
|
|
IF i = 0 THEN EXIT DO
|
|
i = i - 1
|
|
IF INSTR(char.sep$, MID$(a$, i, 1)) THEN EXIT DO
|
|
LOOP
|
|
END IF
|
|
a$ = LEFT$(a$, i) + MID$(a$, idecx)
|
|
idecx = i + 1
|
|
idesetline idecy, a$
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
IF K$ = CHR$(8) THEN 'Regular Backspace
|
|
ideselect = 0
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
|
|
'undocombos
|
|
IF ideundocombochr <> 8 THEN
|
|
ideundocombo = 2
|
|
ELSE
|
|
ideundocombo = ideundocombo + 1
|
|
IF ideundocombo = 2 THEN idemergeundo = 1
|
|
END IF
|
|
ideundocombochr = 8
|
|
|
|
a$ = idegetline(idecy)
|
|
IF idecx = 1 THEN
|
|
RegularBackspaceIdecx1:
|
|
IF idecy > 1 THEN
|
|
a2$ = idegetline(idecy - 1)
|
|
IF LEN(a2$) > 0 THEN
|
|
'If the previous line has any content, let's just append this line to it
|
|
RegularBackupToPrevLine:
|
|
idesetline idecy - 1, a2$ + a$
|
|
idedelline idecy
|
|
idecx = LEN(a2$) + 1
|
|
idecy = idecy - 1
|
|
ELSE
|
|
'Or else, if it's an empty line, let's try to follow the
|
|
'next line's indentation.
|
|
'First, get indentation level of next line, if any.
|
|
IF idecy < iden THEN
|
|
a3$ = idegetline(idecy + 1)
|
|
desiredcolumn = LEN(a3$) - LEN(LTRIM$(a3$))
|
|
idesetline idecy - 1, SPACE$(desiredcolumn) + a$
|
|
idedelline idecy
|
|
idecx = desiredcolumn + 1
|
|
idecy = idecy - 1
|
|
ELSE
|
|
GOTO RegularBackupToPrevLine
|
|
END IF
|
|
END IF
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
IF idecx > LEN(a$) + 1 THEN
|
|
idecx = LEN(a$) + 1
|
|
ELSE
|
|
CheckSpacesBehind:
|
|
IF LEN(RTRIM$(MID$(a$, 1, idecx - 1))) = 0 THEN
|
|
'Only spaces behind. If we're on a tab stop, let's go back in tabs.
|
|
x = 4
|
|
IF ideautoindentsize <> 0 THEN x = ideautoindentsize
|
|
check.tabstop! = (idecx - 1) / x
|
|
IF check.tabstop! = FIX(check.tabstop!) THEN
|
|
IF idecx - x < 1 THEN x = idecx - 1
|
|
a$ = LEFT$(a$, idecx - (x + 1)) + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
idesetline idecy, a$
|
|
idecx = idecx - x
|
|
ELSE
|
|
GOTO onebackspace
|
|
END IF
|
|
ELSE
|
|
onebackspace:
|
|
a$ = LEFT$(a$, idecx - 2) + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
idesetline idecy, a$
|
|
idecx = idecx - 1
|
|
END IF
|
|
END IF
|
|
GOTO specialchar
|
|
END IF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'patch#1
|
|
IF LEN(K$) <> 1 THEN GOTO specialchar
|
|
IF K$ = CHR$(9) THEN GOTO ideforceinput
|
|
IF block_chr(ASC(K$)) THEN GOTO specialchar
|
|
ideforceinput:
|
|
|
|
IF K$ = CHR$(9) OR (K$ = CHR$(25) AND INSTR(_OS$, "MAC") > 0) THEN
|
|
IF ideselect THEN
|
|
'Block indentation code copied/adapted from block comment/uncomment:
|
|
IF KSHIFT OR K$ = CHR$(25) THEN
|
|
IdeBlockDecreaseIndent:
|
|
BlockIndentLevel = 4
|
|
IF ideautoindentsize <> 0 THEN BlockIndentLevel = ideautoindentsize
|
|
y1 = idecy
|
|
y2 = ideselecty1
|
|
|
|
IF y1 = y2 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
|
|
GOTO SkipBlockIndent
|
|
END IF
|
|
END IF
|
|
|
|
IF y1 > y2 THEN SWAP y1, y2
|
|
IF idecy > ideselecty1 AND idecx = 1 THEN y2 = y2 - 1
|
|
'calculate lhs
|
|
lhs = 10000000
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
ta$ = LTRIM$(a$)
|
|
t = LEN(a$) - LEN(ta$)
|
|
IF t < lhs THEN lhs = t
|
|
END IF
|
|
NEXT
|
|
'edit lines
|
|
'Unless any of the block lines already starts at the beginning of the line
|
|
IF lhs > 0 THEN
|
|
IF lhs < BlockIndentLevel THEN BlockIndentLevel = lhs
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - BlockIndentLevel)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
IF (y1 = y2) AND idechangemade THEN
|
|
ideselectx1 = ideselectx1 - BlockIndentLevel
|
|
idecx = idecx - BlockIndentLevel
|
|
IF idecx < 1 THEN idecx = 1: ideselectx1 = idecx
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
ELSE
|
|
IdeBlockIncreaseIndent:
|
|
BlockIndentLevel = 4
|
|
IF ideautoindentsize <> 0 THEN BlockIndentLevel = ideautoindentsize
|
|
y1 = idecy
|
|
y2 = ideselecty1
|
|
|
|
IF y1 = y2 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
|
|
GOTO SkipBlockIndent
|
|
END IF
|
|
END IF
|
|
|
|
IF y1 > y2 THEN SWAP y1, y2
|
|
IF idecy > ideselecty1 AND idecx = 1 THEN y2 = y2 - 1
|
|
'calculate lhs
|
|
lhs = 10000000
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
ta$ = LTRIM$(a$)
|
|
t = LEN(a$) - LEN(ta$)
|
|
IF t < lhs THEN lhs = t
|
|
END IF
|
|
NEXT
|
|
'edit lines
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
a$ = LEFT$(a$, lhs) + SPACE$(BlockIndentLevel) + RIGHT$(a$, LEN(a$) - lhs)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
NEXT
|
|
IF (y1 = y2) AND idechangemade THEN
|
|
ideselectx1 = ideselectx1 + BlockIndentLevel
|
|
idecx = idecx + BlockIndentLevel
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
ELSE
|
|
SkipBlockIndent:
|
|
IF KSHIFT = 0 THEN
|
|
x = 4
|
|
IF ideautoindentsize <> 0 THEN x = ideautoindentsize
|
|
K$ = SPACE$(x - ((idecx - 1) MOD x))
|
|
ELSE
|
|
K$ = ""
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) AND NOT AltSpecial THEN GOTO specialchar 'Steve edit 07-04-2014 to stop ESC from printing chr$(27) in the IDE
|
|
|
|
'alt and ctrl combos have already been processed, so skip inserting
|
|
'K$ if these are still held down:
|
|
IF KCTRL AND NOT KALT THEN GOTO specialchar
|
|
IF KALT AND NOT KCTRL AND NOT AltSpecial THEN GOTO specialchar
|
|
|
|
'standard character
|
|
IF ideselect THEN delselect
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
|
|
'undocombos
|
|
IF LEN(K$) = 1 THEN
|
|
asck = ASC(K$)
|
|
IF alphanumeric(asck) OR ideundocombochr = asck THEN
|
|
IF ideundocombochr = 8 THEN ideundocombo = 0
|
|
IF ideundocombo = 0 THEN
|
|
ideundocombo = 2
|
|
ELSE
|
|
ideundocombo = ideundocombo + 1
|
|
IF ideundocombo = 2 THEN idemergeundo = 1
|
|
END IF
|
|
END IF
|
|
ideundocombochr = asck
|
|
END IF
|
|
|
|
a$ = idegetline(idecy)
|
|
IF LEN(a$) < idecx - 1 THEN a$ = a$ + SPACE$(idecx - 1 - LEN(a$))
|
|
|
|
IF ideinsert THEN
|
|
a2$ = RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
IF LEN(a2$) THEN a2$ = RIGHT$(a$, LEN(a$) - idecx)
|
|
a$ = LEFT$(a$, idecx - 1) + K$ + a2$
|
|
ELSE
|
|
a$ = LEFT$(a$, idecx - 1) + K$ + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
END IF
|
|
|
|
idesetline idecy, a$
|
|
idecx = idecx + LEN(K$)
|
|
specialchar:
|
|
'In case there is a selection, let's show the number of
|
|
'selected characters on the status bar:
|
|
IF (IdeInfo = "" OR LEFT$(IdeInfo, 19) = "Selection length = ") THEN
|
|
IF idecy = ideselecty1 THEN 'selection is in only one line
|
|
sx1 = ideselectx1: sx2 = idecx
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF ideselect = 1 AND (sx2 - sx1) > 0 THEN
|
|
IF sx2 - sx1 > 0 THEN
|
|
a$ = idegetline(idecy)
|
|
ideCurrentSingleLineSelection = MID$(a$, sx1, sx2 - sx1)
|
|
FOR i = 1 TO LEN(ideCurrentSingleLineSelection)
|
|
IF INSTR(char.sep$, MID$(ideCurrentSingleLineSelection, i, 1)) > 0 THEN
|
|
'separators in selection don't trigger multi-highlight
|
|
IF MID$(ideCurrentSingleLineSelection, i, 1) <> "." THEN
|
|
ideCurrentSingleLineSelection = ""
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT i
|
|
END IF
|
|
IdeInfo = "Selection length = " + str2$(sx2 - sx1) + " character" + LEFT$("s", ABS(sx2 - sx1 > 1))
|
|
UpdateIdeInfo
|
|
ELSE
|
|
IdeInfo = ""
|
|
ideCurrentSingleLineSelection = ""
|
|
UpdateIdeInfo
|
|
END IF
|
|
ELSE
|
|
IF ideselect THEN
|
|
sy1 = ideselecty1
|
|
sy2 = idecy
|
|
IF sy1 > sy2 OR idecx > 1 THEN
|
|
IdeInfo = "Selection length = " + str2$(ABS(sy2 - sy1) + 1) + " line" + LEFT$("s", ABS((ABS(sy2 - sy1) + 1) > 1))
|
|
ELSE
|
|
IdeInfo = "Selection length = " + str2$(sy2 - sy1) + " line" + LEFT$("s", ABS(sy2 - sy1 > 1))
|
|
END IF
|
|
ELSE
|
|
IdeInfo = ""
|
|
END IF
|
|
ideCurrentSingleLineSelection = ""
|
|
UpdateIdeInfo
|
|
END IF
|
|
END IF
|
|
|
|
IF AltSpecial THEN
|
|
AltSpecial = 0
|
|
ideentermenu = 0
|
|
KALT = 0
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
END IF
|
|
LOOP
|
|
|
|
'--------------------------------------------------------------------------------
|
|
|
|
startmenu:
|
|
m = 1
|
|
oldmx = mX: oldmy = mY
|
|
startmenu2:
|
|
altheld = 1
|
|
IF IdeSystem = 2 THEN IdeSystem = 1: GOSUB UpdateSearchBar
|
|
|
|
DO
|
|
|
|
LOCATE 1, 3
|
|
FOR i = 1 TO menus
|
|
IF m = i THEN COLOR 15, 0 ELSE COLOR 15, 7
|
|
PRINT " " + LEFT$(menu$(i, 0), 1);
|
|
IF m = i THEN COLOR 7, 0 ELSE COLOR 0, 7
|
|
PRINT RIGHT$(menu$(i, 0), LEN(menu$(i, 0)) - 1) + " ";
|
|
IF i = menus - 1 THEN LOCATE 1, idewx - LEN(menu$(menus, 0)) - 2
|
|
NEXT
|
|
|
|
PCOPY 3, 0
|
|
DO
|
|
|
|
lastaltheld = altheld
|
|
|
|
GetInput
|
|
IF oldmx <> mX OR oldmy <> mY THEN
|
|
IF mY = 1 AND idecontextualmenu <> 1 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
|
|
|
|
IF altheld <> 0 AND lastaltheld = 0 THEN
|
|
DO
|
|
_LIMIT 100
|
|
GetInput
|
|
IF _WINDOWHASFOCUS = 0 AND (os$ = "WIN" OR MacOSX = 1) THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
SCREEN , , 3, 0: PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF _RESIZE THEN
|
|
ForceResize = -1: skipdisplay = 0: GOTO ideloop
|
|
END IF
|
|
LOOP UNTIL KALT = 0
|
|
KB = KEY_ESC
|
|
END IF
|
|
|
|
IF _WINDOWHASFOCUS = 0 AND (os$ = "WIN" OR MacOSX = 1) THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
SCREEN , , 3, 0: PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF _RESIZE THEN
|
|
ForceResize = -1: skipdisplay = 0: GOTO ideloop
|
|
END IF
|
|
|
|
IF mCLICK OR mCLICK2 THEN
|
|
IF mY = 1 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
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0
|
|
GOTO showmenu
|
|
END IF
|
|
NEXT
|
|
END IF 'my=1
|
|
KB = KEY_ESC 'exit menu selection
|
|
END IF
|
|
|
|
IF _EXIT THEN ideexit = 1: KB = KEY_ESC
|
|
LOOP UNTIL KB
|
|
|
|
K$ = UCASE$(K$)
|
|
IF LEN(K$) > 0 AND KCTRL THEN
|
|
'ctrl+key combos are not valid while a menu is active
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
SCREEN , , 3, 0: PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
FOR i = 1 TO menus
|
|
a$ = UCASE$(LEFT$(menu$(i, 0), 1))
|
|
IF K$ = a$ THEN
|
|
m = i
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0
|
|
GOTO showmenu
|
|
END IF
|
|
NEXT
|
|
|
|
IF KB = KEY_LEFT THEN m = m - 1
|
|
IF KB = KEY_RIGHT THEN m = m + 1
|
|
IF KB = KEY_ESC THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
IdeInfo = ""
|
|
GOTO ideloop
|
|
END IF
|
|
IF m < 1 THEN m = menus
|
|
IF m > menus AND idecontextualmenu = 0 THEN m = 1
|
|
IF KB = KEY_UP OR KB = KEY_DOWN OR KB = KEY_ENTER THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0
|
|
GOTO showmenu
|
|
END IF
|
|
|
|
'possible ALT+??? code?
|
|
IF KB > 0 AND KB <= 255 THEN
|
|
IF KALT = 0 THEN
|
|
iCHECKLATER = 1
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
LOOP
|
|
|
|
'--------------------------------------------------------------------------------
|
|
|
|
showmenu:
|
|
altheld = 1
|
|
IF IdeSystem = 2 THEN IdeSystem = 1: GOSUB UpdateSearchBar
|
|
PCOPY 0, 2
|
|
SCREEN , , 1, 0
|
|
parentMenuR = r
|
|
r = 1
|
|
s = 0
|
|
parentMenu = 0
|
|
parentMenuSetup%% = 0
|
|
SELECT CASE idecontextualmenu
|
|
CASE 1
|
|
'right-click on text area
|
|
idectxmenuX = mX
|
|
idectxmenuY = mY
|
|
m = idecontextualmenuID
|
|
CASE 2
|
|
'line numbers menu item in View menu
|
|
idectxmenuX = xx + w + 3
|
|
idectxmenuY = yy + r
|
|
parentMenu = m
|
|
m = ViewMenuShowLineNumbersSubMenuID
|
|
END SELECT
|
|
|
|
IdeMakeEditMenu
|
|
|
|
IF totalWarnings = 0 THEN
|
|
menu$(ViewMenuID, ViewMenuCompilerWarnings) = "~Compiler #Warnings... Ctrl+W"
|
|
ELSE
|
|
menu$(ViewMenuID, ViewMenuCompilerWarnings) = "Compiler #Warnings... Ctrl+W"
|
|
END IF
|
|
|
|
IF callStackLength = 0 THEN
|
|
menu$(DebugMenuID, DebugMenuCallStack) = "~Call #Stack... F12"
|
|
ELSE
|
|
menu$(DebugMenuID, DebugMenuCallStack) = "Call #Stack... F12"
|
|
END IF
|
|
|
|
oldmy = mY: oldmx = mX
|
|
DO
|
|
PCOPY 2, 1
|
|
|
|
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
|
|
COLOR 7, 0: _PRINTSTRING (xx - 1, 1), " " + menu$(m, 0) + " "
|
|
ELSE
|
|
IF parentMenu > 0 AND parentMenuSetup%% = 0 THEN
|
|
parentMenuSetup%% = -1
|
|
backToParent.x1 = xx - 1
|
|
backToParent.x2 = xx + w
|
|
backToParent.y1 = 3
|
|
backToParent.y2 = backToParent.y1 + menusize(parentMenu)
|
|
END IF
|
|
END IF
|
|
'calculate menu width
|
|
w = 0
|
|
FOR i = 1 TO menusize(m)
|
|
m$ = menu$(m, i)
|
|
l = LEN(m$)
|
|
IF INSTR(m$, "#") THEN l = l - 1
|
|
IF LEFT$(m$, 1) = "~" THEN l = l - 1
|
|
IF LEFT$(m$, 1) = CHR$(7) THEN l = l - 1
|
|
IF INSTR(m$, " ") THEN l = l + 2 'min 4 spacing
|
|
IF l > w THEN w = l
|
|
NEXT
|
|
yy = 2
|
|
IF idecontextualmenu > 0 THEN
|
|
actual.idewy = idewy
|
|
IF idesubwindow <> 0 THEN
|
|
actual.idewy = idewy + idesubwindow
|
|
END IF
|
|
xx = idectxmenuX
|
|
IF xx < 3 THEN xx = 3
|
|
yy = idectxmenuY
|
|
IF yy + menusize(m) + 2 > actual.idewy THEN yy = actual.idewy - 2 - menusize(m)
|
|
END IF
|
|
IF xx > idewx - w - 3 THEN xx = idewx - w - 3
|
|
|
|
UpdateMenuHelpLine menuDesc$(m, r)
|
|
|
|
COLOR 0, 7
|
|
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: _PRINTSTRING (xx - 2, i + yy), CHR$(195) + STRING$(w + 2, CHR$(196)) + CHR$(180)
|
|
ELSEIF LEFT$(m$, 1) = "~" THEN
|
|
m$ = RIGHT$(m$, LEN(m$) - 1) 'Remove the tilde before printing
|
|
IF r = i THEN COLOR 7, 0: _PRINTSTRING (xx - 1, i + yy), SPACE$(w + 2)
|
|
IF LEFT$(m$, 1) = CHR$(7) THEN LOCATE i + yy, xx - 1 ELSE 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$)
|
|
IF r = i THEN COLOR 2, 0 ELSE COLOR 2, 7
|
|
PRINT MID$(m$, x, 1);
|
|
NEXT
|
|
ELSE
|
|
IF r = i THEN COLOR 7, 0: _PRINTSTRING (xx - 1, i + yy), SPACE$(w + 2)
|
|
IF LEFT$(m$, 1) = CHR$(7) THEN LOCATE i + yy, xx - 1 ELSE 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$)
|
|
IF x = h THEN
|
|
IF r = i THEN COLOR 15, 0 ELSE COLOR 15, 7
|
|
ELSE
|
|
IF r = i THEN COLOR 7, 0 ELSE COLOR 0, 7
|
|
END IF
|
|
PRINT MID$(m$, x, 1);
|
|
NEXT
|
|
END IF
|
|
NEXT
|
|
|
|
PCOPY 1, 0
|
|
|
|
IF s THEN GOTO menuChoiceMade
|
|
|
|
updateMenuPanel%% = 0
|
|
change = 0
|
|
DO
|
|
mousedown = 0: mouseup = 0
|
|
GetInput
|
|
lastaltheld = altheld: IF KALT THEN altheld = 1 ELSE altheld = 0
|
|
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
|
|
IF altheld <> 0 AND lastaltheld = 0 THEN
|
|
DO
|
|
_LIMIT 100
|
|
GetInput
|
|
IF _WINDOWHASFOCUS = 0 AND (os$ = "WIN" OR MacOSX = 1) THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF (_RESIZE <> 0) AND IdeDebugMode <> 2 THEN
|
|
ForceResize = -1: skipdisplay = 0: GOTO ideloop
|
|
END IF
|
|
LOOP UNTIL KALT = 0 'wait till alt is released
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO startmenu2
|
|
END IF
|
|
IF _EXIT THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 9: GOTO EnterDebugMode
|
|
ELSE
|
|
ideexit = 1: GOTO ideloop
|
|
END IF
|
|
END IF
|
|
IF _WINDOWHASFOCUS = 0 AND (os$ = "WIN" OR MacOSX = 1) THEN
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeDebugMode = 2 THEN GOTO EnterDebugMode
|
|
GOTO ideloop
|
|
END IF
|
|
IF (_RESIZE <> 0) AND IdeDebugMode <> 2 THEN
|
|
ForceResize = -1: skipdisplay = 0: GOTO ideloop
|
|
END IF
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
|
|
s = 0
|
|
|
|
IF mWHEEL THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeDebugMode = 2 THEN GOTO EnterDebugMode
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF mCLICK2 AND idecontextualmenu = 1 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)) OR _
|
|
(mY >= idewy AND mY < idewy + idesubwindow) THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeDebugMode = 2 THEN
|
|
bkpidecy = idecy
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
IF bkpidecy <> idecy THEN
|
|
ideshowtext
|
|
PCOPY 3, 0
|
|
END IF
|
|
GOTO showmenu
|
|
END IF
|
|
GOTO invokecontextualmenu
|
|
ELSE
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
'mouse selection
|
|
IF mouseup 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) <> "-" AND LEFT$(menu$(m, y), 1) <> "~" THEN
|
|
s = r
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF parentMenu > 0 AND _
|
|
mX >= backToParent.x1 AND mX =< backToParent.x2 AND _
|
|
mY >= backToParent.y1 AND mY =< backToParent.y2 THEN
|
|
m = parentMenu
|
|
r = parentMenuR
|
|
parentMenu = 0
|
|
parentMenuR = 0
|
|
idecontextualmenu = 0
|
|
PCOPY 3, 2
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF mX < xx - 2 OR mX >= xx - 2 + w + 4 OR mY > yy + menusize(m) + 1 OR (mY < yy AND idecontextualmenu = 1) THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeDebugMode = 2 THEN GOTO EnterDebugMode
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF NOT mouseup AND NOT mousedown THEN 'Check if we're hovering on menu options
|
|
IF parentMenu > 0 AND oldmy <> mY AND oldmx <> mX AND _
|
|
mX >= backToParent.x1 AND mX =< backToParent.x2 AND _
|
|
mY >= backToParent.y1 AND mY =< backToParent.y2 THEN
|
|
m = parentMenu
|
|
r = parentMenuR
|
|
parentMenu = 0
|
|
parentMenuR = 0
|
|
idecontextualmenu = 0
|
|
PCOPY 3, 2
|
|
_CONTINUE
|
|
END IF
|
|
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 IdeDebugMode <> 2 AND mY = 1 AND idecontextualmenu <> 1 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
|
|
parentMenuR = 0
|
|
parentMenu = 0
|
|
IF idecontextualmenu > 1 THEN idecontextualmenu = 0: PCOPY 3, 2
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
oldmx = mX
|
|
END IF
|
|
END IF
|
|
|
|
IF mB THEN
|
|
|
|
'top row
|
|
IF mY = 1 AND IdeDebugMode <> 2 THEN
|
|
lastm = m
|
|
x = 3
|
|
FOR i = 1 TO menus
|
|
x2 = LEN(menu$(i, 0)) + 2
|
|
IF mX >= x AND mX < x + x2 THEN
|
|
m = i
|
|
r = 1
|
|
IF lastm = m AND mousedown = 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
idecontextualmenu = 0
|
|
EXIT FOR
|
|
END IF
|
|
x = x + x2
|
|
IF i = menus - 1 THEN x = idewx - LEN(menu$(menus, 0)) - 2
|
|
NEXT
|
|
END IF
|
|
|
|
'uses pre-calc xx & w
|
|
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
|
|
|
|
END IF 'mb
|
|
|
|
IF KB = KEY_LEFT AND idecontextualmenu = 0 THEN
|
|
m = m - 1: r = 1
|
|
ELSEIF KB = KEY_LEFT AND idecontextualmenu > 1 THEN
|
|
idecontextualmenu = 0
|
|
PCOPY 3, 2
|
|
m = parentMenu
|
|
r = parentMenuR
|
|
parentMenu = 0
|
|
END IF
|
|
IF KB = KEY_RIGHT AND idecontextualmenu = 0 THEN
|
|
IF RIGHT$(menu$(m, r), 1) = CHR$(16) THEN
|
|
SELECT CASE LEFT$(menu$(m, r), LEN(menu$(m, r)) - 3)
|
|
CASE "#Line Numbers"
|
|
idecontextualmenu = 2
|
|
GOTO showmenu
|
|
END SELECT
|
|
ELSE
|
|
m = m + 1: r = 1
|
|
END IF
|
|
ELSEIF KB = KEY_RIGHT AND idecontextualmenu > 1 THEN
|
|
idecontextualmenu = 0
|
|
PCOPY 3, 2
|
|
m = parentMenu + 1
|
|
r = 1
|
|
END IF
|
|
IF m < 1 THEN m = menus
|
|
IF m > menus AND idecontextualmenu = 0 THEN m = 1
|
|
IF KB = KEY_ESC THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeDebugMode = 2 THEN GOTO EnterDebugMode
|
|
GOTO ideloop
|
|
END IF
|
|
IF KB = KEY_DOWN THEN
|
|
r = r + 1
|
|
IF menu$(m, r) = "-" THEN r = r + 1
|
|
IF r > menusize(m) THEN r = 1
|
|
END IF
|
|
|
|
IF KB = KEY_UP THEN
|
|
r = r - 1
|
|
IF menu$(m, r) = "-" THEN r = r - 1
|
|
IF r < 1 THEN r = menusize(m)
|
|
END IF
|
|
|
|
'select?
|
|
|
|
'with enter
|
|
IF KB = KEY_ENTER THEN
|
|
IF LEFT$(menu$(m, r), 1) <> "~" THEN s = r
|
|
END IF
|
|
|
|
'with hotkey
|
|
K$ = UCASE$(K$)
|
|
IF LEN(K$) > 0 AND NOT KCTRL THEN
|
|
FOR r2 = 1 TO menusize(m)
|
|
x = INSTR(menu$(m, r2), "#")
|
|
IF x THEN
|
|
a$ = UCASE$(MID$(menu$(m, r2), x + 1, 1))
|
|
IF K$ = a$ AND LEFT$(menu$(m, r2), 1) <> "~" THEN
|
|
s = r2
|
|
updateMenuPanel%% = -1
|
|
EXIT FOR
|
|
ELSEIF K$ = a$ AND LEFT$(menu$(m, r2), 1) = "~" THEN
|
|
updateMenuPanel%% = -1
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
IF updateMenuPanel%% THEN r = r2: _CONTINUE
|
|
END IF
|
|
|
|
IF s THEN
|
|
menuChoiceMade:
|
|
IF KALT THEN idehl = 1 ELSE idehl = 0 'set idehl, a shared variable used by various dialogue boxes
|
|
|
|
IF menu$(m, s) = "Add Co#mment (') Ctrl+R" THEN
|
|
ctrlAddComment:
|
|
y1 = idecy: y2 = y1
|
|
IF ideselect = 1 THEN
|
|
y1 = ideselecty1
|
|
IF idecy > ideselecty1 AND idecx = 1 THEN y2 = y2 - 1
|
|
IF y1 > y2 THEN SWAP y1, y2
|
|
END IF
|
|
'calculate lhs
|
|
lhs = 10000000
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
ta$ = LTRIM$(a$)
|
|
t = LEN(a$) - LEN(ta$)
|
|
IF t < lhs THEN lhs = t
|
|
END IF
|
|
NEXT
|
|
'edit lines
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
a$ = LEFT$(a$, lhs) + "'" + RIGHT$(a$, LEN(a$) - lhs)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
NEXT
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Remove Comme#nt (') Ctrl+Shift+R" THEN
|
|
ctrlRemoveComment:
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
y1 = idecy: y2 = y1
|
|
IF ideselect = 1 THEN
|
|
y1 = ideselecty1
|
|
IF idecy > ideselecty1 AND idecx = 1 THEN y2 = y2 - 1
|
|
IF y1 > y2 THEN SWAP y1, y2
|
|
END IF
|
|
'edit lines
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
a2$ = LTRIM$(a$)
|
|
IF LEN(a2$) THEN
|
|
IF ASC(a2$, 1) = 39 THEN
|
|
a$ = SPACE$(LEN(a$) - LEN(a2$)) + RIGHT$(a2$, LEN(a2$) - 1)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "To#ggle Comment Ctrl+T" THEN
|
|
ctrlToggleComment:
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
y1 = idecy: y2 = y1
|
|
IF ideselect = 1 THEN
|
|
y1 = ideselecty1
|
|
IF idecy > ideselecty1 AND idecx = 1 THEN y2 = y2 - 1
|
|
IF y1 > y2 THEN SWAP y1, y2
|
|
END IF
|
|
'calculate lhs
|
|
lhs = 10000000
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
ta$ = LTRIM$(a$)
|
|
t = LEN(a$) - LEN(ta$)
|
|
IF t < lhs THEN lhs = t
|
|
END IF
|
|
NEXT
|
|
'edit lines
|
|
FOR y = y1 TO y2
|
|
a$ = idegetline(y)
|
|
IF LEN(a$) THEN
|
|
a2$ = LTRIM$(a$)
|
|
IF LEN(a2$) THEN
|
|
IF ASC(a2$, 1) = 39 THEN
|
|
a$ = SPACE$(LEN(a$) - LEN(a2$)) + RIGHT$(a2$, LEN(a2$) - 1)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
ELSE
|
|
a$ = LEFT$(a$, lhs) + "'" + RIGHT$(a$, LEN(a$) - lhs)
|
|
idesetline y, a$
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Increase Indent TAB" THEN
|
|
IF ideselect THEN GOTO IdeBlockIncreaseIndent
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 16) = "#Decrease Indent" THEN
|
|
IF ideselect THEN GOTO IdeBlockDecreaseIndent
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Language..." THEN
|
|
PCOPY 2, 0
|
|
retval = idelanguagebox
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Display..." THEN
|
|
PCOPY 2, 0
|
|
IF idehelp = 0 THEN
|
|
retval = idedisplaybox
|
|
IF retval = 1 THEN
|
|
'screen dimensions have changed and everything must be redrawn/reapplied
|
|
WIDTH idewx, idewy + idesubwindow
|
|
IF idecustomfont THEN
|
|
_FONT idecustomfonthandle
|
|
ELSE
|
|
IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
|
|
END IF
|
|
skipdisplay = 0
|
|
GOSUB redrawItAll
|
|
END IF
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "IDE C#olors..." THEN
|
|
PCOPY 2, 0
|
|
HideBracketHighlight
|
|
retval = idechoosecolorsbox 'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#RGB Color Mixer..." THEN
|
|
PCOPY 2, 0
|
|
oldkeywordHighlight = keywordHighlight
|
|
keywordHighlight = 0
|
|
HideBracketHighlight
|
|
keywordHighlight = oldkeywordHighlight
|
|
retval$ = idergbmixer$(-1) 'retval is ignored
|
|
IF LEN(retval$) THEN insertAtCursor retval$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Purge C++ #Libraries" THEN
|
|
PCOPY 2, 0
|
|
PurgeTemporaryBuildFiles (os$), (MacOSX)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
|
|
IF RIGHT$(menu$(m, s), 19) = "#Swap Mouse Buttons" THEN
|
|
PCOPY 2, 0
|
|
MouseButtonSwapped = NOT MouseButtonSwapped
|
|
IF MouseButtonSwapped THEN
|
|
WriteConfigSetting mouseSettingsSection$, "SwapMouseButton", "True"
|
|
menu$(OptionsMenuID, OptionsMenuSwapMouse) = CHR$(7) + "#Swap Mouse Buttons"
|
|
ELSE
|
|
WriteConfigSetting mouseSettingsSection$, "SwapMouseButton", "False"
|
|
menu$(OptionsMenuID, OptionsMenuSwapMouse) = "#Swap Mouse Buttons"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 19) = "Syntax #Highlighter" THEN
|
|
PCOPY 2, 0
|
|
DisableSyntaxHighlighter = NOT DisableSyntaxHighlighter
|
|
IF DisableSyntaxHighlighter THEN
|
|
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "True"
|
|
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = "Syntax #Highlighter"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "False"
|
|
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = CHR$(7) + "Syntax #Highlighter"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 19) = "Cursor After #Paste" THEN
|
|
PCOPY 2, 0
|
|
PasteCursorAtEnd = NOT PasteCursorAtEnd
|
|
IF PasteCursorAtEnd THEN
|
|
WriteConfigSetting generalSettingsSection$, "PasteCursorAtEnd", "True"
|
|
menu$(OptionsMenuID, OptionsMenuPasteCursor) = CHR$(7) + "Cursor After #Paste"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "PasteCursorAtEnd", "False"
|
|
menu$(OptionsMenuID, OptionsMenuPasteCursor) = "Cursor After #Paste"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 15) = "Syntax Ch#ecker" THEN
|
|
PCOPY 2, 0
|
|
IDEShowErrorsImmediately = NOT IDEShowErrorsImmediately
|
|
IF IDEShowErrorsImmediately THEN
|
|
WriteConfigSetting generalSettingsSection$, "ShowErrorsImmediately", "True"
|
|
menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately) = CHR$(7) + "Syntax Ch#ecker"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "ShowErrorsImmediately", "False"
|
|
menu$(OptionsMenuID, OptionsMenuShowErrorsImmediately) = "Syntax Ch#ecker"
|
|
END IF
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 16) = "Ignore #Warnings" THEN
|
|
PCOPY 2, 0
|
|
IF IgnoreWarnings = 0 THEN
|
|
IgnoreWarnings = -1
|
|
WriteConfigSetting generalSettingsSection$, "IgnoreWarnings", "True"
|
|
menu$(OptionsMenuID, OptionsMenuIgnoreWarnings) = CHR$(7) + "Ignore #Warnings"
|
|
ELSE
|
|
IgnoreWarnings = 0
|
|
WriteConfigSetting generalSettingsSection$, "IgnoreWarnings", "False"
|
|
menu$(OptionsMenuID, OptionsMenuIgnoreWarnings) = "Ignore #Warnings"
|
|
END IF
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 28) = "Output EXE to Source #Folder" THEN
|
|
PCOPY 2, 0
|
|
SaveExeWithSource = NOT SaveExeWithSource
|
|
IF SaveExeWithSource THEN
|
|
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "True"
|
|
menu$(RunMenuID, RunMenuSaveExeWithSource) = CHR$(7) + "Output EXE to Source #Folder"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "SaveExeWithSource", "False"
|
|
menu$(RunMenuID, RunMenuSaveExeWithSource) = "Output EXE to Source #Folder"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
idecompiled = 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 29) = "#Output Watch List to Console" THEN
|
|
PCOPY 2, 0
|
|
WatchListToConsole = NOT WatchListToConsole
|
|
IF WatchListToConsole THEN
|
|
WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "True"
|
|
menu$(DebugMenuID, DebugMenuWatchListToConsole) = CHR$(7) + "#Output Watch List to Console"
|
|
ELSE
|
|
WriteConfigSetting debugSettingsSection$, "WatchListToConsole", "False"
|
|
menu$(DebugMenuID, DebugMenuWatchListToConsole) = "#Output Watch List to Console"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 28) = "Auto-add $#Debug Metacommand" THEN
|
|
PCOPY 2, 0
|
|
AutoAddDebugCommand = NOT AutoAddDebugCommand
|
|
IF AutoAddDebugCommand THEN
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "True"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = CHR$(7) + "Auto-add $#Debug Metacommand"
|
|
ELSE
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "False"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = "Auto-add $#Debug Metacommand"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF MID$(menu$(m, s), 1, 17) = "#Quick Navigation" OR MID$(menu$(m, s), 2, 17) = "#Quick Navigation" THEN
|
|
PCOPY 2, 0
|
|
EnableQuickNav = NOT EnableQuickNav
|
|
IF EnableQuickNav THEN
|
|
WriteConfigSetting generalSettingsSection$, "EnableQuickNav", "True"
|
|
menu$(SearchMenuID, SearchMenuEnableQuickNav) = CHR$(7) + "#Quick Navigation"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "EnableQuickNav", "False"
|
|
menu$(SearchMenuID, SearchMenuEnableQuickNav) = "#Quick Navigation"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Code Layout..." THEN
|
|
PCOPY 2, 0
|
|
retval = idelayoutbox
|
|
IF retval THEN idechangemade = 1: idelayoutallow = 2: startPausedPending = 0 'recompile if options changed
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "C++ Co#mpiler Settings..." THEN
|
|
PCOPY 2, 0
|
|
retval = ideCompilerSettingsBox
|
|
IF retval THEN idechangemade = 1: idelayoutallow = 2: startPausedPending = 0 'recompile if options changed
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Add/Remove #Bookmark Alt+Left" THEN
|
|
PCOPY 2, 0
|
|
bmkremoved = 0
|
|
bmkremoveb:
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y = idecy THEN
|
|
FOR b2 = b TO IdeBmkN - 1
|
|
IdeBmk(b2) = IdeBmk(b2 + 1)
|
|
NEXT
|
|
IdeBmkN = IdeBmkN - 1
|
|
bmkremoved = 1
|
|
ideunsaved = 1
|
|
GOTO bmkremoveb
|
|
END IF
|
|
NEXT
|
|
IF bmkremoved = 0 THEN
|
|
IdeBmkN = IdeBmkN + 1
|
|
IF IdeBmkN > UBOUND(IdeBmk) THEN x = UBOUND(IdeBmk) * 2: REDIM _PRESERVE IdeBmk(x) AS IdeBmkType
|
|
IdeBmk(IdeBmkN).y = idecy
|
|
IdeBmk(IdeBmkN).x = idecx
|
|
ideunsaved = 1
|
|
END IF
|
|
SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Next Bookmark Alt+Down" OR menu$(m, s) = "#Previous Bookmark Alt+Up" THEN
|
|
PCOPY 2, 0
|
|
IF IdeBmkN = 0 THEN
|
|
result = idemessagebox("Bookmarks", "No bookmarks exist (Use Alt+Left to create a bookmark)", "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
IF IdeBmkN = 1 THEN
|
|
IF idecy = IdeBmk(1).y THEN
|
|
result = idemessagebox("Bookmarks", "No other bookmarks exist", "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
l = idecy
|
|
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
|
|
IF l > iden THEN l = 1
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y = l THEN EXIT DO
|
|
NEXT
|
|
LOOP
|
|
AddQuickNavHistory
|
|
idecy = l
|
|
idecx = IdeBmk(b).x
|
|
ideselect = 0
|
|
SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IF menu$(m, s) = "#Go To Line... Ctrl+G" THEN
|
|
PCOPY 2, 0
|
|
idegotobox
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Backup/Undo..." THEN
|
|
PCOPY 2, 0
|
|
retval = idebackupbox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
'IF menu$(m, s) = "Check for #Newer Version..." THEN
|
|
' PCOPY 2, 0
|
|
' idecheckupdates
|
|
' PCOPY 3, 0: SCREEN , , 3, 0
|
|
' GOTO ideloop
|
|
'END IF
|
|
|
|
|
|
IF menu$(m, s) = "#About..." THEN
|
|
helpabout:
|
|
PCOPY 2, 0
|
|
m$ = "QB64 Phoenix Edition Version " + Version$
|
|
IF IsCiVersion THEN m$ = m$ + CHR$(10) + "CI Build"
|
|
result = idemessagebox("About", m$, "")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
|
|
IF menu$(m, s) = "#ASCII Chart..." THEN
|
|
PCOPY 2, 0
|
|
relaunch = 0
|
|
DO
|
|
retval$ = ideASCIIbox$(relaunch)
|
|
IF LEN(retval$) THEN insertAtCursor retval$
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOSUB redrawItAll
|
|
ideshowtext
|
|
PCOPY 3, 0
|
|
LOOP WHILE relaunch
|
|
retval = 1
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Insert Quick #Keycode Ctrl+K" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
ideQuickKeycode:
|
|
dummy = DarkenFGBG(1)
|
|
clearStatusWindow 0
|
|
COLOR 15, 1
|
|
_PRINTSTRING (2, idewy - 3), "Press any key to insert its _KEYHIT/_KEYDOWN code..."
|
|
PCOPY 3, 0
|
|
|
|
tempk$ = ""
|
|
|
|
DO: tempk = _KEYHIT: _LIMIT 30: LOOP UNTIL tempk = 0 'wait for key release
|
|
DO 'get the next key hit
|
|
tempk = _KEYHIT
|
|
IF tempk > 0 THEN tempk$ = STR$(tempk)
|
|
|
|
WHILE _MOUSEINPUT: WEND
|
|
IF _MOUSEBUTTON(1) OR _MOUSEBUTTON(2) THEN GOTO bypassCtrlK
|
|
|
|
_LIMIT 30
|
|
LOOP UNTIL tempk > 0
|
|
IF tempk = 100303 OR tempk = 100304 THEN 'shift key
|
|
DO 'get the next key hit
|
|
tempk = _KEYHIT 'see what the next key is, and use it
|
|
IF tempk <> 0 THEN tempk$ = STR$(ABS(tempk)) 'if it's the SHFT UP code, then return the value for shift
|
|
|
|
WHILE _MOUSEINPUT: WEND
|
|
IF _MOUSEBUTTON(1) OR _MOUSEBUTTON(2) THEN GOTO bypassCtrlK
|
|
|
|
_LIMIT 30
|
|
LOOP UNTIL tempk <> 0
|
|
END IF
|
|
tempk$ = LTRIM$(tempk$)
|
|
|
|
'insert
|
|
insertAtCursor tempk$
|
|
|
|
bypassCtrlK:
|
|
dummy = DarkenFGBG(0)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
retval = 1
|
|
KCTRL = 0: KCONTROL = 0
|
|
GOSUB redrawItAll
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 10) = "#Help On '" THEN 'Contextual menu Help
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO contextualhelp
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 10) = "#Go To SUB" OR LEFT$(menu$(m, s), 15) = "#Go To FUNCTION" THEN 'Contextual menu Goto
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
AddQuickNavHistory
|
|
idecy = CVL(MID$(SubFuncLIST(1), 1, 4))
|
|
idesy = idecy
|
|
idecx = 1
|
|
idesx = 1
|
|
ideselect = 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 12) = "Go To #Label" THEN 'Contextual menu Goto label
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
AddQuickNavHistory
|
|
idecy = CVL(MID$(SubFuncLIST(UBOUND(SubFuncLIST)), 1, 4))
|
|
idesy = idecy
|
|
idecx = 1
|
|
idesx = 1
|
|
ideselect = 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Contents Page" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
lnk$ = "QB64 Help Menu"
|
|
GOTO OpenHelpLnk
|
|
END IF
|
|
IF menu$(m, s) = "Keyword #Index" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
lnk$ = "Keyword Reference - Alphabetical"
|
|
GOTO OpenHelpLnk
|
|
END IF
|
|
IF menu$(m, s) = "#Keywords by Usage" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
lnk$ = "Keyword Reference - By usage"
|
|
GOTO OpenHelpLnk
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#View Shift+F1" THEN
|
|
|
|
IF idehelp = 0 THEN
|
|
IF idesubwindow THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
idesubwindow = idewy \ 2: idewy = idewy - idesubwindow
|
|
Help_wx1 = 2: Help_wy1 = idewy + 1: Help_wx2 = idewx - 1: Help_wy2 = idewy + idesubwindow - 2: Help_ww = Help_wx2 - Help_wx1 + 1: Help_wh = Help_wy2 - Help_wy1 + 1
|
|
idehelp = 1
|
|
skipdisplay = 0
|
|
IdeSystem = 3
|
|
retval = 1: GOSUB redrawItAll
|
|
END IF
|
|
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "View Current Page On #Wiki" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF idehelp THEN GOTO launchWiki
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Update Current Page" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF idehelp THEN
|
|
Help_IgnoreCache = 1
|
|
a$ = Wiki$(Back$(Help_Back_Pos))
|
|
WikiParse a$ 'reparse updated page incl. plugin templates
|
|
Help_IgnoreCache = 0
|
|
END IF
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
|
|
IF menu$(m, s) = "#Math Evaluator..." THEN
|
|
STATIC mathEvalExpr$
|
|
'build initial name if word selected
|
|
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 EXIT FOR
|
|
NEXT
|
|
a2$ = _TRIM$(a2$)
|
|
IF LEN(a2$) THEN mathEvalExpr$ = a2$
|
|
END IF
|
|
END IF
|
|
|
|
DO
|
|
PCOPY 2, 0
|
|
retval$ = ideinputbox$("Math Evaluator", "#Enter expression", mathEvalExpr$, "", 60, 0, 0)
|
|
result = 0
|
|
IF LEN(retval$) THEN
|
|
mathEvalExpr$ = retval$
|
|
ev0$ = Evaluate_Expression$(retval$)
|
|
ev$ = ev0$
|
|
mathEvalError%% = INSTR(ev$, "ERROR") > 0
|
|
IF mathEvalError%% = 0 AND mathEvalHEX%% THEN ev$ = "&H" + HEX$(VAL(ev$))
|
|
DO
|
|
b1$ = "#Insert;"
|
|
IF mathEvalHEX%% THEN b2$ = "#Decimal;" ELSE b2$ = "#HEX$;"
|
|
IF mathEvalError%% = 0 AND mathEvalComment%% THEN
|
|
mathMsg$ = ev$ + " '" + retval$
|
|
b3$ = "#Uncomment;"
|
|
ELSE
|
|
mathMsg$ = ev$
|
|
b3$ = "Co#mment;"
|
|
END IF
|
|
IF mathEvalError%% THEN b1$ = "": b2$ = "": b3$ = ""
|
|
PCOPY 2, 0
|
|
result = idemessagebox("Math Evaluator - Result", mathMsg$, b1$ + b2$ + b3$ + "#Redo;#Cancel")
|
|
IF mathEvalError%% = 0 THEN
|
|
SELECT CASE result
|
|
CASE 1, 4, 5
|
|
EXIT DO
|
|
CASE 2
|
|
mathEvalHEX%% = NOT mathEvalHEX%%
|
|
IF mathEvalHEX%% THEN ev$ = "&H" + HEX$(VAL(ev$)) ELSE ev$ = ev0$
|
|
CASE 3
|
|
mathEvalComment%% = NOT mathEvalComment%%
|
|
END SELECT
|
|
ELSE
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
IF mathEvalError%% AND result = 2 THEN EXIT DO
|
|
IF mathEvalError%% = 0 AND (result = 1 OR result = 5) THEN EXIT DO
|
|
ELSE
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
|
|
IF mathEvalError%% = 0 AND result = 1 THEN
|
|
insertAtCursor mathMsg$
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Update All #Pages..." THEN
|
|
PCOPY 2, 0
|
|
q$ = ideyesnobox("Update Help", "This can take up to 20 minutes.\nRedownload all cached help content from the wiki?")
|
|
PCOPY 2, 0
|
|
IF q$ = "Y" THEN
|
|
Help_Recaching = 1: Help_IgnoreCache = 1
|
|
uerr = ideupdatehelpbox
|
|
Help_Recaching = 0: Help_IgnoreCache = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF uerr THEN
|
|
lnk$ = "Update All"
|
|
GOTO OpenHelpLnk
|
|
END IF
|
|
END IF
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 8) = "New #SUB" THEN
|
|
PCOPY 2, 0
|
|
idenewsf "SUB"
|
|
ideselect = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
IF LEFT$(menu$(m, s), 13) = "New #FUNCTION" THEN
|
|
PCOPY 2, 0
|
|
idenewsf "FUNCTION"
|
|
ideselect = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#SUBs... F2" OR menu$(m, s) = "SUBs... F2" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 14
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 2, 0
|
|
idesubsjmp:
|
|
r$ = idesubs
|
|
IF r$ <> "C" THEN ideselect = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Line Numbers " + CHR$(16) THEN
|
|
idecontextualmenu = 2
|
|
GOTO showmenu
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Show Line Numbers" THEN
|
|
PCOPY 2, 0
|
|
ShowLineNumbers = -1
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbers", "True"
|
|
menu$(m, s) = "#Hide Line Numbers"
|
|
menu$(m, ViewMenuShowBGID) = MID$(menu$(m, ViewMenuShowBGID), 2)
|
|
menu$(m, ViewMenuShowSeparatorID) = MID$(menu$(m, ViewMenuShowSeparatorID), 2)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Hide Line Numbers" THEN
|
|
PCOPY 2, 0
|
|
ShowLineNumbers = 0
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbers", "False"
|
|
menu$(m, s) = "#Show Line Numbers"
|
|
menu$(m, ViewMenuShowBGID) = "~" + menu$(m, ViewMenuShowBGID)
|
|
menu$(m, ViewMenuShowSeparatorID) = "~" + menu$(m, ViewMenuShowSeparatorID)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 17) = "#Background Color" THEN
|
|
IF LEFT$(menu$(m, s), 1) <> "~" THEN
|
|
PCOPY 2, 0
|
|
ShowLineNumbersUseBG = NOT ShowLineNumbersUseBG
|
|
IF ShowLineNumbersUseBG THEN
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersUseBG", "True"
|
|
menu$(m, s) = CHR$(7) + "#Background Color"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersUseBG", "False"
|
|
menu$(m, s) = "#Background Color"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF RIGHT$(menu$(m, s), 15) = "Sho#w Separator" THEN
|
|
IF LEFT$(menu$(m, s), 1) <> "~" THEN
|
|
PCOPY 2, 0
|
|
ShowLineNumbersSeparator = NOT ShowLineNumbersSeparator
|
|
IF ShowLineNumbersSeparator THEN
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersSeparator", "True"
|
|
menu$(m, s) = CHR$(7) + "Sho#w Separator"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "ShowLineNumbersSeparator", "False"
|
|
menu$(m, s) = "Sho#w Separator"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Compiler #Warnings... Ctrl+W" THEN
|
|
PCOPY 2, 0
|
|
retval = idewarningbox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Find... Ctrl+F3" THEN
|
|
PCOPY 2, 0
|
|
idefindjmp:
|
|
r$ = idefind
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
'...
|
|
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
|
|
GOTO idemf3
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Change... Alt+F3" THEN
|
|
PCOPY 2, 0
|
|
idefindchangejmp:
|
|
r$ = idechange
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
idealthighlight = 0
|
|
LOCATE , , 0: COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
IF r$ = "C" OR r$ = "" THEN GOTO ideloop
|
|
'assume "V", verify changes
|
|
IdeAddSearched idefindtext
|
|
|
|
oldcx = idecx: oldcy = idecy
|
|
found = 0: looped = 0
|
|
changed = 0
|
|
|
|
s$ = idefindtext$
|
|
IF idefindcasesens = 0 THEN s$ = UCASE$(s$)
|
|
start = idecy: y = start
|
|
startx = idecx: x1 = startx
|
|
first = 1
|
|
idefindnext2:
|
|
|
|
l$ = idegetline(y)
|
|
IF idefindcasesens = 0 THEN l$ = UCASE$(l$)
|
|
|
|
IF first = 1 THEN
|
|
first = 0
|
|
ELSE
|
|
x1 = 1
|
|
IF idefindbackwards THEN
|
|
x1 = LEN(l$) - LEN(s$) + 1
|
|
END IF
|
|
END IF
|
|
IF x1 < 0 THEN x1 = 0
|
|
|
|
idefindagain2:
|
|
|
|
IF idefindbackwards THEN
|
|
x = 0
|
|
FOR xx = x1 TO 1 STEP -1
|
|
IF ASC(l$, xx) = ASC(s$) THEN 'first char
|
|
xxo = xx - 1
|
|
FOR xx2 = xx TO xx + LEN(s$) - 1
|
|
IF ASC(l$, xx2) <> ASC(s$, xx2 - xxo) THEN EXIT FOR
|
|
NEXT
|
|
IF xx2 = xx + LEN(s$) THEN
|
|
'matched!
|
|
x = xx
|
|
EXIT FOR
|
|
END IF
|
|
END IF 'first char
|
|
NEXT
|
|
IF y = start AND looped = 1 AND x <= startx THEN x = 0
|
|
ELSE
|
|
x = INSTR(x1, l$, s$)
|
|
IF y = start AND looped = 1 AND x >= startx THEN x = 0
|
|
END IF
|
|
|
|
IF x THEN
|
|
IF idefindwholeword THEN
|
|
whole = 1
|
|
IF x > 1 THEN
|
|
c = ASC(UCASE$(MID$(l$, x - 1, 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF x + LEN(s$) <= LEN(l$) THEN
|
|
c = ASC(UCASE$(MID$(l$, x + LEN(s$), 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF whole = 0 THEN
|
|
x1 = x + 1: IF idefindbackwards THEN x1 = x - 1
|
|
x = 0
|
|
IF x1 > 0 AND x1 <= LEN(l$) THEN GOTO idefindagain2
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
DIM comment AS _BYTE, quote AS _BYTE
|
|
IF x THEN
|
|
FindQuoteComment l$, x, comment, quote
|
|
IF idefindnocomments <> 0 AND comment THEN x = 0
|
|
IF idefindnostrings <> 0 AND quote THEN x = 0
|
|
IF idefindonlycomments <> 0 AND comment = 0 THEN x = 0
|
|
IF idefindonlystrings <> 0 AND quote = 0 THEN x = 0
|
|
END IF
|
|
|
|
IF x THEN
|
|
ideselect = 1
|
|
idecx = x: idecy = y
|
|
idecentercurrentline
|
|
ideselectx1 = x + LEN(s$): ideselecty1 = y
|
|
|
|
found = 1
|
|
ideshowtext
|
|
SCREEN , , 0, 0: LOCATE , , 1: SCREEN , , 3, 0
|
|
PCOPY 3, 0
|
|
r$ = idechangeit
|
|
idedeltxt
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
ideselect = 0
|
|
IF r$ = "C" THEN
|
|
idecx = oldcx: idecy = oldcy
|
|
IF changed THEN
|
|
ideshowtext
|
|
SCREEN , , 0, 0: LOCATE , , 1: SCREEN , , 3, 0
|
|
PCOPY 3, 0
|
|
idechanged changed
|
|
END IF
|
|
GOTO ideloop
|
|
END IF
|
|
IF r$ = "Y" THEN
|
|
l$ = idegetline(idecy)
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
IF LEN(l$) >= ideselectx1 THEN
|
|
l$ = LEFT$(l$, idecx - 1) + idechangeto$ + RIGHT$(l$, LEN(l$) - ideselectx1 + 1)
|
|
ELSE
|
|
l$ = LEFT$(l$, idecx - 1) + idechangeto$
|
|
END IF
|
|
idesetline idecy, l$
|
|
changed = changed + 1
|
|
IF idefindcasesens = 0 THEN l$ = UCASE$(l$)
|
|
|
|
IF idefindbackwards THEN
|
|
IF x <= startx AND y = start THEN startx = startx - LEN(s$) + LEN(idechangeto$) 'move startx according to the difference
|
|
ELSE
|
|
IF x <= startx AND y = start AND looped = 1 THEN startx = startx - LEN(s$) + LEN(idechangeto$) 'move startx according to the difference
|
|
x = x + LEN(idechangeto$) - 1 'skip changed portion
|
|
END IF
|
|
ELSE
|
|
'"N"
|
|
'(no action)
|
|
END IF
|
|
IF idefindbackwards THEN x1 = x - 1 ELSE x1 = x + 1
|
|
GOTO idefindagain2
|
|
END IF
|
|
|
|
IF idefindbackwards THEN
|
|
y = y - 1
|
|
IF y = start - 1 AND looped = 1 THEN
|
|
GOTO finishedchange
|
|
END IF
|
|
IF y < 1 THEN y = iden: looped = 1
|
|
GOTO idefindnext2
|
|
ELSE
|
|
y = y + 1
|
|
IF y = start + 1 AND looped = 1 THEN
|
|
GOTO finishedchange
|
|
END IF
|
|
IF y > iden THEN y = 1: looped = 1
|
|
GOTO idefindnext2
|
|
END IF
|
|
|
|
'-------------------------------------------------
|
|
|
|
finishedchange:
|
|
idecx = oldcx: idecy = oldcy
|
|
IF changed THEN
|
|
ideshowtext
|
|
SCREEN , , 0, 0: LOCATE , , 1: SCREEN , , 3, 0
|
|
PCOPY 3, 0
|
|
idechanged changed
|
|
ELSEIF found THEN
|
|
ideshowtext
|
|
SCREEN , , 0, 0: LOCATE , , 1: SCREEN , , 3, 0
|
|
PCOPY 3, 0
|
|
result = idemessagebox("Search complete", "No changes made.", "")
|
|
ELSE
|
|
idenomatch -1
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF '#Change...
|
|
|
|
IF menu$(m, s) = "Clear Search #History..." THEN
|
|
PCOPY 2, 0
|
|
r$ = ideclearhistory$("SEARCH")
|
|
IF r$ = "Y" THEN
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\searched.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
idefindtext = ""
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Repeat Last Find (Shift+) F3" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO idemf3
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Cl#ear Del" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeSystem = 1 AND ideselect = 1 THEN
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
delselect
|
|
ELSEIF IdeSystem = 2 THEN
|
|
GOTO deleteSelectionSearchField
|
|
END IF
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Paste Shift+Ins or Ctrl+V" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeSystem = 1 THEN GOTO idempaste
|
|
IF IdeSystem = 2 THEN GOTO pasteIntoSearchField
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Copy Ctrl+Ins or Ctrl+C" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeSystem = 1 AND ideselect = 1 THEN GOTO copy2clip
|
|
IF IdeSystem = 2 THEN GOTO copysearchterm2clip
|
|
IF IdeSystem = 3 AND Help_Select = 2 THEN GOTO copyhelp2clip
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Cu#t Shift+Del or Ctrl+X" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeSystem = 1 AND ideselect = 1 THEN
|
|
K$ = CHR$(0) + "S" 'tricks handler into del after copy
|
|
GOTO idemcut
|
|
ELSEIF IdeSystem = 2 THEN
|
|
GOTO cutToClipboardSearchField
|
|
END IF
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Undo Ctrl+Z" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO idemundo
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Redo Ctrl+Y" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO idemredo
|
|
END IF
|
|
|
|
|
|
IF menu$(m, s) = "Select #All Ctrl+A" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF IdeSystem = 1 THEN GOTO idemselectall
|
|
IF IdeSystem = 2 THEN GOTO selectAllInSearchField
|
|
IF IdeSystem = 3 THEN GOTO selectAllInHelp
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Clo#se Help ESC" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO closeHelp
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Start F5" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
startPaused = 0
|
|
GOTO idemrun
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Run only (No exe)" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
NoExeSaved = -1
|
|
startPaused = 0
|
|
GOTO idemrun
|
|
END IF
|
|
|
|
|
|
|
|
IF menu$(m, s) = "Modify #COMMAND$..." THEN
|
|
PCOPY 2, 0
|
|
ModifyCOMMAND$ = " " + ideinputbox$("Modify COMMAND$", "#Enter text for COMMAND$", _TRIM$(ModifyCOMMAND$), "", 60, 0, 0)
|
|
IF _TRIM$(ModifyCOMMAND$) = "" THEN ModifyCOMMAND$ = ""
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Make E#XE Only F11" OR menu$(m, s) = "Make E#xecutable Only F11" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO idemexe
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Start #Paused F7 or F8" THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
startPausedMenuHandler:
|
|
IF vWatchOn = 0 THEN
|
|
IF AutoAddDebugCommand = 0 THEN
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 2
|
|
COLOR 14, 1
|
|
x = 2
|
|
y = idewy - 2
|
|
printWrapStatus x, y, x, "$DEBUG metacommand is required to start paused."
|
|
PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
result = idemessagebox("Start Paused", "Insert $DEBUG metacommand?", "#Yes;#No;#Don't show this again")
|
|
IF result = 1 THEN
|
|
ideselect = 0
|
|
ideinsline 1, SCase$("$Debug")
|
|
idecy = idecy + 1
|
|
idechangemade = 1
|
|
startPaused = -1
|
|
startPausedPending = -1
|
|
GOTO specialchar
|
|
ELSEIF result = 3 THEN
|
|
result = idemessagebox("Debug", "You can reenable the 'Auto-add $Debug Metacommand' feature\nin the Debug menu.", "#OK")
|
|
AutoAddDebugCommand = 0
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "False"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = "Auto-add $#Debug Metacommand"
|
|
END IF
|
|
GOTO ideloop
|
|
ELSE
|
|
startPausedPending = 0
|
|
startPaused = -1
|
|
GOTO idemrun
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Watch List... F4" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 16
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 2, 0
|
|
showWatchList:
|
|
IF vWatchOn = 0 THEN
|
|
IF AutoAddDebugCommand = 0 THEN
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 2
|
|
COLOR 14, 1
|
|
x = 2
|
|
y = idewy - 2
|
|
printWrapStatus x, y, x, "$DEBUG metacommand is required for Watch List functionality."
|
|
PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
result = idemessagebox("Watch List", "Insert $DEBUG metacommand?", "#Yes;#No;#Don't show this again")
|
|
IF result = 1 THEN
|
|
ideselect = 0
|
|
ideinsline 1, SCase$("$Debug")
|
|
idecy = idecy + 1
|
|
idechangemade = 1
|
|
ELSEIF result = 3 THEN
|
|
result = idemessagebox("Debug", "You can reenable the 'Auto-add $Debug Metacommand' feature\nin the Debug menu.", "#OK")
|
|
AutoAddDebugCommand = 0
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "False"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = "Auto-add $#Debug Metacommand"
|
|
END IF
|
|
GOTO ideloop
|
|
ELSE
|
|
IF idecompiling = 1 THEN
|
|
SCREEN , , 3, 0
|
|
COLOR 14, 1
|
|
x = 2
|
|
y = idewy - 2
|
|
printWrapStatus x, y, x, "Variable List will be available after syntax checking is done..."
|
|
waitingForVarList = 1
|
|
PCOPY 3, 0
|
|
GOTO ideloop
|
|
ELSE
|
|
result$ = idevariablewatchbox$("", "", 0, 0)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Call #Stack... F12" OR menu$(m, s) = "Call Stack... F12" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 3
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 2, 0
|
|
showCallStackDialog:
|
|
retval = idecallstackbox
|
|
'retval is ignored
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Continue F5" THEN
|
|
IdeDebugMode = 4
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Step O#ut F6" THEN
|
|
IdeDebugMode = 5
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Ste#p Into F7" THEN
|
|
IdeDebugMode = 7
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Step #Over F8" THEN
|
|
IdeDebugMode = 6
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Run To This Line Ctrl+Shift+G" THEN
|
|
IdeDebugMode = 8
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Exit $DEBUG mode ESC" THEN
|
|
IdeDebugMode = 9
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Toggle #Breakpoint F9" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 10
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
toggleBreakpoint:
|
|
IF vWatchOn = 0 THEN
|
|
IF AutoAddDebugCommand = 0 THEN
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 2
|
|
COLOR 14, 1
|
|
x = 2
|
|
y = idewy - 2
|
|
printWrapStatus x, y, x, "$DEBUG metacommand is required to enable breakpoints."
|
|
PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
result = idemessagebox("Toggle Breakpoint", "Insert $DEBUG metacommand?", "#Yes;#No;#Don't show this again")
|
|
IF result = 1 THEN
|
|
ideselect = 0
|
|
ideinsline 1, SCase$("$Debug")
|
|
idecy = idecy + 1
|
|
idechangemade = 1
|
|
IdeBreakpoints(idecy) = NOT IdeBreakpoints(idecy)
|
|
ELSEIF result = 3 THEN
|
|
result = idemessagebox("Debug", "You can reenable the 'Auto-add $Debug Metacommand' feature\nin the Debug menu.", "#OK")
|
|
AutoAddDebugCommand = 0
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "False"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = "Auto-add $#Debug Metacommand"
|
|
END IF
|
|
ELSE
|
|
IdeBreakpoints(idecy) = NOT IdeBreakpoints(idecy)
|
|
END IF
|
|
IF IdeBreakpoints(idecy) THEN IdeSkipLines(idecy) = 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Clear All Breakpoints F10" OR menu$(m, s) = "Clear All Breakpoints F10" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 11
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
clearAllBreakpoints:
|
|
REDIM IdeBreakpoints(iden) AS _BYTE
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Toggle #Skip Line Ctrl+P" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 12
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
toggleSkipLine:
|
|
IF vWatchOn = 0 THEN
|
|
IF AutoAddDebugCommand = 0 THEN
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 2
|
|
COLOR 14, 1
|
|
x = 2
|
|
y = idewy - 2
|
|
printWrapStatus x, y, x, "$DEBUG metacommand is required to enable line skipping."
|
|
PCOPY 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
result = idemessagebox("Toggle Skip Line", "Insert $DEBUG metacommand?", "#Yes;#No;#Don't show this again")
|
|
IF result = 1 THEN
|
|
ideselect = 0
|
|
ideinsline 1, SCase$("$Debug")
|
|
idecy = idecy + 1
|
|
idechangemade = 1
|
|
IdeSkipLines(idecy) = NOT IdeSkipLines(idecy)
|
|
ELSEIF result = 3 THEN
|
|
result = idemessagebox("Debug", "You can reenable the 'Auto-add $Debug Metacommand' feature\nin the Debug menu.", "#OK")
|
|
AutoAddDebugCommand = 0
|
|
WriteConfigSetting debugSettingsSection$, "AutoAddDebugCommand", "False"
|
|
menu$(DebugMenuID, DebugMenuAutoAddCommand) = "Auto-add $#Debug Metacommand"
|
|
END IF
|
|
ELSE
|
|
IdeSkipLines(idecy) = NOT IdeSkipLines(idecy)
|
|
END IF
|
|
IF IdeSkipLines(idecy) THEN IdeBreakpoints(idecy) = 0
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Unskip All Lines Ctrl+F10" THEN
|
|
IF IdeDebugMode = 2 THEN
|
|
IdeDebugMode = 15
|
|
GOTO EnterDebugMode
|
|
ELSE
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
unskipAllLines:
|
|
REDIM IdeSkipLines(iden) AS _BYTE
|
|
GOTO ideloop
|
|
END IF
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Set Base #TCP/IP Port Number..." THEN
|
|
PCOPY 2, 0
|
|
bkpidebaseTcpPort = idebaseTcpPort
|
|
ideSetTCPPortBox
|
|
IF bkpidebaseTcpPort <> idebaseTcpPort THEN
|
|
IF host& <> 0 THEN CLOSE host&: host& = 0
|
|
attemptToHost = 0
|
|
changingTcpPort = -1
|
|
idechangemade = 1
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "Set #Next Line Ctrl+G" THEN
|
|
IdeDebugMode = 13
|
|
GOTO EnterDebugMode
|
|
END IF
|
|
|
|
IF menu$(m, s) = "E#xit" THEN
|
|
PCOPY 2, 0
|
|
quickexit:
|
|
IF ideunsaved = 1 THEN
|
|
r$ = idesavenow
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
IF r$ = "Y" THEN
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
r$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
r$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF ideerror > 1 THEN GOTO IDEerrorMessage
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
ELSE
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
END IF
|
|
|
|
END IF
|
|
fh = FREEFILE: OPEN tmpdir$ + "autosave.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
SYSTEM
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#New Ctrl+N" THEN
|
|
PCOPY 2, 0
|
|
ctrlNew:
|
|
IF ideunsaved = 1 THEN
|
|
r$ = idesavenow
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
IF r$ = "Y" THEN
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
r$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
r$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF ideerror > 1 THEN GOTO IDEerrorMessage
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
ELSE
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
END IF
|
|
END IF
|
|
ideunsaved = -1
|
|
'new blank text field
|
|
REDIM IdeBreakpoints(1) AS _BYTE
|
|
REDIM IdeSkipLines(1) AS _BYTE
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "": REDIM backupUsedVariableList(1000) AS usedVarList
|
|
backupTypeDefinitions$ = ""
|
|
watchpointList$ = ""
|
|
callstacklist$ = "": callStackLength = 0
|
|
idet$ = MKL$(0) + MKL$(0): idel = 1: ideli = 1: iden = 1: IdeBmkN = 0
|
|
idesx = 1
|
|
idesy = 1
|
|
idecx = 1
|
|
idecy = 1
|
|
ideselect = 0
|
|
ideprogname$ = ""
|
|
listOfCustomKeywords$ = LEFT$(listOfCustomKeywords$, customKeywordsLength)
|
|
QuickNavTotal = 0
|
|
ModifyCOMMAND$ = ""
|
|
_TITLE WindowTitle
|
|
startPausedPending = 0
|
|
idechangemade = 1
|
|
idefocusline = 0
|
|
ideundobase = 0 'reset
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
AttemptToLoadRecent = 0
|
|
FOR ml = 1 TO UBOUND(IdeRecentLink, 1)
|
|
IF LEN(IdeRecentLink(ml, 1)) THEN
|
|
IF menu$(m, s) = IdeRecentLink(ml, 1) THEN
|
|
IdeOpenFile$ = IdeRecentLink(ml, 2)
|
|
AttemptToLoadRecent = -1
|
|
GOTO directopen
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
|
|
IF menu$(m, s) = "#Recent..." THEN
|
|
PCOPY 2, 0
|
|
ideshowrecentbox:
|
|
f$ = iderecentbox
|
|
IF f$ = "<C>" THEN
|
|
f$ = ""
|
|
r$ = ideclearhistory$("FILES")
|
|
IF r$ = "Y" THEN
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
IdeMakeFileMenu
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
ELSE
|
|
GOTO ideshowrecentbox
|
|
END IF
|
|
ELSEIF f$ = "<R>" THEN
|
|
GOSUB CleanUpRecentList
|
|
GOTO ideshowrecentbox
|
|
END IF
|
|
IF LEN(f$) THEN
|
|
IdeOpenFile$ = f$
|
|
AttemptToLoadRecent = -1
|
|
GOTO directopen
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Clear Recent..." THEN
|
|
PCOPY 2, 0
|
|
r$ = ideclearhistory$("FILES")
|
|
IF r$ = "Y" THEN
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
IdeMakeFileMenu
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Open... Ctrl+O" THEN
|
|
IdeOpenFile$ = ""
|
|
directopen:
|
|
PCOPY 2, 0
|
|
ctrlOpen:
|
|
IF ideunsaved THEN
|
|
r$ = idesavenow
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
IF r$ = "Y" THEN
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
r$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
r$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
IF ideerror > 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO IDEerrorMessage
|
|
IF r$ = "C" THEN GOTO ideloop
|
|
ELSE
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
END IF '"Y"
|
|
END IF 'unsaved
|
|
r$ = idefiledialog$("", 1)
|
|
IF ideerror > 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO IDEerrorMessage
|
|
IF r$ <> "C" THEN ideunsaved = -1: idechangemade = 1: idelayoutallow = 2: ideundobase = 0: QuickNavTotal = 0: ModifyCOMMAND$ = "": idefocusline = 0: startPausedPending = 0
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOSUB redrawItAll: GOTO ideloop
|
|
END IF
|
|
|
|
IF menu$(m, s) = "#Save Ctrl+S" THEN
|
|
PCOPY 2, 0
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
a$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
a$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
IF ideerror > 1 THEN PCOPY 3, 0: SCREEN , , 3, 0: GOTO IDEerrorMessage
|
|
ELSE
|
|
idesave idepath$ + idepathsep$ + ideprogname$
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0: GOTO ideloop
|
|
END IF
|
|
|
|
|
|
IF menu$(m, s) = "Save #As..." THEN
|
|
PCOPY 2, 0
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
a$ = idefiledialog$("untitled" + tempfolderindexstr$ + ".bas", 2)
|
|
ELSE
|
|
a$ = idefiledialog$(ProposedTitle$ + ".bas", 2)
|
|
END IF
|
|
ELSE
|
|
a$ = idefiledialog$(ideprogname$, 2)
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF ideerror > 1 THEN GOTO IDEerrorMessage
|
|
GOTO ideloop
|
|
END IF
|
|
|
|
IF LEFT$(menu$(m, s), 1) = "~" THEN 'Ignore disabled items (starting with "~")
|
|
_CONTINUE
|
|
END IF
|
|
|
|
SCREEN , , 0, 0
|
|
CLS: PRINT "MENU ITEM [" + menu$(m, s) + "] NOT IMPLEMENTED!": END
|
|
END IF
|
|
|
|
|
|
_LIMIT 100
|
|
|
|
LOOP
|
|
|
|
'--------------------------------------------------------------------------------
|
|
EXIT FUNCTION
|
|
DrawQuickNav:
|
|
IF IdeSystem = 1 AND QuickNavTotal > 0 THEN
|
|
COLOR 15, 7
|
|
_PRINTSTRING (4, 2), " " + CHR$(17) + " "
|
|
ELSE
|
|
COLOR 7, 1
|
|
_PRINTSTRING (4, 2), STRING$(3, 196)
|
|
END IF
|
|
RETURN
|
|
|
|
UpdateSearchBar:
|
|
COLOR 7, 1: _PRINTSTRING (idewx - (idesystem2.w + 10), idewy - 4), CHR$(180)
|
|
COLOR 3, 1
|
|
_PRINTSTRING (1 + idewx - (idesystem2.w + 10), idewy - 4), "Find[" + SPACE$(idesystem2.w + 1) + CHR$(18) + "]"
|
|
COLOR 7, 1: _PRINTSTRING (idewx - 2, idewy - 4), CHR$(195)
|
|
|
|
'add status title
|
|
COLOR 7, 1
|
|
a$ = STRING$(14, 196)
|
|
_PRINTSTRING ((idewx - LEN(a$)) / 2, idewy - 4), a$
|
|
IF IdeDebugMode THEN
|
|
COLOR 1, 7
|
|
a$ = " $DEBUG MODE "
|
|
ELSE
|
|
IF IdeSystem = 2 THEN COLOR 1, 7 ELSE COLOR 7, 1
|
|
a$ = " Status "
|
|
END IF
|
|
_PRINTSTRING ((idewx - LEN(a$)) / 2, idewy - 4), a$
|
|
|
|
a$ = idefindtext
|
|
tx = 1
|
|
IF LEN(a$) > idesystem2.w THEN
|
|
IF IdeSystem = 2 THEN
|
|
tx = idesystem2.v1 - idesystem2.w + 1
|
|
IF tx < 1 THEN tx = 1
|
|
a$ = MID$(a$, tx, idesystem2.w)
|
|
ELSE
|
|
a$ = LEFT$(a$, idesystem2.w)
|
|
END IF
|
|
END IF
|
|
|
|
sx1 = idesystem2.sx1: sx2 = idesystem2.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
|
|
x = x + 2
|
|
'apply selection color change if necessary
|
|
IF idesystem2.issel = 0 OR IdeSystem <> 2 THEN
|
|
COLOR 3, 1
|
|
_PRINTSTRING (idewx - (idesystem2.w + 8) + 4, idewy - 4), a$
|
|
ELSE
|
|
FOR ColorCHAR = 1 TO LEN(a$)
|
|
IF ColorCHAR + tx - 2 >= sx1 AND ColorCHAR + tx - 2 < sx2 THEN COLOR 1, 3 ELSE COLOR 3, 1
|
|
_PRINTSTRING (idewx - (idesystem2.w + 8) + 4 - 1 + ColorCHAR, idewy - 4), MID$(a$, ColorCHAR, 1)
|
|
NEXT
|
|
END IF
|
|
RETURN
|
|
|
|
CleanUpRecentList:
|
|
l$ = "": ln = 0
|
|
REDIM RecentFilesList(0) AS STRING
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
|
|
CLOSE #fh
|
|
a$ = RIGHT$(a$, LEN(a$) - 2)
|
|
FoundBrokenLink = 0
|
|
DO WHILE LEN(a$)
|
|
ai = INSTR(a$, CRLF)
|
|
IF ai THEN
|
|
f$ = LEFT$(a$, ai - 1): IF ai = LEN(a$) - 1 THEN a$ = "" ELSE a$ = RIGHT$(a$, LEN(a$) - ai - 3)
|
|
IF _FILEEXISTS(f$) THEN
|
|
ln = ln + 1
|
|
REDIM _PRESERVE RecentFilesList(1 TO ln)
|
|
RecentFilesList(ln) = f$
|
|
ELSE
|
|
FoundBrokenLink = -1
|
|
END IF
|
|
END IF
|
|
LOOP
|
|
|
|
IF NOT FoundBrokenLink THEN
|
|
result = idemessagebox("Remove Broken Links", "All files in the list are accessible.", "#OK")
|
|
END IF
|
|
|
|
IF ln > 0 AND FoundBrokenLink THEN
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
f$ = ""
|
|
FOR ln = 1 TO UBOUND(RecentFilesList)
|
|
f$ = f$ + CRLF + RecentFilesList(ln) + CRLF
|
|
NEXT
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh
|
|
PUT #fh, 1, f$
|
|
CLOSE #fh
|
|
END IF
|
|
|
|
ERASE RecentFilesList
|
|
IdeMakeFileMenu
|
|
RETURN
|
|
|
|
redrawItAll:
|
|
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) + " "
|
|
|
|
|
|
SCREEN , , 3, 0
|
|
VIEW PRINT 1 TO idewy + idesubwindow
|
|
'VIEW PRINT 1 TO _HEIGHT(0)
|
|
|
|
|
|
|
|
LOCATE , , , IDENormalCursorStart, IDENormalCursorEnd
|
|
|
|
'static background
|
|
COLOR 0, 7: _PRINTSTRING (1, 1), menubar$
|
|
COLOR 7, 1: idebox 1, 2, idewx, idewy - 5
|
|
|
|
|
|
COLOR 7, 1: idebox 1, idewy - 4, idewx, 5
|
|
'edit corners
|
|
COLOR 7, 1: _PRINTSTRING (1, idewy - 4), CHR$(195): _PRINTSTRING (idewx, idewy - 4), CHR$(180)
|
|
|
|
IF idehelp = 1 THEN
|
|
COLOR 7, 0: idebox 1, idewy, idewx, idesubwindow + 1
|
|
COLOR 7, 0: _PRINTSTRING (1, idewy), CHR$(195): _PRINTSTRING (idewx, idewy), CHR$(180)
|
|
COLOR 15, 4: _PRINTSTRING (idewx - 3, idewy), " x "
|
|
END IF
|
|
|
|
GOSUB UpdateSearchBar
|
|
|
|
'status bar
|
|
COLOR 0, 3: _PRINTSTRING (1, idewy + idesubwindow), SPACE$(idewx)
|
|
q = idevbar(idewx, idewy - 3, 3, 1, 1)
|
|
q = idevbar(idewx, 3, idewy - 8, 1, 1)
|
|
q = idehbar(2, idewy - 5, idewx - 2, 1, 1)
|
|
|
|
UpdateIdeInfo
|
|
|
|
UpdateTitleOfMainWindow
|
|
|
|
DEF SEG = 0
|
|
ideshowtext
|
|
|
|
IF idehelp THEN
|
|
Help_ShowText
|
|
|
|
q = idehbar(2, idewy + idesubwindow - 1, idewx - 2, Help_cx, help_w + 1)
|
|
q = idevbar(idewx, idewy + 1, idesubwindow - 2, Help_cy, help_h + 1)
|
|
|
|
GOSUB HelpAreaShowBackLinks
|
|
END IF
|
|
|
|
IF IDEShowErrorsImmediately OR IDECompilationRequested THEN
|
|
clearStatusWindow 0
|
|
|
|
IdeInfo = ""
|
|
|
|
IF idecompiling = 1 THEN
|
|
_PRINTSTRING (2, idewy - 3), STRING$(3, 250) '"..."
|
|
ELSE
|
|
IF idefocusline THEN
|
|
_PRINTSTRING (2, idewy - 3), STRING$(3, 250) '"..."
|
|
ELSE
|
|
_PRINTSTRING (2, idewy - 3), "OK" 'report OK status
|
|
END IF
|
|
statusarealink = 0
|
|
IF totalWarnings > 0 THEN
|
|
COLOR 11, 1
|
|
msg$ = " (" + LTRIM$(STR$(totalWarnings)) + " warning"
|
|
IF totalWarnings > 1 THEN msg$ = msg$ + "s"
|
|
msg$ = msg$ + " - click here or Ctrl+W to view)"
|
|
_PRINTSTRING (4, idewy - 3), msg$
|
|
statusarealink = 4
|
|
END IF
|
|
IF waitingForVarList THEN GOSUB showVarListReady
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
|
|
HelpAreaShowBackLinks:
|
|
Back_Str$ = STRING$(1000, 0)
|
|
Back_Str_I$ = STRING$(4000, 0)
|
|
top = UBOUND(back$)
|
|
FOR x = 1 TO top
|
|
n$ = Back_Name$(x)
|
|
IF x = Help_Back_Pos THEN p = LEN(Back_Str$)
|
|
Back_Str$ = Back_Str$ + " "
|
|
Back_Str_I$ = Back_Str_I$ + MKL$(x)
|
|
FOR x2 = 1 TO LEN(n$)
|
|
Back_Str$ = Back_Str$ + CHR$(ASC(n$, x2))
|
|
Back_Str_I$ = Back_Str_I$ + MKL$(x)
|
|
NEXT
|
|
Back_Str$ = Back_Str$ + " "
|
|
Back_Str_I$ = Back_Str_I$ + MKL$(x)
|
|
|
|
IF x <> top THEN
|
|
Back_Str$ = Back_Str$ + CHR$(0)
|
|
Back_Str_I$ = Back_Str_I$ + MKL$(0)
|
|
END IF
|
|
NEXT
|
|
Back_Str$ = Back_Str$ + STRING$(1000, 0)
|
|
Back_Str_I$ = Back_Str_I$ + STRING$(4000, 0)
|
|
Back_Str_Pos = p - idewx \ 2 + (LEN(Back_Name$(Help_Back_Pos)) + 2) \ 2 + 3
|
|
'COLOR 1, 2
|
|
'LOCATE idewy, 2: PRINT MID$(Back_Str$, Back_Str_Pos, idewx - 5)
|
|
LOCATE idewy, 2
|
|
FOR x = Back_Str_Pos TO Back_Str_Pos + idewx - 6
|
|
i = CVL(MID$(Back_Str_I$, (x - 1) * 4 + 1, 4))
|
|
a = ASC(Back_Str$, x)
|
|
IF a THEN
|
|
IF IdeSystem = 3 THEN COLOR 0, 7 ELSE COLOR 7, 0
|
|
IF i < Help_Back_Pos THEN COLOR 9
|
|
IF i > Help_Back_Pos THEN COLOR 9
|
|
PRINT CHR$(a);
|
|
ELSE
|
|
COLOR 7, 0
|
|
PRINT CHR$(196);
|
|
END IF
|
|
NEXT
|
|
COLOR 7, 0: _PRINTSTRING (idewx - 18, idewy), CHR$(180)
|
|
COLOR 15, 3: _PRINTSTRING (idewx - 17, idewy), " View on Wiki "
|
|
RETURN
|
|
|
|
showVarListReady:
|
|
waitingForVarList = 0
|
|
COLOR 14, 1
|
|
_PRINTSTRING (2, idewy - 2), "Variable List is now available (F4 to see it)"
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
SUB UpdateTitleOfMainWindow
|
|
sfname$ = FindCurrentSF$(idecy)
|
|
cleanSubName sfname$
|
|
COLOR 7, 1: _PRINTSTRING (2, 2), STRING$(idewx - 2, CHR$(196))
|
|
IF LEN(ideprogname) THEN a$ = ideprogname ELSE a$ = "Untitled" + tempfolderindexstr$
|
|
a$ = " " + a$
|
|
IF ideunsaved THEN a$ = a$ + "*"
|
|
IF LEN(sfname$) > 0 THEN a$ = a$ + ":" + sfname$
|
|
a$ = a$ + " "
|
|
IF LEN(a$) > idewx - 5 THEN a$ = LEFT$(a$, idewx - 11) + STRING$(3, 250) + " "
|
|
IF IdeSystem = 1 THEN COLOR 1, 7 ELSE COLOR 7, 1
|
|
_PRINTSTRING (((idewx / 2) - 1) - (LEN(a$) - 1) \ 2, 2), a$
|
|
END SUB
|
|
|
|
SUB DebugMode
|
|
STATIC AS _BYTE PauseMode, noFocusMessage, EnteredInput
|
|
STATIC buffer$
|
|
STATIC currentSub$
|
|
STATIC debuggeehwnd AS _OFFSET
|
|
STATIC panelActive AS _BYTE
|
|
|
|
DECLARE LIBRARY
|
|
SUB set_foreground_window (BYVAL hwnd AS _OFFSET)
|
|
END DECLARE
|
|
|
|
timeout = 10
|
|
_KEYCLEAR
|
|
|
|
SCREEN , , 3, 0
|
|
|
|
COLOR 15, 3: _PRINTSTRING (1, 1), SPACE$(LEN(menubar$))
|
|
m$ = "$DEBUG MODE ACTIVE"
|
|
_PRINTSTRING ((idewx - LEN(m$)) \ 2, 1), m$
|
|
|
|
TYPE vWatchPanelType
|
|
AS INTEGER x, y, w, h, firstVisible, hPos, vBarThumb, hBarThumb
|
|
AS INTEGER draggingVBar, draggingHBar, mX, mY
|
|
AS LONG contentWidth, tempIndex
|
|
AS _BYTE draggingPanel, resizingPanel, closingPanel, clicked
|
|
END TYPE
|
|
STATIC vWatchPanel AS vWatchPanelType
|
|
|
|
TYPE ui
|
|
AS INTEGER x, y, w, h
|
|
AS STRING caption
|
|
END TYPE
|
|
DIM Button(1 TO 8) AS ui
|
|
i = 0
|
|
i = i + 1: Button(i).Caption = "<F4 = Add Watch>"
|
|
i = i + 1: Button(i).Caption = "<F5 = Run>"
|
|
i = i + 1: Button(i).Caption = "<F6 = Step Out>"
|
|
i = i + 1: Button(i).Caption = "<F7 = Step Into>"
|
|
i = i + 1: Button(i).Caption = "<F8 = Step Over>"
|
|
i = i + 1: Button(i).Caption = "<F9 = Toggle Breakpoint>"
|
|
i = i + 1: Button(i).Caption = "<F10 = Clear all breakpoints>"
|
|
i = i + 1: Button(i).Caption = "<F12 = Call Stack>"
|
|
y = (idewy - 4) + 2
|
|
x = 2
|
|
FOR i = 1 TO UBOUND(Button)
|
|
Button(i).x = x
|
|
Button(i).y = y
|
|
Button(i).w = LEN(Button(i).Caption)
|
|
IF i < UBOUND(Button) THEN
|
|
x = x + Button(i).w + 1
|
|
IF x + LEN(Button(i + 1).Caption) > idewx - 1 THEN
|
|
y = y + 1
|
|
x = 2
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
SELECT EVERYCASE IdeDebugMode
|
|
CASE 1
|
|
PauseMode = 0
|
|
callStackLength = 0
|
|
callstacklist$ = ""
|
|
buffer$ = ""
|
|
debugClient& = 0
|
|
debuggeepid = 0
|
|
|
|
panelActive = -1
|
|
showvWatchPanel vWatchPanel, "", 1
|
|
|
|
IF LEN(variableWatchList$) = 0 THEN
|
|
totalVisibleVariables = 0
|
|
vWatchPanel.h = 5
|
|
ELSE
|
|
'between edits, variables may have been deleted;
|
|
'next line assures we don't try to fetch values
|
|
'for ghost variables
|
|
result$ = idevariablewatchbox$("", "", -1, 0)
|
|
END IF
|
|
|
|
watchpointList$ = ""
|
|
vWatchPanel.w = 40
|
|
vWatchPanel.x = idewx - vWatchPanel.w - 6
|
|
vWatchPanel.y = 4
|
|
vWatchPanel.firstVisible = 1
|
|
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", "settings", "vWatchPanel.w"))
|
|
IF x THEN vWatchPanel.w = x
|
|
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", "settings", "vWatchPanel.h"))
|
|
IF x THEN vWatchPanel.h = x
|
|
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", "settings", "vWatchPanel.x"))
|
|
IF x THEN vWatchPanel.x = x
|
|
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", "settings", "vWatchPanel.y"))
|
|
IF x THEN vWatchPanel.y = x
|
|
|
|
GOSUB checkvWatchPanelSize
|
|
CASE IS > 1
|
|
noFocusMessage = NOT noFocusMessage
|
|
GOSUB UpdateStatusArea
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Paused.", 2
|
|
CASE 2: IdeDebugMode = 1: GOTO returnFromContextMenu
|
|
CASE 3: IdeDebugMode = 1: GOTO requestCallStack
|
|
CASE 4: IdeDebugMode = 1: GOTO requestContinue
|
|
CASE 5: IdeDebugMode = 1: GOTO requestStepOut
|
|
CASE 6: IdeDebugMode = 1: GOTO requestStepOver
|
|
CASE 7: IdeDebugMode = 1: GOTO requestStepInto
|
|
CASE 8
|
|
IdeDebugMode = 1
|
|
result = idecy
|
|
GOTO requestRunToThisLine
|
|
CASE 9: IdeDebugMode = 1: GOTO requestQuit
|
|
CASE 10: IdeDebugMode = 1: GOTO requestToggleBreakpoint
|
|
CASE 11: IdeDebugMode = 1: GOTO requestClearBreakpoints
|
|
CASE 12
|
|
IdeDebugMode = 1
|
|
result = idecy
|
|
GOTO requestToggleSkipLine
|
|
CASE 13
|
|
IdeDebugMode = 1
|
|
result = idecy
|
|
GOTO requestSetNextLine
|
|
CASE 14: IdeDebugMode = 1: GOTO requestSubsDialog
|
|
CASE 15: IdeDebugMode = 1: GOTO requestUnskipAllLines
|
|
CASE 16: IdeDebugMode = 1: GOTO requestVariableWatch
|
|
END SELECT
|
|
|
|
dummy = DarkenFGBG(1)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Entering $DEBUG mode (ESC to abort)...", 15
|
|
|
|
IF host& = 0 THEN
|
|
host& = _OPENHOST("TCP/IP:" + hostport$)
|
|
IF host& = 0 THEN
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Failed to initiate debug session.", 7
|
|
setStatusMessage 2, "Cannot receive connections on port" + STR$(idebaseTcpPort) + ". Check your firewall permissions.", 2
|
|
WHILE _MOUSEINPUT: WEND
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
|
|
'wait for client to connect
|
|
start! = TIMER
|
|
DO
|
|
debugClient& = _OPENCONNECTION(host&)
|
|
IF debugClient& THEN EXIT DO
|
|
|
|
k& = _KEYHIT
|
|
IF k& = 27 OR TIMER - start! > timeout THEN
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, temp$ + "Debug session aborted.", 7
|
|
IF k& <> 27 THEN
|
|
setStatusMessage 2, "Connection timeout.", 2
|
|
END IF
|
|
_KEYCLEAR
|
|
WHILE _MOUSEINPUT: WEND
|
|
EXIT SUB
|
|
END IF
|
|
|
|
_LIMIT 100
|
|
LOOP
|
|
|
|
ideselect = 0
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Handshaking...", 15
|
|
|
|
start! = TIMER
|
|
DO
|
|
k& = _KEYHIT
|
|
IF k& = 27 OR TIMER - start! > timeout THEN
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, temp$ + "Debug session aborted.", 7
|
|
IF k& <> 27 THEN
|
|
setStatusMessage 2, "Connection timeout.", 2
|
|
END IF
|
|
_KEYCLEAR
|
|
WHILE _MOUSEINPUT: WEND
|
|
EXIT SUB
|
|
END IF
|
|
|
|
GOSUB GetCommand
|
|
SELECT CASE cmd$
|
|
CASE "me"
|
|
program$ = value$
|
|
expected$ = lastBinaryGenerated$
|
|
p$ = ideztakepath$(program$)
|
|
p$ = ideztakepath$(expected$)
|
|
|
|
IF program$ <> expected$ THEN
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Failed to initiate debug session.", 7
|
|
setStatusMessage 2, LEFT$("Expected: " + expected$, idewx - 2), 2
|
|
setStatusMessage 3, LEFT$("Received: " + program$, idewx - 2), 2
|
|
cmd$ = "vwatch:file mismatch"
|
|
GOSUB SendCommand
|
|
CLOSE #debugClient&
|
|
WHILE _MOUSEINPUT: WEND
|
|
EXIT SUB
|
|
END IF
|
|
EXIT DO
|
|
END SELECT
|
|
LOOP
|
|
|
|
cmd$ = "vwatch:ok"
|
|
GOSUB SendCommand
|
|
cmd$ = "hwnd:" + _MK$(_OFFSET, _WINDOWHANDLE)
|
|
GOSUB SendCommand
|
|
cmd$ = "line count:" + MKL$(iden)
|
|
GOSUB SendCommand
|
|
|
|
breakpointCount = 0
|
|
breakpointList$ = ""
|
|
FOR i = 1 TO UBOUND(IdeBreakpoints)
|
|
IF IdeBreakpoints(i) THEN
|
|
breakpointCount = breakpointCount + 1
|
|
breakpointList$ = breakpointList$ + MKL$(i)
|
|
END IF
|
|
NEXT
|
|
IF breakpointCount THEN
|
|
cmd$ = "breakpoint count:" + MKL$(breakpointCount)
|
|
GOSUB SendCommand
|
|
cmd$ = "breakpoint list:" + breakpointList$
|
|
GOSUB SendCommand
|
|
END IF
|
|
|
|
skipCount = 0
|
|
skipList$ = ""
|
|
FOR i = 1 TO UBOUND(IdeSkipLines)
|
|
IF IdeSkipLines(i) THEN
|
|
skipCount = skipCount + 1
|
|
skipList$ = skipList$ + MKL$(i)
|
|
END IF
|
|
NEXT
|
|
IF skipCount THEN
|
|
cmd$ = "skip count:" + MKL$(skipCount)
|
|
GOSUB SendCommand
|
|
cmd$ = "skip list:" + skipList$
|
|
GOSUB SendCommand
|
|
END IF
|
|
|
|
clearStatusWindow 1
|
|
IF startPaused THEN
|
|
cmd$ = "break"
|
|
PauseMode = -1
|
|
setStatusMessage 1, "Paused.", 2
|
|
ELSE
|
|
cmd$ = "run"
|
|
PauseMode = 0
|
|
setStatusMessage 1, "Running...", 10
|
|
END IF
|
|
GOSUB SendCommand
|
|
|
|
clearStatusWindow 2
|
|
setStatusMessage 2, "$DEBUG MODE: Set focus to the IDE to control execution", 15
|
|
|
|
noFocusMessage = -1
|
|
|
|
DO 'main loop
|
|
IF _EXIT THEN ideexit = 1: GOTO requestQuit
|
|
|
|
bkpidecy = idecy
|
|
bkpPanelFirstVisible = vWatchPanel.firstVisible
|
|
WHILE _MOUSEINPUT
|
|
mX = _MOUSEX
|
|
mY = _MOUSEY
|
|
vWatchPanel.mX = mX
|
|
vWatchPanel.mY = mY
|
|
IF LEN(variableWatchList$) > 0 AND _
|
|
(mX >= vWatchPanel.x AND mX <= vWatchPanel.x + vWatchPanel.w) AND _
|
|
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h) THEN
|
|
vWatchPanel.firstVisible = vWatchPanel.firstVisible + _MOUSEWHEEL * 3
|
|
IF vWatchPanel.firstVisible < 1 THEN vWatchPanel.firstVisible = 1
|
|
IF vWatchPanel.firstVisible > totalVisibleVariables - (vWatchPanel.h - 2) + 1 THEN
|
|
vWatchPanel.firstVisible = totalVisibleVariables - (vWatchPanel.h - 2) + 1
|
|
END IF
|
|
ELSE
|
|
idecy = idecy + _MOUSEWHEEL * 3
|
|
END IF
|
|
WEND
|
|
|
|
IF idecy < 1 THEN idecy = 1
|
|
IF idecy > iden THEN idecy = iden
|
|
IF idecy <> bkpidecy OR bkpPanelFirstVisible <> vWatchPanel.firstVisible OR _
|
|
(LEN(variableWatchList$) > 0 AND _
|
|
(mX >= vWatchPanel.x AND mX <= vWatchPanel.x + vWatchPanel.w) AND _
|
|
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h)) THEN
|
|
ideselect = 0: GOSUB UpdateDisplay
|
|
END IF
|
|
|
|
mB = _MOUSEBUTTON(1)
|
|
mB2 = _MOUSEBUTTON(2)
|
|
|
|
IF mB2 THEN
|
|
IF mouseDown2 = 0 THEN
|
|
mouseDown2 = -1
|
|
mouseDownOnX2 = mX
|
|
mouseDownOnY2 = mY
|
|
ELSE
|
|
END IF
|
|
ELSE
|
|
IF mouseDown2 THEN
|
|
IF mouseDownOnX2 = mX AND mouseDownOnY2 = mY THEN
|
|
'right-click on watch panel?
|
|
IF (LEN(variableWatchList$) > 0 AND _
|
|
(mX >= vWatchPanel.x AND mX <= vWatchPanel.x + vWatchPanel.w) AND _
|
|
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h)) THEN
|
|
GOTO requestVariableWatch
|
|
END IF
|
|
|
|
'right-click on code area?
|
|
IF (mX > 1 AND mX <= 1 + maxLineNumberLength AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers) OR _
|
|
(mX = 1 AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers = 0) OR _
|
|
(mX > 1 + maxLineNumberLength AND mX < idewx AND mY > 2 AND mY < (idewy - 5)) THEN
|
|
bkpidecy = idecy
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
IF bkpidecy <> idecy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
IdeDebugMode = 2
|
|
IF PauseMode = 0 THEN GOSUB requestPause: dummy = DarkenFGBG(0)
|
|
EXIT SUB
|
|
returnFromContextMenu:
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
END IF
|
|
mouseDown2 = 0
|
|
END IF
|
|
|
|
IF mB THEN
|
|
IF mouseDown = 0 THEN
|
|
mouseDown = -1
|
|
mouseDownOnX = mX
|
|
mouseDownOnY = mY
|
|
IF LEN(variableWatchList$) > 0 AND _
|
|
(mX >= vWatchPanel.x + vWatchPanel.w - 3) AND (mX <= vWatchPanel.x + vWatchPanel.w - 1) AND _
|
|
(mY = vWatchPanel.y) THEN
|
|
vWatchPanel.closingPanel = -1
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.vBarThumb > 0 AND _
|
|
(mX = vWatchPanel.x + vWatchPanel.w - 1) AND _
|
|
(mY = vWatchPanel.vBarThumb) THEN
|
|
vWatchPanel.draggingVBar = 1 'thumb
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.vBarThumb > 0 AND _
|
|
(mX = vWatchPanel.x + vWatchPanel.w - 1) AND _
|
|
(mY = vWatchPanel.y + 1) THEN
|
|
vWatchPanel.draggingVBar = 2 'up arrow
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.vBarThumb > 0 AND _
|
|
(mX = vWatchPanel.x + vWatchPanel.w - 1) AND _
|
|
(mY = vWatchPanel.y + vWatchPanel.h - 2) THEN
|
|
vWatchPanel.draggingVBar = 3 'down arrow
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.hBarThumb > 0 AND _
|
|
(mX = vWatchPanel.hBarThumb) AND _
|
|
(mY = vWatchPanel.y + vWatchPanel.h - 1) THEN
|
|
vWatchPanel.draggingHBar = 1 'thumb
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.hBarThumb > 0 AND _
|
|
(mX = vWatchPanel.x) AND _
|
|
(mY = vWatchPanel.y + vWatchPanel.h - 1) THEN
|
|
vWatchPanel.draggingHBar = 2 'left arrow
|
|
ELSEIF LEN(variableWatchList$) > 0 AND vWatchPanel.hBarThumb > 0 AND _
|
|
(mX = vWatchPanel.x + vWatchPanel.w - 2) AND _
|
|
(mY = vWatchPanel.y + vWatchPanel.h - 1) THEN
|
|
vWatchPanel.draggingHBar = 3 'right arrow
|
|
ELSEIF LEN(variableWatchList$) > 0 AND _
|
|
(mX = vWatchPanel.x + vWatchPanel.w - 1) AND _
|
|
(mY = vWatchPanel.y + vWatchPanel.h - 1) THEN
|
|
vWatchPanel.resizingPanel = -1
|
|
ELSEIF LEN(variableWatchList$) > 0 AND _
|
|
(mX >= vWatchPanel.x AND mX <= vWatchPanel.x + vWatchPanel.w) AND _
|
|
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h) THEN
|
|
vWatchPanel.draggingPanel = -1
|
|
vWatchPanel.clicked = 1
|
|
IF timeElapsedSince(lastPanelClick!) < .3 THEN
|
|
'Double-click on watch list
|
|
vWatchPanel.draggingPanel = 0
|
|
mouseDown = 0
|
|
GOTO requestVariableWatch
|
|
END IF
|
|
lastPanelClick! = TIMER
|
|
ELSE
|
|
vWatchPanel.draggingPanel = 0
|
|
vWatchPanel.resizingPanel = 0
|
|
vWatchPanel.closingPanel = 0
|
|
vWatchPanel.draggingVBar = 0
|
|
vWatchPanel.draggingHBar = 0
|
|
vWatchPanel.clicked = 0
|
|
END IF
|
|
|
|
IF mX = idewx THEN
|
|
IF mY = idevbar(idewx, 3, idewy - 8, idecy, iden) THEN
|
|
draggingVThumb = -1
|
|
ELSE
|
|
draggingVThumb = 0
|
|
END IF
|
|
ELSE
|
|
draggingVThumb = 0
|
|
END IF
|
|
|
|
IF mY = idewy - 5 THEN
|
|
IF mX = idehbar(2, idewy - 5, idewx - 2, idesx, 608) THEN
|
|
draggingHThumb = -1
|
|
ELSE
|
|
draggingHThumb = 0
|
|
END IF
|
|
ELSE
|
|
draggingHThumb = 0
|
|
END IF
|
|
|
|
mouseDownOnButton = 0
|
|
FOR i = 1 TO UBOUND(Button)
|
|
IF mY = Button(i).y AND mX >= Button(i).x AND mX <= Button(i).x + Button(i).w AND _
|
|
vWatchPanel.draggingPanel = 0 AND vWatchPanel.resizingPanel = 0 THEN
|
|
mouseDownOnButton = i
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
ELSE
|
|
'drag
|
|
IF draggingVThumb = -1 THEN
|
|
IF mouseDownOnY <> mY THEN
|
|
mouseDownOnY = mY
|
|
IF iden > 1 THEN
|
|
IF mY <= 4 THEN idecy = 1
|
|
IF mY >= idewy - 7 THEN idecy = iden
|
|
IF mY > 4 AND mY < idewy - 7 THEN
|
|
y = mY
|
|
p! = y - 3 - 2 + .5
|
|
p! = p! / ((idewy - 8) - 4)
|
|
i = p! * (iden - 1) + 1
|
|
idecy = i
|
|
END IF
|
|
END IF
|
|
ideselect = 0: GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
|
|
IF draggingHThumb = -1 THEN
|
|
IF mouseDownOnX <> mX THEN
|
|
mouseDownOnX = mX
|
|
IF mX <= 3 THEN idesx = 1: idecx = idesx
|
|
IF mX >= idewx - 2 THEN idesx = 608: idecx = idesx
|
|
IF mX > 3 AND mX < idewx - 2 THEN
|
|
x = mX
|
|
p! = x - 2 - 2 + .5
|
|
p! = p! / ((idewx - 2) - 4)
|
|
i = p! * (608 - 1) + 1
|
|
idesx = i
|
|
idecx = idesx
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
|
|
vWatchPanelLimit = idewy - 6
|
|
IF vWatchPanel.draggingPanel THEN
|
|
vWatchPanel.x = vWatchPanel.x - (mouseDownOnX - mX)
|
|
vWatchPanel.y = vWatchPanel.y - (mouseDownOnY - mY)
|
|
|
|
IF vWatchPanel.x < 2 THEN vWatchPanel.x = 2
|
|
IF vWatchPanel.x + vWatchPanel.w > idewx - 1 THEN vWatchPanel.x = idewx - vWatchPanel.w - 1
|
|
IF vWatchPanel.y < 3 THEN vWatchPanel.y = 3
|
|
IF vWatchPanel.y > vWatchPanelLimit - (vWatchPanel.h - 1) THEN vWatchPanel.y = vWatchPanelLimit - (vWatchPanel.h - 1)
|
|
|
|
IF mouseDownOnX <> mX THEN vWatchPanel.clicked = 0
|
|
mouseDownOnX = mX
|
|
IF mouseDownOnY <> mY THEN vWatchPanel.clicked = 0
|
|
mouseDownOnY = mY
|
|
GOSUB UpdateDisplay
|
|
ELSEIF vWatchPanel.resizingPanel THEN
|
|
vWatchPanel.w = vWatchPanel.w + (mX - mouseDownOnX)
|
|
vWatchPanel.h = vWatchPanel.h + (mY - mouseDownOnY)
|
|
|
|
GOSUB checkvWatchPanelSize
|
|
|
|
IF vWatchPanel.vBarThumb > 0 AND vWatchPanel.firstVisible > totalVisibleVariables - (vWatchPanel.h - 2) + 1 THEN
|
|
vWatchPanel.firstVisible = totalVisibleVariables - (vWatchPanel.h - 2) + 1
|
|
END IF
|
|
IF vWatchPanel.hBarThumb > 0 AND vWatchPanel.hPos > vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1 THEN
|
|
vWatchPanel.hPos = vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1
|
|
END IF
|
|
|
|
mouseDownOnX = mX
|
|
mouseDownOnY = mY
|
|
GOSUB UpdateDisplay
|
|
ELSEIF vWatchPanel.draggingVBar = 1 THEN
|
|
vWatchPanel.firstVisible = INT(map(mY, vWatchPanel.y + 2, vWatchPanel.y + vWatchPanel.h - 2, 1, totalVisibleVariables - (vWatchPanel.h - 2) + 1))
|
|
IF vWatchPanel.firstVisible < 1 THEN vWatchPanel.firstVisible = 1
|
|
IF vWatchPanel.firstVisible > totalVisibleVariables - (vWatchPanel.h - 2) + 1 THEN
|
|
vWatchPanel.firstVisible = totalVisibleVariables - (vWatchPanel.h - 2) + 1
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
ELSEIF vWatchPanel.draggingHBar = 1 THEN
|
|
vWatchPanel.hPos = INT(map(mX, vWatchPanel.x, vWatchPanel.x + vWatchPanel.w - 2, 1, vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1))
|
|
IF vWatchPanel.hPos < 1 THEN vWatchPanel.hPos = 1
|
|
IF vWatchPanel.hPos > vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1 THEN
|
|
vWatchPanel.hPos = vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
ELSE 'mouse button released
|
|
IF vWatchPanel.clicked = 1 THEN
|
|
vWatchPanel.clicked = 2
|
|
'panel was clicked but not dragged, so register a click (= 2)
|
|
'which will be handled by showvWatchPanel()
|
|
END IF
|
|
IF vWatchPanel.draggingPanel THEN
|
|
vWatchPanel.draggingPanel = 0: mouseDown = 0
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.x", str2$(vWatchPanel.x)
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.y", str2$(vWatchPanel.y)
|
|
END IF
|
|
IF vWatchPanel.resizingPanel THEN
|
|
vWatchPanel.resizingPanel = 0: mouseDown = 0
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.w", str2$(vWatchPanel.w)
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.h", str2$(vWatchPanel.h)
|
|
END IF
|
|
IF vWatchPanel.closingPanel AND (mX = mouseDownOnX AND mY = mouseDownOnY) THEN
|
|
vWatchPanel.closingPanel = 0
|
|
mouseDown = 0
|
|
panelActive = 0
|
|
result = idemessagebox("$DEBUG MODE", "Close Watch Panel", "#Keep Variables;#Clear List")
|
|
IF result = 2 THEN
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "": REDIM backupUsedVariableList(1000) AS usedVarList
|
|
backupTypeDefinitions$ = ""
|
|
FOR i = 1 TO totalVariablesCreated
|
|
usedVariableList(i).watch = 0
|
|
NEXT
|
|
|
|
'Reset panel position in debug settings
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.x", "0"
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.y", "0"
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.w", "0"
|
|
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.h", "0"
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
IF vWatchPanel.draggingVBar THEN
|
|
IF vWatchPanel.draggingVBar = 2 THEN
|
|
vWatchPanel.firstVisible = vWatchPanel.firstVisible - 1
|
|
IF vWatchPanel.firstVisible < 1 THEN vWatchPanel.firstVisible = 1
|
|
GOSUB UpdateDisplay
|
|
ELSEIF vWatchPanel.draggingVBar = 3 THEN
|
|
vWatchPanel.firstVisible = vWatchPanel.firstVisible + 1
|
|
IF vWatchPanel.firstVisible > totalVisibleVariables - (vWatchPanel.h - 2) + 1 THEN
|
|
vWatchPanel.firstVisible = totalVisibleVariables - (vWatchPanel.h - 2) + 1
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
vWatchPanel.draggingVBar = 0: mouseDown = 0
|
|
END IF
|
|
IF vWatchPanel.draggingHBar THEN
|
|
IF vWatchPanel.draggingHBar = 2 THEN
|
|
vWatchPanel.hPos = vWatchPanel.hPos - 1
|
|
IF vWatchPanel.hPos < 1 THEN vWatchPanel.hPos = 1
|
|
GOSUB UpdateDisplay
|
|
ELSEIF vWatchPanel.draggingHBar = 3 THEN
|
|
vWatchPanel.hPos = vWatchPanel.hPos + 1
|
|
IF vWatchPanel.hPos > vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1 THEN
|
|
vWatchPanel.hPos = vWatchPanel.contentWidth - (vWatchPanel.w - 4) + 1
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
vWatchPanel.draggingHBar = 0: mouseDown = 0
|
|
END IF
|
|
IF mouseDown THEN
|
|
mouseDown = 0
|
|
draggingVThumb = 0
|
|
draggingHThumb = 0
|
|
|
|
IF mouseDownOnButton > 0 AND mX = mouseDownOnX AND mY = mouseDownOnY THEN
|
|
SELECT CASE mouseDownOnButton
|
|
CASE 1: mouseDownOnButton = 0: mouseDown = 0: GOTO F4
|
|
CASE 2: mouseDownOnButton = 0: mouseDown = 0: GOTO F5
|
|
CASE 3: mouseDownOnButton = 0: mouseDown = 0: GOTO F6
|
|
CASE 4: mouseDownOnButton = 0: mouseDown = 0: GOTO F7
|
|
CASE 5: mouseDownOnButton = 0: mouseDown = 0: GOTO F8
|
|
CASE 6: mouseDownOnButton = 0: mouseDown = 0: GOTO F9
|
|
CASE 7: mouseDownOnButton = 0: mouseDown = 0: GOTO F10
|
|
CASE 8: mouseDownOnButton = 0: mouseDown = 0: GOTO F12
|
|
END SELECT
|
|
END IF
|
|
|
|
IF (mX > 1 AND mX <= 1 + maxLineNumberLength AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers) OR _
|
|
(mX = 1 AND mY > 2 AND mY < (idewy - 5) AND ShowLineNumbers = 0) THEN
|
|
'Inside the editor/line numbers
|
|
IF mouseDownOnX = mX AND mouseDownOnY = mY THEN
|
|
ideselect = 0
|
|
idecytemp = mY - 2 + idesy - 1
|
|
IF idecytemp <= iden THEN
|
|
IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN
|
|
IF IdeSkipLines(idecytemp) = -1 THEN
|
|
IdeSkipLines(idecytemp) = 0
|
|
cmd$ = "clear skip line:" + MKL$(idecytemp)
|
|
ELSE
|
|
IdeSkipLines(idecytemp) = -1
|
|
IdeBreakpoints(idecytemp) = 0
|
|
cmd$ = "set skip line:" + MKL$(idecytemp)
|
|
END IF
|
|
ELSE
|
|
IF IdeBreakpoints(idecytemp) THEN
|
|
IdeBreakpoints(idecytemp) = 0
|
|
cmd$ = "clear breakpoint:"
|
|
ELSE
|
|
IdeBreakpoints(idecytemp) = -1
|
|
IdeSkipLines(idecytemp) = 0
|
|
cmd$ = "set breakpoint:"
|
|
END IF
|
|
cmd$ = cmd$ + MKL$(idecytemp)
|
|
END IF
|
|
GOSUB SendCommand
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
ELSEIF mX > 1 + maxLineNumberLength AND mX < idewx AND mY > 2 AND mY < (idewy - 5) THEN
|
|
'inside text box
|
|
bkpidecy = idecy
|
|
idecy = mY - 2 + idesy - 1
|
|
IF idecy > iden THEN idecy = iden
|
|
IF bkpidecy <> idecy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
ELSEIF mX = idewx AND mY > 2 AND mY < idewy - 5 THEN
|
|
'inside vbar
|
|
IF mouseDownOnX = mX AND mouseDownOnY = mY THEN
|
|
IF mY = 3 THEN GOTO keyUp
|
|
IF mY = idewy - 6 THEN GOTO keyDown
|
|
IF mY > 3 AND mY < (idewy - 6) THEN
|
|
'assume not on slider
|
|
IF iden > 1 THEN 'take no action if not slider available
|
|
y = idevbar(idewx, 3, idewy - 8, idecy, iden)
|
|
IF y <> mY THEN
|
|
IF mY < y THEN
|
|
GOTO pageUp
|
|
ELSE
|
|
GOTO pageDown
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
ELSEIF mY = idewy - 4 AND mX > idewx - (idesystem2.w + 10) AND mX < idewx - 1 THEN
|
|
'inside "Find" box
|
|
GOTO findjmp
|
|
END IF
|
|
ELSE
|
|
mouseDown = 0
|
|
draggingVThumb = 0
|
|
draggingHThumb = 0
|
|
vWatchPanel.draggingPanel = 0
|
|
vWatchPanel.resizingPanel = 0
|
|
vWatchPanel.closingPanel = 0
|
|
vWatchPanel.draggingVBar = 0
|
|
vWatchPanel.draggingHBar = 0
|
|
END IF
|
|
END IF
|
|
|
|
|
|
UpdateStatusArea:
|
|
IF _WINDOWHASFOCUS THEN
|
|
IF noFocusMessage THEN
|
|
UpdateMenuHelpLine "Right-click for options; ESC to abort."
|
|
GOSUB printVersion
|
|
GOSUB UpdateButtons
|
|
noFocusMessage = 0
|
|
END IF
|
|
ELSE
|
|
IF noFocusMessage = 0 THEN
|
|
clearStatusWindow 2
|
|
clearStatusWindow 3
|
|
setStatusMessage 2, "Set focus to the IDE to control execution", 15
|
|
noFocusMessage = -1
|
|
END IF
|
|
END IF
|
|
IF IdeDebugMode > 1 THEN RETURN
|
|
|
|
k& = _KEYHIT
|
|
SELECT CASE k&
|
|
CASE 18432 'Up arrow
|
|
keyUp:
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN 'scroll the window, instead of moving the cursor
|
|
idesy = idesy - 1
|
|
IF idesy < 1 THEN idesy = 1
|
|
IF idecy > idesy + (idewy - 9) THEN idecy = idesy + (idewy - 9)
|
|
ELSE
|
|
idecy = idecy - 1
|
|
IF idecy < 1 THEN idecy = 1
|
|
END IF
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 20480 'Down arrow
|
|
keyDown:
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN 'scroll the window, instead of moving the cursor
|
|
idesy = idesy + 1
|
|
IF idesy > iden THEN idesy = iden
|
|
IF idecy < idesy THEN idecy = idesy
|
|
ELSE
|
|
idecy = idecy + 1
|
|
IF idecy > iden THEN idecy = iden
|
|
END IF
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 18688 'Page up
|
|
pageUp:
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
idecy = idecy - (idewy - 9)
|
|
IF idecy < 1 THEN idecy = 1
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 20736 'Page down
|
|
pageDown:
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
idecy = idecy + (idewy - 9)
|
|
IF idecy > iden THEN idecy = iden
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 18176 'Home
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN idecy = 1
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 20224 'End
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN idecy = iden
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
CASE 27
|
|
requestQuit:
|
|
cmd$ = "free"
|
|
GOSUB SendCommand
|
|
CLOSE #debugClient&
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Debug session aborted.", 7
|
|
WHILE _MOUSEINPUT: WEND
|
|
_KEYCLEAR
|
|
EXIT SUB
|
|
CASE 15360 'F2
|
|
requestSubsDialog:
|
|
bkpidecy = idecy: bkpidesy = idesy
|
|
r$ = idesubs
|
|
IF bkpidecy <> idecy OR bkpidesy <> idesy THEN ideselect = 0: GOSUB UpdateDisplay
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
GOSUB UpdateDisplay
|
|
WHILE _MOUSEINPUT: WEND
|
|
CASE 102, 70 'f, F
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN GOTO findjmp
|
|
CASE 15616 'F3
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN GOTO findjmp
|
|
IF idefindtext <> "" THEN
|
|
|
|
'UpdateSearchBar:
|
|
COLOR 7, 1: _PRINTSTRING (idewx - (idesystem2.w + 10), idewy - 4), CHR$(180)
|
|
COLOR 3, 1
|
|
_PRINTSTRING (1 + idewx - (idesystem2.w + 10), idewy - 4), "Find[" + SPACE$(idesystem2.w + 1) + CHR$(18) + "]"
|
|
a$ = LEFT$(idefindtext, idesystem2.w)
|
|
_PRINTSTRING (idewx - (idesystem2.w + 8) + 4, idewy - 4), a$
|
|
COLOR 7, 1: _PRINTSTRING (idewx - 2, idewy - 4), CHR$(195)
|
|
|
|
IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN idefindinvert = 1
|
|
IdeAddSearched idefindtext
|
|
idefindagain -1
|
|
ELSE
|
|
findjmp:
|
|
r$ = idefind
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
CASE 15872 'F4
|
|
F4:
|
|
IF PauseMode = 0 THEN
|
|
cmd$ = "break"
|
|
PauseMode = -1
|
|
GOSUB SendCommand
|
|
estabilishingScope = -1
|
|
ELSE
|
|
requestVariableWatch:
|
|
hidePanel = -1
|
|
GOSUB UpdateDisplay
|
|
selectVar = 1
|
|
filter$ = ""
|
|
DO
|
|
result$ = idevariablewatchbox$(currentSub$, filter$, selectVar, returnAction)
|
|
temp$ = GetBytes$("", 0) 'reset buffer
|
|
IF returnAction = 1 THEN
|
|
'set address
|
|
tempIndex& = CVL(GetBytes$(result$, 4))
|
|
tempIsArray& = _CV(_BYTE, GetBytes$(result$, 1))
|
|
temp$ = GetBytes$(result$, 4) 'skip original line number
|
|
tempLocalIndex& = CVL(GetBytes$(result$, 4))
|
|
tempArrayIndex& = CVL(GetBytes$(result$, 4))
|
|
tempArrayIndexes$ = MKL$(tempArrayIndex&) + GetBytes$(result$, tempArrayIndex&)
|
|
tempArrayElementSize& = CVL(GetBytes$(result$, 4))
|
|
tempIsUDT& = CVL(GetBytes$(result$, 4))
|
|
temp$ = GetBytes$(result$, 4) 'skip element number
|
|
tempElementOffset& = CVL(GetBytes$(result$, 4))
|
|
temp$ = GetBytes$(result$, 4) 'skip var size
|
|
tempStorage& = CVL(GetBytes$(result$, 4))
|
|
i = CVI(GetBytes$(result$, 2))
|
|
tempScope$ = GetBytes$(result$, i)
|
|
i = CVI(GetBytes$(result$, 2))
|
|
varType$ = GetBytes$(result$, i)
|
|
i = CVI(GetBytes$(result$, 2))
|
|
value$ = GetBytes$(result$, i)
|
|
|
|
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
|
|
cmd$ = "set global address:"
|
|
ELSE
|
|
cmd$ = "set local address:"
|
|
END IF
|
|
|
|
findVarSize:
|
|
tempVarType$ = varType$
|
|
fixedVarSize& = 0
|
|
IF INSTR(varType$, "STRING *") THEN
|
|
tempVarType$ = "STRING"
|
|
fixedVarSize& = VAL(MID$(varType$, _INSTRREV(varType$, "* ") + 2))
|
|
END IF
|
|
IF INSTR(varType$, "BIT *") THEN tempVarType$ = "_BIT"
|
|
IF tempVarType$ = "_BIT" AND INSTR(varType$, "UNSIGNED") > 0 THEN
|
|
tempVarType$ = "_UNSIGNED _BIT"
|
|
END IF
|
|
SELECT CASE tempVarType$
|
|
CASE "_BIT", "_UNSIGNED _BIT"
|
|
value$ = MKL$(VAL(value$))
|
|
varSize& = LEN(dummy&)
|
|
result$ = STR$(CVL(value$))
|
|
CASE "_BYTE", "_UNSIGNED _BYTE", "BYTE", "UNSIGNED BYTE"
|
|
value$ = _MK$(_BYTE, VAL(value$))
|
|
varSize& = LEN(dummy%%)
|
|
IF INSTR(tempVarType$, "UNSIGNED") > 0 THEN
|
|
result$ = STR$(_CV(_UNSIGNED _BYTE, value$))
|
|
ELSE
|
|
result$ = STR$(_CV(_BYTE, value$))
|
|
END IF
|
|
CASE "INTEGER", "_UNSIGNED INTEGER", "UNSIGNED INTEGER"
|
|
value$ = MKI$(VAL(value$))
|
|
varSize& = LEN(dummy%)
|
|
IF INSTR(tempVarType$, "UNSIGNED") > 0 THEN
|
|
result$ = STR$(_CV(_UNSIGNED INTEGER, value$))
|
|
ELSE
|
|
result$ = STR$(_CV(INTEGER, value$))
|
|
END IF
|
|
CASE "LONG", "_UNSIGNED LONG", "UNSIGNED LONG"
|
|
value$ = MKL$(VAL(value$))
|
|
varSize& = LEN(dummy&)
|
|
IF INSTR(tempVarType$, "UNSIGNED") > 0 THEN
|
|
result$ = STR$(_CV(_UNSIGNED LONG, value$))
|
|
ELSE
|
|
result$ = STR$(_CV(LONG, value$))
|
|
END IF
|
|
CASE "_INTEGER64", "INTEGER64", "_UNSIGNED _INTEGER64", "UNSIGNED INTEGER64"
|
|
value$ = _MK$(_INTEGER64, VAL(value$))
|
|
varSize& = LEN(dummy&&)
|
|
IF INSTR(tempVarType$, "UNSIGNED") > 0 THEN
|
|
result$ = STR$(_CV(_UNSIGNED _INTEGER64, value$))
|
|
ELSE
|
|
result$ = STR$(_CV(_INTEGER64, value$))
|
|
END IF
|
|
CASE "SINGLE"
|
|
value$ = MKS$(VAL(value$))
|
|
varSize& = LEN(dummy!)
|
|
result$ = STR$(CVS(value$))
|
|
CASE "DOUBLE"
|
|
value$ = MKD$(VAL(value$))
|
|
varSize& = LEN(dummy#)
|
|
result$ = STR$(CVD(value$))
|
|
CASE "_FLOAT", "FLOAT"
|
|
value$ = _MK$(_FLOAT, VAL(value$))
|
|
varSize& = LEN(dummy##)
|
|
result$ = STR$(_CV(_FLOAT, value$))
|
|
CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET"
|
|
value$ = _MK$(_OFFSET, VAL(value$))
|
|
varSize& = LEN(dummy%&)
|
|
IF INSTR(tempVarType$, "UNSIGNED") > 0 THEN
|
|
result$ = STR$(_CV(_UNSIGNED _OFFSET, value$))
|
|
ELSE
|
|
result$ = STR$(_CV(_OFFSET, value$))
|
|
END IF
|
|
CASE "STRING"
|
|
varSize& = LEN(value$)
|
|
result$ = value$
|
|
IF fixedVarSize& THEN
|
|
varSize& = fixedVarSize&
|
|
result$ = LEFT$(result$, fixedVarSize&)
|
|
END IF
|
|
END SELECT
|
|
|
|
IF returnAction = 2 OR returnAction = 3 THEN RETURN
|
|
|
|
cmd$ = cmd$ + MKL$(tempIndex&)
|
|
cmd$ = cmd$ + _MK$(_BYTE, tempIsArray& <> 0)
|
|
cmd$ = cmd$ + MKL$(0)
|
|
cmd$ = cmd$ + MKL$(tempLocalIndex&)
|
|
cmd$ = cmd$ + tempArrayIndexes$
|
|
cmd$ = cmd$ + MKL$(tempArrayElementSize&)
|
|
cmd$ = cmd$ + MKL$(tempIsUDT&)
|
|
cmd$ = cmd$ + MKL$(0)
|
|
cmd$ = cmd$ + MKL$(tempElementOffset&)
|
|
cmd$ = cmd$ + MKL$(varSize&)
|
|
cmd$ = cmd$ + MKL$(tempStorage&)
|
|
cmd$ = cmd$ + MKI$(LEN(tempScope$)) + tempScope$
|
|
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
|
|
cmd$ = cmd$ + MKI$(LEN(value$)) + value$
|
|
GOSUB SendCommand
|
|
|
|
IF tempStorage& > 0 THEN
|
|
vWatchReceivedData$(tempStorage&) = result$
|
|
END IF
|
|
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
hidePanel = -1
|
|
GOSUB UpdateDisplay
|
|
ELSEIF returnAction = 2 OR returnAction = 3 THEN
|
|
'send watchpoint data
|
|
tempIndex& = CVL(GetBytes$(result$, 4))
|
|
tempIsArray& = _CV(_BYTE, GetBytes$(result$, 1)) <> 0
|
|
temp$ = GetBytes$(result$, 4) 'skip original line number
|
|
tempLocalIndex& = CVL(GetBytes$(result$, 4))
|
|
tempArrayIndex& = CVL(GetBytes$(result$, 4))
|
|
tempArrayIndexes$ = MKL$(tempArrayIndex&) + GetBytes$(result$, tempArrayIndex&)
|
|
tempArrayElementSize& = CVL(GetBytes$(result$, 4))
|
|
tempIsUDT& = CVL(GetBytes$(result$, 4))
|
|
tempElement& = CVL(GetBytes$(result$, 4))
|
|
tempElementOffset& = CVL(GetBytes$(result$, 4))
|
|
temp$ = GetBytes$(result$, 4) 'skip var size
|
|
tempStorage& = CVL(GetBytes$(result$, 4))
|
|
i = CVI(GetBytes$(result$, 2))
|
|
tempScope$ = GetBytes$(result$, i)
|
|
i = CVI(GetBytes$(result$, 2))
|
|
varType$ = GetBytes$(result$, i)
|
|
i = CVI(GetBytes$(result$, 2))
|
|
value$ = GetBytes$(result$, i)
|
|
|
|
IF returnAction = 2 THEN
|
|
temp$ = "set "
|
|
ELSE
|
|
'clear watchpoint data
|
|
temp$ = "clear "
|
|
END IF
|
|
|
|
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
|
|
cmd$ = temp$ + "global watchpoint:"
|
|
ELSE
|
|
cmd$ = temp$ + "local watchpoint:"
|
|
END IF
|
|
|
|
temp$ = value$
|
|
IF INSTR(varType$, "STRING") = 0 THEN
|
|
GOSUB findVarSize
|
|
ELSE
|
|
IF INSTR(varType$, " * ") > 0 AND (tempIsUDT& <> 0 OR tempIsArray& <> 0) THEN
|
|
varSize& = VAL(_TRIM$(MID$(varType$, INSTR(varType$, "STRING *") + 8)))
|
|
ELSE
|
|
varSize& = LEN(dummy%&) + LEN(dummy&)
|
|
END IF
|
|
END IF
|
|
|
|
cmd$ = cmd$ + MKL$(tempIndex&)
|
|
cmd$ = cmd$ + _MK$(_BYTE, tempIsArray& <> 0)
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).linenumber)
|
|
cmd$ = cmd$ + MKL$(tempLocalIndex&)
|
|
cmd$ = cmd$ + tempArrayIndexes$
|
|
cmd$ = cmd$ + MKL$(tempArrayElementSize&)
|
|
cmd$ = cmd$ + MKL$(tempIsUDT&)
|
|
cmd$ = cmd$ + MKL$(tempElement&)
|
|
cmd$ = cmd$ + MKL$(tempElementOffset&)
|
|
cmd$ = cmd$ + MKL$(varSize&)
|
|
cmd$ = cmd$ + MKL$(tempStorage&)
|
|
cmd$ = cmd$ + MKI$(LEN(tempScope$)) + tempScope$
|
|
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
|
|
cmd$ = cmd$ + MKI$(LEN(temp$)) + temp$
|
|
GOSUB SendCommand
|
|
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
hidePanel = -1
|
|
GOSUB UpdateDisplay
|
|
_CONTINUE
|
|
ELSEIF returnAction = -1 THEN
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
hidePanel = -1
|
|
GOSUB UpdateDisplay
|
|
_CONTINUE
|
|
ELSE
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
GOSUB UpdateDisplay
|
|
IF LEN(variableWatchList$) THEN
|
|
panelActive = -1
|
|
GOTO requestVariableValues
|
|
END IF
|
|
END IF
|
|
CASE 16128 'F5
|
|
F5:
|
|
requestContinue:
|
|
PauseMode = 0
|
|
debugnextline = 0
|
|
cmd$ = "run"
|
|
GOSUB SendCommand
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Running...", 10
|
|
GOSUB UpdateDisplay
|
|
dummy = DarkenFGBG(1)
|
|
set_foreground_window debuggeehwnd
|
|
CASE 16384 'F6
|
|
F6:
|
|
requestStepOut:
|
|
IF PauseMode THEN
|
|
IF LEN(currentSub$) > 0 THEN
|
|
PauseMode = 0
|
|
cmd$ = "step out"
|
|
GOSUB SendCommand
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Running...", 10
|
|
dummy = DarkenFGBG(1)
|
|
GOSUB UpdateDisplay
|
|
ELSE
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Not inside a sub/function.", 4
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
CASE 16640 'F7
|
|
F7:
|
|
requestStepInto:
|
|
IF PauseMode = 0 THEN
|
|
cmd$ = "break"
|
|
PauseMode = -1
|
|
GOSUB SendCommand
|
|
ELSE
|
|
cmd$ = "step"
|
|
PauseMode = -1
|
|
GOSUB SendCommand
|
|
END IF
|
|
clearStatusWindow 1
|
|
IF EnteredInput THEN
|
|
setStatusMessage 1, "Execution will be paused after SLEEP/INPUT/LINE INPUT finishes running...", 2
|
|
set_foreground_window debuggeehwnd
|
|
ELSE
|
|
setStatusMessage 1, "Paused.", 2
|
|
END IF
|
|
IF IdeDebugMode = 2 THEN RETURN
|
|
CASE 16896 'F8
|
|
F8:
|
|
requestStepOver:
|
|
IF PauseMode THEN
|
|
cmd$ = "step over"
|
|
PauseMode = 0
|
|
GOSUB SendCommand
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Running...", 10
|
|
dummy = DarkenFGBG(1)
|
|
ELSE
|
|
requestPause:
|
|
cmd$ = "break"
|
|
PauseMode = -1
|
|
GOSUB SendCommand
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Paused.", 2
|
|
IF IdeDebugMode = 2 THEN RETURN
|
|
END IF
|
|
CASE 17152 'F9
|
|
F9:
|
|
requestToggleBreakpoint:
|
|
IF PauseMode THEN
|
|
IdeBreakpoints(idecy) = NOT IdeBreakpoints(idecy)
|
|
IF IdeBreakpoints(idecy) THEN
|
|
IdeSkipLines(idecy) = 0
|
|
cmd$ = "set breakpoint:"
|
|
ELSE
|
|
cmd$ = "clear breakpoint:"
|
|
END IF
|
|
cmd$ = cmd$ + MKL$(idecy)
|
|
GOSUB SendCommand
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
CASE 17408 'F10
|
|
F10:
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN
|
|
requestUnskipAllLines:
|
|
REDIM IdeSkipLines(iden) AS _BYTE
|
|
cmd$ = "clear all skips"
|
|
GOSUB SendCommand
|
|
ELSE
|
|
requestClearBreakpoints:
|
|
REDIM IdeBreakpoints(iden) AS _BYTE
|
|
cmd$ = "clear all breakpoints"
|
|
GOSUB SendCommand
|
|
END IF
|
|
GOSUB UpdateDisplay
|
|
CASE 34304 'F12
|
|
F12:
|
|
IF PauseMode THEN
|
|
requestCallStack:
|
|
cmd$ = "call stack"
|
|
GOSUB SendCommand
|
|
|
|
IF BypassRequestCallStack THEN GOTO ShowCallStack
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Requesting call stack...", 7
|
|
|
|
start! = TIMER
|
|
callStackLength = -1
|
|
DO
|
|
GOSUB GetCommand
|
|
IF cmd$ = "call stack size" THEN
|
|
callStackLength = CVL(value$)
|
|
IF callStackLength = 0 THEN EXIT DO
|
|
END IF
|
|
_LIMIT 100
|
|
LOOP UNTIL cmd$ = "call stack" OR TIMER - start! > timeout
|
|
|
|
IF cmd$ = "call stack" THEN
|
|
'display call stack
|
|
callstacklist$ = value$
|
|
ShowCallStack:
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Paused.", 2
|
|
retval = idecallstackbox
|
|
SCREEN , , 3, 0
|
|
GOSUB UpdateDisplay
|
|
WHILE _MOUSEINPUT: WEND
|
|
ELSE
|
|
IF callStackLength = -1 THEN
|
|
callStackLength = 0
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Error retrieving call stack.", 4
|
|
ELSEIF callStackLength = 0 THEN
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "No call stack log available.", 4
|
|
END IF
|
|
END IF
|
|
noFocusMessage = NOT noFocusMessage
|
|
END IF
|
|
CASE 103, 71 'g, G
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN
|
|
IF _KEYDOWN(100304) OR _KEYDOWN(100303) THEN
|
|
result = idegetlinenumberbox("Run To Line", idecy)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
requestRunToThisLine:
|
|
IF result > 0 AND result <= iden THEN
|
|
PauseMode = 0
|
|
debugnextline = 0
|
|
cmd$ = "run to line:" + MKL$(result)
|
|
GOSUB SendCommand
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "Running...", 10
|
|
GOSUB UpdateDisplay
|
|
dummy = DarkenFGBG(1)
|
|
END IF
|
|
ELSE
|
|
result = idegetlinenumberbox("Set Next Line", idecy)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
requestSetNextLine:
|
|
IF result > 0 AND result <= iden THEN
|
|
cmd$ = "set next line:" + MKL$(result)
|
|
GOSUB SendCommand
|
|
END IF
|
|
END IF
|
|
END IF
|
|
CASE 112, 80 'p, P
|
|
IF _KEYDOWN(100306) OR _KEYDOWN(100305) THEN
|
|
result = idegetlinenumberbox("Skip Line", idecy)
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
requestToggleSkipLine:
|
|
IF result > 0 AND result <= iden THEN
|
|
IdeSkipLines(result) = NOT IdeSkipLines(result)
|
|
cmd$ = "set skip line:"
|
|
IF IdeSkipLines(result) = 0 THEN cmd$ = "clear skip line:"
|
|
cmd$ = cmd$ + MKL$(result)
|
|
GOSUB SendCommand
|
|
GOSUB UpdateDisplay
|
|
END IF
|
|
END IF
|
|
END SELECT
|
|
|
|
GOSUB GetCommand
|
|
|
|
SELECT CASE cmd$
|
|
CASE "breakpoint", "line number", "watchpoint"
|
|
BypassRequestCallStack = 0
|
|
IF cmd$ = "watchpoint" THEN
|
|
temp$ = GetBytes$("", 0) 'reset buffer
|
|
tempIndex& = CVL(GetBytes$(value$, 4))
|
|
latestWatchpointMet& = tempIndex&
|
|
tempArrayIndexes$ = GetBytes$(value$, 4)
|
|
tempArrayIndexes$ = tempArrayIndexes$ + GetBytes$(value$, CVL(tempArrayIndexes$))
|
|
tempElementOffset$ = GetBytes$(value$, 4)
|
|
i = CVI(GetBytes$(value$, 2))
|
|
temp$ = usedVariableList(tempIndex&).name + " " + GetBytes$(value$, i)
|
|
result = idemessagebox("Watchpoint condition met", temp$, "#OK;#Clear Watchpoint")
|
|
IF result = 2 THEN
|
|
'find existing watchpoint for the same variable/index/element
|
|
temp$ = MKL$(tempIndex&) + tempArrayIndexes$ + tempElementOffset$
|
|
i = 0
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
DO WHILE i
|
|
IF MID$(watchpointList$, i + 8, LEN(temp$)) = temp$ THEN EXIT DO
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
LOOP
|
|
|
|
IF i > 0 THEN
|
|
'remove it
|
|
j = CVL(MID$(watchpointList$, i + 4, 4))
|
|
watchpointList$ = LEFT$(watchpointList$, i - 1) + MID$(watchpointList$, i + j + 8)
|
|
END IF
|
|
|
|
cmd$ = "clear last watchpoint"
|
|
GOSUB SendCommand
|
|
END IF
|
|
value$ = RIGHT$(value$, 4)
|
|
ELSE
|
|
latestWatchpointMet& = 0
|
|
END IF
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
WHILE _MOUSEINPUT: WEND
|
|
l = CVL(value$)
|
|
idecy = l
|
|
ideselect = 0
|
|
debugnextline = l
|
|
idefocusline = 0
|
|
idecentercurrentline
|
|
clearStatusWindow 1
|
|
IF cmd$ = "breakpoint" THEN
|
|
setStatusMessage 1, "Breakpoint reached on line" + STR$(l), 2
|
|
ELSEIF cmd$ = "watchpoint" THEN
|
|
setStatusMessage 1, "Watchpoint condition met (" + temp$ + ")", 2
|
|
ELSE
|
|
setStatusMessage 1, "Paused.", 2
|
|
END IF
|
|
PauseMode = -1
|
|
GOSUB UpdateDisplay
|
|
|
|
'request variables addresses
|
|
IF LEN(variableWatchList$) > 0 AND panelActive THEN
|
|
requestVariableValues:
|
|
temp$ = GetBytes$("", 0) 'reset buffer
|
|
temp$ = MID$(variableWatchList$, 9) 'skip longest var name and total visible vars
|
|
DO
|
|
temp2$ = GetBytes$(temp$, 4)
|
|
IF temp2$ <> MKL$(-1) THEN EXIT DO 'no more variables in list
|
|
tempIndex& = CVL(GetBytes$(temp$, 4))
|
|
tempArrayIndexes$ = GetBytes$(temp$, 4)
|
|
i = CVL(tempArrayIndexes$)
|
|
IF i > 0 THEN
|
|
tempArrayIndexes$ = tempArrayIndexes$ + GetBytes$(temp$, i)
|
|
END IF
|
|
tempElement& = CVL(GetBytes$(temp$, 4))
|
|
tempElementOffset& = CVL(GetBytes$(temp$, 4))
|
|
tempStorage& = CVL(GetBytes$(temp$, 4))
|
|
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
|
|
cmd$ = "get global var:"
|
|
ELSE
|
|
cmd$ = "get local var:"
|
|
END IF
|
|
GOSUB GetVarSize
|
|
IF varSize& THEN
|
|
cmd$ = cmd$ + MKL$(tempIndex&)
|
|
cmd$ = cmd$ + _MK$(_BYTE, usedVariableList(tempIndex&).isarray)
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).linenumber)
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex)
|
|
cmd$ = cmd$ + tempArrayIndexes$
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize)
|
|
cmd$ = cmd$ + MKL$(tempElement&)
|
|
IF tempElement& THEN
|
|
tempElementOffset& = CVL(MID$(usedVariableList(tempIndex&).elementOffset, tempElement& * 4 - 3, 4))
|
|
ELSE
|
|
tempElementOffset& = 0
|
|
END IF
|
|
cmd$ = cmd$ + MKL$(tempElementOffset&)
|
|
cmd$ = cmd$ + MKL$(varSize&)
|
|
cmd$ = cmd$ + MKL$(tempStorage&)
|
|
cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc))
|
|
cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc
|
|
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
|
|
GOSUB SendCommand
|
|
ELSE
|
|
cmd$ = ""
|
|
END IF
|
|
LOOP
|
|
END IF
|
|
CASE "hwnd"
|
|
debuggeehwnd = _CV(_OFFSET, value$)
|
|
CASE "address read"
|
|
tempIndex& = CVL(LEFT$(value$, 4))
|
|
tempArrayIndex& = CVL(MID$(value$, 5, 4))
|
|
tempElement& = CVL(MID$(value$, 9, 4))
|
|
tempStorage& = CVL(MID$(value$, 13, 4))
|
|
recvData$ = MID$(value$, 17)
|
|
GOSUB GetVarSize
|
|
SELECT CASE tempVarType$
|
|
CASE "_BYTE", "BYTE": recvData$ = STR$(_CV(_BYTE, recvData$))
|
|
CASE "_UNSIGNED _BYTE", "UNSIGNED BYTE": recvData$ = STR$(_CV(_UNSIGNED _BYTE, recvData$))
|
|
CASE "INTEGER": recvData$ = STR$(_CV(INTEGER, recvData$))
|
|
CASE "_UNSIGNED INTEGER", "UNSIGNED INTEGER": recvData$ = STR$(_CV(_UNSIGNED INTEGER, recvData$))
|
|
CASE "LONG": recvData$ = STR$(_CV(LONG, recvData$))
|
|
CASE "_UNSIGNED LONG", "UNSIGNED LONG": recvData$ = STR$(_CV(_UNSIGNED LONG, recvData$))
|
|
CASE "_INTEGER64", "INTEGER64": recvData$ = STR$(_CV(_INTEGER64, recvData$))
|
|
CASE "_UNSIGNED _INTEGER64", "UNSIGNED INTEGER64": recvData$ = STR$(_CV(_UNSIGNED _INTEGER64, recvData$))
|
|
CASE "SINGLE": recvData$ = STR$(_CV(SINGLE, recvData$))
|
|
CASE "DOUBLE": recvData$ = STR$(_CV(DOUBLE, recvData$))
|
|
CASE "_FLOAT", "FLOAT": recvData$ = STR$(_CV(_FLOAT, recvData$))
|
|
CASE "_OFFSET", "OFFSET": recvData$ = STR$(_CV(_OFFSET, recvData$))
|
|
CASE "_UNSIGNED _OFFSET", "UNSIGNED OFFSET": recvData$ = STR$(_CV(_UNSIGNED _OFFSET, recvData$))
|
|
'CASE "STRING": 'no conversion required
|
|
END SELECT
|
|
vWatchReceivedData$(tempStorage&) = recvData$
|
|
IF PauseMode THEN GOSUB UpdateDisplay
|
|
CASE "current sub"
|
|
currentSub$ = value$
|
|
IF estabilishingScope THEN
|
|
estabilishingScope = 0
|
|
GOSUB UpdateDisplay
|
|
GOTO requestVariableWatch
|
|
END IF
|
|
CASE "quit"
|
|
CLOSE #debugClient&
|
|
dummy = DarkenFGBG(0)
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Debug session aborted.", 15
|
|
IF LEN(value$) THEN
|
|
setStatusMessage 2, value$, 7
|
|
END IF
|
|
WHILE _MOUSEINPUT: WEND
|
|
_KEYCLEAR
|
|
EXIT SUB
|
|
CASE "error"
|
|
l = CVL(value$)
|
|
idecy = l
|
|
ideselect = 0
|
|
idefocusline = l
|
|
GOSUB UpdateDisplay
|
|
clearStatusWindow 1
|
|
COLOR , 4
|
|
setStatusMessage 1, "Error occurred on line" + STR$(l), 15
|
|
BypassRequestCallStack = -1
|
|
PauseMode = -1
|
|
CASE "enter input"
|
|
EnteredInput = -1
|
|
l = CVL(value$)
|
|
idecy = l
|
|
debugnextline = l
|
|
ideselect = 0
|
|
GOSUB UpdateDisplay
|
|
dummy = DarkenFGBG(1)
|
|
clearStatusWindow 1
|
|
setStatusMessage 1, "SLEEP/INPUT/LINE INPUT active in your program...", 10
|
|
set_foreground_window debuggeehwnd
|
|
CASE "leave input"
|
|
EnteredInput = 0
|
|
clearStatusWindow 1
|
|
IF PauseMode THEN
|
|
setStatusMessage 1, "Paused.", 2
|
|
dummy = DarkenFGBG(0)
|
|
ELSE
|
|
setStatusMessage 1, "Running...", 10
|
|
END IF
|
|
CASE "call stack size"
|
|
'call stack is only received without having been
|
|
'requested when the program is about to quit or
|
|
'when an error just occurred
|
|
callStackLength = CVL(value$)
|
|
IF callStackLength THEN
|
|
start! = TIMER
|
|
DO
|
|
GOSUB GetCommand
|
|
_LIMIT 100
|
|
LOOP UNTIL cmd$ = "call stack" OR TIMER - start! > timeout
|
|
|
|
IF cmd$ = "call stack" THEN
|
|
'store call stack
|
|
callstacklist$ = value$
|
|
END IF
|
|
ELSE
|
|
callstacklist$ = ""
|
|
END IF
|
|
END SELECT
|
|
|
|
IF _WINDOWHASFOCUS THEN GOSUB UpdateButtons
|
|
_LIMIT 100
|
|
LOOP
|
|
|
|
WHILE _MOUSEINPUT: WEND
|
|
_KEYCLEAR
|
|
EXIT SUB
|
|
|
|
GetCommand:
|
|
GET #debugClient&, , temp$
|
|
IF os$ = "WIN" AND _CONNECTED(debugClient&) = 0 THEN
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Debug session aborted.", 7
|
|
setStatusMessage 2, "Disconnected.", 2
|
|
WHILE _MOUSEINPUT: WEND
|
|
_KEYCLEAR
|
|
EXIT SUB
|
|
END IF
|
|
buffer$ = buffer$ + temp$
|
|
|
|
IF LEN(buffer$) >= 4 THEN cmdsize = CVL(LEFT$(buffer$, 4)) ELSE cmdsize = 0
|
|
IF cmdsize > 0 AND LEN(buffer$) >= cmdsize THEN
|
|
cmd$ = MID$(buffer$, 5, cmdsize)
|
|
buffer$ = MID$(buffer$, 5 + cmdsize)
|
|
|
|
IF INSTR(cmd$, ":") THEN
|
|
value$ = MID$(cmd$, INSTR(cmd$, ":") + 1)
|
|
cmd$ = LEFT$(cmd$, INSTR(cmd$, ":") - 1)
|
|
ELSE
|
|
value$ = ""
|
|
END IF
|
|
ELSE
|
|
cmd$ = "": value$ = ""
|
|
END IF
|
|
RETURN
|
|
|
|
SendCommand:
|
|
cmd$ = MKL$(LEN(cmd$)) + cmd$
|
|
PUT #debugClient&, , cmd$
|
|
IF os$ = "WIN" AND _CONNECTED(debugClient&) = 0 THEN
|
|
clearStatusWindow 0
|
|
setStatusMessage 1, "Debug session aborted.", 7
|
|
setStatusMessage 2, "Disconnected.", 2
|
|
WHILE _MOUSEINPUT: WEND
|
|
_KEYCLEAR
|
|
EXIT SUB
|
|
END IF
|
|
cmd$ = ""
|
|
RETURN
|
|
|
|
UpdateDisplay:
|
|
IF PauseMode = 0 THEN ideshowtextBypassColorRestore = -1
|
|
ideshowtext
|
|
UpdateTitleOfMainWindow
|
|
|
|
GOSUB printVersion
|
|
|
|
IF PauseMode <> 0 AND LEN(variableWatchList$) > 0 THEN
|
|
IF WatchListToConsole THEN _CONSOLE ON
|
|
totalVisibleVariables = CVL(MID$(variableWatchList$, 5, 4))
|
|
IF hidePanel = 0 AND panelActive = -1 THEN showvWatchPanel vWatchPanel, currentSub$, 0
|
|
hidePanel = 0
|
|
END IF
|
|
|
|
PCOPY 3, 0
|
|
RETURN
|
|
|
|
UpdateButtons:
|
|
FOR i = 1 TO UBOUND(Button)
|
|
IF mY = Button(i).y AND mX >= Button(i).x AND mX <= Button(i).x + Button(i).w AND _
|
|
vWatchPanel.draggingPanel = 0 AND vWatchPanel.resizingPanel = 0 THEN
|
|
COLOR 0, 7
|
|
temp$ = ""
|
|
ELSE
|
|
COLOR 13, 1
|
|
temp$ = " "
|
|
END IF
|
|
_PRINTSTRING (Button(i).x, Button(i).y), Button(i).Caption + temp$
|
|
NEXT
|
|
PCOPY 3, 0
|
|
RETURN
|
|
|
|
GetVarSize:
|
|
varSize& = 0
|
|
varType$ = usedVariableList(tempIndex&).varType
|
|
checkVarType:
|
|
tempVarType$ = varType$
|
|
IF INSTR(tempVarType$, "STRING *") THEN tempVarType$ = "STRING"
|
|
IF INSTR(tempVarType$, "BIT *") THEN
|
|
IF VAL(MID$(tempVarType$, _INSTRREV(tempVarType$, " ") + 1)) > 32 THEN
|
|
tempVarType$ = "_INTEGER64"
|
|
IF INSTR(varType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED _INTEGER64"
|
|
ELSE
|
|
tempVarType$ = "LONG"
|
|
IF INSTR(varType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED LONG"
|
|
END IF
|
|
ELSEIF INSTR("@_BIT@BIT@_UNSIGNED _BIT@UNSIGNED BIT@", "@" + tempVarType$ + "@") THEN
|
|
tempVarType$ = "LONG"
|
|
IF INSTR(varType$, "UNSIGNED") THEN tempVarType$ = "_UNSIGNED LONG"
|
|
END IF
|
|
SELECT CASE tempVarType$
|
|
CASE "_BYTE", "_UNSIGNED _BYTE", "BYTE", "UNSIGNED BYTE": varSize& = LEN(dummy%%)
|
|
CASE "INTEGER", "_UNSIGNED INTEGER", "UNSIGNED INTEGER": varSize& = LEN(dummy%)
|
|
CASE "LONG", "_UNSIGNED LONG", "UNSIGNED LONG": varSize& = LEN(dummy&)
|
|
CASE "_INTEGER64", "_UNSIGNED _INTEGER64", "INTEGER64", "UNSIGNED INTEGER64": varSize& = LEN(dummy&&)
|
|
CASE "SINGLE": varSize& = LEN(dummy!)
|
|
CASE "DOUBLE": varSize& = LEN(dummy#)
|
|
CASE "_FLOAT", "FLOAT": varSize& = LEN(dummy##)
|
|
CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET": varSize& = LEN(dummy%&)
|
|
CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&)
|
|
CASE ELSE 'UDT?
|
|
varType$ = getelement(usedVariableList(tempIndex&).elementTypes, tempElement&)
|
|
IF INSTR(varType$, "STRING *") THEN
|
|
'Request exactly the amount of bytes specified for fixed strings in UDTs
|
|
varSize& = VAL(_TRIM$(MID$(varType$, INSTR(varType$, "STRING *") + 8)))
|
|
RETURN
|
|
END IF
|
|
IF LEN(varType$) THEN GOTO checkVarType
|
|
END SELECT
|
|
RETURN
|
|
|
|
printVersion:
|
|
'print version in the status bar
|
|
IF LEN(versionStringStatus$) = 0 THEN
|
|
versionStringStatus$ = " v" + Version$
|
|
versionStringStatus$ = versionStringStatus$ + " "
|
|
END IF
|
|
COLOR 2, 3
|
|
_PRINTSTRING (idewx - 21 - LEN(versionStringStatus$), idewy + idesubwindow), versionStringStatus$
|
|
RETURN
|
|
|
|
checkvWatchPanelSize:
|
|
IF vWatchPanel.w < 40 THEN vWatchPanel.w = 40
|
|
IF vWatchPanel.w > idewx - 12 THEN vWatchPanel.w = idewx - 12
|
|
IF vWatchPanel.x + vWatchPanel.w > idewx - 1 THEN
|
|
vWatchPanel.w = (idewx - 1) - vWatchPanel.x
|
|
END IF
|
|
IF vWatchPanel.y + vWatchPanel.h > vWatchPanelLimit THEN
|
|
vWatchPanel.h = vWatchPanelLimit - (vWatchPanel.y - 1)
|
|
END IF
|
|
IF vWatchPanel.h < 5 THEN vWatchPanel.h = 5
|
|
IF vWatchPanel.h > idewy - 10 THEN vWatchPanel.h = idewy - 10
|
|
RETURN
|
|
END SUB
|
|
|
|
Function map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)
|
|
map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!
|
|
End Function
|
|
|
|
SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
|
|
STATIC previousVariableWatchList$
|
|
STATIC longestVarName, totalVisibleVariables
|
|
|
|
IF action = 1 THEN previousVariableWatchList$ = "": EXIT SUB 'reset
|
|
|
|
IF previousVariableWatchList$ <> variableWatchList$ THEN
|
|
'new setup
|
|
previousVariableWatchList$ = variableWatchList$
|
|
longestVarName = CVL(LEFT$(variableWatchList$, 4))
|
|
totalVisibleVariables = CVL(MID$(variableWatchList$, 5, 4))
|
|
this.h = totalVisibleVariables + 2
|
|
IF this.h > idewy - 10 THEN this.h = idewy - 10
|
|
IF this.h < 5 THEN this.h = 5
|
|
END IF
|
|
|
|
fg = 0: bg = 7
|
|
|
|
title$ = "Watch List"
|
|
IF LEN(currentScope$) THEN title$ = title$ + " - " + currentScope$
|
|
IF this.w < LEN(title$) + 4 THEN
|
|
this.w = LEN(title$) + 4
|
|
IF this.x + this.w + 2 > idewx THEN this.x = idewx - (this.w + 2)
|
|
END IF
|
|
|
|
IF WatchListToConsole = 0 THEN
|
|
vWatchPanelLimit = idewy - 6
|
|
|
|
IF this.x < 2 THEN this.x = 2
|
|
IF this.x + this.w > idewx - 1 THEN this.x = idewx - this.w - 1
|
|
IF this.y < 3 THEN this.y = 3
|
|
IF this.y > vWatchPanelLimit - (this.h - 1) THEN this.y = vWatchPanelLimit - (this.h - 1)
|
|
|
|
IF this.w < 40 THEN this.w = 40
|
|
IF this.w > idewx - 12 THEN this.w = idewx - 12
|
|
IF this.x + this.w > idewx - 1 THEN
|
|
this.w = (idewx - 1) - this.x
|
|
END IF
|
|
IF this.y + this.h > vWatchPanelLimit THEN
|
|
this.h = vWatchPanelLimit - (this.y - 1)
|
|
END IF
|
|
IF this.h < 5 THEN this.h = 5
|
|
IF this.h > idewy - 10 THEN this.h = idewy - 10
|
|
|
|
COLOR fg, bg
|
|
ideboxshadow this.x, this.y, this.w, this.h
|
|
COLOR 15, bg
|
|
_PRINTSTRING (this.x + this.w - 1, this.y + this.h - 1), CHR$(254) 'resize handle
|
|
|
|
x = LEN(title$) + 2
|
|
COLOR fg, bg
|
|
_PRINTSTRING (this.x + (this.w \ 2) - (x - 1) \ 2, this.y), " " + title$ + " "
|
|
COLOR 15, 4
|
|
_PRINTSTRING (this.x + this.w - 3, this.y), " x " 'close button
|
|
COLOR , bg
|
|
ELSE
|
|
_ECHO "-------- " + title$
|
|
END IF
|
|
|
|
y = 0
|
|
i = 0
|
|
shadowX = 0
|
|
shadowY = 0
|
|
shadowLength = 0
|
|
this.contentWidth = 0
|
|
IF this.hPos = 0 THEN this.hPos = 1
|
|
temp$ = GetBytes$("", 0) 'reset buffer
|
|
temp$ = MID$(variableWatchList$, 9)
|
|
actualLongestVarName = 0
|
|
displayFormatButton = 0
|
|
DO
|
|
temp2$ = GetBytes$(temp$, 4)
|
|
IF temp2$ <> MKL$(-1) THEN EXIT DO 'no more variables in list
|
|
tempIndex& = CVL(GetBytes$(temp$, 4))
|
|
tempTotalArrayIndexes& = CVL(GetBytes$(temp$, 4))
|
|
tempArrayIndexes$ = GetBytes$(temp$, tempTotalArrayIndexes&)
|
|
tempElement& = CVL(GetBytes$(temp$, 4))
|
|
tempElementOffset& = CVL(GetBytes$(temp$, 4))
|
|
tempStorage& = CVL(GetBytes$(temp$, 4))
|
|
|
|
i = i + 1
|
|
IF this.firstVisible > i AND WatchListToConsole = 0 THEN _CONTINUE
|
|
y = y + 1
|
|
IF y > this.h - 2 AND WatchListToConsole = 0 THEN EXIT DO
|
|
|
|
thisName$ = usedVariableList(tempIndex&).name
|
|
IF usedVariableList(tempIndex&).isarray THEN
|
|
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1)
|
|
tempTotalArrayIndexes& = tempTotalArrayIndexes& \ 4
|
|
FOR j = 1 TO tempTotalArrayIndexes&
|
|
thisName$ = thisName$ + LTRIM$(STR$(CVL(MID$(tempArrayIndexes$, j * 4 - 3, 4))))
|
|
IF j < tempTotalArrayIndexes& THEN thisName$ = thisName$ + ", "
|
|
NEXT
|
|
thisName$ = thisName$ + ")"
|
|
END IF
|
|
IF tempElement& THEN
|
|
tempElementList$ = MID$(usedVariableList(tempIndex&).elements, 5)
|
|
thisName$ = thisName$ + getelement$(tempElementList$, tempElement&)
|
|
END IF
|
|
IF LEN(thisName$) > actualLongestVarName THEN actualLongestVarName = LEN(thisName$)
|
|
item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = "
|
|
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
|
|
IF tempElement& THEN
|
|
tempVarType$ = getelement$(usedVariableList(tempIndex&).elementTypes, tempElement&)
|
|
ELSE
|
|
tempVarType$ = usedVariableList(tempIndex&).varType
|
|
END IF
|
|
thisIsAString = (INSTR(tempVarType$, "STRING *") > 0 OR tempVarType$ = "STRING")
|
|
tempValue$ = StrReplace$(vWatchReceivedData$(tempStorage&), CHR$(0), " ")
|
|
IF thisIsAString THEN
|
|
item$ = item$ + CHR$(34) + tempValue$ + CHR$(34)
|
|
IF displayFormatButton > 0 THEN displayFormatButton = 0
|
|
ELSE
|
|
IF displayFormatButton = 0 AND this.mY = this.y + y THEN displayFormatButton = LEN(item$) + 2
|
|
IF WatchListToConsole THEN displayFormatButton = 0
|
|
|
|
SELECT CASE usedVariableList(tempIndex&).displayFormat
|
|
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
|
|
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
|
|
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
|
|
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
|
|
END SELECT
|
|
item$ = item$ + tempValue$
|
|
END IF
|
|
COLOR fg
|
|
ELSE
|
|
item$ = item$ + "<out of scope>"
|
|
IF WatchListToConsole = 0 THEN COLOR 2
|
|
END IF
|
|
IF LEN(item$) > this.contentWidth THEN this.contentWidth = LEN(item$)
|
|
IF WatchListToConsole = 0 THEN
|
|
temp2$ = MID$(item$, this.hPos)
|
|
_PRINTSTRING (this.x + 2, this.y + y), LEFT$(temp2$, this.w - 4)
|
|
IF this.x + 2 + LEN(temp2$) > this.x + this.w - 2 THEN
|
|
_PRINTSTRING (this.x + this.w - 2, this.y + y), CHR$(26)
|
|
END IF
|
|
|
|
'show/highlight .displayFormat button
|
|
IF displayFormatButton > 0 AND displayFormatButton >= this.hPos AND _
|
|
this.x + displayFormatButton - this.hPos < this.x + this.w - 4 AND _
|
|
this.x + displayFormatButton - this.hPos > this.x + 1 THEN
|
|
COLOR 15
|
|
IF this.mY = this.y + y AND this.mX = this.x + displayFormatButton - this.hPos THEN
|
|
COLOR , 3
|
|
|
|
IF this.clicked = 2 THEN
|
|
this.clicked = 0 'indicate we handled the click here
|
|
usedVariableList(tempIndex&).displayFormat = usedVariableList(tempIndex&).displayFormat + 1
|
|
IF usedVariableList(tempIndex&).displayFormat > 3 THEN usedVariableList(tempIndex&).displayFormat = 0
|
|
END IF
|
|
END IF
|
|
_PRINTSTRING (this.x + displayFormatButton - this.hPos, this.mY), CHR$(29)
|
|
COLOR fg, bg
|
|
displayFormatButton = -1 'mark done
|
|
END IF
|
|
|
|
'find existing watchpoint for this variable/index/element
|
|
temp2$ = MKL$(tempIndex&) + MKL$(tempTotalArrayIndexes& * 4) + tempArrayIndexes$ + MKL$(tempElementOffset&)
|
|
j = 0
|
|
j = INSTR(j + 1, watchpointList$, MKL$(-1))
|
|
DO WHILE j
|
|
IF MID$(watchpointList$, j + 8, LEN(temp2$)) = temp2$ THEN EXIT DO
|
|
j = INSTR(j + 1, watchpointList$, MKL$(-1))
|
|
LOOP
|
|
|
|
IF j > 0 THEN
|
|
IF latestWatchpointMet& = tempIndex& THEN COLOR 15 ELSE COLOR 4
|
|
_PRINTSTRING (this.x + 1, this.y + y), CHR$(7) 'watchpoint bullet indicator
|
|
IF this.mX = this.x + 1 AND this.mY = this.y + y THEN
|
|
COLOR 15, 3
|
|
|
|
k = CVL(MID$(watchpointList$, j + 4, 4))
|
|
temp3$ = MID$(watchpointList$, j + 8, k)
|
|
k = CVI(RIGHT$(temp3$, 2))
|
|
condition$ = " Watchpoint: " + thisName$ + " " + MID$(temp3$, LEN(temp3$) - (2 + k) + 1, k) + " "
|
|
|
|
IF LEN(condition$) > idewx - 8 THEN
|
|
condition$ = LEFT$(condition$, idewx - 13) + STRING$(3, 250) + " "
|
|
END IF
|
|
k = this.x + 2
|
|
IF k + LEN(condition$) > idewx THEN k = idewx - (LEN(condition$) + 2)
|
|
|
|
_PRINTSTRING (k, this.y + y), condition$
|
|
|
|
shadowX = k
|
|
shadowY = this.y + y + 1
|
|
shadowLength = LEN(condition$)
|
|
END IF
|
|
COLOR fg, bg
|
|
END IF
|
|
ELSE
|
|
_ECHO item$
|
|
END IF
|
|
LOOP
|
|
longestVarName = actualLongestVarName 'if these are different, next time it'll be fixed
|
|
|
|
IF WatchListToConsole = 0 THEN
|
|
IF shadowLength THEN
|
|
'shadow for watchpoint popup
|
|
COLOR 2, 0
|
|
FOR x2 = shadowX + 2 TO shadowX + shadowLength
|
|
_PRINTSTRING (x2, shadowY), CHR$(SCREEN(shadowY, x2))
|
|
NEXT
|
|
END IF
|
|
|
|
IF totalVisibleVariables > this.h - 2 THEN
|
|
y = idevbar(this.x + this.w - 1, this.y + 1, this.h - 2, this.firstVisible, totalVisibleVariables - (this.h - 2) + 1)
|
|
IF this.draggingVBar = 0 THEN
|
|
this.vBarThumb = y
|
|
END IF
|
|
ELSE
|
|
this.vBarThumb = 0
|
|
this.firstVisible = 1
|
|
END IF
|
|
|
|
IF this.contentWidth > this.w - 4 THEN
|
|
x = idehbar(this.x, this.y + this.h - 1, this.w - 1, this.hPos, this.contentWidth - (this.w - 4) + 1)
|
|
IF this.draggingHBar = 0 THEN
|
|
this.hBarThumb = x
|
|
END IF
|
|
ELSE
|
|
this.hBarThumb = 0
|
|
this.hPos = 1
|
|
END IF
|
|
END IF
|
|
IF this.clicked = 2 THEN this.clicked = 0 'discard unhandled click
|
|
END SUB
|
|
|
|
FUNCTION multiSearch (__fullText$, __searchString$)
|
|
'Returns -1 if all of the search items in SearchString can be found
|
|
'in FullText$. Returns 0 if any of the search terms cannot be found.
|
|
'Multiple items in SearchString$ must be in the format "term1+term2+..."
|
|
'Not case-sensitive.
|
|
|
|
fullText$ = _TRIM$(UCASE$(__fullText$))
|
|
searchString$ = _TRIM$(UCASE$(__searchString$))
|
|
IF LEN(fullText$) = 0 THEN EXIT FUNCTION
|
|
IF LEN(searchString$) = 0 THEN EXIT FUNCTION
|
|
|
|
multiSearch = -1
|
|
findPlus = INSTR(searchString$, "+")
|
|
WHILE findPlus
|
|
thisTerm$ = LEFT$(searchString$, findPlus - 1)
|
|
searchString$ = MID$(searchString$, findPlus + 1)
|
|
IF INSTR(fullText$, thisTerm$) = 0 THEN multiSearch = 0: EXIT FUNCTION
|
|
findPlus = INSTR(searchString$, "+")
|
|
WEND
|
|
|
|
IF LEN(searchString$) THEN
|
|
IF INSTR(fullText$, searchString$) = 0 THEN multiSearch = 0
|
|
END IF
|
|
END FUNCTION
|
|
|
|
FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
returnAction = 0
|
|
mainmodule$ = "GLOBAL"
|
|
maxModuleNameLen = LEN(mainmodule$)
|
|
maxTypeLen = LEN("Type")
|
|
variableNameColor = 3
|
|
typeColumnColor = 15
|
|
selectedBG = 2
|
|
|
|
TYPE varDlgList
|
|
AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator, indicator2
|
|
AS _BYTE selected
|
|
AS STRING varType
|
|
END TYPE
|
|
|
|
REDIM varDlgList(1 TO totalVariablesCreated) AS varDlgList
|
|
|
|
'calculate longest module name, longest var name, longest type name
|
|
FOR x = 1 TO totalVariablesCreated
|
|
IF usedVariableList(x).includedLine THEN _CONTINUE 'don't deal with variables in $INCLUDEs
|
|
IF LEN(usedVariableList(x).subfunc) > maxModuleNameLen THEN
|
|
maxModuleNameLen = LEN(usedVariableList(x).subfunc)
|
|
END IF
|
|
|
|
IF LEN(usedVariableList(x).varType) > maxTypeLen THEN maxTypeLen = LEN(usedVariableList(x).varType)
|
|
NEXT
|
|
|
|
searchTerm$ = filter$
|
|
firstRun = -1
|
|
GOSUB buildList
|
|
firstRun = 0
|
|
dialogHeight = (totalMainVariablesCreated) + 7
|
|
listBuilt:
|
|
IF selectVar = -1 THEN GOTO generateVariableWatchList
|
|
|
|
i = 0
|
|
IF dialogHeight < lastUsedDialogHeight THEN dialogHeight = lastUsedDialogHeight
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
IF dialogHeight < 9 THEN dialogHeight = 9
|
|
|
|
dialogWidth = 6 + maxModuleNameLen + maxVarLen + maxTypeLen
|
|
IF IdeDebugMode > 0 THEN dialogWidth = dialogWidth + 40 'make room for "= values"
|
|
IF dialogWidth < 70 THEN dialogWidth = 70
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
idepar p, dialogWidth, dialogHeight, "Add Watch - Variable List"
|
|
|
|
i = i + 1: filterBox = i
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).y = 2
|
|
IF o(i).nam = 0 THEN o(i).nam = idenewtxt("#Filter (multiple+terms+accepted)")
|
|
IF o(i).txt = 0 THEN o(i).txt = idenewtxt(filter$)
|
|
|
|
i = i + 1: varListBox = i
|
|
o(varListBox).typ = 2
|
|
o(varListBox).y = 5
|
|
o(varListBox).w = dialogWidth - 4: o(i).h = dialogHeight - 7
|
|
IF o(varListBox).txt = 0 THEN o(varListBox).txt = idenewtxt(l$) ELSE idetxt(o(varListBox).txt) = l$
|
|
IF selectVar = 0 THEN selectVar = 1 ELSE focus = varListBox
|
|
o(varListBox).sel = selectVar
|
|
|
|
IF LEN(searchTerm$) THEN temp$ = ", filtered" ELSE temp$ = ""
|
|
idetxt(p.nam) = "Add Watch - Variable List (" + LTRIM$(STR$(totalVisibleVariables)) + temp$ + ")"
|
|
|
|
i = i + 1: buttonSet = i
|
|
o(buttonSet).typ = 3
|
|
o(buttonSet).y = dialogHeight
|
|
IF IdeDebugMode > 0 AND o(buttonSet).txt = 0 THEN
|
|
o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Send Value" + sep + "Add #Watchpoint" + sep + "#Close")
|
|
ELSE
|
|
o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Close")
|
|
END IF
|
|
|
|
lastUsedDialogHeight = dialogHeight
|
|
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
dlgUpdate:
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7
|
|
LOCATE p.y + 4, p.x + 2
|
|
PRINT "Double-click on an item to add it to the watch list:"
|
|
IF doubleClickThreshold > 0 AND doubleClickThreshold < p.w AND IdeDebugMode > 0 THEN
|
|
_PRINTSTRING (p.x + doubleClickThreshold, p.y + 5), CHR$(194)
|
|
_PRINTSTRING (p.x + doubleClickThreshold, p.y + p.h - 1), CHR$(193)
|
|
|
|
IF focus = varListBox AND o(varListBox).sel > 0 THEN
|
|
y = o(varListBox).sel
|
|
IF usedVariableList(varDlgList(y).index).watch <> 0 AND _
|
|
INSTR(usedVariableList(varDlgList(y).index).varType, "STRING *") = 0 AND _
|
|
usedVariableList(varDlgList(y).index).varType <> "STRING" THEN
|
|
COLOR 15, 3
|
|
y = o(varListBox).selY
|
|
_PRINTSTRING (p.x + doubleClickThreshold - 1, y), CHR$(29)
|
|
COLOR fg, bg
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
IF quickDlgUpdate THEN quickDlgUpdate = 0: RETURN
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus = filterBox THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
IF (focus = 3 AND info <> 0) THEN 'add all
|
|
FOR y = 1 TO totalVisibleVariables
|
|
varType$ = usedVariableList(varDlgList(y).index).varType
|
|
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT"
|
|
IF (usedVariableList(varDlgList(y).index).isarray AND LEN(usedVariableList(varDlgList(y).index).watchRange) = 0) OR _
|
|
INSTR(nativeDataTypes$, varType$) = 0 THEN _CONTINUE
|
|
usedVariableList(varDlgList(y).index).watch = -1
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+
|
|
NEXT
|
|
focus = filterBox
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (focus = 4 AND info <> 0) THEN 'remove all
|
|
FOR y = 1 TO totalVisibleVariables
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
|
|
NEXT
|
|
focus = filterBox
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (IdeDebugMode > 0 AND focus = 5 AND info <> 0) OR _
|
|
(IdeDebugMode > 0 AND focus = 6 AND info <> 0) THEN
|
|
'set address/add watchpoint
|
|
sendValue:
|
|
SELECT CASE focus
|
|
CASE 5
|
|
dlgTitle$ = "Change Value"
|
|
dlgPrompt$ = "#Index to change"
|
|
dlgPrompt2$ = "#New value"
|
|
thisReturnAction = 1
|
|
CASE 6
|
|
dlgTitle$ = "Add Watchpoint"
|
|
dlgPrompt$ = "#Index to monitor"
|
|
dlgPrompt2$ = "#Condition"
|
|
thisReturnAction = 2
|
|
END SELECT
|
|
|
|
y = ABS(o(varListBox).sel)
|
|
|
|
IF y >= 1 AND y <= totalVisibleVariables THEN
|
|
o(varListBox).sel = y
|
|
quickDlgUpdate = -1: GOSUB dlgUpdate
|
|
tempIndex& = varDlgList(y).index
|
|
IF (focus = 5 AND (usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "")) OR focus = 6 THEN
|
|
'scope is valid (or we're setting a watchpoint)
|
|
tempArrayIndex& = 0
|
|
tempArrayIndexes$ = MKL$(0)
|
|
|
|
tempStorage& = 0
|
|
IF LEN(usedVariableList(tempIndex&).storage) = 4 THEN
|
|
tempStorage& = CVL(usedVariableList(tempIndex&).storage)
|
|
ELSEIF LEN(usedVariableList(tempIndex&).storage) > 4 THEN
|
|
i = 4
|
|
DO
|
|
i = INSTR(i + 1, variableWatchList$, MKL$(-1) + MKL$(tempIndex&) + tempArrayIndexes$)
|
|
IF i = 0 THEN EXIT DO
|
|
IF MID$(variableWatchList$, i + 8 + LEN(tempArrayIndexes$), 4) = tempElementOffset$ THEN
|
|
'we found where this element's value is being stored
|
|
tempStorage& = CVL(MID$(variableWatchList$, i + 16 + LEN(tempArrayIndexes$), 4))
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
END IF
|
|
|
|
tempIsUDT& = 0
|
|
tempElementOffset$ = MKL$(0)
|
|
IF usedVariableList(tempIndex&).isarray THEN
|
|
setArrayRange3:
|
|
v$ = ideinputbox$(dlgTitle$, dlgPrompt$, temp$, "01234567890,", 45, 0, ok)
|
|
_KEYCLEAR
|
|
IF ok THEN
|
|
IF LEN(v$) > 0 THEN
|
|
WHILE RIGHT$(v$, 1) = ",": v$ = LEFT$(v$, LEN(v$) - 1): WEND
|
|
temp$ = lineformat$(v$)
|
|
i = countelements(temp$)
|
|
IF i <> ABS(ids(usedVariableList(tempIndex&).id).arrayelements) THEN
|
|
result = idemessagebox("Error", "Array has" + STR$(ABS(ids(usedVariableList(tempIndex&).id).arrayelements)) + " dimension(s).", "#OK")
|
|
_KEYCLEAR
|
|
temp$ = _TRIM$(v$)
|
|
GOTO setArrayRange3
|
|
END IF
|
|
tempArrayIndexes$ = MKL$(i * 4)
|
|
WHILE i
|
|
foundComma = INSTR(v$, ",")
|
|
IF foundComma THEN
|
|
temp$ = LEFT$(v$, foundComma - 1)
|
|
v$ = MID$(v$, foundComma + 1)
|
|
ELSE
|
|
temp$ = v$
|
|
END IF
|
|
tempArrayIndexes$ = tempArrayIndexes$ + MKL$(VAL(temp$))
|
|
i = i - 1
|
|
WEND
|
|
ELSE
|
|
_CONTINUE
|
|
END IF
|
|
ELSE
|
|
_CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
varType$ = usedVariableList(tempIndex&).varType
|
|
tempVarType$ = varType$
|
|
IF INSTR(varType$, "STRING *") THEN tempVarType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN tempVarType$ = "_BIT"
|
|
IF INSTR(nativeDataTypes$, tempVarType$) = 0 THEN
|
|
'It's a UDT
|
|
tempIsUDT& = -1
|
|
elementIndexes$ = ""
|
|
thisUDT = 0
|
|
E = 0
|
|
FOR i = 1 TO lasttype
|
|
IF RTRIM$(udtxcname(i)) = varType$ THEN thisUDT = i: EXIT FOR
|
|
NEXT
|
|
|
|
i = 0
|
|
DO
|
|
IF E = 0 THEN E = udtxnext(thisUDT) ELSE E = udtenext(E)
|
|
IF E = 0 THEN EXIT DO
|
|
elementIndexes$ = elementIndexes$ + MKL$(E)
|
|
i = i + 1
|
|
LOOP
|
|
PCOPY 0, 4
|
|
v$ = ideelementwatchbox$(usedVariableList(tempIndex&).name + ".", elementIndexes$, 0, -1, ok)
|
|
_KEYCLEAR
|
|
PCOPY 2, 0
|
|
PCOPY 2, 1
|
|
SCREEN , , 1, 0
|
|
IF ok = -2 THEN
|
|
getid usedVariableList(tempIndex&).id
|
|
IF id.t = 0 THEN
|
|
typ = id.arraytype AND 511
|
|
IF id.arraytype AND ISINCONVENTIONALMEMORY THEN
|
|
typ = typ - ISINCONVENTIONALMEMORY
|
|
END IF
|
|
|
|
usedVariableList(tempIndex&).arrayElementSize = udtxsize(typ)
|
|
IF udtxbytealign(typ) THEN
|
|
IF usedVariableList(tempIndex&).arrayElementSize MOD 8 THEN usedVariableList(tempIndex&).arrayElementSize = usedVariableList(tempIndex&).arrayElementSize + (8 - (usedVariableList(tempIndex&).arrayElementSize MOD 8)) 'round up to nearest byte
|
|
usedVariableList(tempIndex&).arrayElementSize = usedVariableList(tempIndex&).arrayElementSize \ 8
|
|
END IF
|
|
ELSE
|
|
usedVariableList(tempIndex&).arrayElementSize = 0
|
|
END IF
|
|
|
|
temp$ = v$
|
|
IF numelements(temp$) <> 1 THEN
|
|
'shouldn't ever happen
|
|
result = idemessagebox("Error", "Only one UDT element can be selected at a time", "#OK")
|
|
_KEYCLEAR
|
|
_CONTINUE
|
|
END IF
|
|
|
|
v$ = getelement$(temp$, 1)
|
|
|
|
'-------
|
|
v$ = lineformat$(UCASE$(v$))
|
|
Error_Happened = 0
|
|
result$ = udtreference$("", v$, typ)
|
|
IF Error_Happened THEN
|
|
'shouldn't ever happen
|
|
Error_Happened = 0
|
|
result = idemessagebox("Error", Error_Message, "#OK")
|
|
_KEYCLEAR
|
|
_CONTINUE
|
|
ELSE
|
|
typ = typ - ISUDT
|
|
typ = typ - ISREFERENCE
|
|
IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY
|
|
SELECT CASE typ
|
|
CASE BYTETYPE
|
|
varType$ = "_BYTE"
|
|
CASE UBYTETYPE
|
|
varType$ = "_UNSIGNED _BYTE"
|
|
CASE INTEGERTYPE
|
|
varType$ = "INTEGER"
|
|
CASE UINTEGERTYPE
|
|
varType$ = "_UNSIGNED INTEGER"
|
|
CASE LONGTYPE
|
|
varType$ = "LONG"
|
|
CASE ULONGTYPE
|
|
varType$ = "_UNSIGNED LONG"
|
|
CASE INTEGER64TYPE
|
|
varType$ = "_INTEGER64"
|
|
CASE UINTEGER64TYPE
|
|
varType$ = "_UNSIGNED _INTEGER64"
|
|
CASE SINGLETYPE
|
|
varType$ = "SINGLE"
|
|
CASE DOUBLETYPE
|
|
varType$ = "DOUBLE"
|
|
CASE FLOATTYPE
|
|
varType$ = "_FLOAT"
|
|
CASE OFFSETTYPE
|
|
varType$ = "_OFFSET"
|
|
CASE UOFFSETTYPE
|
|
varType$ = "_UNSIGNED _OFFSET"
|
|
CASE ELSE
|
|
IF typ AND ISSTRING THEN
|
|
IF (typ AND ISFIXEDLENGTH) = 0 THEN
|
|
varType$ = "STRING"
|
|
ELSE
|
|
'E contains the UDT element index at this point
|
|
varType$ = "STRING *" + STR$(udtetypesize(E))
|
|
END IF
|
|
ELSE
|
|
'shouldn't ever happen
|
|
result = idemessagebox("Error", "Cannot select full UDT", "#OK")
|
|
_KEYCLEAR
|
|
GOTO dlgLoop
|
|
END IF
|
|
END SELECT
|
|
tempElementOffset$ = MKL$(VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)))
|
|
END IF
|
|
'-------
|
|
ELSE
|
|
_CONTINUE
|
|
END IF
|
|
END IF
|
|
storageSlot& = 0
|
|
IF LEN(usedVariableList(tempIndex&).storage) = 4 THEN
|
|
storageSlot& = CVL(usedVariableList(tempIndex&).storage)
|
|
ELSEIF LEN(usedVariableList(tempIndex&).storage) > 4 THEN
|
|
i = 4
|
|
DO
|
|
i = INSTR(i + 1, variableWatchList$, MKL$(-1) + MKL$(tempIndex&) + tempArrayIndexes$)
|
|
IF i = 0 THEN EXIT DO
|
|
IF MID$(variableWatchList$, i + 8 + LEN(tempArrayIndexes$), 4) = tempElementOffset$ THEN
|
|
'we found where this element's value is being stored
|
|
storageSlot& = CVL(MID$(variableWatchList$, i + 16 + LEN(tempArrayIndexes$), 4))
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
END IF
|
|
a2$ = ""
|
|
IF storageSlot& > 0 AND focus = 5 THEN
|
|
a2$ = vWatchReceivedData$(storageSlot&)
|
|
ELSEIF focus = 6 THEN
|
|
'find existing watchpoint for this variable/index/element
|
|
temp$ = MKL$(tempIndex&) + tempArrayIndexes$ + tempElementOffset$
|
|
i = 0
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
DO WHILE i
|
|
IF MID$(watchpointList$, i + 8, LEN(temp$)) = temp$ THEN EXIT DO
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
LOOP
|
|
|
|
IF i > 0 THEN
|
|
j = CVL(MID$(watchpointList$, i + 4, 4))
|
|
temp$ = MID$(watchpointList$, i + 8, j)
|
|
j = CVI(RIGHT$(temp$, 2))
|
|
a2$ = MID$(temp$, LEN(temp$) - (2 + j) + 1, j)
|
|
END IF
|
|
END IF
|
|
IF INSTR(varType$, "STRING") THEN
|
|
thisWidth = idewx - 20
|
|
ELSE
|
|
thisWidth = 45
|
|
SELECT CASE usedVariableList(tempIndex&).displayFormat
|
|
CASE 1: a2$ = "&H" + HEX$(VAL(a2$))
|
|
CASE 2: a2$ = "&B" + _BIN$(VAL(a2$))
|
|
CASE 3: a2$ = "&O" + OCT$(VAL(a2$))
|
|
END SELECT
|
|
END IF
|
|
getNewValueInput:
|
|
v$ = ideinputbox$(dlgTitle$, dlgPrompt2$, a2$, "", thisWidth, 0, ok)
|
|
_KEYCLEAR
|
|
IF ok THEN
|
|
IF focus = 6 THEN
|
|
'validate condition string first
|
|
v$ = LTRIM$(v$)
|
|
IF LEN(v$) < 2 THEN
|
|
result = idemessagebox(dlgTitle$, "Watchpoint cleared.", "#OK")
|
|
_KEYCLEAR
|
|
v$ = ""
|
|
thisReturnAction = 3 'remove watchpoint for this variable
|
|
ELSE
|
|
StartWatchPointEval:
|
|
op1$ = LEFT$(v$, 1)
|
|
op2$ = MID$(v$, 2, 1)
|
|
SELECT CASE op1$
|
|
CASE "="
|
|
IF op2$ = "<" OR op2$ = ">" THEN
|
|
MID$(v$, 1, 2) = op2$ + "="
|
|
GOTO StartWatchPointEval
|
|
END IF
|
|
op$ = "="
|
|
actualValue$ = _TRIM$(MID$(v$, 2))
|
|
CASE ">"
|
|
IF op2$ = "<" OR op2$ = ">" THEN
|
|
result = idemessagebox(dlgTitle$, "Invalid expression.\nYou can use =, <>, >, >=, <, <=, and a literal value", "#OK")
|
|
_KEYCLEAR
|
|
GOTO getNewValueInput
|
|
END IF
|
|
IF op2$ = "=" THEN
|
|
op$ = ">="
|
|
actualValue$ = _TRIM$(MID$(v$, 3))
|
|
ELSE
|
|
op$ = ">"
|
|
actualValue$ = _TRIM$(MID$(v$, 2))
|
|
END IF
|
|
CASE "<"
|
|
IF op2$ = ">" OR op2$ = "=" THEN
|
|
op$ = "<" + op2$
|
|
actualValue$ = _TRIM$(MID$(v$, 3))
|
|
ELSE
|
|
op$ = "<"
|
|
actualValue$ = _TRIM$(MID$(v$, 2))
|
|
END IF
|
|
CASE ELSE
|
|
result = idemessagebox(dlgTitle$, "Invalid expression.\nYou can use =, <>, >, >=, <, <=, and a literal value", "#OK")
|
|
_KEYCLEAR
|
|
GOTO getNewValueInput
|
|
END SELECT
|
|
END IF
|
|
|
|
IF thisReturnAction <> 3 THEN
|
|
IF INSTR(varType$, "STRING") = 0 THEN
|
|
v$ = op$ + actualValue$
|
|
IF v$ <> op$ + LTRIM$(STR$(VAL(actualValue$))) THEN
|
|
result = idemessagebox(dlgTitle$, "Invalid expression.\nYou can use =, <>, >, >=, <, <=, and a literal value\n(scientific notation not allowed).", "#OK")
|
|
_KEYCLEAR
|
|
GOTO getNewValueInput
|
|
END IF
|
|
END IF
|
|
|
|
v$ = op$ + " " + actualValue$ 'just to prettify it
|
|
END IF
|
|
END IF
|
|
|
|
cmd$ = ""
|
|
cmd$ = cmd$ + MKL$(tempIndex&)
|
|
cmd$ = cmd$ + _MK$(_BYTE, usedVariableList(tempIndex&).isarray)
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).linenumber)
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex)
|
|
cmd$ = cmd$ + tempArrayIndexes$
|
|
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize)
|
|
cmd$ = cmd$ + MKL$(tempIsUDT&)
|
|
cmd$ = cmd$ + MKL$(tempElement&)
|
|
cmd$ = cmd$ + tempElementOffset$
|
|
cmd$ = cmd$ + MKL$(0)
|
|
cmd$ = cmd$ + MKL$(tempStorage&)
|
|
cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc))
|
|
cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc
|
|
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
|
|
cmd$ = cmd$ + MKI$(LEN(v$)) + v$
|
|
idevariablewatchbox$ = cmd$
|
|
|
|
IF thisReturnAction = 2 OR thisReturnAction = 3 THEN
|
|
'find existing watchpoint for the same variable/index/element
|
|
temp$ = MKL$(tempIndex&) + tempArrayIndexes$ + tempElementOffset$
|
|
i = 0
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
DO WHILE i
|
|
IF MID$(watchpointList$, i + 8, LEN(temp$)) = temp$ THEN EXIT DO
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
LOOP
|
|
|
|
IF i > 0 THEN
|
|
'remove it
|
|
j = CVL(MID$(watchpointList$, i + 4, 4))
|
|
watchpointList$ = LEFT$(watchpointList$, i - 1) + MID$(watchpointList$, i + j + 8)
|
|
END IF
|
|
END IF
|
|
|
|
IF thisReturnAction = 2 THEN
|
|
'add watchpoint
|
|
temp$ = temp$ + v$ + MKI$(LEN(v$))
|
|
watchpointList$ = watchpointList$ + MKL$(-1) + MKL$(LEN(temp$)) + temp$
|
|
END IF
|
|
|
|
returnAction = thisReturnAction 'actually send command
|
|
ELSE
|
|
returnAction = -1 'redraw and carry on
|
|
END IF
|
|
selectVar = y
|
|
EXIT FUNCTION
|
|
ELSE
|
|
result = idemessagebox(dlgTitle$, "Variable is out of scope.", "#OK")
|
|
_KEYCLEAR
|
|
END IF
|
|
ELSE
|
|
result = idemessagebox(dlgTitle$, "Select a variable first.", "#OK")
|
|
_KEYCLEAR
|
|
END IF
|
|
focus = filterBox
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (IdeDebugMode = 0 AND focus = 5 AND info <> 0) OR _
|
|
(IdeDebugMode > 0 AND focus = 7 AND info <> 0) THEN
|
|
generateVariableWatchList:
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "" 'used in case this program is edited in the same session
|
|
backupTypeDefinitions$ = typeDefinitions$ 'store current TYPE definitions for later comparison
|
|
longestVarName = 0
|
|
nextvWatchDataSlot = 0
|
|
totalVisibleVariables = 0
|
|
totalSelectedVariables = 0
|
|
msg$ = ""
|
|
FOR y = 1 TO totalVariablesCreated
|
|
IF selectVar = -1 THEN
|
|
IF msg$ = "" THEN
|
|
msg$ = "Analyzing Variable List..."
|
|
idepar p, 60, 1, msg$
|
|
END IF
|
|
|
|
idedrawpar p
|
|
COLOR 0, 7
|
|
c = totalVariablesCreated
|
|
n = y
|
|
|
|
maxprogresswidth = 52 'arbitrary
|
|
percentage = INT(n / c * 100)
|
|
percentagechars = INT(maxprogresswidth * n / c)
|
|
percentageMsg$ = STRING$(percentagechars, 219) + STRING$(maxprogresswidth - percentagechars, 176) + STR$(percentage) + "%"
|
|
_PRINTSTRING (p.x + (p.w \ 2 - LEN(percentageMsg$) \ 2) + 1, p.y + 1), percentageMsg$
|
|
|
|
PCOPY 1, 0
|
|
END IF
|
|
|
|
IF usedVariableList(y).includedLine THEN _CONTINUE 'don't deal with variables in $INCLUDEs
|
|
|
|
totalSelectedVariables = totalSelectedVariables + 1
|
|
backupVariableWatchList$ = backupVariableWatchList$ + MKL$(-1)
|
|
backupVariableWatchList$ = backupVariableWatchList$ + MKL$(LEN(usedVariableList(y).cname)) + usedVariableList(y).cname
|
|
backupVariableWatchList$ = backupVariableWatchList$ + MKL$(totalSelectedVariables)
|
|
WHILE totalSelectedVariables > UBOUND(backupUsedVariableList)
|
|
REDIM _PRESERVE backupUsedVariableList(totalSelectedVariables + 999) AS usedVarList
|
|
WEND
|
|
backupUsedVariableList(totalSelectedVariables) = usedVariableList(y)
|
|
|
|
usedVariableList(y).storage = ""
|
|
IF usedVariableList(y).watch THEN
|
|
thisLen = LEN(usedVariableList(y).name)
|
|
IF usedVariableList(y).isarray THEN
|
|
thisLen = thisLen + LEN(usedVariableList(y).watchRange)
|
|
END IF
|
|
|
|
IF LEN(usedVariableList(y).elements) THEN
|
|
thisLen = thisLen + CVL(LEFT$(usedVariableList(y).elements, 4))
|
|
END IF
|
|
|
|
IF thisLen > longestVarName THEN
|
|
longestVarName = thisLen
|
|
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(8)
|
|
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
|
|
END IF
|
|
|
|
IF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) = 0 THEN
|
|
'array of native data type
|
|
temp$ = GetBytes$("", 0) 'reset buffer
|
|
temp$ = expandArray$(usedVariableList(y).indexes, "")
|
|
DO
|
|
temp2$ = GetBytes$(temp$, 4)
|
|
IF LEN(temp2$) <> 4 THEN EXIT DO 'no more items
|
|
length = CVL(temp2$)
|
|
temp2$ = MKL$(length) + GetBytes$(temp$, length)
|
|
nextvWatchDataSlot = nextvWatchDataSlot + 1
|
|
WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
|
|
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
|
|
WEND
|
|
variableWatchList$ = variableWatchList$ + MKL$(-1) + MKL$(y) + temp2$ + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
|
|
totalVisibleVariables = totalVisibleVariables + 1
|
|
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
|
|
vWatchReceivedData$(nextvWatchDataSlot) = ""
|
|
LOOP
|
|
ELSEIF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) > 0 THEN
|
|
'array of UDT
|
|
temp$ = GetBytes$("", 0)
|
|
temp$ = expandArray$(usedVariableList(y).indexes, "")
|
|
DO
|
|
temp2$ = GetBytes$(temp$, 4)
|
|
IF LEN(temp2$) <> 4 THEN EXIT DO 'no more items
|
|
length = CVL(temp2$)
|
|
temp2$ = MKL$(length) + GetBytes$(temp$, length)
|
|
|
|
thisTempElement$ = MKL$(-1) + MKL$(y) + temp2$
|
|
thisElementList$ = MID$(usedVariableList(y).elements, 5)
|
|
i = 0
|
|
DO
|
|
i = i + 1
|
|
temp2$ = getelement$(thisElementList$, i)
|
|
IF temp2$ = "" THEN EXIT DO
|
|
|
|
nextvWatchDataSlot = nextvWatchDataSlot + 1
|
|
WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
|
|
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
|
|
WEND
|
|
tempElementOffset& = CVL(MID$(usedVariableList(y).elementOffset, i * 4 - 3, 4))
|
|
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(tempElementOffset&) + MKL$(nextvWatchDataSlot)
|
|
totalVisibleVariables = totalVisibleVariables + 1
|
|
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
|
|
vWatchReceivedData$(nextvWatchDataSlot) = ""
|
|
LOOP
|
|
LOOP
|
|
ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) > 0 THEN
|
|
'single variable of UDT
|
|
thisTempElement$ = MKL$(-1) + MKL$(y) + MKL$(0)
|
|
thisElementList$ = MID$(usedVariableList(y).elements, 5)
|
|
i = 0
|
|
DO
|
|
i = i + 1
|
|
temp2$ = getelement$(thisElementList$, i)
|
|
IF temp2$ = "" THEN EXIT DO
|
|
|
|
nextvWatchDataSlot = nextvWatchDataSlot + 1
|
|
WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
|
|
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
|
|
WEND
|
|
tempElementOffset& = CVL(MID$(usedVariableList(y).elementOffset, i * 4 - 3, 4))
|
|
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(tempElementOffset&) + MKL$(nextvWatchDataSlot)
|
|
totalVisibleVariables = totalVisibleVariables + 1
|
|
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
|
|
vWatchReceivedData$(nextvWatchDataSlot) = ""
|
|
LOOP
|
|
ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) = 0 THEN
|
|
'single variable
|
|
nextvWatchDataSlot = nextvWatchDataSlot + 1
|
|
WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
|
|
REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
|
|
WEND
|
|
variableWatchList$ = variableWatchList$ + MKL$(-1) + MKL$(y) + MKL$(0) + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
|
|
totalVisibleVariables = totalVisibleVariables + 1
|
|
usedVariableList(y).storage = MKL$(nextvWatchDataSlot)
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
IF LEN(variableWatchList$) THEN MID$(variableWatchList$, 5, 4) = MKL$(totalVisibleVariables)
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF mCLICK AND focus = 2 THEN 'list click
|
|
IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(varListBox).sel THEN
|
|
IF doubleClickThreshold > 0 AND mX >= p.x + doubleClickThreshold AND IdeDebugMode > 0 THEN
|
|
focus = 5
|
|
GOTO sendValue
|
|
ELSEIF (doubleClickThreshold > 0 AND mX < p.x + doubleClickThreshold - 1 AND IdeDebugMode > 0) OR _
|
|
IdeDebugMode = 0 THEN
|
|
GOTO toggleWatch
|
|
END IF
|
|
ELSEIF clickedItem = o(varListBox).sel THEN
|
|
IF doubleClickThreshold > 0 AND mX = p.x + doubleClickThreshold - 1 AND IdeDebugMode > 0 THEN
|
|
y = ABS(o(varListBox).sel)
|
|
IF INSTR(usedVariableList(varDlgList(y).index).varType, "STRING *") = 0 AND usedVariableList(varDlgList(y).index).varType <> "STRING" THEN
|
|
usedVariableList(varDlgList(y).index).displayFormat = usedVariableList(varDlgList(y).index).displayFormat + 1
|
|
IF usedVariableList(varDlgList(y).index).displayFormat > 3 THEN
|
|
usedVariableList(varDlgList(y).index).displayFormat = 0
|
|
END IF
|
|
GOSUB buildList
|
|
idetxt(o(varListBox).txt) = l$
|
|
END IF
|
|
END IF
|
|
END IF
|
|
lastClick! = TIMER
|
|
IF o(varListBox).sel > 0 THEN clickedItem = o(varListBox).sel
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 2) THEN
|
|
K$ = ""
|
|
toggleWatch:
|
|
y = ABS(o(varListBox).sel)
|
|
|
|
IF y >= 1 AND y <= totalVisibleVariables THEN
|
|
o(varListBox).sel = y
|
|
quickDlgUpdate = -1: GOSUB dlgUpdate
|
|
y = o(varListBox).sel 'reset y, as it may get messed up in the GOSUB above
|
|
IF usedVariableList(varDlgList(y).index).watch <> 0 AND usedVariableList(varDlgList(y).index).isarray THEN
|
|
GOTO setArrayRange
|
|
END IF
|
|
usedVariableList(varDlgList(y).index).watch = NOT usedVariableList(varDlgList(y).index).watch
|
|
IF usedVariableList(varDlgList(y).index).watch THEN
|
|
IF usedVariableList(varDlgList(y).index).isarray THEN
|
|
setArrayRange:
|
|
temp$ = ""
|
|
IF LEN(usedVariableList(varDlgList(y).index).indexes) THEN
|
|
temp$ = usedVariableList(varDlgList(y).index).watchRange
|
|
END IF
|
|
setArrayRange2:
|
|
v$ = ideinputbox$("Watch Array", "#Indexes" + tempPrompt$, temp$, "01234567890,-; TOto", 45, 0, ok)
|
|
IF ok THEN
|
|
IF LEN(v$) > 0 THEN
|
|
v$ = UCASE$(v$)
|
|
v$ = StrReplace$(v$, " TO ", "-")
|
|
WHILE RIGHT$(v$, 1) = ",": v$ = LEFT$(v$, LEN(v$) - 1): WEND
|
|
temp$ = lineformat$(v$)
|
|
i = countelements(temp$)
|
|
IF i <> ABS(ids(usedVariableList(varDlgList(y).index).id).arrayelements) THEN
|
|
result = idemessagebox("Error", "Array has" + STR$(ABS(ids(usedVariableList(varDlgList(y).index).id).arrayelements)) + " dimension(s).", "#OK")
|
|
temp$ = _TRIM$(v$)
|
|
GOTO setArrayRange2
|
|
END IF
|
|
usedVariableList(varDlgList(y).index).indexes = ""
|
|
usedVariableList(varDlgList(y).index).watchRange = ""
|
|
WHILE i
|
|
foundComma = INSTR(v$, ",")
|
|
IF foundComma THEN
|
|
temp$ = LEFT$(v$, foundComma - 1)
|
|
v$ = MID$(v$, foundComma + 1)
|
|
ELSE
|
|
temp$ = v$
|
|
END IF
|
|
temp$ = parseRange$(temp$)
|
|
usedVariableList(varDlgList(y).index).indexes = usedVariableList(varDlgList(y).index).indexes + MKL$(LEN(temp$)) + temp$
|
|
temp$ = formatRange$(temp$)
|
|
usedVariableList(varDlgList(y).index).watchRange = usedVariableList(varDlgList(y).index).watchRange + temp$
|
|
i = i - 1
|
|
IF i THEN usedVariableList(varDlgList(y).index).watchRange = usedVariableList(varDlgList(y).index).watchRange + ","
|
|
WEND
|
|
ELSE
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
GOSUB buildList
|
|
idetxt(o(varListBox).txt) = l$
|
|
GOTO unWatch
|
|
END IF
|
|
GOSUB buildList
|
|
idetxt(o(varListBox).txt) = l$
|
|
ELSE
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
GOTO unWatch
|
|
END IF
|
|
|
|
END IF
|
|
|
|
varType$ = usedVariableList(varDlgList(y).index).varType
|
|
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT"
|
|
IF INSTR(nativeDataTypes$, varType$) = 0 THEN
|
|
'It's a UDT
|
|
elementIndexes$ = ""
|
|
thisUDT = 0
|
|
E = 0
|
|
FOR i = 1 TO lasttype
|
|
IF RTRIM$(udtxcname(i)) = varType$ THEN thisUDT = i: EXIT FOR
|
|
NEXT
|
|
|
|
i = 0
|
|
DO
|
|
IF E = 0 THEN E = udtxnext(thisUDT) ELSE E = udtenext(E)
|
|
IF E = 0 THEN EXIT DO
|
|
elementIndexes$ = elementIndexes$ + MKL$(E)
|
|
i = i + 1
|
|
LOOP
|
|
PCOPY 0, 4
|
|
v$ = ideelementwatchbox$(usedVariableList(varDlgList(y).index).name + ".", elementIndexes$, 0, 0, ok)
|
|
PCOPY 2, 0
|
|
PCOPY 2, 1
|
|
SCREEN , , 1, 0
|
|
IF ok THEN
|
|
longestElementName = 0
|
|
usedVariableList(varDlgList(y).index).elements = ""
|
|
usedVariableList(varDlgList(y).index).elementTypes = ""
|
|
usedVariableList(varDlgList(y).index).elementOffset = ""
|
|
getid usedVariableList(varDlgList(y).index).id
|
|
IF id.t = 0 THEN
|
|
typ = id.arraytype AND 511
|
|
IF id.arraytype AND ISINCONVENTIONALMEMORY THEN
|
|
typ = typ - ISINCONVENTIONALMEMORY
|
|
END IF
|
|
|
|
usedVariableList(varDlgList(y).index).arrayElementSize = udtxsize(typ)
|
|
IF udtxbytealign(typ) THEN
|
|
IF usedVariableList(varDlgList(y).index).arrayElementSize MOD 8 THEN usedVariableList(varDlgList(y).index).arrayElementSize = usedVariableList(varDlgList(y).index).arrayElementSize + (8 - (usedVariableList(varDlgList(y).index).arrayElementSize MOD 8)) 'round up to nearest byte
|
|
usedVariableList(varDlgList(y).index).arrayElementSize = usedVariableList(varDlgList(y).index).arrayElementSize \ 8
|
|
END IF
|
|
ELSE
|
|
usedVariableList(varDlgList(y).index).arrayElementSize = 0
|
|
END IF
|
|
|
|
temp$ = v$
|
|
i = 0
|
|
DO
|
|
i = i + 1
|
|
v$ = getelement$(temp$, i)
|
|
IF LEN(v$) = 0 THEN EXIT DO
|
|
|
|
'-------
|
|
IF LEN(v$) > longestElementName THEN longestElementName = LEN(v$)
|
|
IF LEN(usedVariableList(varDlgList(y).index).elements) = 0 THEN
|
|
usedVariableList(varDlgList(y).index).elements = MKL$(longestElementName)
|
|
ELSE
|
|
MID$(usedVariableList(varDlgList(y).index).elements, 1, 4) = MKL$(longestElementName)
|
|
END IF
|
|
usedVariableList(varDlgList(y).index).elements = usedVariableList(varDlgList(y).index).elements + v$ + sp
|
|
v$ = lineformat$(UCASE$(v$))
|
|
Error_Happened = 0
|
|
result$ = udtreference$("", v$, typ)
|
|
IF Error_Happened THEN
|
|
'shouldn't ever happen
|
|
Error_Happened = 0
|
|
result = idemessagebox("Error", Error_Message, "#OK")
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
usedVariableList(varDlgList(y).index).elements = ""
|
|
usedVariableList(varDlgList(y).index).elementTypes = ""
|
|
usedVariableList(varDlgList(y).index).elementOffset = ""
|
|
GOTO unWatch
|
|
ELSE
|
|
typ = typ - ISUDT
|
|
typ = typ - ISREFERENCE
|
|
IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY
|
|
SELECT CASE typ
|
|
CASE BYTETYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_BYTE" + sp
|
|
CASE UBYTETYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _BYTE" + sp
|
|
CASE INTEGERTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "INTEGER" + sp
|
|
CASE UINTEGERTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED INTEGER" + sp
|
|
CASE LONGTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "LONG" + sp
|
|
CASE ULONGTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED LONG" + sp
|
|
CASE INTEGER64TYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_INTEGER64" + sp
|
|
CASE UINTEGER64TYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _INTEGER64" + sp
|
|
CASE SINGLETYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "SINGLE" + sp
|
|
CASE DOUBLETYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "DOUBLE" + sp
|
|
CASE FLOATTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_FLOAT" + sp
|
|
CASE OFFSETTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_OFFSET" + sp
|
|
CASE UOFFSETTYPE
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _OFFSET" + sp
|
|
CASE ELSE
|
|
IF typ AND ISSTRING THEN
|
|
IF (typ AND ISFIXEDLENGTH) = 0 THEN
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "STRING" + sp
|
|
ELSE
|
|
'E contains the UDT element index at this point
|
|
usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "STRING *" + STR$(udtetypesize(E)) + sp
|
|
END IF
|
|
ELSE
|
|
'shouldn't ever happen
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
usedVariableList(varDlgList(y).index).elements = ""
|
|
usedVariableList(varDlgList(y).index).elementTypes = ""
|
|
usedVariableList(varDlgList(y).index).elementOffset = ""
|
|
result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK")
|
|
GOTO unWatch
|
|
END IF
|
|
END SELECT
|
|
usedVariableList(varDlgList(y).index).elementOffset = usedVariableList(varDlgList(y).index).elementOffset + MKL$(VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)))
|
|
END IF
|
|
'-------
|
|
LOOP
|
|
'remove trailing sp:
|
|
usedVariableList(varDlgList(y).index).elements = LEFT$(usedVariableList(varDlgList(y).index).elements, LEN(usedVariableList(varDlgList(y).index).elements) - 1)
|
|
usedVariableList(varDlgList(y).index).elementTypes = LEFT$(usedVariableList(varDlgList(y).index).elementTypes, LEN(usedVariableList(varDlgList(y).index).elementTypes) - 1)
|
|
ELSE
|
|
usedVariableList(varDlgList(y).index).watch = 0
|
|
GOTO unWatch
|
|
END IF
|
|
END IF
|
|
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+
|
|
ELSE
|
|
unWatch:
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
|
|
END IF
|
|
END IF
|
|
'focus = filterBox
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF focus = 2 AND (UCASE$(K$) = "C" AND KCTRL <> 0) THEN
|
|
GOSUB copyList
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF focus = varListBox AND (K$ >= " " AND K$ <= CHR$(126)) THEN
|
|
focus = filterBox
|
|
PrevFocus = focus
|
|
idetxt(o(focus).txt) = K$
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = 0
|
|
searchTerm$ = ""
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF focus = filterBox AND (KB = 18432 OR KB = 20480) THEN 'up/down arrow
|
|
focus = varListBox
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF focus = filterBox AND idetxt(o(filterBox).txt) <> searchTerm$ THEN
|
|
filter$ = idetxt(o(filterBox).txt)
|
|
searchTerm$ = UCASE$(filter$)
|
|
'rebuild filtered list
|
|
GOSUB buildList
|
|
idetxt(o(varListBox).txt) = l$
|
|
o(varListBox).sel = 0 'reset visible list to the first item
|
|
IF LEN(searchTerm$) THEN temp$ = ", filtered" ELSE temp$ = ""
|
|
idetxt(p.nam) = "Add Watch - Variable List (" + LTRIM$(STR$(totalVisibleVariables)) + temp$ + ")"
|
|
END IF
|
|
|
|
dlgLoop:
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
idevariablewatchbox$ = ""
|
|
EXIT FUNCTION
|
|
|
|
copyList:
|
|
temp$ = ""
|
|
IF ideprogname = "" THEN
|
|
ProposedTitle$ = FindProposedTitle$
|
|
IF ProposedTitle$ = "" THEN
|
|
temp$ = "QB64 - Variable List Report: untitled" + tempfolderindexstr$ + ".bas" + CHR$(10)
|
|
ELSE
|
|
temp$ = "QB64 - Variable List Report: " + ProposedTitle$ + ".bas" + CHR$(10)
|
|
END IF
|
|
ELSE
|
|
temp$ = "QB64 - Variable List Report: " + ideprogname$ + CHR$(10)
|
|
END IF
|
|
|
|
FOR x = 1 TO totalVariablesCreated
|
|
IF usedVariableList(x).includedLine THEN _CONTINUE 'don't add variables in $INCLUDEs
|
|
|
|
IF LEN(searchTerm$) THEN
|
|
thisScope$ = usedVariableList(x).subfunc
|
|
IF thisScope$ = "" THEN thisScope$ = mainmodule$
|
|
item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$
|
|
IF multiSearch(item$, searchTerm$) = 0 THEN
|
|
_CONTINUE 'skip variable if no field matches the search
|
|
END IF
|
|
END IF
|
|
|
|
temp$ = temp$ + usedVariableList(x).name + " "
|
|
temp$ = temp$ + SPACE$(maxVarLen - LEN(usedVariableList(x).name))
|
|
temp$ = temp$ + " " + usedVariableList(x).varType + SPACE$(maxTypeLen - LEN(usedVariableList(x).varType))
|
|
|
|
l3$ = SPACE$(2)
|
|
IF LEN(usedVariableList(x).subfunc) > 0 THEN
|
|
l3$ = l3$ + usedVariableList(x).subfunc + SPACE$(maxModuleNameLen - LEN(usedVariableList(x).subfunc)) + CHR$(10)
|
|
ELSE
|
|
l3$ = l3$ + mainmodule$ + SPACE$(maxModuleNameLen - LEN(mainmodule$)) + CHR$(10)
|
|
END IF
|
|
|
|
temp$ = temp$ + l3$
|
|
NEXT
|
|
_CLIPBOARD$ = temp$
|
|
RETURN
|
|
|
|
buildList:
|
|
maxVarLen = LEN("Variable")
|
|
FOR x = 1 TO totalVariablesCreated
|
|
IF usedVariableList(x).includedLine THEN _CONTINUE 'don't deal with variables in $INCLUDEs
|
|
thisLen = LEN(usedVariableList(x).name) + 3 'extra room for the eventual bullet
|
|
IF LEN(usedVariableList(x).watchRange) > 0 THEN
|
|
thisLen = thisLen + LEN(usedVariableList(x).watchRange)
|
|
END IF
|
|
IF thisLen > maxVarLen THEN maxVarLen = thisLen
|
|
NEXT
|
|
|
|
IF firstRun THEN
|
|
msg$ = "Building Variable List..."
|
|
IF selectVar = -1 THEN msg$ = "Analyzing Variable List..."
|
|
idepar p, 60, 1, msg$
|
|
END IF
|
|
|
|
l$ = ""
|
|
totalVisibleVariables = 0
|
|
FOR x = 1 TO totalVariablesCreated
|
|
|
|
IF firstRun THEN
|
|
idedrawpar p
|
|
COLOR 0, 7
|
|
c = totalVariablesCreated
|
|
n = x
|
|
|
|
maxprogresswidth = 52 'arbitrary
|
|
percentage = INT(n / c * 100)
|
|
percentagechars = INT(maxprogresswidth * n / c)
|
|
percentageMsg$ = STRING$(percentagechars, 219) + STRING$(maxprogresswidth - percentagechars, 176) + STR$(percentage) + "%"
|
|
_PRINTSTRING (p.x + (p.w \ 2 - LEN(percentageMsg$) \ 2) + 1, p.y + 1), percentageMsg$
|
|
|
|
PCOPY 1, 0
|
|
END IF
|
|
|
|
IF usedVariableList(x).includedLine THEN _CONTINUE 'don't add variables in $INCLUDEs
|
|
|
|
IF LEN(searchTerm$) THEN
|
|
thisScope$ = usedVariableList(x).subfunc
|
|
IF thisScope$ = "" THEN thisScope$ = mainmodule$
|
|
item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$
|
|
IF IdeDebugMode > 0 AND usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN
|
|
'single var
|
|
item$ = item$ + StrReplace$(vWatchReceivedData$(CVL(usedVariableList(x).storage)), CHR$(0), " ")
|
|
END IF
|
|
IF multiSearch(item$, searchTerm$) = 0 THEN
|
|
_CONTINUE 'skip variable if no field matches the search
|
|
END IF
|
|
END IF
|
|
|
|
totalVisibleVariables = totalVisibleVariables + 1
|
|
WHILE totalVisibleVariables > UBOUND(varDlgList)
|
|
REDIM _PRESERVE varDlgList(1 TO totalVariablesCreated + 100) AS varDlgList
|
|
WEND
|
|
|
|
l$ = l$ + CHR$(17)
|
|
varDlgList(totalVisibleVariables).bgColorFlag = LEN(l$) + 1
|
|
IF usedVariableList(x).watch THEN
|
|
l$ = l$ + CHR$(selectedBG)
|
|
ELSE
|
|
l$ = l$ + CHR$(17)
|
|
END IF
|
|
|
|
l$ = l$ + CHR$(16)
|
|
varDlgList(totalVisibleVariables).index = x
|
|
IF itemToSelect > 0 AND x = itemToSelect THEN itemToSelect = 0: o(varListBox).sel = totalVisibleVariables
|
|
varDlgList(totalVisibleVariables).colorFlag = LEN(l$) + 1
|
|
varDlgList(totalVisibleVariables).indicator = LEN(l$) + 2
|
|
IF usedVariableList(x).watch THEN
|
|
l$ = l$ + CHR$(variableNameColor) + "+"
|
|
ELSE
|
|
l$ = l$ + CHR$(16) + " "
|
|
END IF
|
|
|
|
thisName$ = usedVariableList(x).name
|
|
IF LEN(usedVariableList(x).watchRange) THEN
|
|
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + usedVariableList(x).watchRange + ")"
|
|
END IF
|
|
|
|
'find existing watchpoint for this variable/index/element
|
|
temp$ = MKL$(x)
|
|
i = 0
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
DO WHILE i
|
|
IF MID$(watchpointList$, i + 8, LEN(temp$)) = temp$ THEN EXIT DO
|
|
i = INSTR(i + 1, watchpointList$, MKL$(-1))
|
|
LOOP
|
|
|
|
IF i > 0 THEN
|
|
thisName$ = thisName$ + CHR$(16) + CHR$(4) + CHR$(7) 'red bullet to indicate watchpoint
|
|
ELSE
|
|
thisName$ = thisName$ + CHR$(16) + CHR$(16) + " "
|
|
END IF
|
|
|
|
text$ = thisName$ + CHR$(16)
|
|
varDlgList(totalVisibleVariables).colorFlag2 = LEN(l$) + LEN(text$) + 1
|
|
IF usedVariableList(x).watch THEN
|
|
text$ = text$ + CHR$(typeColumnColor) + " "
|
|
ELSE
|
|
text$ = text$ + CHR$(2) + " "
|
|
END IF
|
|
text$ = text$ + SPACE$(maxVarLen - LEN(thisName$))
|
|
text$ = text$ + " " + usedVariableList(x).varType + SPACE$(maxTypeLen - LEN(usedVariableList(x).varType))
|
|
|
|
l3$ = SPACE$(2)
|
|
IF LEN(usedVariableList(x).subfunc) > 0 THEN
|
|
l3$ = l3$ + usedVariableList(x).subfunc + SPACE$(maxModuleNameLen - LEN(usedVariableList(x).subfunc)) + CHR$(16) + CHR$(16)
|
|
ELSE
|
|
l3$ = l3$ + mainmodule$ + SPACE$(maxModuleNameLen - LEN(mainmodule$)) + CHR$(16) + CHR$(16)
|
|
END IF
|
|
|
|
l$ = l$ + text$ + l3$
|
|
IF x = 1 THEN doubleClickThreshold = LEN(l$) - 3
|
|
|
|
IF IdeDebugMode > 0 THEN
|
|
IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN
|
|
IF usedVariableList(x).watch THEN
|
|
thisIsAString = (INSTR(usedVariableList(x).varType, "STRING *") > 0 OR usedVariableList(x).varType = "STRING")
|
|
IF usedVariableList(x).isarray <> 0 AND LEN(usedVariableList(x).elements) = 0 THEN
|
|
'array of native data type
|
|
temp$ = usedVariableList(x).storage
|
|
IF LEN(temp$) THEN l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) + "{"
|
|
DO WHILE LEN(temp$)
|
|
storageSlot& = CVL(LEFT$(temp$, 4))
|
|
temp$ = MID$(temp$, 5)
|
|
tempValue$ = StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
|
|
IF thisIsAString THEN
|
|
l$ = l$ + CHR$(34)
|
|
ELSE
|
|
SELECT CASE usedVariableList(x).displayFormat
|
|
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
|
|
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
|
|
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
|
|
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
|
|
END SELECT
|
|
END IF
|
|
l$ = l$ + tempValue$
|
|
IF thisIsAString THEN l$ = l$ + CHR$(34)
|
|
IF LEN(temp$) THEN l$ = l$ + ","
|
|
LOOP
|
|
IF LEN(usedVariableList(x).storage) THEN l$ = l$ + "}"
|
|
ELSEIF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 THEN
|
|
'simple variable
|
|
IF LEN(usedVariableList(x).storage) = 4 THEN
|
|
storageSlot& = CVL(usedVariableList(x).storage)
|
|
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
|
|
tempValue$ = StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
|
|
IF thisIsAString THEN
|
|
l$ = l$ + CHR$(34)
|
|
ELSE
|
|
SELECT CASE usedVariableList(x).displayFormat
|
|
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
|
|
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
|
|
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
|
|
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
|
|
END SELECT
|
|
END IF
|
|
l$ = l$ + tempValue$
|
|
IF thisIsAString THEN l$ = l$ + CHR$(34)
|
|
END IF
|
|
ELSE
|
|
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
|
|
l$ = l$ + "<multiple values>"
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
l$ = l$ + " <out of scope>"
|
|
END IF
|
|
END IF
|
|
IF x < totalVariablesCreated THEN l$ = l$ + sep
|
|
NEXT
|
|
itemToSelect = 0
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, singleElementSelection, ok)
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 4, 0
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
STATIC returnList$
|
|
IF level = 0 THEN returnList$ = ""
|
|
|
|
ok = 0
|
|
variableNameColor = 3
|
|
typeColumnColor = 15
|
|
selectedBG = 2
|
|
|
|
totalElements = LEN(elementIndexes$) \ 4
|
|
REDIM varDlgList(1 TO totalElements) AS varDlgList
|
|
dialogHeight = (totalElements) + 4
|
|
i = 0
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
IF dialogHeight < 5 THEN dialogHeight = 5
|
|
|
|
|
|
GOSUB buildList
|
|
dialogWidth = 6 + longestName + maxTypeLen
|
|
IF dialogWidth < 40 THEN dialogWidth = 40
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
title$ = "Add UDT Elements"
|
|
IF singleElementSelection THEN title$ = "Choose UDT Element"
|
|
idepar p, dialogWidth, dialogHeight, title$
|
|
|
|
i = i + 1: varListBox = i
|
|
o(varListBox).typ = 2
|
|
o(varListBox).y = 2
|
|
o(varListBox).w = dialogWidth - 4: o(i).h = dialogHeight - 4
|
|
IF o(varListBox).txt = 0 THEN o(varListBox).txt = idenewtxt(l$) ELSE idetxt(o(varListBox).txt) = l$
|
|
|
|
i = i + 1: buttonSet = i
|
|
o(buttonSet).typ = 3
|
|
o(buttonSet).y = dialogHeight
|
|
IF o(buttonSet).txt = 0 THEN
|
|
IF singleElementSelection THEN
|
|
o(buttonSet).txt = idenewtxt("#OK" + sep + "#Cancel" + sep + "#Up One Level")
|
|
ELSE
|
|
o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Close")
|
|
END IF
|
|
END IF
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7
|
|
temp$ = currentPath$
|
|
IF LEN(temp$) > p.w - 4 THEN temp$ = STRING$(3, 250) + RIGHT$(temp$, p.w - 7)
|
|
_PRINTSTRING (p.x + 2, p.y + 1), temp$
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
IF (focus = 2 AND info <> 0) THEN
|
|
IF singleElementSelection THEN
|
|
'ok
|
|
y = ABS(o(varListBox).sel)
|
|
IF y >= 1 AND y <= totalElements THEN
|
|
toggleAndReturn = -1: GOSUB toggleWatch: toggleAndReturn = 0
|
|
GOTO buildListToReturn
|
|
END IF
|
|
ELSE
|
|
'add all
|
|
FOR y = 1 TO totalElements
|
|
varType$ = varDlgList(y).varType
|
|
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT"
|
|
IF INSTR(nativeDataTypes$, varType$) > 0 THEN
|
|
varDlgList(y).selected = -1
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (focus = 3 AND info <> 0) THEN
|
|
IF singleElementSelection THEN
|
|
'cancel
|
|
ok = -3
|
|
EXIT FUNCTION
|
|
ELSE
|
|
'remove all
|
|
FOR y = 1 TO totalElements
|
|
varDlgList(y).selected = 0
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
|
|
NEXT
|
|
END IF
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 4 AND info <> 0) THEN
|
|
IF singleElementSelection THEN
|
|
ok = -4
|
|
EXIT FUNCTION
|
|
ELSE
|
|
'build element list to return
|
|
buildListToReturn:
|
|
FOR y = 1 TO totalElements
|
|
IF varDlgList(y).selected THEN
|
|
varType$ = varDlgList(y).varType
|
|
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT"
|
|
IF INSTR(nativeDataTypes$, varType$) > 0 THEN
|
|
'non-native data types will have already been added to the return list
|
|
thisName$ = RTRIM$(udtecname(varDlgList(y).index))
|
|
IF LEN(returnList$) THEN returnList$ = returnList$ + sp
|
|
returnList$ = returnList$ + currentPath$ + thisName$
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
IF singleElementSelection THEN
|
|
IF LEN(returnList$) > 0 THEN
|
|
ok = -2 'different return so selection can be done with
|
|
ELSE
|
|
ok = 0
|
|
END IF
|
|
ELSE
|
|
ok = LEN(returnList$) > 0
|
|
END IF
|
|
IF level = 0 THEN returnList$ = StrReplace$(returnList$, currentPath$, ".")
|
|
ideelementwatchbox$ = returnList$
|
|
END IF
|
|
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF mCLICK AND focus = 1 THEN 'list click
|
|
IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(varListBox).sel THEN
|
|
IF singleElementSelection = 0 THEN
|
|
GOTO toggleWatch
|
|
ELSE
|
|
y = ABS(o(varListBox).sel)
|
|
IF y >= 1 AND y <= totalElements THEN
|
|
toggleAndReturn = -1: GOSUB toggleWatch: toggleAndReturn = 0
|
|
y = ABS(o(varListBox).sel)
|
|
GOTO buildListToReturn
|
|
END IF
|
|
END IF
|
|
END IF
|
|
lastClick! = TIMER
|
|
IF o(varListBox).sel > 0 THEN clickedItem = o(varListBox).sel
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 1) THEN
|
|
K$ = ""
|
|
toggleWatch:
|
|
y = ABS(o(varListBox).sel)
|
|
|
|
IF y >= 1 AND y <= totalElements THEN
|
|
IF singleElementSelection THEN
|
|
varDlgList(y).selected = -1
|
|
ELSE
|
|
varDlgList(y).selected = NOT varDlgList(y).selected
|
|
END IF
|
|
IF varDlgList(y).selected THEN
|
|
IF singleElementSelection THEN
|
|
FOR i = 1 TO totalElements
|
|
IF i = y THEN _CONTINUE
|
|
varDlgList(i).selected = 0
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).indicator) = 32 'space
|
|
NEXT
|
|
END IF
|
|
|
|
varType$ = varDlgList(y).varType
|
|
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
|
|
IF INSTR(varType$, "BIT *") THEN varType$ = "_BIT"
|
|
IF INSTR(nativeDataTypes$, varType$) = 0 THEN
|
|
'It's a UDT
|
|
elementIndexes2$ = ""
|
|
thisUDT = 0
|
|
E = 0
|
|
FOR i = 1 TO lasttype
|
|
IF RTRIM$(udtxcname(i)) = varType$ THEN thisUDT = i: EXIT FOR
|
|
NEXT
|
|
|
|
i = 0
|
|
DO
|
|
IF E = 0 THEN E = udtxnext(thisUDT) ELSE E = udtenext(E)
|
|
IF E = 0 THEN EXIT DO
|
|
elementIndexes2$ = elementIndexes2$ + MKL$(E)
|
|
i = i + 1
|
|
LOOP
|
|
v$ = ideelementwatchbox$(currentPath$ + RTRIM$(udtecname(varDlgList(y).index)) + ".", elementIndexes2$, level + 1, singleElementSelection, ok2)
|
|
ok = ok2
|
|
IF ok2 = -2 THEN
|
|
'single selection
|
|
GOTO buildListToReturn
|
|
ELSEIF ok2 = -3 THEN
|
|
'single selection canceled
|
|
EXIT FUNCTION
|
|
ELSEIF ok2 = -4 THEN
|
|
i = y
|
|
varDlgList(i).selected = 0
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(i).indicator) = 32 'space
|
|
_CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+
|
|
ELSE
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
|
|
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
|
|
END IF
|
|
END IF
|
|
IF toggleAndReturn THEN RETURN
|
|
_CONTINUE
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
EXIT FUNCTION
|
|
|
|
buildList:
|
|
maxTypeLen = 0
|
|
FOR x = 1 TO totalElements
|
|
thisType = CVL(MID$(elementIndexes$, x * 4 - 3, 4))
|
|
IF LEN(RTRIM$(udtecname(thisType))) > longestName THEN longestName = LEN(RTRIM$(udtecname(thisType)))
|
|
varDlgList(x).index = thisType
|
|
varDlgList(x).selected = 0
|
|
id.t = udtetype(thisType)
|
|
id.tsize = udtesize(thisType)
|
|
|
|
IF id.t AND ISFIXEDLENGTH THEN
|
|
id.tsize = udtetypesize(thisType)
|
|
END IF
|
|
|
|
varDlgList(x).varType = id2fulltypename$
|
|
thisLen = LEN(varDlgList(x).varType)
|
|
IF thisLen > maxTypeLen THEN maxTypeLen = thisLen
|
|
NEXT
|
|
|
|
l$ = ""
|
|
FOR x = 1 TO totalElements
|
|
thisElement = varDlgList(x).index
|
|
l$ = l$ + CHR$(17)
|
|
varDlgList(x).bgColorFlag = LEN(l$) + 1
|
|
l$ = l$ + CHR$(17)
|
|
|
|
l$ = l$ + CHR$(16)
|
|
varDlgList(x).colorFlag = LEN(l$) + 1
|
|
varDlgList(x).indicator = LEN(l$) + 2
|
|
l$ = l$ + CHR$(16) + " "
|
|
|
|
thisName$ = RTRIM$(udtecname(thisElement))
|
|
text$ = thisName$ + CHR$(16)
|
|
varDlgList(x).colorFlag2 = LEN(l$) + LEN(text$) + 1
|
|
text$ = text$ + CHR$(2) + " "
|
|
text$ = text$ + SPACE$(longestName - LEN(thisName$))
|
|
text$ = text$ + " " + varDlgList(x).varType + SPACE$(maxTypeLen - LEN(varDlgList(x).varType))
|
|
|
|
l$ = l$ + text$
|
|
IF x < totalElements THEN l$ = l$ + sep
|
|
NEXT
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
FUNCTION formatRange$(__text$)
|
|
'__text$ is a series of MKL$(values) concatenated
|
|
temp$ = __text$
|
|
v1 = -1
|
|
v2 = -1
|
|
FOR i = 1 TO LEN(temp$) \ 4
|
|
v = CVL(MID$(temp$, i * 4 - 3, 4))
|
|
IF v1 = -1 THEN
|
|
v1 = v
|
|
ELSE
|
|
IF v = v1 + 1 OR v = v2 + 1 THEN
|
|
v2 = v
|
|
ELSE
|
|
IF v2 = -1 THEN
|
|
a2$ = a2$ + LTRIM$(STR$(v1)) + ";"
|
|
v1 = v
|
|
ELSE
|
|
a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2)) + ";"
|
|
v1 = v
|
|
v2 = -1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
IF v1 <> -1 AND v2 = -1 THEN a2$ = a2$ + LTRIM$(STR$(v1))
|
|
IF v1 <> -1 AND v2 <> -1 THEN a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2))
|
|
formatRange$ = a2$
|
|
END FUNCTION
|
|
|
|
FUNCTION expandArray$ (__indexes$, __path$)
|
|
STATIC thisLevel AS LONG, returnValue$
|
|
|
|
IF thisLevel = 0 THEN
|
|
returnValue$ = ""
|
|
END IF
|
|
|
|
thisLevel = thisLevel + 1
|
|
|
|
totalIndexes = CVL(LEFT$(__indexes$, 4))
|
|
indexes$ = MID$(__indexes$, 5, totalIndexes)
|
|
remainingIndexes$ = MID$(__indexes$, 5 + totalIndexes)
|
|
totalIndexes = totalIndexes \ 4
|
|
|
|
FOR i = 1 TO totalIndexes
|
|
temp$ = __path$ + MID$(indexes$, i * 4 - 3, 4)
|
|
IF LEN(remainingIndexes$) THEN
|
|
temp$ = expandArray$(remainingIndexes$, temp$)
|
|
END IF
|
|
IF LEN(temp$) THEN
|
|
returnValue$ = returnValue$ + MKL$(LEN(temp$)) + temp$
|
|
END IF
|
|
NEXT
|
|
|
|
thisLevel = thisLevel - 1
|
|
|
|
IF thisLevel = 0 THEN
|
|
expandArray$ = returnValue$
|
|
END IF
|
|
END FUNCTION
|
|
|
|
FUNCTION parseRange$(__text$)
|
|
'__text$ must contain a valid numeric string (####),
|
|
'a valid interval (####-####) or comma-separated values.
|
|
'Only positive values >= 0 considered.
|
|
'Returns MKL$(value1) + MKL$(value2)... in order
|
|
|
|
IF LEN(_TRIM$(__text$)) = 0 THEN EXIT FUNCTION
|
|
|
|
DIM zeroIncluded AS _BYTE
|
|
|
|
Filter$ = _TRIM$(__text$)
|
|
j = INSTR(Filter$, "-") + INSTR(Filter$, ";")
|
|
temp$ = SPACE$(1000)
|
|
|
|
IF j = 0 THEN 'Single number passed
|
|
parseRange$ = MKL$(VAL(Filter$))
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
Reading = 1
|
|
FOR j = 1 TO LEN(Filter$)
|
|
v = ASC(Filter$, j)
|
|
SELECT CASE v
|
|
CASE 59 ';
|
|
Reading = 1
|
|
GOSUB parseIt
|
|
CASE 45 'hyphen
|
|
IF PrevChar <> 45 THEN
|
|
Reading = Reading + 1
|
|
IF Reading = 2 THEN
|
|
IF j = LEN(Filter$) THEN GOSUB parseIt
|
|
END IF
|
|
END IF
|
|
CASE 48 TO 57 '0 to 9
|
|
IF Reading = 1 THEN
|
|
v1$ = v1$ + CHR$(v)
|
|
ELSEIF Reading = 2 THEN
|
|
v2$ = v2$ + CHR$(v)
|
|
END IF
|
|
IF j = LEN(Filter$) THEN GOSUB parseIt
|
|
END SELECT
|
|
PrevChar = v
|
|
NEXT j
|
|
|
|
returnValue$ = ""
|
|
IF zeroIncluded THEN returnValue$ = MKL$(0)
|
|
FOR i = 1 TO LEN(temp$)
|
|
IF ASC(temp$, i) = 1 THEN returnValue$ = returnValue$ + MKL$(i)
|
|
NEXT
|
|
parseRange$ = returnValue$
|
|
|
|
EXIT FUNCTION
|
|
parseIt:
|
|
v1 = VAL(v1$)
|
|
v2 = VAL(v2$)
|
|
IF LEN(v2$) > 0 THEN
|
|
IF LEN(v1$) > 0 THEN
|
|
IF v1 > v2 THEN SWAP v1, v2
|
|
IF v2 > LEN(temp$) THEN temp$ = temp$ + SPACE$(v2 - LEN(temp$))
|
|
IF v1 = 0 THEN zeroIncluded = -1: v1 = 1
|
|
FOR i = v1 TO v2
|
|
ASC(temp$, i) = 1
|
|
NEXT
|
|
END IF
|
|
ELSE
|
|
IF v1 > LEN(temp$) THEN temp$ = temp$ + SPACE$(v1 - LEN(temp$))
|
|
IF v1 = 0 THEN
|
|
zeroIncluded = -1
|
|
ELSE
|
|
ASC(temp$, v1) = 1
|
|
END IF
|
|
END IF
|
|
v1$ = ""
|
|
v2$ = ""
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
FUNCTION idecallstackbox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
dialogHeight = callStackLength + 4
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
|
|
dialogWidth = 52
|
|
temp$ = callstacklist$
|
|
DO
|
|
i = INSTR(temp$, sep)
|
|
IF i THEN
|
|
temp2$ = LEFT$(temp$, i - 1)
|
|
temp$ = MID$(temp$, i + 1)
|
|
IF LEN(temp2$) + 6 > dialogWidth THEN dialogWidth = LEN(temp2$) + 6
|
|
ELSE
|
|
IF LEN(temp$) + 6 > dialogWidth THEN dialogWidth = LEN(temp$) + 6
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
idepar p, dialogWidth, dialogHeight, "$DEBUG MODE"
|
|
|
|
i = 0
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 2
|
|
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 4
|
|
o(i).txt = idenewtxt(callstacklist$)
|
|
o(i).sel = callStackLength
|
|
o(i).nam = idenewtxt("Call Stack")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = dialogHeight
|
|
o(i).txt = idenewtxt("#Go To Line" + sep + "#Close" + sep + "Co#py")
|
|
o(i).dft = 1
|
|
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 1), "Most recent sub/function calls in your program:"
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF mCLICK AND focus = 1 THEN 'list click
|
|
IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(1).sel THEN
|
|
GOTO setIDEcy
|
|
END IF
|
|
lastClick! = TIMER
|
|
IF o(1).sel > 0 THEN clickedItem = o(1).sel
|
|
_CONTINUE
|
|
END IF
|
|
|
|
IF (focus = 1 AND K$ = CHR$(13)) OR (focus = 2 AND info <> 0)THEN
|
|
setIDEcy:
|
|
y = ABS(o(1).sel)
|
|
IF y >= 1 AND y <= callStackLength THEN
|
|
temp$ = idetxt(o(1).stx)
|
|
idegotobox_LastLineNum = VAL(MID$(temp$, _INSTRREV(temp$, " ") + 1))
|
|
idecy = idegotobox_LastLineNum
|
|
idecentercurrentline
|
|
ideselect = 0
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 3 AND info <> 0) THEN
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 3 AND info <> 0) THEN
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 4 AND info <> 0) OR (UCASE$(K$) = "C" AND KCTRL <> 0) THEN
|
|
_CLIPBOARD$ = StrReplace$(callstacklist$, sep, CHR$(10))
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
idecallstackbox = 0
|
|
|
|
END FUNCTION
|
|
|
|
SUB idebox (x, y, w, h)
|
|
_PRINTSTRING (x, y), CHR$(218) + STRING$(w - 2, 196) + CHR$(191)
|
|
FOR y2 = y + 1 TO y + h - 2
|
|
_PRINTSTRING (x, y2), CHR$(179) + SPACE$(w - 2) + CHR$(179)
|
|
NEXT
|
|
_PRINTSTRING (x, y + h - 1), CHR$(192) + STRING$(w - 2, 196) + CHR$(217)
|
|
END SUB
|
|
|
|
SUB ideboxshadow (x, y, w, h)
|
|
|
|
idebox x, y, w, h
|
|
|
|
'shadow
|
|
COLOR 2, 0
|
|
FOR y2 = y + 1 TO y + h - 1
|
|
FOR x2 = x + w TO x + w + 1
|
|
IF x2 <= idewx AND y2 <= idewy + idesubwindow THEN
|
|
_PRINTSTRING (x2, y2), CHR$(SCREEN(y2, x2))
|
|
END IF
|
|
NEXT
|
|
NEXT
|
|
|
|
y2 = y + h
|
|
IF y2 <= idewy + idesubwindow THEN
|
|
FOR x2 = x + 2 TO x + w + 1
|
|
IF x2 <= idewx THEN
|
|
_PRINTSTRING (x2, y2), CHR$(SCREEN(y2, x2))
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
|
|
END SUB
|
|
|
|
FUNCTION idechange$
|
|
REDIM SearchHistory(0) AS STRING
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
'built initial search strings
|
|
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
|
|
END IF
|
|
IF a2$ = "" THEN
|
|
a2$ = idefindtext
|
|
END IF
|
|
|
|
RetrieveSearchHistory SearchHistory()
|
|
|
|
i = 0
|
|
idepar p, 60, 14, "Change"
|
|
i = i + 1
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt("#Find What")
|
|
o(i).txt = idenewtxt(a2$)
|
|
IF LEN(a2$) > 0 THEN
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
END IF
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).y = 5
|
|
o(i).nam = idenewtxt("Change #To")
|
|
o(i).txt = idenewtxt(idechangeto)
|
|
IF LEN(idechangeto) > 0 THEN
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
END IF
|
|
o(i).v1 = LEN(idechangeto)
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 8
|
|
o(i).nam = idenewtxt("#Match Upper/Lowercase")
|
|
o(i).sel = idefindcasesens
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 9
|
|
o(i).nam = idenewtxt("#Whole Word")
|
|
o(i).sel = idefindwholeword
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 10
|
|
o(i).nam = idenewtxt("#Search Backwards")
|
|
o(i).sel = idefindbackwards
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 11
|
|
o(i).nam = idenewtxt("#Ignore 'comments")
|
|
o(i).sel = idefindnocomments
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 29
|
|
o(i).y = 11
|
|
o(i).nam = idenewtxt("#Look only in 'comments")
|
|
o(i).sel = idefindonlycomments
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 12
|
|
o(i).nam = idenewtxt("Ignore " + CHR$(34) + "#strings" + CHR$(34))
|
|
o(i).sel = idefindnostrings
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 29
|
|
o(i).y = 12
|
|
o(i).nam = idenewtxt("Look only in " + CHR$(34) + "st#rings" + CHR$(34))
|
|
o(i).sel = idefindonlystrings
|
|
|
|
i = i + 1
|
|
ButtonsID = i
|
|
o(i).typ = 3
|
|
o(i).y = 14
|
|
o(i).txt = idenewtxt("Find and #Verify" + sep + "#Change All" + sep + "Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
GOSUB displayDialog
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus = 1 OR focus = 2 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
'mutually exclusive options
|
|
IF focus = 6 AND o(6).sel = 1 THEN
|
|
o(7).sel = 0
|
|
ELSEIF focus = 7 AND o(7).sel = 1 THEN
|
|
o(6).sel = 0
|
|
o(8).sel = 0
|
|
o(9).sel = 0
|
|
ELSEIF focus = 8 AND o(8).sel = 1 THEN
|
|
o(9).sel = 0
|
|
ELSEIF focus = 9 AND o(9).sel = 1 THEN
|
|
o(6).sel = 0
|
|
o(7).sel = 0
|
|
o(8).sel = 0
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 12 AND info <> 0) THEN
|
|
idechange$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF UBOUND(SearchHistory) > 0 THEN
|
|
IF K$ = CHR$(0) + CHR$(72) AND focus = 1 THEN 'Up
|
|
IF ln < UBOUND(SearchHistory) THEN
|
|
ln = ln + 1
|
|
END IF
|
|
idetxt(o(1).txt) = SearchHistory(ln)
|
|
o(1).issel = -1: o(1).sx1 = 0: o(1).v1 = LEN(idetxt(o(1).txt))
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(80) AND focus = 1 THEN 'Down
|
|
IF ln > 1 THEN
|
|
ln = ln - 1
|
|
ELSE
|
|
ln = 1
|
|
END IF
|
|
idetxt(o(1).txt) = SearchHistory(ln)
|
|
o(1).issel = -1: o(1).sx1 = 0: o(1).v1 = LEN(idetxt(o(1).txt))
|
|
END IF
|
|
END IF
|
|
|
|
IF focus = 11 AND info <> 0 THEN 'change all
|
|
idefindcasesens = o(3).sel
|
|
idefindwholeword = o(4).sel
|
|
idefindbackwards = o(5).sel
|
|
idefindnocomments = o(6).sel
|
|
idefindonlycomments = o(7).sel
|
|
idefindnostrings = o(8).sel
|
|
idefindonlystrings = o(9).sel
|
|
|
|
s$ = idetxt(o(1).txt)
|
|
idefindtext$ = s$
|
|
idechangeto$ = idetxt(o(2).txt)
|
|
IdeAddSearched idefindtext
|
|
|
|
changed = 0
|
|
|
|
s$ = idefindtext$
|
|
IF idefindcasesens = 0 THEN s$ = UCASE$(s$)
|
|
|
|
FOR y = 1 TO iden
|
|
COLOR 0, 7
|
|
maxprogresswidth = p.w - 4
|
|
percentage = INT(y / iden * 100)
|
|
percentagechars = INT(maxprogresswidth * y / iden)
|
|
percentageMsg$ = STRING$(percentagechars, 219) + STRING$(maxprogresswidth - percentagechars, 176)
|
|
_PRINTSTRING (p.x + 2, p.y + 7), percentageMsg$
|
|
PCOPY 1, 0
|
|
|
|
l$ = idegetline(y)
|
|
l2$ = ""
|
|
|
|
x1 = 1
|
|
idechangeall:
|
|
IF idefindcasesens = 0 THEN l3$ = UCASE$(l$) ELSE l3$ = l$
|
|
x = INSTR(x1, l3$, s$)
|
|
|
|
IF x THEN
|
|
IF idefindwholeword THEN
|
|
whole = 1
|
|
IF x > 1 THEN
|
|
c = ASC(UCASE$(MID$(l$, x - 1, 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF x + LEN(s$) <= LEN(l$) THEN
|
|
c = ASC(UCASE$(MID$(l$, x + LEN(s$), 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF whole = 0 THEN
|
|
IF x1 <= LEN(l$) THEN
|
|
l2$ = l2$ + MID$(l$, x1, x - x1 + 1)
|
|
x1 = x + 1
|
|
GOTO idechangeall
|
|
END IF
|
|
x = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
DIM comment AS _BYTE, quote AS _BYTE
|
|
IF x THEN
|
|
FindQuoteComment l$, x, comment, quote
|
|
IF idefindnocomments <> 0 AND comment THEN x = 0
|
|
IF idefindnostrings <> 0 AND quote THEN x = 0
|
|
IF idefindonlycomments <> 0 AND comment = 0 THEN x = 0
|
|
IF idefindonlystrings <> 0 AND quote = 0 THEN x = 0
|
|
END IF
|
|
|
|
IF x THEN
|
|
l2$ = l2$ + MID$(l$, x1, x - x1) + idechangeto$
|
|
changed = changed + 1
|
|
x1 = x + LEN(s$)
|
|
IF x1 <= LEN(l$) THEN GOTO idechangeall
|
|
END IF
|
|
|
|
l2$ = l2$ + MID$(l$, x1, LEN(l$) - x1 + 1)
|
|
|
|
IF l2$ <> l$ THEN idesetline y, l2$
|
|
|
|
NEXT
|
|
|
|
SCREEN , , 3, 0
|
|
clearStatusWindow 0
|
|
idefocusline = 0
|
|
ideshowtext
|
|
PCOPY 3, 0
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
GOSUB displayDialog
|
|
PCOPY 1, 0
|
|
|
|
IF changed = 0 THEN
|
|
idenomatch 0
|
|
ELSE
|
|
idechanged changed: idechangemade = 1: startPausedPending = 0
|
|
END IF
|
|
|
|
idetxt(o(ButtonsID).txt) = "Find and #Verify" + sep + "#Change All" + sep + "Close"
|
|
END IF 'change all
|
|
|
|
|
|
IF (focus = 10 AND info <> 0) OR K$ = CHR$(13) THEN
|
|
idefindcasesens = o(3).sel
|
|
idefindwholeword = o(4).sel
|
|
idefindbackwards = o(5).sel
|
|
idefindnocomments = o(6).sel
|
|
idefindonlycomments = o(7).sel
|
|
idefindnostrings = o(8).sel
|
|
idefindonlystrings = o(9).sel
|
|
idefindtext$ = idetxt(o(1).txt)
|
|
idechangeto$ = idetxt(o(2).txt)
|
|
idechange$ = "V"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
|
|
'end of custom controls
|
|
|
|
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
EXIT FUNCTION
|
|
displayDialog:
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
|
|
o(i).cx = 0: o(i).cy = 0
|
|
|
|
idedrawobj o(i), f 'display object
|
|
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
|
|
END IF
|
|
NEXT i
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
SUB FindQuoteComment (text$, __cursor AS LONG, c AS _BYTE, q AS _BYTE)
|
|
c = 0: q = 0
|
|
cursor = __cursor
|
|
IF cursor > LEN(text$) THEN cursor = LEN(text$)
|
|
FOR find_k = 1 TO cursor
|
|
SELECT CASE MID$(text$, find_k, 1)
|
|
CASE CHR$(34): q = NOT q
|
|
CASE "'": IF q = 0 THEN c = -1: EXIT FOR
|
|
CASE "R", "r"
|
|
IF q = 0 THEN
|
|
IF UCASE$(MID$(text$, find_k - 1, 5)) = " REM " OR _
|
|
UCASE$(MID$(text$, find_k - 1, 5)) = ":REM " OR _
|
|
(find_k + 2 = LEN(text$) AND UCASE$(MID$(text$, find_k - 1, 4)) = " REM") OR _
|
|
(find_k + 2 = LEN(text$) AND UCASE$(MID$(text$, find_k - 1, 4)) = ":REM") OR _
|
|
(find_k = 1 AND UCASE$(LEFT$(text$, 4)) = "REM ") OR _
|
|
(find_k = 1 AND UCASE$(text$) = "REM") THEN
|
|
c = -1: EXIT FOR
|
|
END IF
|
|
END IF
|
|
END SELECT
|
|
NEXT find_k
|
|
END SUB
|
|
|
|
SUB idechanged (totalChanges AS LONG)
|
|
IF totalChanges > 1 THEN pl$ = "s"
|
|
result = idemessagebox("Change Complete", LTRIM$(STR$(totalChanges)) + " substitution" + pl$ + ".", "")
|
|
END SUB
|
|
|
|
FUNCTION idechangeit$
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 3, 0
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
i = 0
|
|
w = 45
|
|
p.x = 40 - w \ 2
|
|
p.y = idewy - 4
|
|
p.w = w
|
|
p.h = 2
|
|
p.nam = idenewtxt("Change")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 2
|
|
o(i).txt = idenewtxt("#Change" + sep + "#Skip" + sep + "Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
IF UCASE$(K$) = "C" THEN altletter$ = "C"
|
|
IF UCASE$(K$) = "S" THEN altletter$ = "S"
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(27) THEN
|
|
idechangeit$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF info THEN
|
|
IF info = 1 THEN idechangeit$ = "Y"
|
|
IF info = 2 THEN idechangeit$ = "N"
|
|
IF info = 3 THEN idechangeit$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
|
|
END FUNCTION
|
|
|
|
SUB idedelline (i)
|
|
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y >= i THEN
|
|
y = IdeBmk(b).y - 1: IF y = 0 THEN y = 1
|
|
IdeBmk(b).y = y
|
|
END IF
|
|
NEXT
|
|
|
|
IF vWatchOn THEN
|
|
IF iden > UBOUND(IdeBreakpoints) OR iden > UBOUND(IdeSkipLines) THEN
|
|
REDIM _PRESERVE IdeBreakpoints(iden) AS _BYTE
|
|
REDIM _PRESERVE IdeSkipLines(iden) AS _BYTE
|
|
END IF
|
|
|
|
FOR b = i TO iden - 1
|
|
SWAP IdeBreakpoints(b), IdeBreakpoints(b + 1)
|
|
NEXT
|
|
REDIM _PRESERVE IdeBreakpoints(iden - 1) AS _BYTE
|
|
|
|
FOR b = i TO iden - 1
|
|
SWAP IdeSkipLines(b), IdeSkipLines(b - 1)
|
|
NEXT
|
|
REDIM _PRESERVE IdeSkipLines(iden - 1) AS _BYTE
|
|
END IF
|
|
|
|
idegotoline i
|
|
textlen = CVL(MID$(idet$, ideli, 4))
|
|
idet$ = LEFT$(idet$, ideli - 1) + RIGHT$(idet$, LEN(idet$) - ideli + 1 - 8 - textlen)
|
|
iden = iden - 1
|
|
|
|
IF i > iden THEN idegotoline iden '[2013] if last line was removed, move to previous line
|
|
|
|
END SUB
|
|
|
|
SUB idedeltxt
|
|
idetxtlast = 0
|
|
END SUB
|
|
|
|
SUB idedrawobj (o AS idedbotype, f)
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
|
|
'#1: SINGLE LINE TEXT INPUT BOX
|
|
IF o.typ = 1 THEN
|
|
IF o.x = 0 THEN o.x = 2
|
|
x = o.par.x + o.x: y = o.par.y + o.y
|
|
COLOR 0, 7
|
|
IF o.nam THEN
|
|
a$ = idetxt(o.nam)
|
|
LOCATE y, x: idehPRINT a$ + ":"
|
|
x = x + idehlen(a$) + 2
|
|
END IF
|
|
IF o.w = 0 THEN x2 = o.par.x + o.par.w - 1: o.w = x2 - x - 3
|
|
idebox x, y - 1, o.w + 4, 3
|
|
IF o.txt = 0 THEN o.txt = idenewtxt("")
|
|
a$ = idetxt(o.txt)
|
|
IF o.v1 > LEN(a$) THEN o.v1 = LEN(a$) 'new
|
|
cx = o.v1
|
|
|
|
tx = 1
|
|
IF LEN(a$) > o.w THEN
|
|
IF o.foc = 0 THEN
|
|
tx = o.v1 - o.w + 1
|
|
IF tx < 1 THEN tx = 1
|
|
a$ = MID$(a$, tx, o.w)
|
|
cx = cx - tx + 1
|
|
ELSE
|
|
a$ = LEFT$(a$, o.w)
|
|
END IF
|
|
END IF
|
|
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
|
|
x = x + 2
|
|
'apply selection color change if necessary
|
|
IF o.issel = 0 OR o.foc <> 0 THEN
|
|
_PRINTSTRING (x, y), a$
|
|
ELSE
|
|
FOR ColorCHAR = 1 TO LEN(a$)
|
|
IF ColorCHAR + tx - 2 >= sx1 AND ColorCHAR + tx - 2 < sx2 THEN COLOR 7, 0 ELSE COLOR 0, 7
|
|
_PRINTSTRING (x - 1 + ColorCHAR, y), MID$(a$, ColorCHAR, 1)
|
|
NEXT
|
|
END IF
|
|
|
|
IF o.foc = 0 THEN o.cx = x + cx: o.cy = y
|
|
f = f + 1
|
|
END IF '#1
|
|
|
|
'#2: VERTICAL SCROLLING SELECTION BOX
|
|
IF o.typ = 2 THEN
|
|
IF o.x = 0 THEN o.x = 2
|
|
IF o.w = 0 THEN o.w = o.par.w - 2 - o.x
|
|
IF o.h = 0 THEN o.h = o.par.h - 1 - o.y
|
|
x = o.par.x + o.x: y = o.par.y + o.y
|
|
COLOR 0, 7
|
|
idebox x, y, o.w + 2, o.h + 2
|
|
IF o.nam THEN
|
|
a$ = idetxt(o.nam)
|
|
w = o.w + 2
|
|
m = w \ 2: IF w AND 1 THEN m = m + 1
|
|
LOCATE y, x + m - 1 - ((idehlen(a$) + 2) - 1) \ 2: idehPRINT " " + a$ + " "
|
|
END IF 'nam
|
|
'display list items
|
|
IF o.sel = 0 THEN o.sel = -1
|
|
IF o.txt = 0 THEN o.txt = idenewtxt("")
|
|
IF o.stx = 0 THEN o.stx = idenewtxt("")
|
|
IF o.v1 = 0 THEN o.v1 = 1
|
|
s = ABS(o.sel)
|
|
IF s >= o.v1 + o.h THEN o.v1 = s - o.h + 1
|
|
IF s < o.v1 THEN o.v1 = s
|
|
IF o.foc <> 0 AND o.sel > 0 THEN o.sel = -o.sel
|
|
a$ = idetxt(o.txt)
|
|
n = 1
|
|
y = 1
|
|
v1 = o.v1
|
|
a3$ = ""
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ <> sep THEN a3$ = a3$ + a2$
|
|
IF a2$ = sep OR i2 = LEN(a$) THEN
|
|
IF n < v1 THEN
|
|
'skip
|
|
ELSE
|
|
IF y <= o.h THEN
|
|
a3$ = " " + RTRIM$(a3$)
|
|
IF o.sel = n THEN
|
|
COLOR 7, 0
|
|
o.selY = o.par.y + o.y + y
|
|
ELSE
|
|
COLOR 0, 7
|
|
END IF
|
|
IF (o.sel = n OR -o.sel = n) AND o.foc = 0 THEN
|
|
o.cx = o.par.x + o.x + 2: o.cy = o.par.y + o.y + y
|
|
IF LEFT$(a3$, 2) = CHR$(32) + CHR$(195) OR LEFT$(a3$, 2) = CHR$(32) + CHR$(192) THEN
|
|
o.cx = o.cx + 2
|
|
END IF
|
|
END IF
|
|
|
|
LOCATE o.par.y + o.y + y, o.par.x + o.x + 1
|
|
IF INSTR(a3$, CHR$(16)) THEN
|
|
'color formatting: CHR$(16) + CHR$(color)
|
|
' CHR$(16) + CHR$(16) restores default
|
|
' CHR$(17) + CHR$(bg color)
|
|
' CHR$(17) + CHR$(17) restores default
|
|
character = 0
|
|
rightSideLimit = POS(1) + o.w - 1
|
|
cf = POS(1)
|
|
DO
|
|
character = character + 1
|
|
IF character > LEN(a3$) THEN
|
|
PRINT SPACE$(o.w - (POS(1) - (o.par.x + o.x)) + 1);
|
|
EXIT DO
|
|
END IF
|
|
IF ASC(a3$, character) = 16 AND character < LEN(a3$) THEN
|
|
IF ASC(a3$, character + 1) >= 0 AND ASC(a3$, character + 1) <= 15 THEN
|
|
COLOR ASC(a3$, character + 1)
|
|
character = character + 1
|
|
_CONTINUE
|
|
ELSEIF ASC(a3$, character + 1) = 16 THEN
|
|
IF o.sel = n THEN COLOR 7 ELSE COLOR 0
|
|
character = character + 1
|
|
_CONTINUE
|
|
END IF
|
|
ELSEIF ASC(a3$, character) = 17 AND character < LEN(a3$) THEN
|
|
IF ASC(a3$, character + 1) >= 0 AND ASC(a3$, character + 1) <= 15 THEN
|
|
IF o.sel <> n THEN COLOR , ASC(a3$, character + 1)
|
|
character = character + 1
|
|
_CONTINUE
|
|
ELSEIF ASC(a3$, character + 1) = 17 THEN
|
|
IF o.sel = n THEN COLOR , 0 ELSE COLOR , 7
|
|
character = character + 1
|
|
_CONTINUE
|
|
END IF
|
|
ELSEIF character = 1 AND (LEFT$(a3$, 2) = CHR$(32) + CHR$(195) OR LEFT$(a3$, 2) = CHR$(32) + CHR$(192)) THEN
|
|
COLOR 0, 7
|
|
PRINT LEFT$(a3$, 3);
|
|
IF o.sel = n THEN COLOR 7, 0 ELSE COLOR 0, 7
|
|
character = 3
|
|
cf = cf + 3
|
|
_CONTINUE
|
|
END IF
|
|
PRINT MID$(a3$, character, 1);
|
|
cf = cf + 1
|
|
LOOP UNTIL cf > rightSideLimit
|
|
IF character < LEN(a3$) THEN _PRINTSTRING (rightSideLimit, CSRLIN), CHR$(26)
|
|
IF POS(1) < rightSideLimit THEN
|
|
PRINT SPACE$(rightSideLimit - POS(1));
|
|
END IF
|
|
ELSE
|
|
IF LEN(a3$) > o.w THEN MID$(a3$, o.w, 1) = CHR$(26)
|
|
a3$ = a3$ + SPACE$(o.w)
|
|
a3$ = LEFT$(a3$, o.w)
|
|
'customization specific for the SUBs list, due to the tree characters:
|
|
IF LEFT$(a3$, 2) = CHR$(32) + CHR$(195) OR LEFT$(a3$, 2) = CHR$(32) + CHR$(192) THEN
|
|
COLOR 0, 7
|
|
PRINT LEFT$(a3$, 3);
|
|
IF o.sel = n THEN COLOR 7, 0 ELSE COLOR 0, 7
|
|
PRINT MID$(a3$, 4);
|
|
ELSE
|
|
PRINT a3$;
|
|
END IF
|
|
END IF
|
|
'customization specific for the SUBs list, when there are external procedures:
|
|
IF INSTR(a3$, CHR$(196) + "*") > 0 THEN
|
|
IF o.sel = n THEN COLOR 2, 0 ELSE COLOR 2, 7
|
|
_PRINTSTRING (o.par.x + o.x + 4, o.par.y + o.y + y), "*"
|
|
END IF
|
|
y = y + 1
|
|
END IF
|
|
END IF
|
|
n = n + 1
|
|
a3$ = ""
|
|
END IF
|
|
NEXT
|
|
o.num = n - 1
|
|
|
|
tnum = o.num
|
|
tsel = ABS(o.sel)
|
|
|
|
q = idevbar(o.par.x + o.x + o.w + 1, o.par.y + o.y + 1, o.h, tsel, tnum)
|
|
|
|
f = f + 1
|
|
END IF '#2
|
|
|
|
'#3: ACTION BUTTONS
|
|
IF o.typ = 3 THEN
|
|
IF o.x = 0 THEN o.x = 2
|
|
IF o.w = 0 THEN o.w = o.par.w - o.x 'spanable width
|
|
IF o.txt = 0 THEN o.txt = idenewtxt("#OK")
|
|
a$ = idetxt(o.txt)
|
|
n = 1
|
|
c = 0
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ = CHR$(0) THEN
|
|
n = n + 1
|
|
ELSE
|
|
IF a$ <> "#" THEN c = c + 1
|
|
END IF
|
|
NEXT
|
|
w = o.w
|
|
c = c + n * 4 'add characters for bracing < > buttons
|
|
whitespace = w - c
|
|
spacing = whitespace \ (n + 1)
|
|
f2 = o.foc + 1
|
|
IF f2 < 1 OR f2 > n THEN
|
|
IF o.dft THEN f2 = o.dft
|
|
END IF
|
|
n2 = 1
|
|
a3$ = ""
|
|
LOCATE o.par.y + o.y, o.par.x + o.x
|
|
x = o.par.x + o.x
|
|
COLOR 0, 7
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ <> CHR$(0) THEN a3$ = a3$ + a2$
|
|
IF a2$ = CHR$(0) OR i2 = LEN(a$) THEN
|
|
PRINT SPACE$(spacing);
|
|
x = x + spacing
|
|
IF f2 = n2 THEN COLOR 15, 7 ELSE COLOR 0, 7
|
|
PRINT "< ";
|
|
COLOR 0, 7: idehPRINT a3$
|
|
IF f2 = n2 THEN COLOR 15, 7 ELSE COLOR 0, 7
|
|
IF n2 = o.foc + 1 THEN
|
|
o.cx = x + 2: o.cy = o.par.y + o.y
|
|
END IF
|
|
PRINT " >";
|
|
COLOR 0, 7
|
|
x = x + idehlen(a3$) + 4
|
|
a3$ = ""
|
|
n2 = n2 + 1
|
|
END IF
|
|
NEXT
|
|
f = f + n
|
|
END IF '#3
|
|
|
|
'#4: CHECK BOX
|
|
IF o.typ = 4 THEN
|
|
IF o.x = 0 THEN o.x = 2
|
|
x = o.par.x + o.x: y = o.par.y + o.y
|
|
LOCATE y, x
|
|
COLOR 0, 7
|
|
IF o.sel THEN
|
|
PRINT "[X] ";
|
|
ELSE
|
|
PRINT "[ ] ";
|
|
END IF
|
|
IF o.nam THEN
|
|
a$ = idetxt(o.nam)
|
|
idehPRINT a$
|
|
END IF
|
|
IF o.foc = 0 THEN o.cx = x + 1: o.cy = y
|
|
f = f + 1
|
|
END IF '#4
|
|
|
|
END SUB
|
|
|
|
SUB idedrawpar (p AS idedbptype)
|
|
COLOR 0, 7: ideboxshadow p.x, p.y, p.w + 2, p.h + 2
|
|
IF p.nam THEN
|
|
x = LEN(idetxt(p.nam)) + 2
|
|
COLOR 0, 7: _PRINTSTRING (p.x + (p.w \ 2) - (x - 1) \ 2, p.y), " " + idetxt(p.nam) + " "
|
|
END IF
|
|
END SUB
|
|
|
|
FUNCTION idefileexists$(f$)
|
|
l = LEN(f$)
|
|
DO
|
|
IF l < LEN(f$) THEN
|
|
m$ = "File " + CHR$(34) + STRING$(3, 250) + RIGHT$(f$, l) + CHR$(34) + " already exists. Overwrite?"
|
|
ELSE
|
|
m$ = "File " + CHR$(34) + f$ + CHR$(34) + " already exists. Overwrite?"
|
|
END IF
|
|
l = l - 1
|
|
LOOP UNTIL LEN(m$) + 4 < (idewx - 6)
|
|
|
|
result = idemessagebox("Save", m$, "#Yes;#No")
|
|
IF result = 1 THEN idefileexists$ = "Y" ELSE idefileexists$ = "N"
|
|
END FUNCTION
|
|
|
|
FUNCTION idefind$
|
|
|
|
REDIM SearchHistory(0) AS STRING
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
'built initial search string
|
|
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
|
|
END IF
|
|
IF a2$ = "" THEN
|
|
a2$ = idefindtext
|
|
END IF
|
|
|
|
RetrieveSearchHistory SearchHistory()
|
|
|
|
i = 0
|
|
idepar p, 60, 11, "Find"
|
|
i = i + 1
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt("#Find What")
|
|
o(i).txt = idenewtxt(a2$)
|
|
IF LEN(a2$) > 0 THEN
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
END IF
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 5
|
|
o(i).nam = idenewtxt("#Match Upper/Lowercase")
|
|
o(i).sel = idefindcasesens
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 6
|
|
o(i).nam = idenewtxt("#Whole Word")
|
|
o(i).sel = idefindwholeword
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 7
|
|
o(i).nam = idenewtxt("#Search Backwards")
|
|
o(i).sel = idefindbackwards
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 8
|
|
o(i).nam = idenewtxt("#Ignore 'comments")
|
|
o(i).sel = idefindnocomments
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 29
|
|
o(i).y = 8
|
|
o(i).nam = idenewtxt("#Look only in 'comments")
|
|
o(i).sel = idefindonlycomments
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 9
|
|
o(i).nam = idenewtxt("Ignore " + CHR$(34) + "s#trings" + CHR$(34))
|
|
o(i).sel = idefindnostrings
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 29
|
|
o(i).y = 9
|
|
o(i).nam = idenewtxt("Look only in " + CHR$(34) + "st#rings" + CHR$(34))
|
|
o(i).sel = idefindonlystrings
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 11
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus = 1 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 10 AND info <> 0) THEN
|
|
idefind$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'mutually exclusive options
|
|
IF focus = 5 AND o(5).sel = 1 THEN
|
|
o(6).sel = 0
|
|
ELSEIF focus = 6 AND o(6).sel = 1 THEN
|
|
o(5).sel = 0
|
|
o(7).sel = 0
|
|
o(8).sel = 0
|
|
ELSEIF focus = 7 AND o(7).sel = 1 THEN
|
|
o(8).sel = 0
|
|
ELSEIF focus = 8 AND o(8).sel = 1 THEN
|
|
o(5).sel = 0
|
|
o(6).sel = 0
|
|
o(7).sel = 0
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 9 AND info <> 0) THEN
|
|
idefindcasesens = o(2).sel
|
|
idefindwholeword = o(3).sel
|
|
idefindbackwards = o(4).sel
|
|
idefindnocomments = o(5).sel
|
|
idefindonlycomments = o(6).sel
|
|
idefindnostrings = o(7).sel
|
|
idefindonlystrings = o(8).sel
|
|
s$ = idetxt(o(1).txt)
|
|
idefindtext$ = s$
|
|
IdeAddSearched idefindtext
|
|
idefindagain 0
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF UBOUND(SearchHistory) > 0 THEN
|
|
IF K$ = CHR$(0) + CHR$(72) AND focus = 1 THEN 'Up
|
|
IF ln < UBOUND(SearchHistory) THEN
|
|
ln = ln + 1
|
|
END IF
|
|
idetxt(o(1).txt) = SearchHistory(ln)
|
|
o(1).issel = -1: o(1).sx1 = 0: o(1).v1 = LEN(idetxt(o(1).txt))
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(80) AND focus = 1 THEN 'Down
|
|
IF ln > 1 THEN
|
|
ln = ln - 1
|
|
ELSE
|
|
ln = 1
|
|
END IF
|
|
idetxt(o(1).txt) = SearchHistory(ln)
|
|
o(1).issel = -1: o(1).sx1 = 0: o(1).v1 = LEN(idetxt(o(1).txt))
|
|
END IF
|
|
END IF
|
|
'end of custom controls
|
|
|
|
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
SUB idefindagain (showFlags AS _BYTE)
|
|
DIM comment AS _BYTE, quote AS _BYTE
|
|
|
|
IF idefindinvert THEN
|
|
IF idefindbackwards = 0 THEN idefindbackwards = 1 ELSE idefindbackwards = 0
|
|
END IF
|
|
|
|
s$ = idefindtext$
|
|
IF idefindcasesens = 0 THEN s$ = UCASE$(s$)
|
|
start = idecy
|
|
y = start
|
|
|
|
idefindnext2:
|
|
l$ = idegetline(y)
|
|
IF idefindcasesens = 0 THEN l$ = UCASE$(l$)
|
|
|
|
IF y = start THEN
|
|
'retrieve the unscanned portion of this line only
|
|
IF looped = 1 THEN
|
|
IF idefindbackwards THEN
|
|
IF LEN(l$) > idecx THEN l$ = STRING$(idecx, 255) + RIGHT$(l$, LEN(l$) - idecx) ELSE l$ = ""
|
|
ELSE
|
|
IF LEN(l$) > idecx THEN l$ = LEFT$(l$, idecx)
|
|
END IF
|
|
ELSE
|
|
IF idefindbackwards THEN
|
|
IF LEN(l$) > idecx THEN l$ = LEFT$(l$, idecx - 1 + (LEN(s$) - 1))
|
|
ELSE
|
|
IF LEN(l$) > idecx THEN l$ = STRING$(idecx, 255) + RIGHT$(l$, LEN(l$) - idecx) ELSE l$ = ""
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
x1 = 1
|
|
IF idefindbackwards THEN
|
|
x1 = LEN(l$) - LEN(s$) + 1
|
|
IF x1 < 0 THEN x1 = 0
|
|
END IF
|
|
|
|
idefindagain2:
|
|
|
|
IF idefindbackwards THEN
|
|
x = 0
|
|
FOR xx = x1 TO 1 STEP -1
|
|
IF ASC(l$, xx) = ASC(s$) THEN 'first char
|
|
xxo = xx - 1
|
|
FOR xx2 = xx TO xx + LEN(s$) - 1
|
|
IF ASC(l$, xx2) <> ASC(s$, xx2 - xxo) THEN EXIT FOR
|
|
NEXT
|
|
IF xx2 = xx + LEN(s$) THEN
|
|
'matched!
|
|
x = xx
|
|
EXIT FOR
|
|
END IF
|
|
END IF 'first char
|
|
NEXT
|
|
ELSE
|
|
x = INSTR(x1, l$, s$)
|
|
END IF
|
|
|
|
|
|
IF x THEN
|
|
IF idefindwholeword THEN
|
|
whole = 1
|
|
IF x > 1 THEN
|
|
c = ASC(UCASE$(MID$(l$, x - 1, 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF x + LEN(s$) <= LEN(l$) THEN
|
|
c = ASC(UCASE$(MID$(l$, x + LEN(s$), 1)))
|
|
IF c >= 65 AND c <= 90 THEN whole = 0
|
|
IF c >= 48 AND c <= 57 THEN whole = 0
|
|
END IF
|
|
IF whole = 0 THEN
|
|
x1 = x + 1: IF idefindbackwards THEN x1 = x - 1
|
|
x = 0
|
|
IF x1 > 0 AND x1 <= LEN(l$) THEN GOTO idefindagain2
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF x THEN
|
|
FindQuoteComment l$, x, comment, quote
|
|
IF idefindnocomments <> 0 AND comment THEN x = 0
|
|
IF idefindnostrings <> 0 AND quote THEN x = 0
|
|
IF idefindonlycomments <> 0 AND comment = 0 THEN x = 0
|
|
IF idefindonlystrings <> 0 AND quote = 0 THEN x = 0
|
|
END IF
|
|
|
|
IF x THEN
|
|
ideselect = 1
|
|
idecx = x: idecy = y
|
|
searchStringFoundOn = idecy
|
|
ideselectx1 = x + LEN(s$): ideselecty1 = y
|
|
|
|
IF idefindinvert THEN
|
|
IF idefindbackwards = 0 THEN idefindbackwards = 1 ELSE idefindbackwards = 0
|
|
idefindinvert = 0
|
|
END IF
|
|
idecentercurrentline
|
|
EXIT SUB
|
|
END IF
|
|
|
|
IF idefindbackwards THEN
|
|
y = y - 1
|
|
IF y = start - 1 AND looped = 1 THEN
|
|
idenomatch showFlags
|
|
IF idefindinvert THEN
|
|
IF idefindbackwards = 0 THEN idefindbackwards = 1 ELSE idefindbackwards = 0
|
|
idefindinvert = 0
|
|
END IF
|
|
EXIT SUB
|
|
END IF
|
|
IF y < 1 THEN y = iden: looped = 1
|
|
GOTO idefindnext2
|
|
ELSE
|
|
y = y + 1
|
|
IF y = start + 1 AND looped = 1 THEN
|
|
idenomatch showFlags
|
|
IF idefindinvert THEN
|
|
IF idefindbackwards = 0 THEN idefindbackwards = 1 ELSE idefindbackwards = 0
|
|
idefindinvert = 0
|
|
END IF
|
|
EXIT SUB
|
|
END IF
|
|
IF y > iden THEN y = 1: looped = 1
|
|
GOTO idefindnext2
|
|
END IF
|
|
END SUB
|
|
|
|
FUNCTION idegetline$ (i)
|
|
IF i <> -1 THEN idegotoline i
|
|
idegetline$ = MID$(idet$, ideli + 4, CVL(MID$(idet$, ideli, 4)))
|
|
END FUNCTION
|
|
|
|
SUB idecentercurrentline
|
|
IF iden <= idewy - 8 THEN EXIT SUB
|
|
idesy = idecy - (idewy - 8) \ 2
|
|
IF idesy < 1 THEN idesy = 1
|
|
END SUB
|
|
|
|
SUB idegotoline (i)
|
|
IF idel = i THEN EXIT SUB
|
|
IF i < 1 THEN i = 1
|
|
'scan backwards
|
|
IF i < idel THEN
|
|
DO
|
|
idel = idel - 1
|
|
ideli = ideli - CVL(MID$(idet$, ideli - 4, 4)) - 8
|
|
LOOP UNTIL idel = i
|
|
EXIT SUB
|
|
END IF
|
|
'assume scan forwards
|
|
DO
|
|
IF idel = iden THEN idet$ = idet$ + MKL$(0) + MKL$(0): iden = iden + 1 'insert blank line at end?
|
|
idel = idel + 1
|
|
ideli = ideli + CVL(MID$(idet$, ideli, 4)) + 8
|
|
LOOP UNTIL idel = i
|
|
END SUB
|
|
|
|
FUNCTION idehbar (x, y, h, i2, n2)
|
|
i = i2: n = n2
|
|
|
|
'COLOR 0, 7
|
|
'LOCATE y, x: PRINT CHR$(27);
|
|
'LOCATE y, x + w - 1: PRINT CHR$(26);
|
|
'FOR x2 = x + 1 TO x + w - 2
|
|
'LOCATE y, x2: PRINT chr$(176);
|
|
'NEXT
|
|
'IF w > 3 THEN
|
|
'p2! = w - 2 - .00001
|
|
'x2 = x + 1 + INT(p2! * p!)
|
|
'LOCATE y, x2: PRINT chr$(219);
|
|
'END IF
|
|
|
|
|
|
'h is size in characters (inc. arrows)
|
|
|
|
'draw background & arrows
|
|
COLOR 0, 7
|
|
_PRINTSTRING (x, y), CHR$(27)
|
|
_PRINTSTRING (x + h - 1, y), CHR$(26)
|
|
FOR x2 = x + 1 TO x + h - 2
|
|
_PRINTSTRING (x2, y), CHR$(176)
|
|
NEXT
|
|
|
|
'draw slider
|
|
|
|
IF n < 1 THEN n = 1
|
|
IF i < 1 THEN i = 1
|
|
IF i > n THEN i = n
|
|
|
|
IF h = 2 THEN
|
|
idehbar = x 'not position for slider exists
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF h = 3 THEN
|
|
idehbar = x + 1 'dummy value
|
|
'no slider
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF h = 4 THEN
|
|
IF n = 1 THEN
|
|
idehbar = x + 1 'dummy value
|
|
'no slider required for 1 item
|
|
EXIT FUNCTION
|
|
ELSE
|
|
'show whichever is closer of the two positions
|
|
p! = (i - 1) / (n - 1)
|
|
IF p! < .5 THEN x2 = x + 1 ELSE x2 = x + 2
|
|
_PRINTSTRING (x2, y), CHR$(219)
|
|
idehbar = x2
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
IF h > 4 THEN
|
|
IF n = 1 THEN
|
|
idehbar = x + h \ 4 'dummy value
|
|
'no slider required for 1 item
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF i = 1 THEN
|
|
x2 = x + 1
|
|
_PRINTSTRING (x2, y), CHR$(219)
|
|
idehbar = x2
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF i = n THEN
|
|
x2 = x + h - 2
|
|
_PRINTSTRING (x2, y), CHR$(219)
|
|
idehbar = x2
|
|
EXIT FUNCTION
|
|
END IF
|
|
'between i=1 and i=n
|
|
p! = (i - 1) / (n - 1)
|
|
p! = p! * (h - 4)
|
|
x2 = x + 2 + INT(p!)
|
|
_PRINTSTRING (x2, y), CHR$(219)
|
|
idehbar = x2
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION idehlen (a$)
|
|
IF INSTR(a$, "#") THEN idehlen = LEN(a$) - 1 ELSE idehlen = LEN(a$)
|
|
END FUNCTION
|
|
|
|
SUB idehPRINT (a$)
|
|
COLOR 0, 7
|
|
FOR i = 1 TO LEN(a$)
|
|
c$ = MID$(a$, i, 1)
|
|
IF c$ = "#" THEN
|
|
IF idehl THEN COLOR 15, 7
|
|
ELSE
|
|
PRINT c$;: COLOR 0, 7
|
|
END IF
|
|
NEXT
|
|
END SUB
|
|
|
|
SUB ideinsline (i, text$)
|
|
'note: cursor remains on line i
|
|
|
|
FOR b = 1 TO IdeBmkN
|
|
IF IdeBmk(b).y >= i THEN
|
|
y = IdeBmk(b).y + 1
|
|
IdeBmk(b).y = y
|
|
END IF
|
|
NEXT
|
|
|
|
IF vWatchOn THEN
|
|
REDIM _PRESERVE IdeBreakpoints(iden + 1) AS _BYTE
|
|
FOR b = iden + 1 TO i STEP -1
|
|
SWAP IdeBreakpoints(b), IdeBreakpoints(b - 1)
|
|
NEXT
|
|
IdeBreakpoints(i) = 0
|
|
|
|
REDIM _PRESERVE IdeSkipLines(iden + 1) AS _BYTE
|
|
FOR b = iden + 1 TO i STEP -1
|
|
SWAP IdeSkipLines(b), IdeSkipLines(b - 1)
|
|
NEXT
|
|
IdeSkipLines(i) = 0
|
|
END IF
|
|
|
|
text$ = RTRIM$(text$)
|
|
|
|
IF i = -1 THEN i = idel
|
|
'if at end, use idesetline
|
|
IF i > iden THEN
|
|
idesetline i, text$
|
|
EXIT SUB
|
|
END IF
|
|
idegotoline i
|
|
'insert line
|
|
textlen = LEN(text$)
|
|
idet$ = LEFT$(idet$, ideli - 1) + MKL$(textlen) + text$ + MKL$(textlen) + RIGHT$(idet$, LEN(idet$) - ideli + 1)
|
|
iden = iden + 1
|
|
END SUB
|
|
|
|
FUNCTION ideinputbox$(title$, caption$, initialvalue$, validinput$, boxwidth, maxlength, ok)
|
|
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
i = 0
|
|
ok = 0 'will be set to true if "OK" or Enter are used to close the dialog
|
|
|
|
idepar p, boxwidth, 5, title$
|
|
|
|
i = i + 1
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt(caption$)
|
|
o(i).txt = idenewtxt(initialvalue$)
|
|
IF LEN(initialvalue$) > 0 THEN o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
o(i).v1 = LEN(initialvalue$)
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 5
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus = 1 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
IF LEN(validinput$) THEN
|
|
a$ = idetxt(o(1).txt)
|
|
tempA$ = ""
|
|
FOR i = 1 TO LEN(a$)
|
|
IF INSTR(validinput$, MID$(a$, i, 1)) > 0 THEN
|
|
tempA$ = tempA$ + MID$(a$, i, 1)
|
|
END IF
|
|
NEXT
|
|
idetxt(o(1).txt) = tempA$
|
|
END IF
|
|
|
|
IF maxlength THEN
|
|
idetxt(o(1).txt) = LEFT$(idetxt(o(1).txt), maxlength)
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 3 AND info <> 0) THEN
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 2 AND info <> 0) THEN
|
|
ideinputbox$ = idetxt(o(1).txt)
|
|
ok = -1
|
|
ClearMouse
|
|
_KEYCLEAR
|
|
EXIT FUNCTION
|
|
END IF
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
END FUNCTION
|
|
|
|
SUB idenewsf (sf AS STRING)
|
|
'build initial name if word selected
|
|
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
|
|
END IF
|
|
|
|
newSF$ = ideinputbox$("New " + sf$, "#Name", a2$, "", 60, 40, 0)
|
|
|
|
IF LEN(newSF$) THEN
|
|
y = iden
|
|
y = y + 1: idesetline y, ""
|
|
y = y + 1: idesetline y, sf$ + " " + newSF$
|
|
idesy = y
|
|
y = y + 1: idesetline y, ""
|
|
idecy = y
|
|
y = y + 1: idesetline y, "END " + sf$
|
|
idecx = 1: idesx = 1
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END IF
|
|
END SUB
|
|
|
|
FUNCTION idenewfolder$(thispath$)
|
|
newfolder$ = ideinputbox$("New Folder", "#Name", "", "", 60, 0, 0)
|
|
|
|
IF LEN(newfolder$) THEN
|
|
IF _DIREXISTS(thispath$ + idepathsep$ + newfolder$) THEN
|
|
idenewfolder$ = newfolder$
|
|
EXIT SUB
|
|
END IF
|
|
ideerror = 5
|
|
MKDIR thispath$ + idepathsep$ + newfolder$
|
|
ideerror = 1
|
|
idenewfolder$ = newfolder$
|
|
END IF
|
|
END SUB
|
|
|
|
|
|
FUNCTION idenewtxt (a$)
|
|
idetxtlast = idetxtlast + 1
|
|
idetxt$(idetxtlast) = a$
|
|
idenewtxt = idetxtlast
|
|
END FUNCTION
|
|
|
|
SUB idenomatch (showFlags AS _BYTE)
|
|
msg$ = "Match not found."
|
|
c$ = ", "
|
|
IF showFlags THEN
|
|
IF idefindcasesens THEN flags$ = flags$ + "match case": flagset = flagset + 1
|
|
IF idefindwholeword THEN flags$ = flags$ + LEFT$(c$, ABS(flagset) * 2) + "whole word": flagset = flagset + 1
|
|
IF idefindnocomments THEN flags$ = flags$ + LEFT$(c$, ABS(flagset) * 2) + "no comments": flagset = flagset + 1
|
|
IF idefindonlycomments THEN flags$ = flags$ + LEFT$(c$, ABS(flagset) * 2) + "only comments": flagset = flagset + 1
|
|
IF idefindnostrings THEN flags$ = flags$ + LEFT$(c$, ABS(flagset) * 2) + "no strings": flagset = flagset + 1
|
|
IF idefindonlystrings THEN flags$ = flags$ + LEFT$(c$, ABS(flagset) * 2) + "only strings": flagset = flagset + 1
|
|
IF flagset > 1 THEN pl$ = "s"
|
|
IF flagset THEN msg$ = msg$ + "\n(Flag" + pl$ + ": " + flags$ + ")"
|
|
END IF
|
|
result = idemessagebox("Search complete", msg$, "")
|
|
END SUB
|
|
|
|
FUNCTION idefiledialog$(programname$, mode AS _BYTE)
|
|
STATIC AllFiles
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
path$ = idepath$
|
|
filelist$ = idezfilelist$(path$, AllFiles, "")
|
|
pathlist$ = idezpathlist$(path$)
|
|
|
|
i = 0
|
|
IF mode = 1 THEN
|
|
idepar p, 70, idewy + idesubwindow - 7, "Open"
|
|
ELSEIF mode = 2 THEN
|
|
idepar p, 70, idewy + idesubwindow - 7, "Save As"
|
|
END IF
|
|
i = i + 1
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt("File #Name")
|
|
IF mode = 2 THEN
|
|
o(i).txt = idenewtxt(programname$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
o(i).v1 = LEN(programname$)
|
|
END IF
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 5
|
|
o(i).w = 32: o(i).h = idewy + idesubwindow - 14
|
|
o(i).nam = idenewtxt("#Files")
|
|
o(i).txt = idenewtxt(filelist$): filelist$ = ""
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).x = 37: o(i).y = 5
|
|
o(i).w = 31: o(i).h = idewy + idesubwindow - 16
|
|
o(i).nam = idenewtxt("#Paths")
|
|
o(i).txt = idenewtxt(pathlist$): pathlist$ = ""
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 37
|
|
o(i).y = idewy + idesubwindow - 9
|
|
o(i).nam = idenewtxt(".#BAS Only")
|
|
IF AllFiles THEN o(i).sel = 0 ELSE o(i).sel = 1
|
|
prevBASOnly = o(i).sel
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).x = 56
|
|
o(i).y = idewy + idesubwindow - 9
|
|
o(i).txt = idenewtxt("Ne#w Folder")
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = idewy + idesubwindow - 7
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
IF mode = 1 AND LEN(IdeOpenFile) > 0 THEN f$ = IdeOpenFile: GOTO DirectLoad
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 4), "Path: "
|
|
a$ = path$
|
|
IF LEN(a$) = 2 AND RIGHT$(a$, 1) = ":" THEN a$ = a$ + "\"
|
|
w = p.w - 8
|
|
IF LEN(a$) > w - 3 THEN a$ = STRING$(3, 250) + RIGHT$(a$, w - 3)
|
|
_PRINTSTRING (p.x + 2 + 6, p.y + 4), a$
|
|
'-------- end of custom display changes --------
|
|
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
|
|
IF mode = 1 THEN
|
|
IF _TOTALDROPPEDFILES > 0 THEN
|
|
idetxt(o(1).txt) = _DROPPEDFILE$(1)
|
|
o(1).v1 = LEN(idetxt(o(1).txt))
|
|
focus = 1
|
|
_FINISHDROP
|
|
change = 1
|
|
END IF
|
|
END IF
|
|
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus = 1 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
IF o(4).sel <> prevBASOnly THEN
|
|
prevBASOnly = o(4).sel
|
|
IF o(4).sel = 0 THEN AllFiles = 1 ELSE AllFiles = 0
|
|
idetxt(o(2).txt) = idezfilelist$(path$, AllFiles, "")
|
|
o(2).sel = -1
|
|
GOTO ideopenloop
|
|
END IF
|
|
|
|
IF focus = 5 AND info <> 0 THEN
|
|
'create new folder
|
|
newpath$ = idenewfolder(path$)
|
|
IF LEN(newpath$) THEN
|
|
f$ = removeDoubleSlashes$(newpath$)
|
|
GOTO changepath
|
|
ELSE
|
|
GOTO ideopenloop
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) OR (focus = 7 AND info <> 0) THEN
|
|
idefiledialog$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF focus = 2 AND o(2).sel <> prevFileBoxSel THEN
|
|
prevFileBoxSel = o(2).sel
|
|
idetxt(o(1).txt) = idetxt(o(2).stx)
|
|
o(1).issel = 0
|
|
END IF
|
|
|
|
IF focus = 3 THEN
|
|
IF (K$ = CHR$(13) OR info = 1) AND o(3).sel >= 1 THEN
|
|
newpath$ = removeDoubleSlashes$(idetxt(o(3).stx))
|
|
IF newpath$ = "" THEN
|
|
newpath$ = ".."
|
|
f$ = newpath$
|
|
GOTO changepath
|
|
ELSE
|
|
path$ = removeDoubleSlashes$(idezchangepath(path$, newpath$))
|
|
idetxt(o(2).txt) = idezfilelist$(path$, AllFiles, "")
|
|
idetxt(o(3).txt) = idezpathlist$(path$)
|
|
|
|
o(2).sel = -1
|
|
o(3).sel = 1
|
|
IF info = 1 THEN o(3).sel = -1
|
|
GOTO ideopenloop
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'load or save file
|
|
IF K$ = CHR$(13) OR (info = 1 AND focus = 2) OR (focus = 6 AND info <> 0) THEN
|
|
f$ = idetxt(o(1).txt)
|
|
|
|
IF _FILEEXISTS(f$) THEN GOTO DirectLoad
|
|
|
|
IF f$ = "" AND focus = 1 AND K$ = CHR$(13) THEN
|
|
'reset filters
|
|
idetxt(o(2).txt) = idezfilelist$(path$, AllFiles, "")
|
|
o(2).sel = -1
|
|
GOTO ideopenloop
|
|
ELSEIF f$ = "" AND focus = 6 AND info <> 0 THEN
|
|
GOTO ideopenloop
|
|
END IF
|
|
|
|
'change path?
|
|
changepath:
|
|
IF _DIREXISTS(path$ + idepathsep$ + f$) THEN
|
|
'check/acquire file path
|
|
path$ = removeDoubleSlashes$(idezgetfilepath$(path$, f$ + idepathsep$)) 'note: path ending with pathsep needn't contain a file
|
|
IF ideerror > 1 THEN EXIT FUNCTION
|
|
|
|
IF LEN(newpath$) = 0 THEN
|
|
idetxt(o(1).txt) = ""
|
|
focus = 1
|
|
ELSE
|
|
newpath$ = ""
|
|
END IF
|
|
idetxt(o(2).txt) = idezfilelist$(path$, AllFiles, "")
|
|
o(2).sel = -1
|
|
idetxt(o(3).txt) = idezpathlist$(path$)
|
|
o(3).sel = -1
|
|
GOTO ideopenloop
|
|
END IF
|
|
|
|
'wildcards search
|
|
IF INSTR(f$, "?") > 0 OR INSTR(f$, "*") > 0 THEN
|
|
IF INSTR(f$, "/") > 0 OR INSTR(f$, "\") > 0 THEN
|
|
'path + wildcards
|
|
path$ = removeDoubleSlashes$(idezgetfilepath$(path$, f$)) 'note: path ending with pathsep needn't contain a file
|
|
IF ideerror > 1 THEN EXIT FUNCTION
|
|
idetxt(o(3).txt) = idezpathlist$(path$)
|
|
o(3).sel = -1
|
|
END IF
|
|
idetxt(o(1).txt) = f$
|
|
idetxt(o(2).txt) = idezfilelist$(path$, 2, f$)
|
|
o(2).sel = -1
|
|
o(1).v1 = LEN(idetxt(o(1).txt))
|
|
o(1).issel = -1
|
|
o(1).sx1 = 0
|
|
IF LCASE$(RIGHT$(f$, 4)) <> ".bas" THEN
|
|
AllFiles = 0
|
|
o(4).sel = 0
|
|
prevBASOnly = o(4).sel
|
|
END IF
|
|
GOTO ideopenloop
|
|
END IF
|
|
|
|
DirectLoad:
|
|
path$ = removeDoubleSlashes$(idezgetfilepath$(path$, f$)) 'repeat in case of DirectLoad
|
|
IF ideerror > 1 THEN EXIT FUNCTION
|
|
|
|
IF mode = 1 THEN
|
|
IF _FILEEXISTS(path$ + idepathsep$ + f$) = 0 THEN
|
|
'add .bas if not given
|
|
IF (LCASE$(RIGHT$(f$, 4)) <> ".bas") AND AllFiles = 0 THEN f$ = f$ + ".bas"
|
|
END IF
|
|
|
|
'check file exists
|
|
ideerror = 2
|
|
IF _FILEEXISTS(path$ + idepathsep$ + f$) = 0 THEN EXIT FUNCTION
|
|
|
|
IF BinaryFormatCheck%(path$, idepathsep$, f$) > 0 THEN
|
|
IF LEN(IdeOpenFile) THEN
|
|
idefiledialog$ = "C"
|
|
EXIT FUNCTION
|
|
ELSE
|
|
info = 0: GOTO ideopenloop
|
|
END IF
|
|
END IF
|
|
|
|
'load file
|
|
ideerror = 3
|
|
idet$ = MKL$(0) + MKL$(0): idel = 1: ideli = 1: iden = 1: IdeBmkN = 0
|
|
idesx = 1
|
|
idesy = 1
|
|
idecx = 1
|
|
idecy = 1
|
|
ideselect = 0
|
|
idefocusline = 0
|
|
lineinput3load path$ + idepathsep$ + f$
|
|
idet$ = SPACE$(LEN(lineinput3buffer) * 8)
|
|
i2 = 1
|
|
n = 0
|
|
chrtab$ = CHR$(9)
|
|
space1$ = " ": space2$ = " ": space3$ = " ": space4$ = " "
|
|
chr7$ = CHR$(7): chr11$ = CHR$(11): chr12$ = CHR$(12): chr28$ = CHR$(28): chr29$ = CHR$(29): chr30$ = CHR$(30): chr31$ = CHR$(31)
|
|
DO
|
|
a$ = lineinput3$
|
|
l = LEN(a$)
|
|
IF l THEN asca = ASC(a$) ELSE asca = -1
|
|
IF asca <> 13 THEN
|
|
IF asca <> -1 THEN
|
|
'fix tabs
|
|
ideopenfixtabs:
|
|
x = INSTR(a$, chrtab$)
|
|
IF x THEN
|
|
x2 = (x - 1) MOD 4
|
|
IF x2 = 0 THEN a$ = LEFT$(a$, x - 1) + space4$ + RIGHT$(a$, l - x): l = l + 3: GOTO ideopenfixtabs
|
|
IF x2 = 1 THEN a$ = LEFT$(a$, x - 1) + space3$ + RIGHT$(a$, l - x): l = l + 2: GOTO ideopenfixtabs
|
|
IF x2 = 2 THEN a$ = LEFT$(a$, x - 1) + space2$ + RIGHT$(a$, l - x): l = l + 1: GOTO ideopenfixtabs
|
|
IF x2 = 3 THEN a$ = LEFT$(a$, x - 1) + space1$ + RIGHT$(a$, l - x): GOTO ideopenfixtabs
|
|
END IF
|
|
END IF 'asca<>-1
|
|
MID$(idet$, i2, l + 8) = MKL$(l) + a$ + MKL$(l): i2 = i2 + l + 8: n = n + 1
|
|
END IF
|
|
LOOP UNTIL asca = 13
|
|
lineinput3buffer = ""
|
|
iden = n: IF n = 0 THEN idet$ = MKL$(0) + MKL$(0): iden = 1 ELSE idet$ = LEFT$(idet$, i2 - 1)
|
|
REDIM IdeBreakpoints(iden) AS _BYTE
|
|
REDIM IdeSkipLines(iden) AS _BYTE
|
|
variableWatchList$ = ""
|
|
backupVariableWatchList$ = "": REDIM backupUsedVariableList(1000) AS usedVarList
|
|
backupTypeDefinitions$ = ""
|
|
callstacklist$ = "": callStackLength = 0
|
|
|
|
ideerror = 1
|
|
ideprogname = f$: _TITLE ideprogname + " - " + WindowTitle
|
|
listOfCustomKeywords$ = LEFT$(listOfCustomKeywords$, customKeywordsLength)
|
|
idepath$ = path$
|
|
IdeAddRecent idepath$ + idepathsep$ + ideprogname$
|
|
IdeImportBookmarks idepath$ + idepathsep$ + ideprogname$
|
|
EXIT FUNCTION
|
|
ELSEIF mode = 2 THEN
|
|
IF FileHasExtension(f$) = 0 THEN f$ = f$ + ".bas"
|
|
|
|
ideerror = 3
|
|
OPEN path$ + idepathsep$ + f$ FOR BINARY AS #150
|
|
ideerror = 1
|
|
IF LOF(150) THEN
|
|
CLOSE #150
|
|
a$ = idefileexists(f$)
|
|
IF a$ = "N" THEN
|
|
idefiledialog$ = "C"
|
|
EXIT FUNCTION 'user didn't agree to overwrite
|
|
END IF
|
|
ELSE
|
|
CLOSE #150
|
|
END IF
|
|
ideprogname$ = f$: _TITLE ideprogname + " - " + WindowTitle
|
|
idesave path$ + idepathsep$ + f$
|
|
idepath$ = path$
|
|
IdeAddRecent idepath$ + idepathsep$ + ideprogname$
|
|
IdeSaveBookmarks idepath$ + idepathsep$ + ideprogname$
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
ideopenloop:
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
SUB idepar (par AS idedbptype, w, h, title$)
|
|
par.x = (idewx \ 2) - w \ 2
|
|
par.y = ((idewy + idesubwindow) \ 2) - h \ 2
|
|
par.w = w
|
|
par.h = h
|
|
IF LEN(title$) THEN par.nam = idenewtxt(title$)
|
|
_RESIZE OFF
|
|
END SUB
|
|
|
|
FUNCTION iderestore$
|
|
PCOPY 3, 0
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
result = idemessagebox("Backup found", "Recover program from auto-saved backup?", "#Yes;#No")
|
|
IF result = 1 THEN iderestore$ = "Y" ELSE iderestore$ = "N"
|
|
END FUNCTION
|
|
|
|
FUNCTION ideclearhistory$ (WhichHistory$)
|
|
SELECT CASE WhichHistory$
|
|
CASE "SEARCH": t$ = "Clear search history": m$ = "This cannot be undone. Proceed?"
|
|
CASE "FILES": t$ = "Clear recent files": m$ = "This cannot be undone. Proceed?"
|
|
END SELECT
|
|
result = idemessagebox(t$, m$, "#Yes;#No")
|
|
IF result = 1 THEN ideclearhistory$ = "Y" ELSE ideclearhistory$ = "N"
|
|
END FUNCTION
|
|
|
|
SUB idesave (f$)
|
|
ideerror = 6
|
|
OPEN f$ FOR OUTPUT AS #151
|
|
ideerror = 1
|
|
FOR i = 1 TO iden
|
|
a$ = idegetline(i)
|
|
PRINT #151, a$
|
|
NEXT
|
|
CLOSE #151
|
|
IdeSaveBookmarks f$
|
|
ideunsaved = 0
|
|
END SUB
|
|
|
|
FUNCTION idesavenow$
|
|
m$ = "Program is not saved. Save it now?"
|
|
result = idemessagebox("", m$, "#Yes;#No;#Cancel")
|
|
SELECT CASE result
|
|
CASE 1: idesavenow$ = "Y"
|
|
CASE 2: idesavenow$ = "N"
|
|
CASE 0, 3: idesavenow$ = "C"
|
|
END SELECT
|
|
END FUNCTION
|
|
|
|
SUB idesetline (i, text$)
|
|
|
|
text$ = RTRIM$(text$)
|
|
|
|
IF i <> -1 THEN idegotoline i
|
|
textlen = LEN(text$)
|
|
idet$ = LEFT$(idet$, ideli - 1) + MKL$(textlen) + text$ + MKL$(textlen) + RIGHT$(idet$, LEN(idet$) - ideli + 1 - CVL(MID$(idet$, ideli, 4)) - 8)
|
|
|
|
END SUB
|
|
|
|
FUNCTION timeElapsedSince! (startTime!)
|
|
IF startTime! > TIMER THEN startTime! = startTime! - 86400
|
|
timeElapsedSince! = TIMER - startTime!
|
|
END FUNCTION
|
|
|
|
SUB ideshowtext
|
|
|
|
IF ideshowtextBypassColorRestore = 0 THEN
|
|
_PALETTECOLOR 1, IDEBackgroundColor, 0
|
|
_PALETTECOLOR 2, _RGB32(84, 84, 84), 0 'dark gray - help system and interface details
|
|
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
|
_PALETTECOLOR 6, IDEBackgroundColor2, 0
|
|
_PALETTECOLOR 7, IDEChromaColor, 0
|
|
_PALETTECOLOR 8, IDENumbersColor, 0
|
|
_PALETTECOLOR 10, IDEMetaCommandColor, 0
|
|
_PALETTECOLOR 11, IDECommentColor, 0
|
|
_PALETTECOLOR 12, IDEKeywordColor, 0
|
|
_PALETTECOLOR 13, IDETextColor, 0
|
|
_PALETTECOLOR 14, IDEQuoteColor, 0
|
|
END IF
|
|
ideshowtextBypassColorRestore = 0
|
|
|
|
char.sep$ = CHR$(34) + " =<>+-/\^:;,*()'"
|
|
initialNum.char$ = "0123456789-.&"
|
|
num.char$ = "0123456789EDed+-.`%&!#~HBOhboACFacf"
|
|
|
|
DIM ideshowtext_comment AS _BYTE, ideshowtext_quote AS _BYTE
|
|
|
|
STATIC prevListOfCustomWords$, manualList AS _BYTE
|
|
DIM startTime AS SINGLE
|
|
|
|
startTime = TIMER
|
|
|
|
IF NOT DisableSyntaxHighlighter THEN
|
|
IF idefocusline <> 0 THEN
|
|
'there's an error and compilation is halted,
|
|
'so we'll build the list of subs/functions
|
|
'for proper highlighting:
|
|
IF idechangemade THEN manualList = 0
|
|
IF manualList = 0 THEN
|
|
manualList = -1
|
|
listOfCustomKeywords$ = LEFT$(listOfCustomKeywords$, customKeywordsLength)
|
|
FOR y = 1 TO iden
|
|
a$ = UCASE$(_TRIM$(idegetline(y)))
|
|
sf = 0
|
|
IF LEFT$(a$, 4) = "SUB " THEN sf = 1
|
|
IF LEFT$(a$, 9) = "FUNCTION " THEN sf = 2
|
|
IF sf THEN
|
|
IF RIGHT$(a$, 7) = " STATIC" THEN
|
|
a$ = RTRIM$(LEFT$(a$, LEN(a$) - 7))
|
|
END IF
|
|
|
|
IF sf = 1 THEN
|
|
a$ = MID$(a$, 5)
|
|
ELSE
|
|
a$ = MID$(a$, 10)
|
|
END IF
|
|
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
x = INSTR(a$, "(")
|
|
IF x THEN
|
|
a$ = RTRIM$(LEFT$(a$, x - 1))
|
|
ELSE
|
|
cleanSubName a$
|
|
END IF
|
|
listOfCustomKeywords$ = listOfCustomKeywords$ + "@" + removesymbol2$(a$) + "@"
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
ELSE
|
|
manualList = 0
|
|
END IF
|
|
|
|
IF prevListOfCustomWords$ <> listOfCustomKeywords$ THEN
|
|
IF manualList = 0 THEN
|
|
DO
|
|
atSign = INSTR(atSign + 1, listOfCustomKeywords$, "@")
|
|
nextAt = INSTR(atSign + 1, listOfCustomKeywords$, "@")
|
|
IF nextAt = 0 THEN EXIT DO
|
|
IF atSign > customKeywordsLength THEN
|
|
checkKeyword$ = removesymbol2$(MID$(listOfCustomKeywords$, atSign + 1, (nextAt - atSign) - 1))
|
|
IF LEN(checkKeyword$) THEN
|
|
hashchkflags = HASHFLAG_RESERVED + HASHFLAG_CONSTANT
|
|
hashchkflags = hashchkflags + HASHFLAG_FUNCTION
|
|
hashres1 = HashFind(checkKeyword$, hashchkflags, hashresflags, hashresref)
|
|
IF hashres1 <> 0 THEN hashres1 = 1
|
|
hashchkflags = HASHFLAG_RESERVED + HASHFLAG_CONSTANT
|
|
hashchkflags = hashchkflags + HASHFLAG_SUB
|
|
hashres2 = HashFind(checkKeyword$, hashchkflags, hashresflags, hashresref)
|
|
IF hashres2 <> 0 THEN hashres2 = 1
|
|
IF hashres1 + hashres2 = 0 THEN
|
|
'remove this custom keyword if not registered
|
|
MID$(listOfCustomKeywords$, atSign + 1, (nextAt - atSign) - 1) = STRING$(LEN(checkKeyword$), "@")
|
|
END IF
|
|
END IF
|
|
END IF
|
|
LOOP
|
|
END IF
|
|
|
|
FOR i = 1 TO LEN(listOfCustomKeywords$)
|
|
checkChar = ASC(listOfCustomKeywords$, i)
|
|
IF checkChar = 64 THEN
|
|
IF RIGHT$(tempList$, 1) <> "@" THEN tempList$ = tempList$ + "@"
|
|
ELSE
|
|
tempList$ = tempList$ + CHR$(checkChar)
|
|
END IF
|
|
NEXT
|
|
listOfCustomKeywords$ = tempList$
|
|
|
|
DO WHILE INSTR(listOfCustomKeywords$, fix046$)
|
|
x = INSTR(listOfCustomKeywords$, fix046$)
|
|
listOfCustomKeywords$ = LEFT$(listOfCustomKeywords$, x - 1) + "." + RIGHT$(listOfCustomKeywords$, LEN(listOfCustomKeywords$) - x + 1 - LEN(fix046$))
|
|
LOOP
|
|
|
|
prevListOfCustomWords$ = listOfCustomKeywords$
|
|
END IF
|
|
END IF
|
|
|
|
|
|
cc = -1
|
|
|
|
IF idecx < idesx THEN idesx = idecx
|
|
IF idecy < idesy THEN idesy = idecy
|
|
IF (idecx + maxLineNumberLength) - idesx >= (idewx - 2) THEN idesx = (idecx + maxLineNumberLength) - (idewx - 3)
|
|
IF idecy - idesy >= (idewy - 8) THEN idesy = idecy - (idewy - 9)
|
|
|
|
sy1 = ideselecty1
|
|
sy2 = idecy
|
|
IF sy1 > sy2 THEN SWAP sy1, sy2
|
|
sx1 = ideselectx1
|
|
sx2 = idecx
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
|
|
l = idesy
|
|
EnteringRGB = 0
|
|
|
|
IF NOT DisableSyntaxHighlighter THEN
|
|
idecy_multilinestart = 0
|
|
idecy_multilineend = 0
|
|
a$ = idegetline(idecy)
|
|
FindQuoteComment a$, LEN(a$), ideshowtext_comment, ideshowtext_quote
|
|
IF RIGHT$(a$, 1) = "_" AND ideshowtext_comment = 0 THEN
|
|
'Find the beginning of the multiline
|
|
FOR idecy_i = idecy - 1 TO 1 STEP -1
|
|
b$ = idegetline(idecy_i)
|
|
FindQuoteComment b$, LEN(b$), ideshowtext_comment, ideshowtext_quote
|
|
IF RIGHT$(b$, 1) <> "_" OR ideshowtext_comment = -1 THEN idecy_multilinestart = idecy_i + 1: EXIT FOR
|
|
NEXT
|
|
IF idecy_multilinestart = 0 THEN idecy_multilinestart = 1
|
|
|
|
'Find the end of the multiline
|
|
FOR idecy_i = idecy + 1 TO iden
|
|
b$ = idegetline(idecy_i)
|
|
FindQuoteComment b$, LEN(b$), ideshowtext_comment, ideshowtext_quote
|
|
IF RIGHT$(b$, 1) <> "_" OR ideshowtext_comment = -1 THEN idecy_multilineend = idecy_i: EXIT FOR
|
|
NEXT
|
|
IF idecy_multilineend = 0 THEN idecy_multilinestart = iden
|
|
ELSE
|
|
IF idecy > 1 THEN b$ = idegetline(idecy - 1) ELSE b$ = ""
|
|
FindQuoteComment b$, LEN(b$), ideshowtext_comment, ideshowtext_quote
|
|
IF RIGHT$(b$, 1) = "_" AND ideshowtext_comment = 0 THEN
|
|
idecy_multilineend = idecy
|
|
|
|
'Find the beginning of the multiline
|
|
FOR idecy_i = idecy - 1 TO 1 STEP -1
|
|
b$ = idegetline(idecy_i)
|
|
FindQuoteComment b$, LEN(b$), ideshowtext_comment, ideshowtext_quote
|
|
IF RIGHT$(b$, 1) <> "_" OR ideshowtext_comment = -1 THEN idecy_multilinestart = idecy_i + 1: EXIT FOR
|
|
NEXT
|
|
IF idecy_multilinestart = 0 THEN idecy_multilinestart = 1
|
|
END IF
|
|
END IF
|
|
|
|
IF idecy > 1 THEN b$ = idegetline(idecy - 1) ELSE b$ = ""
|
|
|
|
ActiveINCLUDELink = 0
|
|
|
|
FOR y = 0 TO (idewy - 9)
|
|
COLOR 7, 1
|
|
_PRINTSTRING (1, y + 3), CHR$(179) 'clear prev bookmarks from lhs
|
|
|
|
GOSUB ShowLineNumber
|
|
|
|
IF (l = idefocusline AND idecy <> l AND IdeDebugMode = 0) OR (l = idefocusline AND idecy = l AND IdeDebugMode <> 0) THEN
|
|
COLOR 7, 4 'Line with error gets a red background
|
|
ELSEIF idecy = l OR (l >= idecy_multilinestart AND l <= idecy_multilineend) THEN
|
|
IF HideCurrentLineHighlight = 0 AND IdeSystem = 1 THEN COLOR 7, 6 'Highlight the current line
|
|
ELSE
|
|
COLOR 7, 1 'Regular text color
|
|
END IF
|
|
|
|
IF l <= iden THEN
|
|
DO UNTIL l < UBOUND(InValidLine) 'make certain we have enough InValidLine elements to cover us in case someone scrolls QB64
|
|
REDIM _PRESERVE InValidLine(UBOUND(InValidLine) + 1000) AS _BYTE ' to the end of a program before the IDE has finished
|
|
LOOP ' verifying the code and growing the array during the IDE passes.
|
|
|
|
a$ = idegetline(l)
|
|
link_idecx = 0
|
|
shiftEnter_idecx = 0
|
|
IF l = idecy THEN
|
|
IF idecx <= LEN(a$) AND idecx >= 1 THEN
|
|
cc = ASC(a$, idecx)
|
|
IF cc = 32 THEN
|
|
IF LTRIM$(LEFT$(a$, idecx)) = "" THEN cc = -1
|
|
END IF
|
|
END IF
|
|
|
|
'Check if the cursor is positioned inside a comment or
|
|
'quotation marks:
|
|
FindQuoteComment a$, idecx, ideshowtext_comment, ideshowtext_quote
|
|
idecx_comment = ideshowtext_comment
|
|
idecx_quote = ideshowtext_quote
|
|
|
|
'Check if we're on a bracket, to highlight it and its match
|
|
brackets = 0
|
|
bracket1 = 0
|
|
bracket2 = 0
|
|
IF idecx_comment + idecx_quote = 0 AND brackethighlight = -1 THEN
|
|
inquote = 0
|
|
comment = 0
|
|
IF MID$(a$, idecx, 1) = "(" THEN
|
|
brackets = 1
|
|
bracket1 = idecx
|
|
ScanBracket2:
|
|
FOR k = bracket1 + 1 TO LEN(a$)
|
|
SELECT CASE MID$(a$, k, 1)
|
|
CASE CHR$(34)
|
|
inquote = NOT inquote
|
|
CASE "'"
|
|
IF inquote = 0 THEN comment = -1: EXIT FOR
|
|
END SELECT
|
|
IF MID$(a$, k, 1) = ")" AND inquote = 0 THEN
|
|
brackets = brackets - 1
|
|
IF brackets = 0 THEN bracket2 = k: EXIT FOR
|
|
ELSEIF MID$(a$, k, 1) = "(" AND inquote = 0 THEN
|
|
brackets = brackets + 1
|
|
END IF
|
|
NEXT
|
|
ELSEIF MID$(a$, idecx - 1, 1) = "(" AND MID$(a$, idecx, 1) <> CHR$(34) THEN
|
|
brackets = 1
|
|
bracket1 = idecx - 1
|
|
GOTO ScanBracket2
|
|
ELSEIF MID$(a$, idecx, 1) = ")" THEN
|
|
brackets = 1
|
|
bracket2 = idecx
|
|
ScanBracket1:
|
|
FOR k = bracket2 - 1 TO 1 STEP -1
|
|
SELECT CASE MID$(a$, k, 1)
|
|
CASE CHR$(34)
|
|
inquote = NOT inquote
|
|
END SELECT
|
|
IF MID$(a$, k, 1) = "(" AND inquote = 0 THEN
|
|
brackets = brackets - 1
|
|
IF brackets = 0 THEN bracket1 = k: EXIT FOR
|
|
ELSEIF MID$(a$, k, 1) = ")" AND inquote = 0 THEN
|
|
brackets = brackets + 1
|
|
END IF
|
|
NEXT
|
|
ELSEIF MID$(a$, idecx - 1, 1) = ")" AND MID$(a$, idecx, 1) <> CHR$(34) THEN
|
|
brackets = 1
|
|
bracket2 = idecx - 1
|
|
GOTO ScanBracket1
|
|
END IF
|
|
END IF
|
|
|
|
'If the user is typing on the current line and has just inserted
|
|
'an _RGB(, _RGB32(, _RGBA( or _RGBA32(, we'll offer the RGB
|
|
'color mixer.
|
|
a2$ = UCASE$(a$)
|
|
'IF IdeAutoComplete AND idecx = LEN(a$) + 1 AND idecx_comment + idecx_quote = 0 THEN
|
|
IF idecx = LEN(a$) + 1 AND idecx_comment + idecx_quote = 0 THEN
|
|
IF (RIGHT$(a2$, 5) = "_RGB(" OR _
|
|
RIGHT$(a2$, 7) = "_RGB32(" OR _
|
|
RIGHT$(a2$, 6) = "_RGBA(" OR _
|
|
RIGHT$(a2$, 8) = "_RGBA32(") OR _
|
|
((RIGHT$(a2$, 4) = "RGB(" OR _
|
|
RIGHT$(a2$, 6) = "RGB32(" OR _
|
|
RIGHT$(a2$, 5) = "RGBA(" OR _
|
|
RIGHT$(a2$, 7) = "RGBA32(") AND qb64prefix_set = 1) THEN
|
|
shiftEnter_idecx = LEN(a$)
|
|
a$ = a$ + " --> Shift+ENTER to open the RGB mixer"
|
|
EnteringRGB = -1
|
|
END IF
|
|
ELSEIF idecx_comment + idecx_quote = 0 THEN
|
|
IF (MID$(a2$, idecx - 5, 5) = "_RGB(" OR _
|
|
MID$(a2$, idecx - 7, 7) = "_RGB32(" OR _
|
|
MID$(a2$, idecx - 6, 6) = "_RGBA(" OR _
|
|
MID$(a2$, idecx - 8, 8) = "_RGBA32(") OR _
|
|
((MID$(a2$, idecx - 4, 4) = "RGB(" OR _
|
|
MID$(a2$, idecx - 6, 6) = "RGB32(" OR _
|
|
MID$(a2$, idecx - 5, 5) = "RGBA(" OR _
|
|
MID$(a2$, idecx - 7, 7) = "RGBA32(") AND qb64prefix_set = 1) THEN
|
|
IF INSTR("0123456789", MID$(a2$, idecx, 1)) = 0 THEN EnteringRGB = -1
|
|
END IF
|
|
END IF
|
|
|
|
FindInclude = _INSTRREV(a2$, "$INCLUDE")
|
|
IF FindInclude > 0 THEN
|
|
link_idecx = LEN(a$)
|
|
FindApostrophe1 = INSTR(FindInclude + 8, a2$, "'")
|
|
FindApostrophe2 = INSTR(FindApostrophe1 + 1, a2$, "'")
|
|
ActiveINCLUDELinkFile = MID$(a$, FindApostrophe1 + 1, FindApostrophe2 - FindApostrophe1 - 1)
|
|
p$ = idepath$ + pathsep$
|
|
f$ = p$ + ActiveINCLUDELinkFile
|
|
IF _FILEEXISTS(f$) OR _FILEEXISTS(ActiveINCLUDELinkFile) THEN
|
|
a$ = a$ + " --> Double-click to open": ActiveINCLUDELink = idecy
|
|
END IF
|
|
END IF
|
|
END IF 'l = idecy
|
|
|
|
a2$ = SPACE$(idesx + (idewx - 3))
|
|
MID$(a2$, 1) = a$
|
|
ELSE
|
|
a2$ = SPACE$((idewx - 2))
|
|
END IF
|
|
|
|
'Syntax highlighter
|
|
inquote = 0
|
|
metacommand = 0
|
|
comment = 0
|
|
isKeyword = 0: oldChar$ = ""
|
|
isCustomKeyword = 0
|
|
multiHighlightLength = 0
|
|
prevBG% = _BACKGROUNDCOLOR
|
|
|
|
FOR m = 1 TO LEN(a2$) 'print to the screen while checking required color changes
|
|
IF timeElapsedSince(startTime) > 1 THEN
|
|
result = idemessagebox("Syntax Highlighter Disabled", "Syntax Highlighter has been disabled to avoid slowing down the IDE.\nYou can reenable the Highlighter in the 'Options' menu.", "")
|
|
DisableSyntaxHighlighter = -1
|
|
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "True"
|
|
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = "Syntax #Highlighter"
|
|
GOTO noSyntaxHighlighting
|
|
END IF
|
|
IF m > idesx + idewx - 2 THEN EXIT FOR 'stop printing when off screen
|
|
IF ideselect = 1 AND LEN(ideCurrentSingleLineSelection) > 0 AND multiHighlightLength = 0 AND multihighlight = -1 THEN
|
|
IF LCASE$(MID$(a2$, m, LEN(ideCurrentSingleLineSelection))) = LCASE$(ideCurrentSingleLineSelection) THEN
|
|
'the current selection was found at this spot. Multi-highlight takes place:
|
|
IF m > 1 THEN
|
|
IF INSTR(char.sep$, MID$(a2$, m - 1, 1)) > 0 THEN
|
|
IF m + LEN(ideCurrentSingleLineSelection) < LEN(a2$) AND _
|
|
(INSTR(char.sep$, MID$(a2$, m + LEN(ideCurrentSingleLineSelection), 1)) > 0 OR _
|
|
MID$(a2$, m + LEN(ideCurrentSingleLineSelection), 1) = ".") THEN
|
|
multiHighlightLength = LEN(ideCurrentSingleLineSelection)
|
|
ELSEIF m + LEN(ideCurrentSingleLineSelection) >= LEN(a2$) THEN
|
|
multiHighlightLength = LEN(ideCurrentSingleLineSelection)
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
IF m + LEN(ideCurrentSingleLineSelection) < LEN(a2$) AND _
|
|
(INSTR(char.sep$, MID$(a2$, m + LEN(ideCurrentSingleLineSelection), 1)) > 0 OR _
|
|
MID$(a2$, m + LEN(ideCurrentSingleLineSelection), 1) = ".") THEN
|
|
multiHighlightLength = LEN(ideCurrentSingleLineSelection)
|
|
ELSEIF m + LEN(ideCurrentSingleLineSelection) >= LEN(a2$) THEN
|
|
multiHighlightLength = LEN(ideCurrentSingleLineSelection)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
thisChar$ = MID$(a2$, m, 1)
|
|
|
|
IF comment = 0 THEN
|
|
SELECT CASE thisChar$
|
|
CASE CHR$(34): inquote = NOT inquote
|
|
CASE "'": IF inquote = 0 THEN comment = -1
|
|
END SELECT
|
|
END IF
|
|
|
|
COLOR 13
|
|
|
|
IF InValidLine(l) THEN COLOR 7: GOTO SkipSyntaxHighlighter
|
|
|
|
IF (LEN(oldChar$) > 0 OR m = 1) AND inquote = 0 AND isKeyword = 0 THEN
|
|
IF INSTR(initialNum.char$, thisChar$) > 0 AND oldChar$ <> ")" AND (INSTR(char.sep$, oldChar$) > 0 OR oldChar$ = "?") THEN
|
|
'a number literal
|
|
checkKeyword$ = ""
|
|
is_Number = 0
|
|
|
|
FOR i = m TO LEN(a2$)
|
|
IF INSTR(num.char$, MID$(a2$, i, 1)) = 0 THEN EXIT FOR
|
|
checkKeyword$ = checkKeyword$ + MID$(a2$, i, 1)
|
|
NEXT
|
|
|
|
IF checkKeyword$ = "-" OR checkKeyword$ = "." OR checkKeyword$ = "&" THEN
|
|
checkKeyword$ = ""
|
|
ELSE
|
|
IF isnumber(checkKeyword$) THEN
|
|
is_Number = -1
|
|
isKeyword = LEN(checkKeyword$)
|
|
ELSEIF INSTR(UserDefineList$, "@" + UCASE$(checkKeyword$)) > 0 THEN
|
|
'keep checking
|
|
FOR i = i TO LEN(a2$)
|
|
IF INSTR(char.sep$, MID$(a2$, i, 1)) > 0 THEN right.sep$ = MID$(a2$, i, 1): GOTO keywordAcquired
|
|
checkKeyword$ = checkKeyword$ + MID$(a2$, i, 1)
|
|
NEXT
|
|
GOTO keywordAcquired
|
|
END IF
|
|
END IF
|
|
GOTO setOldChar
|
|
END IF
|
|
|
|
IF (INSTR(char.sep$, oldChar$) > 0 OR oldChar$ = "?") AND INSTR(char.sep$, thisChar$) = 0 THEN
|
|
'a new "word" begins; check if it's an internal keyword
|
|
checkKeyword$ = ""
|
|
right.sep$ = ""
|
|
FOR i = m TO LEN(a2$)
|
|
IF INSTR(char.sep$, MID$(a2$, i, 1)) > 0 THEN right.sep$ = MID$(a2$, i, 1): EXIT FOR
|
|
checkKeyword$ = checkKeyword$ + MID$(a2$, i, 1)
|
|
NEXT
|
|
IF comment = 0 AND LEFT$(checkKeyword$, 1) = "?" THEN isKeyword = 1: GOTO setOldChar
|
|
keywordAcquired:
|
|
checkKeyword$ = UCASE$(checkKeyword$)
|
|
IF INSTR(listOfKeywords$, "@" + checkKeyword$ + "@") > 0 OR _
|
|
(qb64prefix_set = 1 AND INSTR(listOfKeywords$, "@_" + checkKeyword$ + "@") > 0) THEN
|
|
'special cases
|
|
IF checkKeyword$ = "$END" THEN
|
|
IF UCASE$(MID$(a2$, m, 7)) = "$END IF" THEN checkKeyword$ = "$END IF"
|
|
ELSEIF checkKeyword$ = "THEN" AND _
|
|
(UCASE$(LEFT$(LTRIM$(a2$), 3)) = "$IF" OR _
|
|
UCASE$(LEFT$(LTRIM$(a2$), 7)) = "$ELSEIF") THEN
|
|
metacommand = -1
|
|
ELSEIF checkKeyword$ = "$ASSERTS" THEN
|
|
IF UCASE$(_TRIM$(a2$)) = "$ASSERTS:CONSOLE" THEN
|
|
checkKeyword$ = "$ASSERTS:CONSOLE"
|
|
END IF
|
|
END IF
|
|
isKeyword = LEN(checkKeyword$)
|
|
ELSEIF INSTR(listOfCustomKeywords$, "@" + removesymbol2$(checkKeyword$) + "@") > 0 THEN
|
|
isCustomKeyword = -1
|
|
isKeyword = LEN(checkKeyword$)
|
|
ELSEIF INSTR(UserDefineList$, "@" + checkKeyword$ + "@") > 0 AND _
|
|
(UCASE$(LEFT$(LTRIM$(a2$), 3)) = "$IF" OR _
|
|
UCASE$(LEFT$(LTRIM$(a2$), 7)) = "$ELSEIF") THEN
|
|
isCustomKeyword = -1
|
|
isKeyword = LEN(checkKeyword$)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
setOldChar:
|
|
oldChar$ = thisChar$
|
|
|
|
IF isKeyword > 0 AND keywordHighlight THEN
|
|
IF is_Number THEN
|
|
COLOR 8
|
|
ELSEIF isCustomKeyword THEN
|
|
COLOR 10
|
|
ELSE
|
|
COLOR 12
|
|
END IF
|
|
IF LEFT$(checkKeyword$, 1) = "$" THEN metacommand = -1
|
|
END IF
|
|
|
|
IF comment THEN
|
|
COLOR 11
|
|
IF metacommand THEN
|
|
SELECT CASE checkKeyword$
|
|
CASE "$INCLUDE"
|
|
IF INSTR(m + 1, UCASE$(a2$), checkKeyword$) = 0 THEN COLOR 10
|
|
CASE "$DYNAMIC", "$STATIC"
|
|
IF INSTR(m + 1, UCASE$(a2$), "$DYNAMIC") = 0 AND INSTR(m + 1, UCASE$(a2$), "$STATIC") = 0 THEN COLOR 10
|
|
END SELECT
|
|
END IF
|
|
ELSEIF metacommand THEN
|
|
COLOR 10
|
|
ELSEIF inquote OR thisChar$ = CHR$(34) THEN
|
|
COLOR 14
|
|
END IF
|
|
|
|
SkipSyntaxHighlighter:
|
|
|
|
IF l = idecy AND (link_idecx > 0 AND m > link_idecx) THEN COLOR 10
|
|
IF (shiftEnter_idecx > 0 AND m > shiftEnter_idecx) THEN COLOR 10
|
|
|
|
IF l = idecy AND (m = bracket1 OR m = bracket2) THEN
|
|
COLOR , 5
|
|
ELSEIF multiHighlightLength > 0 AND multihighlight = -1 THEN
|
|
multiHighlightLength = multiHighlightLength - 1
|
|
COLOR , 5
|
|
ELSE
|
|
COLOR , prevBG%
|
|
END IF
|
|
|
|
IF ShowLineNumbers THEN
|
|
IF (2 + m - idesx) + maxLineNumberLength >= 2 + maxLineNumberLength AND (2 + m - idesx) + maxLineNumberLength < idewx THEN
|
|
_PRINTSTRING ((2 + m - idesx) + maxLineNumberLength, y + 3), thisChar$
|
|
END IF
|
|
ELSE
|
|
IF 2 + m - idesx >= 2 AND 2 + m - idesx < idewx THEN
|
|
_PRINTSTRING (2 + m - idesx, y + 3), thisChar$
|
|
END IF
|
|
END IF
|
|
|
|
'Restore BG color in case a matching bracket was printed with different BG
|
|
IF l = idecy THEN COLOR , 6
|
|
IF isKeyword > 0 THEN isKeyword = isKeyword - 1
|
|
IF isKeyword = 0 AND checkKeyword$ = "REM" THEN comment = -1
|
|
IF isKeyword = 0 THEN checkKeyword$ = "": metacommand = 0: is_Number = 0: isCustomKeyword = 0
|
|
NEXT m
|
|
|
|
'apply selection color change if necessary
|
|
IF (IdeSystem = 1 OR IdeSystem = 2) AND ideselect <> 0 THEN
|
|
IF l >= sy1 AND l <= sy2 THEN
|
|
IF sy1 = sy2 THEN 'single line select
|
|
COLOR 1, 7
|
|
x2 = idesx
|
|
FOR x = 2 + maxLineNumberLength TO (idewx - 1)
|
|
IF x2 >= sx1 AND x2 < sx2 THEN
|
|
a = SCREEN(y + 3, x)
|
|
|
|
IF a = 63 THEN '"?"
|
|
c = SCREEN(y + 3, x, 1)
|
|
ELSE
|
|
c = 1
|
|
END IF
|
|
IF (c AND 15) = 0 THEN 'black background
|
|
COLOR 0, 7
|
|
_PRINTSTRING (x, y + 3), "?"
|
|
COLOR 1, 7
|
|
ELSE
|
|
_PRINTSTRING (x, y + 3), CHR$(a)
|
|
END IF
|
|
|
|
|
|
END IF
|
|
x2 = x2 + 1
|
|
NEXT
|
|
COLOR 7, 1
|
|
ELSE 'multiline select
|
|
IF idecx = 1 AND l = sy2 AND idecy > sy1 THEN GOTO nofinalselect
|
|
LOCATE y + 3, 2 + maxLineNumberLength
|
|
COLOR 1, 7
|
|
|
|
FOR x = idesx TO idesx + idewx - (2 + maxLineNumberLength)
|
|
PRINT MID$(a2$, x, 1);
|
|
NEXT
|
|
|
|
COLOR 7, 1
|
|
nofinalselect:
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
l = l + 1
|
|
NEXT
|
|
ELSE
|
|
noSyntaxHighlighting:
|
|
'original SUB ideshowtext routine:
|
|
COLOR 13, 1
|
|
l = idesy
|
|
FOR y = 0 TO (idewy - 9)
|
|
COLOR 7, 1
|
|
_PRINTSTRING (1, y + 3), CHR$(179) 'clear prev bookmarks from lhs
|
|
|
|
GOSUB ShowLineNumber
|
|
|
|
IF l = idefocusline AND idecy <> l THEN COLOR 13, 4 ELSE COLOR 13, 1
|
|
|
|
IF l <= iden THEN
|
|
a$ = idegetline(l)
|
|
a2$ = SPACE$(idesx + (idewx - 3) - maxLineNumberLength)
|
|
MID$(a2$, 1) = a$
|
|
a2$ = RIGHT$(a2$, (idewx - 2) - maxLineNumberLength)
|
|
ELSE
|
|
a2$ = SPACE$((idewx - 2) - maxLineNumberLength)
|
|
END IF
|
|
_PRINTSTRING (2 + maxLineNumberLength, y + 3), a2$
|
|
|
|
IF l = idecy THEN
|
|
IF idecx <= LEN(a$) AND idecx >= 1 THEN
|
|
cc = ASC(a$, idecx)
|
|
IF cc = 32 THEN
|
|
IF LTRIM$(LEFT$(a$, idecx)) = "" THEN cc = -1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'apply selection color change if necessary
|
|
IF ideselect THEN
|
|
IF l >= sy1 AND l <= sy2 THEN
|
|
IF sy1 = sy2 THEN 'single line select
|
|
COLOR 1, 7
|
|
x2 = idesx
|
|
FOR x = 2 + maxLineNumberLength TO (idewx - 1)
|
|
IF x2 >= sx1 AND x2 < sx2 THEN
|
|
a = SCREEN(y + 3, x): _PRINTSTRING (x, y + 3), CHR$(a)
|
|
END IF
|
|
x2 = x2 + 1
|
|
NEXT
|
|
COLOR 7, 1
|
|
ELSE 'multiline select
|
|
IF idecx = 1 AND l = sy2 AND idecy > sy1 THEN GOTO nofinalselect0
|
|
COLOR 1, 7: _PRINTSTRING (2 + maxLineNumberLength, y + 3), a2$
|
|
COLOR 7, 1
|
|
nofinalselect0:
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
l = l + 1
|
|
NEXT
|
|
END IF
|
|
|
|
COLOR 7, 1
|
|
FOR b = 1 TO IdeBmkN
|
|
y = IdeBmk(b).y
|
|
IF y >= idesy AND y <= idesy + (idewy - 9) THEN
|
|
_PRINTSTRING (1, 3 + y - idesy), CHR$(197)
|
|
END IF
|
|
NEXT
|
|
|
|
q = idevbar(idewx, 3, (idewy - 8), idecy, iden)
|
|
q = idehbar(2, (idewy - 5), (idewx - 2), idesx, 608)
|
|
|
|
'update cursor pos in status bar
|
|
COLOR 0, 3
|
|
a$ = SPACE$(10)
|
|
b$ = ""
|
|
RSET a$ = LTRIM$(STR$(idecy))
|
|
IF idecx < 100000 THEN
|
|
b$ = SPACE$(10)
|
|
c$ = LTRIM$(STR$(idecx))
|
|
IF cc <> -1 THEN c$ = c$ + "(" + str2$(cc) + ")"
|
|
LSET b$ = c$
|
|
END IF
|
|
lineNumberStatus$ = a$ + ":" + b$
|
|
'_PRINTSTRING (idewx - 21, idewy + idesubwindow), CHR$(179)
|
|
_PRINTSTRING (idewx - 20, idewy + idesubwindow), lineNumberStatus$
|
|
|
|
SCREEN , , 0, 0: LOCATE idecy - idesy + 3, maxLineNumberLength + idecx - idesx + 2: SCREEN , , 3, 0
|
|
|
|
EXIT SUB
|
|
ShowLineNumber:
|
|
DO WHILE l > UBOUND(IdeBreakpoints)
|
|
REDIM _PRESERVE IdeBreakpoints(UBOUND(IdeBreakpoints) + 100) AS _BYTE
|
|
LOOP
|
|
|
|
DO WHILE l > UBOUND(IdeSkipLines)
|
|
REDIM _PRESERVE IdeSkipLines(UBOUND(IdeSkipLines) + 100) AS _BYTE
|
|
LOOP
|
|
|
|
IF ShowLineNumbers THEN
|
|
IF ShowLineNumbersUseBG THEN COLOR , 6
|
|
IF (searchStringFoundOn > 0 AND searchStringFoundOn = l) OR (l = debugnextline AND vWatchOn = 1) THEN
|
|
COLOR 13, 5
|
|
IF searchStringFoundOn > 0 AND searchStringFoundOn = l THEN searchStringFoundOn = 0
|
|
END IF
|
|
IF vWatchOn = 1 AND IdeBreakpoints(l) <> 0 THEN COLOR , 4
|
|
IF vWatchOn = 1 AND IdeSkipLines(l) <> 0 THEN COLOR 14
|
|
_PRINTSTRING (2, y + 3), SPACE$(maxLineNumberLength)
|
|
IF l <= iden THEN
|
|
l2$ = STR$(l)
|
|
IF 2 + maxLineNumberLength - (LEN(l2$) + 1) >= 2 THEN
|
|
_PRINTSTRING (2 + maxLineNumberLength - (LEN(l2$) + 1), y + 3), l2$
|
|
IF vWatchOn THEN
|
|
IF IdeBreakpoints(l) <> 0 THEN
|
|
_PRINTSTRING (2, y + 3), CHR$(7)
|
|
ELSEIF IdeSkipLines(l) <> 0 THEN
|
|
_PRINTSTRING (2, y + 3), "!"
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
IF ShowLineNumbersSeparator THEN
|
|
IF l = debugnextline THEN
|
|
COLOR 10
|
|
_PRINTSTRING (1 + maxLineNumberLength, y + 3), CHR$(16)
|
|
ELSE
|
|
_PRINTSTRING (1 + maxLineNumberLength, y + 3), CHR$(179)
|
|
END IF
|
|
ELSE
|
|
IF l = debugnextline THEN
|
|
COLOR 10
|
|
_PRINTSTRING (1 + maxLineNumberLength, y + 3), CHR$(16)
|
|
END IF
|
|
END IF
|
|
COLOR , 1
|
|
ELSE
|
|
IF vWatchOn = 1 AND (IdeBreakpoints(l) <> 0 OR IdeSkipLines(l) <> 0) THEN
|
|
COLOR 7, 4
|
|
IF l = debugnextline THEN
|
|
COLOR 10
|
|
_PRINTSTRING (1, y + 3), CHR$(16)
|
|
ELSEIF IdeSkipLines(l) <> 0 THEN
|
|
COLOR 14, 1
|
|
_PRINTSTRING (1, y + 3), "!"
|
|
ELSE
|
|
_PRINTSTRING (1, y + 3), CHR$(7)
|
|
END IF
|
|
ELSEIF vWatchOn = 1 AND l = debugnextline THEN
|
|
COLOR 10
|
|
_PRINTSTRING (1, y + 3), CHR$(16)
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
|
|
END SUB
|
|
|
|
FUNCTION idesubs$
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'------- identify word or character at current cursor position
|
|
a2$ = UCASE$(getWordAtCursor$)
|
|
IF LEN(a2$) > 1 THEN
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(a2$, 1)))
|
|
a2$ = LEFT$(a2$, LEN(a2$) - 1) 'removes sigil, if any
|
|
IF LEN(a2$) = 0 THEN EXIT DO
|
|
LOOP
|
|
END IF
|
|
|
|
'-------- init --------
|
|
|
|
l$ = ideprogname$
|
|
IF l$ = "" THEN l$ = "Untitled" + tempfolderindexstr$
|
|
|
|
IF idewx < 100 THEN
|
|
moduleNameLenLimit = 20
|
|
ELSE
|
|
moduleNameLenLimit = 42
|
|
END IF
|
|
|
|
maxModuleNameLen = LEN(l$)
|
|
IF maxModuleNameLen > moduleNameLenLimit + 2 THEN
|
|
l$ = LEFT$(l$, moduleNameLenLimit - 1) + STRING$(3, 250)
|
|
maxModuleNameLen = moduleNameLenLimit
|
|
ELSEIF maxModuleNameLen < 10 THEN
|
|
maxModuleNameLen = 10
|
|
END IF
|
|
|
|
ly$ = MKL$(1)
|
|
lySorted$ = ly$
|
|
CurrentlyViewingWhichSUBFUNC = 1
|
|
PreferCurrentCursorSUBFUNC = 0
|
|
InsideDECLARE = 0
|
|
FoundExternalSUBFUNC = 0
|
|
maxLineCount = 0
|
|
|
|
REDIM SortedSubsList(1 TO 100) AS STRING * 998
|
|
REDIM CaseBkpSubsList(1 TO 100) AS STRING * 998
|
|
REDIM TotalLines(0 TO 100) AS LONG
|
|
REDIM SubNames(0 TO 100) AS STRING
|
|
REDIM SubLines(0 TO 100) AS LONG
|
|
REDIM Args(0 TO 100) AS STRING
|
|
REDIM SF(0 TO 100) AS STRING
|
|
|
|
TotalSUBs = 0
|
|
ModuleSize = 0 'in lines
|
|
SortedSubsFlag = idesortsubs
|
|
SubClosed = 0
|
|
|
|
FOR y = 1 TO iden
|
|
a$ = idegetline(y)
|
|
IF SubClosed = 0 THEN ModuleSize = ModuleSize + 1
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
sf = 0
|
|
nca$ = UCASE$(a$)
|
|
IF LEFT$(nca$, 8) = "DECLARE " AND INSTR(nca$, " LIBRARY") > 0 THEN InsideDECLARE = -1
|
|
IF LEFT$(nca$, 11) = "END DECLARE" THEN InsideDECLARE = 0
|
|
IF LEFT$(nca$, 4) = "SUB " THEN sf = 1: sf$ = "SUB "
|
|
IF LEFT$(nca$, 9) = "FUNCTION " THEN sf = 2: sf$ = "FUNC "
|
|
IF sf THEN
|
|
'Resize SortedSubsList() and helper arrays
|
|
TotalSUBs = TotalSUBs + 1
|
|
IF NOT InsideDECLARE THEN LastOpenSUB = TotalSUBs
|
|
IF TotalSUBs > UBOUND(SortedSubsList) THEN
|
|
REDIM _PRESERVE SortedSubsList(1 TO TotalSUBs + 99) AS STRING * 998
|
|
REDIM _PRESERVE CaseBkpSubsList(1 TO TotalSUBs + 99) AS STRING * 998
|
|
REDIM _PRESERVE TotalLines(0 TO TotalSUBs + 99) AS LONG
|
|
REDIM _PRESERVE SubNames(0 TO TotalSUBs + 99) AS STRING
|
|
REDIM _PRESERVE SubLines(0 TO TotalSUBs + 99) AS LONG
|
|
REDIM _PRESERVE Args(0 TO TotalSUBs + 99) AS STRING
|
|
REDIM _PRESERVE SF(0 TO TotalSUBs + 99) AS STRING
|
|
END IF
|
|
|
|
IF RIGHT$(nca$, 7) = " STATIC" THEN
|
|
a$ = RTRIM$(LEFT$(a$, LEN(a$) - 7))
|
|
END IF
|
|
|
|
'Store line number
|
|
ly$ = ly$ + MKL$(y)
|
|
|
|
'Check if the cursor is currently inside this SUB/FUNCTION to position the
|
|
'selection properly in the list.
|
|
IF idecy >= y AND NOT InsideDECLARE THEN
|
|
CurrentlyViewingWhichSUBFUNC = (LEN(ly$) / 4)
|
|
END IF
|
|
'End of current SUB/FUNCTION check
|
|
|
|
IF sf = 1 THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - 4)
|
|
ELSE
|
|
a$ = RIGHT$(a$, LEN(a$) - 9)
|
|
END IF
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
x = INSTR(a$, "(")
|
|
DIM comment AS _BYTE, quote AS _BYTE
|
|
IF x THEN FindQuoteComment a$, x, comment, quote
|
|
IF x > 0 AND comment = 0 AND quote = 0 THEN
|
|
n$ = RTRIM$(LEFT$(a$, x - 1))
|
|
args$ = RIGHT$(a$, LEN(a$) - x + 1)
|
|
x = 1
|
|
FOR i = 2 TO LEN(args$)
|
|
IF ASC(args$, i) = 40 THEN x = x + 1
|
|
IF ASC(args$, i) = 41 THEN x = x - 1
|
|
IF x = 0 THEN args$ = LEFT$(args$, i): EXIT FOR
|
|
NEXT
|
|
ELSE
|
|
n$ = a$
|
|
args$ = "()"
|
|
END IF
|
|
cleanSubName n$
|
|
IF LEN(n$) > maxModuleNameLen THEN maxModuleNameLen = LEN(n$)
|
|
IF maxModuleNameLen > moduleNameLenLimit THEN maxModuleNameLen = moduleNameLenLimit
|
|
|
|
'If the user currently has the cursor over a SUB/FUNC name, let's highlight it
|
|
'instead of the currently in edition, for a quick link functionality:
|
|
n2$ = n$
|
|
IF LEN(n2$) > 1 THEN
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(n2$, 1)))
|
|
n2$ = LEFT$(n$, LEN(n2$) - 1) 'removes sigil, if any
|
|
LOOP
|
|
END IF
|
|
IF a2$ = UCASE$(n2$) THEN PreferCurrentCursorSUBFUNC = (LEN(ly$) / 4)
|
|
|
|
IF InsideDECLARE = -1 THEN
|
|
n$ = "*" + n$
|
|
FoundExternalSUBFUNC = -1
|
|
ELSE
|
|
IF SubClosed = 0 THEN ModuleSize = 0: GOSUB AddLineCount
|
|
SubClosed = 0
|
|
ModuleSize = 0
|
|
END IF
|
|
|
|
'Populate arrays
|
|
SubNames(TotalSUBs) = n$
|
|
SubLines(TotalSUBs) = y
|
|
Args(TotalSUBs) = args$
|
|
SF(TotalSUBs) = sf$
|
|
ELSE 'no sf
|
|
'remove double spaces
|
|
i = INSTR(nca$, " ")
|
|
DO WHILE i > 0
|
|
nca$ = LEFT$(nca$, i) + MID$(nca$, i + 2)
|
|
i = INSTR(i, nca$, " ")
|
|
LOOP
|
|
|
|
cursor = 0
|
|
LookForENDSUB:
|
|
sf = INSTR(cursor + 1, nca$, "END SUB")
|
|
IF sf = 0 THEN sf = INSTR(cursor + 1, nca$, "END FUNCTION")
|
|
|
|
IF sf THEN
|
|
FindQuoteComment nca$, sf, comment, quote
|
|
IF comment OR quote THEN cursor = sf: GOTO LookForENDSUB
|
|
GOSUB AddLineCount
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
IF SubClosed = 0 THEN GOSUB AddLineCount
|
|
|
|
'fix arrays to remove empty items
|
|
IF TotalSUBs > 0 AND TotalSUBs < UBOUND(SortedSubsList) THEN
|
|
REDIM _PRESERVE SortedSubsList(1 TO TotalSUBs) AS STRING * 998
|
|
REDIM _PRESERVE CaseBkpSubsList(1 TO TotalSUBs) AS STRING * 998
|
|
REDIM _PRESERVE TotalLines(0 TO TotalSUBs) AS LONG
|
|
REDIM _PRESERVE SubNames(0 TO TotalSUBs) AS STRING
|
|
REDIM _PRESERVE SubLines(0 TO TotalSUBs) AS LONG
|
|
REDIM _PRESERVE Args(0 TO TotalSUBs) AS STRING
|
|
REDIM _PRESERVE SF(0 TO TotalSUBs) AS STRING
|
|
END IF
|
|
|
|
'build headers (normal, sorted, normal with line count, sorted with line count)
|
|
IF TotalSUBs > 0 THEN
|
|
IF LEN(LTRIM$(STR$(maxLineCount))) <= 10 THEN
|
|
maxLineCountSpace = 10
|
|
linesHeader$ = "Line count"
|
|
external$ = "external"
|
|
END IF
|
|
IF LEN(LTRIM$(STR$(maxLineCount))) <= 5 THEN
|
|
maxLineCountSpace = 5
|
|
linesHeader$ = "Lines"
|
|
external$ = CHR$(196)
|
|
END IF
|
|
|
|
l$ = l$ + SPACE$((maxModuleNameLen + 2) - LEN(l$))
|
|
lSized$ = l$
|
|
lSortedSized$ = l$
|
|
l$ = l$ + " Type Arguments"
|
|
lSorted$ = l$
|
|
lSorted$ = l$
|
|
lSized$ = lSized$ + " " + linesHeader$ + " Type Arguments" + sep
|
|
lSortedSized$ = lSortedSized$ + " " + linesHeader$ + " Type Arguments"
|
|
ELSE
|
|
l$ = ideprogname$
|
|
IF l$ = "" THEN l$ = "Untitled" + tempfolderindexstr$
|
|
lSized$ = l$
|
|
END IF
|
|
|
|
'build lists
|
|
dialogWidth = 50
|
|
argsLength = 2
|
|
FOR x = 1 TO TotalSUBs
|
|
n$ = SubNames(x)
|
|
IF LEN(n$) > maxModuleNameLen THEN
|
|
n$ = LEFT$(n$, maxModuleNameLen - 3) + STRING$(3, 250)
|
|
ELSE
|
|
n$ = n$ + SPACE$(maxModuleNameLen - LEN(n$))
|
|
END IF
|
|
|
|
args$ = Args(x)
|
|
IF LEN(args$) > argsLength THEN argsLength = LEN(args$)
|
|
IF LEN(args$) <= (idewx - 41) THEN
|
|
args$ = args$ + SPACE$((idewx - 41) - LEN(args$))
|
|
ELSE
|
|
args$ = LEFT$(args$, (idewx - 44)) + STRING$(3, 250)
|
|
END IF
|
|
|
|
sf$ = SF(x)
|
|
|
|
l$ = l$ + sep + CHR$(195) + CHR$(196) + n$ + " " + CHR$(16) + CHR$(2) + _
|
|
sf$ + CHR$(16) + CHR$(16) + args$
|
|
|
|
IF TotalLines(x) = 0 THEN num$ = external$ ELSE num$ = LTRIM$(STR$(TotalLines(x)))
|
|
lSized$ = lSized$ + CHR$(195) + CHR$(196) + n$ + " " + _
|
|
CHR$(16) + CHR$(2) + SPACE$(maxLineCountSpace - LEN(num$)) + num$ + " " _
|
|
+ sf$ + CHR$(16) + CHR$(16) + args$ + sep
|
|
|
|
listItem$ = n$ + " " + CHR$(1) + CHR$(16) + CHR$(2) + sf$ + CHR$(16) + CHR$(16) + args$
|
|
ListItemLength = LEN(listItem$)
|
|
SortedSubsList(x) = UCASE$(listItem$)
|
|
CaseBkpSubsList(x) = listItem$
|
|
MID$(CaseBkpSubsList(x), 992, 6) = MKL$(SubLines(x)) + MKI$(ListItemLength)
|
|
MID$(SortedSubsList(x), 992, 6) = MKL$(SubLines(x)) + MKI$(ListItemLength)
|
|
NEXT
|
|
|
|
MID$(l$, _INSTRREV(l$, CHR$(195)), 1) = CHR$(192)
|
|
MID$(lSized$, _INSTRREV(lSized$, CHR$(195)), 1) = CHR$(192)
|
|
|
|
IF TotalSUBs > 1 THEN
|
|
sort SortedSubsList()
|
|
|
|
FOR x = 1 TO TotalSUBs
|
|
ListItemLength = CVI(MID$(SortedSubsList(x), LEN(SortedSubsList(x)) - 2, 2))
|
|
lySorted$ = lySorted$ + MID$(SortedSubsList(x), LEN(SortedSubsList(x)) - 6, 4)
|
|
FOR RestoreCaseBkp = 1 TO TotalSUBs
|
|
IF MID$(SortedSubsList(x), LEN(SortedSubsList(x)) - 6, 4) = MID$(CaseBkpSubsList(RestoreCaseBkp), LEN(CaseBkpSubsList(RestoreCaseBkp)) - 6, 4) THEN
|
|
lSorted$ = lSorted$ + sep + CHR$(195) + CHR$(196)
|
|
temp$ = LEFT$(CaseBkpSubsList(RestoreCaseBkp), ListItemLength)
|
|
lSorted$ = lSorted$ + LEFT$(temp$, INSTR(temp$, CHR$(1)) - 1) + _
|
|
MID$(temp$, INSTR(temp$, CHR$(1)) + 1)
|
|
|
|
num$ = LTRIM$(STR$(TotalLines(RestoreCaseBkp)))
|
|
IF LEFT$(temp$, 1) = "*" THEN num$ = external$
|
|
lSortedSized$ = lSortedSized$ + sep + CHR$(195) + CHR$(196)
|
|
lSortedSized$ = lSortedSized$ + LEFT$(temp$, INSTR(temp$, CHR$(1)) - 1) + _
|
|
SPACE$(maxLineCountSpace - LEN(num$)) + CHR$(16) + CHR$(2) + num$ + " " + _
|
|
MID$(temp$, INSTR(temp$, CHR$(1)) + 1)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
NEXT
|
|
|
|
MID$(lSorted$, _INSTRREV(lSorted$, CHR$(195)), 1) = CHR$(192)
|
|
MID$(lSortedSized$, _INSTRREV(lSortedSized$, CHR$(195)), 1) = CHR$(192)
|
|
SortedSubsFlag = idesortsubs
|
|
ELSE
|
|
SortedSubsFlag = 0 'Override idesortsubs if the current program doesn't have more than 1 subprocedure
|
|
END IF
|
|
|
|
'72,19
|
|
i = 0
|
|
dialogHeight = TotalSUBs + 4
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
|
|
IF argsLength + maxModuleNameLen + maxLineCountSpace + 20 > dialogWidth THEN dialogWidth = argsLength + maxModuleNameLen + maxLineCountSpace + 20
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
idepar p, dialogWidth, dialogHeight, "SUBs"
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 1
|
|
'68
|
|
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 3
|
|
IF SortedSubsFlag = 0 THEN
|
|
IF IDESubsLength THEN
|
|
o(i).txt = idenewtxt(lSized$)
|
|
ELSE
|
|
o(i).txt = idenewtxt(l$)
|
|
END IF
|
|
|
|
IF PreferCurrentCursorSUBFUNC <> 0 THEN
|
|
o(i).sel = PreferCurrentCursorSUBFUNC
|
|
ELSE
|
|
o(i).sel = CurrentlyViewingWhichSUBFUNC
|
|
END IF
|
|
ELSE
|
|
idetxt(o(i).txt) = lSorted$
|
|
IF IDESubsLength THEN
|
|
o(i).txt = idenewtxt(lSortedSized$)
|
|
ELSE
|
|
o(i).txt = idenewtxt(lSorted$)
|
|
END IF
|
|
IF PreferCurrentCursorSUBFUNC <> 0 THEN
|
|
FOR x = 1 TO TotalSUBs
|
|
IF MID$(ly$, PreferCurrentCursorSUBFUNC * 4 - 3, 4) = MID$(SortedSubsList(x), LEN(SortedSubsList(x)) - 6, 4) THEN
|
|
o(i).sel = x + 1 'The sorted list items array doesn't contain the first line (ideprogname$)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
ELSE
|
|
FOR x = 1 TO TotalSUBs
|
|
IF MID$(ly$, CurrentlyViewingWhichSUBFUNC * 4 - 3, 4) = MID$(SortedSubsList(x), LEN(SortedSubsList(x)) - 6, 4) THEN
|
|
o(i).sel = x + 1 'The sorted list items array doesn't contain the first line (ideprogname$)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
END IF
|
|
o(i).nam = idenewtxt("Program Items")
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 2
|
|
o(i).y = dialogHeight
|
|
o(i).nam = idenewtxt("#Line Count")
|
|
o(i).sel = IDESubsLength
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).x = 18
|
|
o(i).y = dialogHeight
|
|
o(i).nam = idenewtxt("#Sort")
|
|
o(i).sel = SortedSubsFlag
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).w = 26
|
|
o(i).x = dialogWidth - 22
|
|
o(i).y = dialogHeight
|
|
IF IdeDebugMode = 0 THEN
|
|
o(i).txt = idenewtxt("#Edit" + sep + "#Cancel")
|
|
ELSE
|
|
o(i).txt = idenewtxt("#View" + sep + "#Cancel")
|
|
END IF
|
|
o(i).dft = 1
|
|
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
IF FoundExternalSUBFUNC THEN
|
|
COLOR 2, 7
|
|
_PRINTSTRING (p.x + p.w - 32, p.y + p.h), "* external"
|
|
END IF
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(27) OR (focus = 5 AND info <> 0) THEN
|
|
idesubs$ = "C"
|
|
GOSUB SaveSortSettings
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 4 AND info <> 0) OR (info = 1 AND focus = 1) THEN
|
|
y = o(1).sel
|
|
IF y < 1 THEN y = -y
|
|
AddQuickNavHistory
|
|
IF SortedSubsFlag = 0 THEN
|
|
idecy = CVL(MID$(ly$, y * 4 - 3, 4))
|
|
ELSE
|
|
idecy = CVL(MID$(lySorted$, y * 4 - 3, 4))
|
|
END IF
|
|
idesy = idecy
|
|
idecx = 1
|
|
idesx = 1
|
|
|
|
GOSUB SaveSortSettings
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF o(2).sel <> IDESubsLength THEN
|
|
IDESubsLength = o(2).sel
|
|
IF IDESubsLength THEN
|
|
IF o(3).sel THEN
|
|
idetxt(o(1).txt) = lSortedSized$
|
|
ELSE
|
|
idetxt(o(1).txt) = lSized$
|
|
END IF
|
|
ELSE
|
|
IF o(3).sel THEN
|
|
idetxt(o(1).txt) = lSorted$
|
|
ELSE
|
|
idetxt(o(1).txt) = l$
|
|
END IF
|
|
END IF
|
|
focus = 1
|
|
END IF
|
|
|
|
IF TotalSUBs > 1 THEN
|
|
IF o(3).sel <> SortedSubsFlag THEN
|
|
SortedSubsFlag = o(3).sel
|
|
|
|
IF SortedSubsFlag = 0 THEN
|
|
'Replace list contents with unsorted version while mantaining current selection.
|
|
PreviousSelection = -1
|
|
IF o(1).sel > 0 THEN
|
|
TargetSourceLine$ = MID$(lySorted$, o(1).sel * 4 - 3, 4)
|
|
FOR x = 1 TO TotalSUBs
|
|
IF MID$(ly$, x * 4 - 3, 4) = TargetSourceLine$ THEN
|
|
PreviousSelection = x
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
IF IDESubsLength THEN
|
|
idetxt(o(1).txt) = lSized$
|
|
ELSE
|
|
idetxt(o(1).txt) = l$
|
|
END IF
|
|
o(1).sel = PreviousSelection
|
|
focus = 1
|
|
ELSE
|
|
'Replace list contents with sorted version while mantaining current selection.
|
|
PreviousSelection = -1
|
|
IF o(1).sel > 0 THEN
|
|
TargetSourceLine$ = MID$(ly$, o(1).sel * 4 - 3, 4)
|
|
FOR x = 1 TO TotalSUBs
|
|
IF MID$(lySorted$, x * 4 - 3, 4) = TargetSourceLine$ THEN
|
|
PreviousSelection = x
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
IF IDESubsLength THEN
|
|
idetxt(o(1).txt) = lSortedSized$
|
|
ELSE
|
|
idetxt(o(1).txt) = lSorted$
|
|
END IF
|
|
o(1).sel = PreviousSelection
|
|
focus = 1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
EXIT FUNCTION
|
|
SaveSortSettings:
|
|
idesortsubs = SortedSubsFlag
|
|
IF idesortsubs THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_SortSUBs", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_SortSUBs", "False"
|
|
END IF
|
|
|
|
IF IDESubsLength THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_SUBsLength", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_SUBsLength", "False"
|
|
END IF
|
|
RETURN
|
|
|
|
AddLineCount:
|
|
ModuleSize = ModuleSize + 1
|
|
TotalLines(LastOpenSUB) = ModuleSize
|
|
IF ModuleSize > maxLineCount THEN maxLineCount = ModuleSize
|
|
SubClosed = -1
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
|
|
FUNCTION idelanguagebox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
'generate list of available code pages
|
|
l$ = idecpname(1)
|
|
dialogWidth = LEN(l$)
|
|
FOR x = 2 TO idecpnum
|
|
l$ = l$ + sep + idecpname(x)
|
|
IF LEN(idecpname(x)) > dialogWidth THEN dialogWidth = LEN(idecpname(x))
|
|
NEXT
|
|
l$ = UCASE$(l$)
|
|
|
|
i = 0
|
|
dialogHeight = idecpnum + 5
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
IF dialogWidth < 60 THEN dialogWidth = 60
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
idepar p, dialogWidth, dialogHeight, "Language"
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 3
|
|
o(i).w = dialogWidth - 4: o(i).h = dialogheight - 5
|
|
o(i).txt = idenewtxt(l$)
|
|
o(i).sel = 1: IF idecpindex THEN o(i).sel = idecpindex
|
|
o(i).nam = idenewtxt("Code Pages")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = dialogheight
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
|
|
|
|
|
|
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7
|
|
_PRINTSTRING (p.x + 2, p.y + 1), "Code-page for ASCII-UNICODE mapping (Default = CP437):"
|
|
COLOR 2, 7
|
|
_PRINTSTRING (p.x + 2, p.y + 2), "(affects the display of TTF fonts set in Options-Display)"
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(27) OR (focus = 3 AND info <> 0) THEN
|
|
' idesubs$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 2 AND info <> 0) OR (info = 1 AND focus = 1) THEN
|
|
y = o(1).sel
|
|
IF y < 1 THEN y = -y
|
|
|
|
FOR x = 128 TO 255
|
|
u = VAL("&H" + MID$(idecp(y), x * 8 + 1, 8) + "&")
|
|
IF u = 0 THEN u = 9744
|
|
_MAPUNICODE u TO x
|
|
NEXT
|
|
|
|
'save changes
|
|
v% = y: idecpindex = v%
|
|
WriteConfigSetting displaySettingsSection$, "IDE_CodePage", STR$(idecpindex)
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
idelanguagebox = 0
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION idewarningbox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
IF LEN(ideprogname) THEN thisprog$ = ideprogname ELSE thisprog$ = "Untitled" + tempfolderindexstr$
|
|
maxModuleNameLen = LEN(thisprog$)
|
|
|
|
'calculate longest module name
|
|
FOR x = 1 TO warningListItems
|
|
IF warningLines(x) = 0 THEN _CONTINUE
|
|
|
|
IF warningIncLines(x) > 0 THEN
|
|
IF LEN(warningIncFiles(x)) > maxModuleNameLen THEN
|
|
maxModuleNameLen = LEN(warningIncFiles(x))
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
'build list
|
|
dialogWidth = 60
|
|
FOR x = 1 TO warningListItems
|
|
IF warningLines(x) = 0 THEN
|
|
l$ = l$ + warning$(x)
|
|
IF x > 1 AND treeConnection > 0 THEN ASC(l$, treeConnection) = 192
|
|
ELSE
|
|
l3$ = CHR$(16) + CHR$(2) 'dark grey
|
|
IF warningIncLines(x) > 0 THEN
|
|
num$ = SPACE$(LEN(STR$(maxLineNumber)) + 1)
|
|
RSET num$ = str2$(warningIncLines(x))
|
|
l3$ = l3$ + warningIncFiles(x) + SPACE$(maxModuleNameLen - LEN(warningIncFiles(x))) + ":" + CHR$(16) + CHR$(16) + num$
|
|
ELSE
|
|
num$ = SPACE$(LEN(STR$(maxLineNumber)) + 1)
|
|
RSET num$ = str2$(warningLines(x))
|
|
l3$ = l3$ + thisprog$ + SPACE$(maxModuleNameLen - LEN(thisprog$)) + ":" + CHR$(16) + CHR$(16) + num$
|
|
END IF
|
|
treeConnection = LEN(l$) + 1
|
|
text$ = warning$(x)
|
|
IF LEN(l3$ + text$) + 6 > dialogWidth THEN dialogWidth = LEN(l3$ + text$) + 6
|
|
IF LEN(text$) THEN
|
|
l$ = l$ + CHR$(195) + CHR$(196) + l3$ + ": " + text$
|
|
ELSE
|
|
l$ = l$ + CHR$(195) + CHR$(196) + l3$
|
|
END IF
|
|
END IF
|
|
IF x < warningListItems THEN l$ = l$ + sep
|
|
NEXT
|
|
|
|
IF warningLines(warningListItems) > 0 THEN
|
|
ASC(l$, treeConnection) = 192
|
|
END IF
|
|
|
|
i = 0
|
|
dialogHeight = warningListItems + 4
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
|
|
idepar p, dialogWidth, dialogHeight, "Compilation status"
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 2
|
|
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 4
|
|
o(i).txt = idenewtxt(l$)
|
|
o(i).sel = 1
|
|
o(i).nam = idenewtxt("Warnings (" + LTRIM$(STR$(totalWarnings)) + ")")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = dialogHeight
|
|
o(i).txt = idenewtxt("#Go to" + sep + "#Close")
|
|
o(i).dft = 1
|
|
|
|
|
|
|
|
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7: _PRINTSTRING (p.x + 2, p.y + 1), "Double-click on an item to jump to the line indicated"
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(27) OR (focus = 3 AND info <> 0) THEN
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (focus = 2 AND info <> 0) OR (info = 1 AND focus = 1) THEN
|
|
y = ABS(o(1).sel)
|
|
IF y >= 1 AND y <= warningListItems AND warningLines(y) > 0 THEN
|
|
idegotobox_LastLineNum = warningLines(y)
|
|
AddQuickNavHistory
|
|
idecy = idegotobox_LastLineNum
|
|
idecentercurrentline
|
|
IF warningIncLines(y) > 0 THEN
|
|
warningInInclude = idecy
|
|
warningInIncludeLine = warningIncLines(y)
|
|
END IF
|
|
ideselect = 0
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
idewarningbox = 0
|
|
END FUNCTION
|
|
|
|
SUB ideobjupdate (o AS idedbotype, focus, f, focusoffset, kk$, altletter$, mb, mousedown, mouseup, mx, my, info, mw)
|
|
STATIC LastKeybInput AS SINGLE
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
|
|
t = o.typ
|
|
mouseup = mouseup 'just to clear warnings of unused variables
|
|
IF t = 1 THEN 'text field
|
|
IF mousedown THEN
|
|
x1 = o.par.x + o.x: y = o.par.y + o.y
|
|
x2 = x1
|
|
IF o.nam THEN
|
|
x2 = x2 + idehlen(idetxt(o.nam)) + 2
|
|
END IF
|
|
IF my >= y - 1 AND my <= y + 1 THEN
|
|
IF mx >= x1 AND mx <= x2 + o.w + 3 THEN
|
|
focus = f
|
|
'change cursor location?
|
|
IF my = y THEN
|
|
IF mx > x2 + 1 AND mx < x2 + o.w + 2 THEN
|
|
a$ = idetxt(o.txt)
|
|
x = mx - x2 - 2 '0-?
|
|
IF x = o.v1 AND x <> LEN(a$) THEN 'dbl-click text=clear field text
|
|
a$ = ""
|
|
idetxt(o.txt) = a$
|
|
o.v1 = 0
|
|
ELSE
|
|
IF x <= LEN(a$) THEN o.v1 = x ELSE o.v1 = LEN(a$)
|
|
o.issel = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF 'mousedown
|
|
|
|
a$ = idetxt(o.txt)
|
|
IF focusoffset = 0 THEN
|
|
IF LEN(kk$) = 1 OR KB <> 0 THEN
|
|
IF LEN(kk$) = 1 THEN k = ASC(kk$)
|
|
IF (KSHIFT AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(kk$) = "V") THEN 'paste from clipboard
|
|
clip$ = _CLIPBOARD$ 'read clipboard
|
|
x = INSTR(clip$, CHR$(13))
|
|
IF x THEN clip$ = LEFT$(clip$, x - 1)
|
|
x = INSTR(clip$, CHR$(10))
|
|
IF x THEN clip$ = LEFT$(clip$, x - 1)
|
|
IF LEN(clip$) THEN
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
a$ = LEFT$(a$, sx1) + clip$ + RIGHT$(a$, LEN(a$) - sx2)
|
|
o.v1 = sx1
|
|
IF PasteCursorAtEnd THEN o.v1 = sx1 + LEN(clip$)
|
|
o.issel = 0
|
|
END IF
|
|
ELSE
|
|
a$ = LEFT$(a$, o.v1) + clip$ + RIGHT$(a$, LEN(a$) - o.v1)
|
|
IF PasteCursorAtEnd THEN o.v1 = o.v1 + LEN(clip$)
|
|
END IF
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF (KCONTROL AND UCASE$(kk$) = "A") THEN 'select all
|
|
IF LEN(a$) > 0 THEN
|
|
o.issel = -1
|
|
o.sx1 = 0
|
|
o.v1 = LEN(a$)
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF ((KCTRL AND KB = KEY_INSERT) OR (KCONTROL AND UCASE$(kk$) = "C")) THEN 'copy to clipboard
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN _CLIPBOARD$ = MID$(a$, sx1 + 1, sx2 - sx1)
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF ((KSHIFT AND KB = KEY_DELETE) OR (KCONTROL AND UCASE$(kk$) = "X")) THEN 'cut to clipboard
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
_CLIPBOARD$ = MID$(a$, sx1 + 1, sx2 - sx1)
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
o.v1 = sx1
|
|
o.issel = 0
|
|
END IF
|
|
END IF
|
|
k = 255
|
|
END IF
|
|
|
|
IF k = 8 AND o.v1 > 0 THEN
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
o.issel = 0
|
|
END IF
|
|
ELSE
|
|
a1$ = LEFT$(a$, o.v1 - 1)
|
|
IF o.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1) ELSE a2$ = ""
|
|
a$ = a1$ + a2$: o.v1 = o.v1 - 1
|
|
END IF
|
|
ELSEIF k = 8 AND o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
o.issel = 0
|
|
END IF
|
|
END IF
|
|
IF k <> 8 AND k <> 9 AND k <> 0 AND k <> 10 AND k <> 13 AND k <> 26 AND k <> 255 AND ((KALT = 0 AND KCTRL = 0) OR (KALT = -1 AND KCTRL = -1)) THEN
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'replace selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idetxt(o.txt) = a$
|
|
o.issel = 0
|
|
o.v1 = sx1
|
|
END IF
|
|
END IF
|
|
IF o.v1 > 0 THEN a1$ = LEFT$(a$, o.v1) ELSE a1$ = ""
|
|
IF o.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1) ELSE a2$ = ""
|
|
a$ = a1$ + kk$ + a2$: o.v1 = o.v1 + 1
|
|
END IF
|
|
idetxt(o.txt) = a$
|
|
END IF
|
|
IF kk$ = CHR$(0) + "S" THEN 'DEL
|
|
IF o.issel THEN
|
|
sx1 = o.sx1: sx2 = o.v1
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
IF sx2 - sx1 > 0 THEN
|
|
'delete selection
|
|
a$ = LEFT$(a$, sx1) + RIGHT$(a$, LEN(a$) - sx2)
|
|
idetxt(o.txt) = a$
|
|
o.v1 = sx1
|
|
o.issel = 0
|
|
END IF
|
|
ELSE
|
|
IF o.v1 > 0 THEN a1$ = LEFT$(a$, o.v1) ELSE a1$ = ""
|
|
IF o.v1 < LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1 - 1) ELSE a2$ = ""
|
|
a$ = a1$ + a2$
|
|
idetxt(o.txt) = a$
|
|
END IF
|
|
END IF
|
|
|
|
'cursor control
|
|
IF kk$ = CHR$(0) + "K" THEN GOSUB selectcheck: o.v1 = o.v1 - 1
|
|
IF kk$ = CHR$(0) + "M" THEN GOSUB selectcheck: o.v1 = o.v1 + 1
|
|
IF kk$ = CHR$(0) + "G" THEN GOSUB selectcheck: o.v1 = 0
|
|
IF kk$ = CHR$(0) + "O" THEN GOSUB selectcheck: o.v1 = LEN(a$)
|
|
IF o.v1 < 0 THEN o.v1 = 0
|
|
IF o.v1 > LEN(a$) THEN o.v1 = LEN(a$)
|
|
IF o.v1 = o.sx1 THEN o.issel = 0
|
|
END IF
|
|
'hot-key focus
|
|
IF LEN(altletter$) THEN
|
|
IF o.nam THEN
|
|
x = INSTR(idetxt(o.nam), "#")
|
|
IF x THEN
|
|
IF UCASE$(MID$(idetxt(o.nam), x + 1, 1)) = altletter$ THEN focus = f
|
|
END IF
|
|
END IF
|
|
END IF
|
|
f = f + 1
|
|
END IF '1
|
|
|
|
IF t = 2 THEN 'list box
|
|
idetxt(o.stx) = ""
|
|
|
|
'Populate ListBoxITEMS:
|
|
a$ = idetxt(o.txt)
|
|
REDIM ListBoxITEMS(0) AS STRING
|
|
REDIM OriginalListBoxITEMS(0) AS STRING
|
|
IF LEN(a$) > 0 THEN
|
|
n = 0: x = 1
|
|
DO
|
|
x2 = INSTR(x, a$, sep)
|
|
IF x2 > 0 THEN
|
|
n = n + 1
|
|
IF n > UBOUND(ListBoxITEMS) THEN
|
|
REDIM _PRESERVE ListBoxITEMS(1 TO n + 999) AS STRING
|
|
REDIM _PRESERVE OriginalListBoxITEMS(1 TO n + 999) AS STRING
|
|
END IF
|
|
ListBoxITEMS(n) = _TRIM$(MID$(a$, x, x2 - x))
|
|
OriginalListBoxITEMS(n) = MID$(a$, x, x2 - x)
|
|
IF LEN(ListBoxITEMS(n)) THEN
|
|
DO WHILE ASC(ListBoxITEMS(n)) < 32 OR ASC(ListBoxITEMS(n)) > 126
|
|
ListBoxITEMS(n) = MID$(ListBoxITEMS(n), 2)
|
|
IF LEN(ListBoxITEMS(n)) = 0 THEN EXIT DO
|
|
LOOP
|
|
END IF
|
|
ELSE
|
|
n = n + 1
|
|
IF n > UBOUND(ListBoxITEMS) THEN
|
|
REDIM _PRESERVE ListBoxITEMS(1 TO n + 999) AS STRING
|
|
REDIM _PRESERVE OriginalListBoxITEMS(1 TO n + 999) AS STRING
|
|
END IF
|
|
ListBoxITEMS(n) = _TRIM$(RIGHT$(a$, LEN(a$) - x + 1))
|
|
OriginalListBoxITEMS(n) = RIGHT$(a$, LEN(a$) - x + 1)
|
|
IF LEN(ListBoxITEMS(n)) THEN
|
|
DO WHILE ASC(ListBoxITEMS(n)) < 32 OR ASC(ListBoxITEMS(n)) > 126
|
|
ListBoxITEMS(n) = MID$(ListBoxITEMS(n), 2)
|
|
IF LEN(ListBoxITEMS(n)) = 0 THEN EXIT DO
|
|
LOOP
|
|
END IF
|
|
EXIT DO
|
|
END IF
|
|
x = x2 + 1
|
|
LOOP
|
|
REDIM _PRESERVE ListBoxITEMS(1 TO n) AS STRING
|
|
REDIM _PRESERVE OriginalListBoxITEMS(1 TO n) AS STRING
|
|
END IF
|
|
|
|
IF mousedown THEN
|
|
x1 = o.par.x + o.x: y1 = o.par.y + o.y
|
|
x2 = x1 + o.w + 1: y2 = y1 + o.h + 1
|
|
IF mx >= x1 AND mx <= x2 AND my >= y1 AND my <= y2 THEN
|
|
focus = f
|
|
IF mx > x1 AND mx < x2 AND my > y1 AND my < y2 THEN
|
|
y = my - y1 - 1
|
|
y = y + o.v1
|
|
IF o.sel = y THEN info = 1
|
|
o.sel = y
|
|
IF o.sel > o.num THEN o.sel = -o.num
|
|
END IF
|
|
END IF
|
|
|
|
END IF 'mousedown
|
|
|
|
IF mb THEN
|
|
IF focusoffset = 0 THEN
|
|
|
|
x1 = o.par.x + o.x: y1 = o.par.y + o.y
|
|
x2 = x1 + o.w + 1: y2 = y1 + o.h + 1
|
|
IF mx >= x1 AND mx <= x2 AND my >= y1 AND my <= y2 THEN
|
|
|
|
IF mx = x2 AND my > y1 + 1 AND my < y2 - 1 THEN
|
|
|
|
tsel = ABS(o.sel)
|
|
tnum = o.num
|
|
q = idevbar(x2, y1 + 1, o.h, tsel, tnum)
|
|
|
|
IF my < q THEN
|
|
kk$ = CHR$(0) + CHR$(73)
|
|
idewait
|
|
END IF
|
|
IF my > q THEN
|
|
kk$ = CHR$(0) + CHR$(81)
|
|
idewait
|
|
END IF
|
|
END IF
|
|
|
|
IF mx = x2 AND my = y1 + 1 THEN
|
|
kk$ = CHR$(0) + CHR$(72)
|
|
idewait
|
|
END IF
|
|
IF mx = x2 AND my = y2 - 1 THEN
|
|
kk$ = CHR$(0) + CHR$(80)
|
|
idewait
|
|
END IF
|
|
|
|
END IF
|
|
END IF
|
|
END IF 'mb
|
|
|
|
|
|
IF focusoffset = 0 THEN
|
|
IF mw THEN
|
|
'move to top or bottom
|
|
IF mw < 0 THEN
|
|
IF o.sel > o.v1 THEN o.sel = o.v1
|
|
ELSE
|
|
o.sel = o.v1 + o.h - 1
|
|
END IF
|
|
o.sel = o.sel + mw * 3
|
|
IF o.sel < 1 THEN o.sel = 1
|
|
IF o.sel > o.num THEN o.sel = o.num
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + CHR$(72) THEN
|
|
IF o.sel < 0 THEN
|
|
o.sel = -o.sel
|
|
ELSE
|
|
o.sel = o.sel - 1
|
|
IF o.sel < 1 THEN o.sel = 1
|
|
END IF
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + CHR$(80) THEN
|
|
IF o.sel < 0 THEN
|
|
o.sel = -o.sel
|
|
ELSE
|
|
o.sel = o.sel + 1
|
|
IF o.sel > o.num THEN o.sel = o.num
|
|
END IF
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + CHR$(73) THEN
|
|
IF o.sel < 0 THEN
|
|
o.sel = -o.sel
|
|
END IF
|
|
o.sel = o.sel - o.h + 1
|
|
IF o.sel < 1 THEN o.sel = 1
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + CHR$(81) THEN
|
|
IF o.sel < 0 THEN
|
|
o.sel = -o.sel
|
|
END IF
|
|
o.sel = o.sel + o.h - 1
|
|
IF o.sel > o.num THEN o.sel = o.num
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + "w" THEN
|
|
o.sel = 1
|
|
END IF
|
|
|
|
IF kk$ = CHR$(0) + "u" THEN
|
|
o.sel = o.num
|
|
END IF
|
|
|
|
IF LEN(kk$) = 1 THEN
|
|
ResetKeybTimer = 0
|
|
IF timeElapsedSince(LastKeybInput) > 1 THEN fileDlgSearchTerm$ = "": ResetKeybTimer = -1
|
|
LastKeybInput = TIMER
|
|
k = ASC(UCASE$(kk$))
|
|
IF k < 32 OR k > 126 THEN
|
|
GOTO selected 'Search is not performed if kk$ isn't a printable character
|
|
END IF
|
|
|
|
fileDlgSearchTerm$ = fileDlgSearchTerm$ + UCASE$(kk$)
|
|
|
|
IF LEN(fileDlgSearchTerm$) = 2 AND LEFT$(fileDlgSearchTerm$, 1) = RIGHT$(fileDlgSearchTerm$, 1) THEN
|
|
'if the user is pressing the same letter again, we deduce the search
|
|
'is only for the initials
|
|
ResetKeybTimer = -1
|
|
fileDlgSearchTerm$ = UCASE$(kk$)
|
|
END IF
|
|
|
|
SearchPass = 1
|
|
IF NOT ResetKeybTimer THEN StartSearch = ABS(o.sel) ELSE StartSearch = ABS(o.sel) + 1
|
|
IF StartSearch < 1 OR StartSearch > n THEN StartSearch = 1
|
|
retryfind:
|
|
IF SearchPass > 2 THEN GOTO selected
|
|
FOR findMatch = StartSearch TO n
|
|
IF UCASE$(LEFT$(ListBoxITEMS(findMatch), LEN(fileDlgSearchTerm$))) = UCASE$(fileDlgSearchTerm$) THEN
|
|
o.sel = findMatch
|
|
idetxt(o.stx) = OriginalListBoxITEMS(findMatch)
|
|
GOTO selected
|
|
END IF
|
|
NEXT findMatch
|
|
'No match, try again:
|
|
StartSearch = 1
|
|
SearchPass = SearchPass + 1
|
|
GOTO retryfind
|
|
selected:
|
|
END IF
|
|
END IF
|
|
IF o.sel > 0 AND o.sel <= UBOUND(OriginalListBoxITEMS) THEN idetxt(o.stx) = OriginalListBoxITEMS(o.sel)
|
|
|
|
'hot-key focus
|
|
IF LEN(altletter$) THEN
|
|
IF o.nam THEN
|
|
x = INSTR(idetxt(o.nam), "#")
|
|
IF x THEN
|
|
IF UCASE$(MID$(idetxt(o.nam), x + 1, 1)) = altletter$ THEN focus = f
|
|
END IF
|
|
END IF
|
|
END IF
|
|
f = f + 1
|
|
END IF '2
|
|
|
|
IF t = 3 THEN 'buttons (eg. OK, Cancel)
|
|
|
|
'count buttons & check for hotkey(s)
|
|
a$ = idetxt(o.txt)
|
|
n = 1
|
|
x = 0
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ = CHR$(0) THEN n = n + 1
|
|
IF x = 1 THEN
|
|
IF UCASE$(a2$) = altletter$ THEN
|
|
focus = f + n - 1
|
|
info = n
|
|
END IF
|
|
END IF
|
|
IF a2$ = "#" THEN x = 1 ELSE x = 0
|
|
NEXT
|
|
|
|
'check for mouse click on button(s)
|
|
IF mousedown THEN
|
|
IF my = o.par.y + o.y THEN
|
|
a$ = idetxt(o.txt)
|
|
n = 1
|
|
c = 0
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ = CHR$(0) THEN
|
|
n = n + 1
|
|
ELSE
|
|
IF a$ <> "#" THEN c = c + 1
|
|
END IF
|
|
NEXT
|
|
w = o.w
|
|
c = c + n * 4 'add characters for bracing < > buttons
|
|
whitespace = w - c
|
|
spacing = whitespace \ (n + 1)
|
|
'f2 = o.foc + 1
|
|
'IF f2 < 1 OR f2 > n THEN
|
|
'IF o.dft THEN f2 = o.dft
|
|
'END IF
|
|
n2 = 1
|
|
a3$ = ""
|
|
'LOCATE o.par.y + o.y, o.par.x + o.x
|
|
x = o.par.x + o.x
|
|
'COLOR 0, 7
|
|
FOR i2 = 1 TO LEN(a$)
|
|
a2$ = MID$(a$, i2, 1)
|
|
IF a2$ <> CHR$(0) THEN a3$ = a3$ + a2$
|
|
IF a2$ = CHR$(0) OR i2 = LEN(a$) THEN
|
|
'PRINT SPACE$(spacing);
|
|
x = x + spacing
|
|
'IF f2 = n2 THEN COLOR 15, 7 ELSE COLOR 0, 7
|
|
'PRINT "< ";
|
|
'COLOR 0, 7: idehPRINT a3$
|
|
'IF f2 = n2 THEN COLOR 15, 7 ELSE COLOR 0, 7
|
|
'IF n2 = o.foc + 1 THEN
|
|
'o.cx = x + 2: o.cy = o.par.y + o.y
|
|
'END IF
|
|
'PRINT " >";
|
|
'COLOR 0, 7
|
|
x2 = idehlen(a3$) + 4
|
|
IF mx >= x AND mx < x + x2 THEN info = n2: focus = f + n2 - 1
|
|
|
|
|
|
x = x + x2
|
|
a3$ = ""
|
|
n2 = n2 + 1
|
|
END IF
|
|
NEXT
|
|
|
|
END IF 'my
|
|
END IF 'mousedown
|
|
|
|
IF focusoffset >= 0 AND focusoffset < n THEN
|
|
f2 = f + focusoffset
|
|
IF kk$ = CHR$(13) OR kk$ = " " THEN
|
|
info = focusoffset + 1
|
|
END IF
|
|
END IF
|
|
|
|
f = f + n
|
|
END IF '3
|
|
|
|
IF t = 4 THEN 'checkbox
|
|
|
|
IF mousedown THEN
|
|
y = o.par.y + o.y
|
|
x1 = o.par.x + o.x: x2 = x1 + 2
|
|
IF o.nam THEN
|
|
x2 = x2 + 1 + idehlen(idetxt(o.nam))
|
|
END IF
|
|
IF my = y THEN
|
|
IF mx >= x1 AND mx <= x2 THEN
|
|
focus = f
|
|
o.sel = o.sel + 1: IF o.sel > 1 THEN o.sel = 0 'toggle
|
|
END IF
|
|
END IF
|
|
END IF 'mousedown
|
|
IF focusoffset = 0 THEN
|
|
|
|
'a$ = idetxt(o.txt)
|
|
'IF LEN(kk$) = 1 THEN
|
|
'k = ASC(kk$)
|
|
'IF k = 8 AND o.v1 > 0 THEN
|
|
'a1$ = LEFT$(a$, o.v1 - 1)
|
|
'IF o.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1) ELSE a2$ = ""
|
|
'a$ = a1$ + a2$: o.v1 = o.v1 - 1
|
|
'END IF
|
|
'IF k >= 32 AND k <= 126 THEN
|
|
'IF o.v1 > 0 THEN a1$ = LEFT$(a$, o.v1) ELSE a1$ = ""
|
|
'IF o.v1 <= LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1) ELSE a2$ = ""
|
|
'a$ = a1$ + kk$ + a2$: o.v1 = o.v1 + 1
|
|
'END IF
|
|
'idetxt(o.txt) = a$
|
|
'END IF
|
|
'IF kk$ = CHR$(0) + "S" THEN 'DEL
|
|
'IF o.v1 > 0 THEN a1$ = LEFT$(a$, o.v1) ELSE a1$ = ""
|
|
'IF o.v1 < LEN(a$) THEN a2$ = RIGHT$(a$, LEN(a$) - o.v1 - 1) ELSE a2$ = ""
|
|
'a$ = a1$ + a2$
|
|
'idetxt(o.txt) = a$
|
|
'END IF
|
|
''cursor control
|
|
'IF kk$ = CHR$(0) + "K" THEN o.v1 = o.v1 - 1
|
|
'IF kk$ = CHR$(0) + "M" THEN o.v1 = o.v1 + 1
|
|
'IF kk$ = CHR$(0) + "G" THEN o.v1 = 0
|
|
'IF kk$ = CHR$(0) + "O" THEN o.v1 = LEN(a$)
|
|
'IF o.v1 < 0 THEN o.v1 = 0
|
|
'IF o.v1 > LEN(a$) THEN o.v1 = LEN(a$)
|
|
|
|
IF kk$ = CHR$(0) + "H" THEN o.sel = 1
|
|
IF kk$ = CHR$(0) + "P" THEN o.sel = 0
|
|
IF kk$ = " " THEN
|
|
o.sel = o.sel + 1: IF o.sel > 1 THEN o.sel = 0 'toggle
|
|
END IF
|
|
|
|
END IF 'in focus
|
|
'hot-key focus
|
|
IF LEN(altletter$) THEN
|
|
IF o.nam THEN
|
|
x = INSTR(idetxt(o.nam), "#")
|
|
IF x THEN
|
|
IF UCASE$(MID$(idetxt(o.nam), x + 1, 1)) = altletter$ THEN focus = f
|
|
END IF
|
|
END IF
|
|
END IF
|
|
f = f + 1
|
|
END IF '4
|
|
|
|
EXIT SUB
|
|
selectcheck:
|
|
IF KSHIFT AND o.issel = 0 THEN o.issel = -1: o.sx1 = o.v1
|
|
IF KSHIFT = 0 THEN o.issel = 0
|
|
RETURN
|
|
END SUB
|
|
|
|
FUNCTION idevbar (x, y, h, i2, n2)
|
|
i = i2: n = n2
|
|
|
|
'h is height in charatcers (inc. arrows)
|
|
|
|
'draw background & arrows
|
|
COLOR 0, 7
|
|
_PRINTSTRING (x, y), CHR$(24)
|
|
_PRINTSTRING (x, y + h - 1), CHR$(25)
|
|
FOR y2 = y + 1 TO y + h - 2
|
|
_PRINTSTRING (x, y2), CHR$(176)
|
|
NEXT
|
|
|
|
'draw slider
|
|
|
|
IF n < 1 THEN n = 1
|
|
IF i < 1 THEN i = 1
|
|
IF i > n THEN i = n
|
|
|
|
IF h = 2 THEN
|
|
idevbar = y 'not position for slider exists
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF h = 3 THEN
|
|
idevbar = y + 1 'dummy value
|
|
'no slider
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF h = 4 THEN
|
|
IF n = 1 THEN
|
|
idevbar = y + 1 'dummy value
|
|
'no slider required for 1 item
|
|
EXIT FUNCTION
|
|
ELSE
|
|
'show whichever is closer of the two positions
|
|
p! = (i - 1) / (n - 1)
|
|
IF p! < .5 THEN y2 = y + 1 ELSE y2 = y + 2
|
|
_PRINTSTRING (x, y2), CHR$(219)
|
|
idevbar = y2
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
IF h > 4 THEN
|
|
IF n = 1 THEN
|
|
idevbar = y + h \ 4 'dummy value
|
|
'no slider required for 1 item
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF i = 1 THEN
|
|
y2 = y + 1
|
|
_PRINTSTRING (x, y2), CHR$(219)
|
|
idevbar = y2
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF i = n THEN
|
|
y2 = y + h - 2
|
|
_PRINTSTRING (x, y2), CHR$(219)
|
|
idevbar = y2
|
|
EXIT FUNCTION
|
|
END IF
|
|
'between i=1 and i=n
|
|
p! = (i - 1) / (n - 1)
|
|
p! = p! * (h - 4)
|
|
y2 = y + 2 + INT(p!)
|
|
_PRINTSTRING (x, y2), CHR$(219)
|
|
idevbar = y2
|
|
EXIT FUNCTION
|
|
END IF
|
|
END FUNCTION
|
|
|
|
SUB idewait
|
|
_DELAY 0.1
|
|
END SUB
|
|
|
|
FUNCTION idezchangepath$ (path$, newpath$)
|
|
|
|
idezchangepath$ = path$ 'default (for unsuccessful cases)
|
|
|
|
IF os$ = "WIN" THEN
|
|
'go back a path
|
|
IF newpath$ = ".." THEN
|
|
FOR x = LEN(path$) TO 1 STEP -1
|
|
a$ = MID$(path$, x, 1)
|
|
IF a$ = "\" THEN
|
|
idezchangepath$ = LEFT$(path$, x - 1)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
EXIT FUNCTION
|
|
END IF
|
|
'change drive
|
|
IF LEN(newpath$) = 2 AND RIGHT$(newpath$, 1) = ":" THEN
|
|
idezchangepath$ = newpath$
|
|
EXIT FUNCTION
|
|
END IF
|
|
idezchangepath$ = path$ + "\" + newpath$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF os$ = "LNX" THEN
|
|
|
|
'go back a path
|
|
IF newpath$ = ".." THEN
|
|
FOR x = LEN(path$) TO 1 STEP -1
|
|
a$ = MID$(path$, x, 1)
|
|
IF a$ = "/" THEN
|
|
idezchangepath$ = LEFT$(path$, x - 1)
|
|
IF x = 1 THEN idezchangepath$ = "/" 'root path cannot be ""
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF path$ = "/" THEN idezchangepath$ = "/" + newpath$ ELSE idezchangepath$ = path$ + "/" + newpath$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION idezfilelist$ (path$, method, mask$) 'method0=*.bas, method1=*.*, method2=custom mask
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
|
|
IF os$ = "WIN" THEN
|
|
OPEN ".\internal\temp\files.txt" FOR OUTPUT AS #150: CLOSE #150
|
|
IF method = 0 THEN SHELL _HIDE "dir /b /ON /A-D " + QuotedFilename$(path$) + "\*.bas >.\internal\temp\files.txt"
|
|
IF method = 1 THEN SHELL _HIDE "dir /b /ON /A-D " + QuotedFilename$(path$) + "\*.* >.\internal\temp\files.txt"
|
|
IF method = 2 THEN SHELL _HIDE "dir /b /ON /A-D " + QuotedFilename$(path$) + "\" + QuotedFilename$(mask$) + " >.\internal\temp\files.txt"
|
|
filelist$ = ""
|
|
OPEN ".\internal\temp\files.txt" FOR INPUT AS #150
|
|
DO UNTIL EOF(150)
|
|
LINE INPUT #150, a$
|
|
IF LEN(a$) THEN 'skip blank entries
|
|
IF path$ = "internal/help" THEN a$ = LEFT$(a$, (LEN(a$) - 5) \ 2) + ".txt" 'remove spelling label
|
|
IF filelist$ = "" THEN filelist$ = a$ ELSE filelist$ = filelist$ + sep + a$
|
|
END IF
|
|
LOOP
|
|
CLOSE #150
|
|
idezfilelist$ = filelist$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF os$ = "LNX" THEN
|
|
filelist$ = ""
|
|
IF method = 0 THEN
|
|
FOR i = 1 TO 2
|
|
OPEN "./internal/temp/files.txt" FOR OUTPUT AS #150: CLOSE #150
|
|
IF i = 1 THEN SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -type f -name " + CHR$(34) + "*.bas" + CHR$(34) + " | sort >./internal/temp/files.txt"
|
|
IF i = 2 THEN SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -type f -name " + CHR$(34) + "*.BAS" + CHR$(34) + " | sort >./internal/temp/files.txt"
|
|
GOSUB AddToList
|
|
NEXT
|
|
ELSEIF method = 1 THEN
|
|
SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -type f -name " + CHR$(34) + "*" + CHR$(34) + " | sort >./internal/temp/files.txt"
|
|
GOSUB AddToList
|
|
ELSEIF method = 2 THEN
|
|
SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -type f -name " + CHR$(34) + mask$ + CHR$(34) + " | sort >./internal/temp/files.txt"
|
|
GOSUB AddToList
|
|
END IF
|
|
idezfilelist$ = filelist$
|
|
EXIT FUNCTION
|
|
|
|
AddToList:
|
|
OPEN "./internal/temp/files.txt" FOR INPUT AS #150
|
|
DO UNTIL EOF(150)
|
|
LINE INPUT #150, a$
|
|
IF LEN(a$) = 0 THEN EXIT DO
|
|
FOR x = LEN(a$) TO 1 STEP -1
|
|
a2$ = MID$(a$, x, 1)
|
|
IF a2$ = "/" THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - x)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
IF path$ = "internal/help" THEN a$ = LEFT$(a$, (LEN(a$) - 5) \ 2) + ".txt" 'remove spelling label
|
|
IF filelist$ = "" THEN filelist$ = a$ ELSE filelist$ = filelist$ + sep + a$
|
|
LOOP
|
|
CLOSE #150
|
|
RETURN
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION idezgetroot$
|
|
'note: does NOT including a trailing / or \ on the right
|
|
|
|
IF os$ = "WIN" THEN
|
|
SHELL _HIDE "cd >.\internal\temp\root.txt"
|
|
OPEN ".\internal\temp\root.txt" FOR INPUT AS #150
|
|
LINE INPUT #150, a$
|
|
idezgetroot$ = a$
|
|
CLOSE #150
|
|
EXIT FUNCTION
|
|
ELSE
|
|
SHELL _HIDE "pwd >./internal/temp/root.txt"
|
|
OPEN "./internal/temp/root.txt" FOR INPUT AS #150
|
|
LINE INPUT #150, a$
|
|
idezgetroot$ = a$
|
|
CLOSE #150
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION idezpathlist$ (path$)
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
|
|
IF os$ = "WIN" THEN
|
|
OPEN ".\internal\temp\paths.txt" FOR OUTPUT AS #150: CLOSE #150
|
|
a$ = "": IF RIGHT$(path$, 1) = ":" THEN a$ = "\" 'use a \ after a drive letter
|
|
SHELL _HIDE "dir /b /ON /AD " + QuotedFilename$(path$ + a$) + " >.\internal\temp\paths.txt"
|
|
pathlist$ = ""
|
|
OPEN ".\internal\temp\paths.txt" FOR INPUT AS #150
|
|
DO UNTIL EOF(150)
|
|
LINE INPUT #150, a$
|
|
IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = pathlist$ + sep + a$
|
|
LOOP
|
|
CLOSE #150
|
|
'count instances of / or \
|
|
c = 0
|
|
FOR x = 1 TO LEN(path$)
|
|
b$ = MID$(path$, x, 1)
|
|
IF b$ = idepathsep$ THEN c = c + 1
|
|
NEXT
|
|
IF c >= 1 THEN
|
|
IF LEN(pathlist$) THEN pathlist$ = ".." + sep + pathlist$ ELSE pathlist$ = ".."
|
|
END IF
|
|
'add drive paths
|
|
|
|
DECLARE LIBRARY
|
|
FUNCTION logical_drives& ()
|
|
END DECLARE
|
|
|
|
d = logical_drives&
|
|
FOR i = 0 TO 25
|
|
IF RIGHT$(pathlist$, 1) <> sep AND LEN(pathlist$) > 0 THEN pathlist$ = pathlist$ + sep
|
|
IF _READBIT(d, i) THEN
|
|
pathlist$ = pathlist$ + CHR$(65 + i) + ":"
|
|
END IF
|
|
NEXT
|
|
|
|
idezpathlist$ = pathlist$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF os$ = "LNX" THEN
|
|
pathlist$ = ""
|
|
OPEN "./internal/temp/paths.txt" FOR OUTPUT AS #150: CLOSE #150
|
|
SHELL _HIDE "find " + QuotedFilename$(path$) + " -maxdepth 1 -mindepth 1 -type d >./internal/temp/paths.txt"
|
|
OPEN "./internal/temp/paths.txt" FOR INPUT AS #150
|
|
DO UNTIL EOF(150)
|
|
LINE INPUT #150, a$
|
|
IF LEN(a$) = 0 THEN EXIT DO
|
|
FOR x = LEN(a$) TO 1 STEP -1
|
|
a2$ = MID$(a$, x, 1)
|
|
IF a2$ = "/" THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - x)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = pathlist$ + sep + a$
|
|
LOOP
|
|
CLOSE #150
|
|
|
|
IF path$ <> "/" THEN
|
|
a$ = ".."
|
|
|
|
IF pathlist$ = "" THEN pathlist$ = a$ ELSE pathlist$ = a$ + sep + pathlist$
|
|
END IF
|
|
|
|
idezpathlist$ = pathlist$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION ideztakepath$ (f$) 'assume f$ contains a filename with an optional path
|
|
p$ = ""
|
|
|
|
FOR i = LEN(f$) TO 1 STEP -1
|
|
a$ = MID$(f$, i, 1)
|
|
IF a$ = "\" OR a$ = "/" THEN
|
|
p$ = LEFT$(f$, i - 1)
|
|
f$ = RIGHT$(f$, LEN(f$) - i)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
ideztakepath$ = p$
|
|
EXIT FUNCTION
|
|
END FUNCTION
|
|
|
|
'file f$ exists, and may contain a path
|
|
'return the FULL path (even if it was passed as a relative path)
|
|
'f$ is altered to only contain the name of the actual file
|
|
'root$ is the path to apply relative paths to
|
|
FUNCTION idezgetfilepath$ (root$, f$)
|
|
'step #1: seperate file's name from its path (if any)
|
|
p$ = ideztakepath$(f$) 'note: this is a simple seperation of the string
|
|
|
|
'step #2: if path was undefined, set it to root
|
|
IF LEN(p$) = 0 THEN p$ = root$
|
|
|
|
'step #3: if path is relative, make it relative to root$
|
|
IF _DIREXISTS(root$ + idepathsep$ + p$) THEN p$ = root$ + idepathsep$ + p$
|
|
|
|
'step #4: attempt a CHDIR to the path to (i) validate its existance
|
|
' & (ii) allow listing the paths full name
|
|
ideerror = 4 'path not found
|
|
p2$ = p$
|
|
IF os$ = "WIN" THEN
|
|
IF RIGHT$(p2$, 1) = ":" THEN p2$ = p2$ + "\" 'force change to root of drive
|
|
END IF
|
|
IF _DIREXISTS(p2$) = 0 THEN EXIT FUNCTION
|
|
|
|
CHDIR p2$
|
|
ideerror = 1
|
|
'step #5: get the path's full name (assume success)
|
|
p$ = _CWD$
|
|
'step #6: restore root path (assume success)
|
|
CHDIR ideroot$
|
|
'important: no validation of f$ necessary
|
|
idezgetfilepath$ = p$
|
|
END FUNCTION
|
|
|
|
FUNCTION idelayoutbox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
i = 0
|
|
idepar p, 60, 9, "Code Layout"
|
|
|
|
i = i + 1
|
|
ideautolayoutid = i
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt("#Auto Spacing & Upper/Lowercase Formatting")
|
|
o(i).sel = ideautolayout
|
|
|
|
i = i + 1
|
|
ideautolayoutkwcapitalsid = i
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 3
|
|
o(i).x = 6
|
|
o(i).nam = idenewtxt("#Keywords in CAPITALS")
|
|
o(i).sel = ideautolayoutkwcapitals
|
|
|
|
i = i + 1
|
|
ideautoindentID = i
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 5
|
|
o(i).nam = idenewtxt("Auto #Indent -")
|
|
o(i).sel = ideautoindent
|
|
|
|
a2$ = str2$(ideautoindentsize)
|
|
i = i + 1
|
|
ideautoindentsizeid = i
|
|
o(i).typ = 1
|
|
o(i).x = 20
|
|
o(i).y = 5
|
|
o(i).nam = idenewtxt("#Spacing")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
ideindentsubsid = i
|
|
o(i).typ = 4
|
|
o(i).x = 6
|
|
o(i).y = 7
|
|
o(i).nam = idenewtxt("Indent SUBs and #FUNCTIONs")
|
|
o(i).sel = ideindentsubs
|
|
|
|
i = i + 1
|
|
buttonsid = i
|
|
o(i).typ = 3
|
|
o(i).y = 9
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF o(focus).typ = 1 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
a$ = idetxt(o(ideautoindentsizeid).txt)
|
|
IF LEN(a$) > 2 THEN a$ = LEFT$(a$, 2) '2 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
NEXT
|
|
IF LEN(a$) THEN
|
|
a = VAL(a$)
|
|
IF a > 64 THEN a$ = "64"
|
|
END IF
|
|
idetxt(o(ideautoindentsizeid).txt) = a$
|
|
|
|
IF focus = ideautolayoutkwcapitalsid AND o(ideautolayoutkwcapitalsid).sel = 1 THEN
|
|
o(ideautolayoutid).sel = 1
|
|
END IF
|
|
|
|
IF focus = ideindentsubsid AND o(ideindentsubsid).sel = 1 THEN
|
|
o(ideautoindentID).sel = 1
|
|
END IF
|
|
|
|
IF o(ideautolayoutid).sel = 0 THEN o(ideautolayoutkwcapitalsid).sel = 0
|
|
IF o(ideautoindentID).sel = 0 THEN o(ideindentsubsid).sel = 0
|
|
|
|
IF K$ = CHR$(27) OR (focus = buttonsid + 1 AND info <> 0) THEN EXIT FUNCTION 'cancel
|
|
IF K$ = CHR$(13) OR (focus = buttonsid AND info <> 0) THEN 'ok
|
|
'save changes
|
|
v% = o(ideautolayoutid).sel: IF v% <> 0 THEN v% = 1 'ideautolayout
|
|
IF ideautolayout <> v% THEN ideautolayout = v%: idelayoutbox = 1
|
|
|
|
v% = o(ideautolayoutkwcapitalsid).sel: IF v% <> 0 THEN v% = 1 'ideautolayoutkwcapitals
|
|
IF ideautolayoutkwcapitals <> v% THEN ideautolayoutkwcapitals = v%: idelayoutbox = 1
|
|
|
|
v% = o(ideautoindentid).sel: IF v% <> 0 THEN v% = 1 'ideautoindent
|
|
IF ideautoindent <> v% THEN ideautoindent = v%: idelayoutbox = 1
|
|
|
|
v$ = idetxt(o(ideautoindentsizeid).txt) 'ideautoindentsize
|
|
IF v$ = "" THEN v$ = "4"
|
|
v% = VAL(v$)
|
|
IF v% < 0 OR v% > 64 THEN v% = 4
|
|
IF ideautoindentsize <> v% THEN
|
|
ideautoindentsize = v%
|
|
IF ideautoindent <> 0 THEN idelayoutbox = 1
|
|
END IF
|
|
|
|
v% = o(ideindentsubsid).sel: IF v% <> 0 THEN v% = 1 'ideindentsubs
|
|
IF ideindentsubs <> v% THEN ideindentsubs = v%: idelayoutbox = 1
|
|
|
|
IF ideautolayout THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoFormat", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoFormat", "False"
|
|
END IF
|
|
IF ideautolayoutkwcapitals THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_KeywordCapital", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_KeywordCapital", "False"
|
|
END IF
|
|
IF ideautoindent THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoIndent", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoIndent", "False"
|
|
END IF
|
|
WriteConfigSetting displaySettingsSection$, "IDE_IndentSize", STR$(ideautoindentsize)
|
|
IF ideindentsubs THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_IndentSUBs", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_IndentSUBs", "False"
|
|
END IF
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
FUNCTION idebackupbox
|
|
a2$ = str2$(idebackupsize)
|
|
v$ = ideinputbox$("Backup/Undo", "#Undo buffer limit (10-2000MB)", a2$, "0123456789", 50, 4, 0)
|
|
IF v$ = "" THEN EXIT FUNCTION
|
|
|
|
'save changes
|
|
v& = VAL(v$)
|
|
IF v& < 10 THEN v& = 10
|
|
IF v& > 2000 THEN v& = 2000
|
|
|
|
IF v& < idebackupsize THEN
|
|
OPEN tmpdir$ + "undo2.bin" FOR OUTPUT AS #151: CLOSE #151
|
|
ideundobase = 0
|
|
ideundopos = 0
|
|
END IF
|
|
|
|
idebackupsize = v&
|
|
WriteConfigSetting generalSettingsSection$, "BackupSize", STR$(v&) + " 'in MB"
|
|
idebackupbox = 1
|
|
END FUNCTION
|
|
|
|
SUB idegotobox
|
|
IF idegotobox_LastLineNum > 0 THEN a2$ = str2$(idegotobox_LastLineNum) ELSE a2$ = ""
|
|
v$ = ideinputbox$("Go To Line", "#Line", a2$, "0123456789", 30, 8, 0)
|
|
IF v$ = "" THEN EXIT SUB
|
|
|
|
v& = VAL(v$)
|
|
IF v& < 1 THEN v& = 1
|
|
IF v& > iden THEN v& = iden
|
|
idegotobox_LastLineNum = v&
|
|
AddQuickNavHistory
|
|
idecy = v&
|
|
idecentercurrentline
|
|
ideselect = 0
|
|
END SUB
|
|
|
|
SUB ideSetTCPPortBox
|
|
a2$ = str2$(idebaseTcpPort)
|
|
v$ = ideinputbox$("Base TCP/IP Port Number", "#Port number for $DEBUG mode", a2$, "0123456789", 45, 5, 0)
|
|
IF v$ = "" THEN EXIT SUB
|
|
|
|
idebaseTcpPort = VAL(v$)
|
|
IF idebaseTcpPort = 0 THEN idebaseTcpPort = 9000
|
|
WriteConfigSetting debugSettingsSection$, "BaseTCPPort", str2$(idebaseTcpPort)
|
|
END SUB
|
|
|
|
FUNCTION idegetlinenumberbox(title$, initialValue&)
|
|
a2$ = str2$(initialValue&)
|
|
IF a2$ = "0" THEN a2$ = ""
|
|
v$ = ideinputbox$(title$, "#Line", a2$, "0123456789", 30, 8, 0)
|
|
IF v$ = "" THEN EXIT FUNCTION
|
|
|
|
v& = VAL(v$)
|
|
IF v& < 1 THEN v& = 1
|
|
IF v& > iden THEN v& = iden
|
|
|
|
idegetlinenumberbox = v&
|
|
END FUNCTION
|
|
|
|
FUNCTION ideCompilerSettingsBox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
DIM optimizeCheckBox AS LONG
|
|
DIM stripDebugCheckBox AS LONG
|
|
DIM addDebugSymbolsCheckBox AS LONG
|
|
DIM maxParallelTextBox AS LONG
|
|
DIM extraCppFlagsTextBox AS LONG
|
|
DIM extraLinkerFlagsTextBox AS LONG
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
i = 0
|
|
y = 0
|
|
|
|
i = i + 1
|
|
optimizeCheckBox = i
|
|
o(i).typ = 4 'check box
|
|
y = y + 2: o(i).y = y
|
|
o(i).nam = idenewtxt("Compile #program with C++ optimization flag")
|
|
o(i).sel = OptimizeCppProgram
|
|
|
|
i = i + 1
|
|
stripDebugCheckBox = i
|
|
o(i).typ = 4 'check box
|
|
y = y + 1: o(i).y = y
|
|
o(i).nam = idenewtxt("#Strip C++ symbols from executable")
|
|
o(i).sel = -StripDebugSymbols
|
|
|
|
i = i + 1
|
|
addDebugSymbolsCheckBox = i
|
|
o(i).typ = 4 'check box
|
|
y = y + 1: o(i).y = y
|
|
o(i).nam = idenewtxt("#Add C++ Debug Information")
|
|
o(i).sel = Include_GDB_Debugging_Info
|
|
|
|
y = y + 1 ' Blank line
|
|
|
|
a2$ = str2$(idewy + idesubwindow)
|
|
i = i + 1
|
|
extraCppFlagsTextBox = i
|
|
o(i).typ = 1
|
|
o(i).x = 2
|
|
y = y + 2: o(i).y = y: y = y + 1
|
|
o(i).nam = idenewtxt("C++ Compiler #Flags")
|
|
o(i).txt = idenewtxt(ExtraCppFlags)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
a2$ = str2$(idewy + idesubwindow)
|
|
i = i + 1
|
|
extraLinkerFlagsTextBox = i
|
|
o(i).typ = 1
|
|
o(i).x = 2
|
|
y = y + 2: o(i).y = y: y = y + 1
|
|
o(i).nam = idenewtxt("C++ #Linker Flags")
|
|
o(i).txt = idenewtxt(ExtraLinkerFlags)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
a2$ = str2$(idewy + idesubwindow)
|
|
i = i + 1
|
|
maxParallelTextBox = i
|
|
o(i).typ = 1
|
|
o(i).x = 2
|
|
y = y + 2: o(i).y = y: y = y + 1
|
|
o(i).nam = idenewtxt("#Max C++ Compiler Processes")
|
|
o(i).txt = idenewtxt(str2$(MaxParallelProcesses))
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
y = y + 1 ' Blank line
|
|
|
|
i = i + 1
|
|
buttonsid = i
|
|
o(i).typ = 3
|
|
y = y + 1: o(i).y = y
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
|
|
idepar p, 60, y, "C++ Compiler Settings"
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF K$ = CHR$(27) OR (focus = buttonsid + 1 AND info <> 0) THEN EXIT FUNCTION 'cancel
|
|
IF K$ = CHR$(13) OR (focus = buttonsid AND info <> 0) THEN 'ok
|
|
'save changes
|
|
v% = o(optimizeCheckBox).sel: IF v% <> 0 THEN v% = -1
|
|
IF OptimizeCppProgram <> v% THEN
|
|
OptimizeCppProgram = v%
|
|
WriteConfigSetting compilerSettingsSection$, "OptimizeCppProgram", BoolToTFString$(OptimizeCppProgram)
|
|
END IF
|
|
|
|
v% = o(stripDebugCheckBox).sel: IF v% <> 0 THEN v% = -1
|
|
IF StripDebugSymbols <> v% THEN
|
|
StripDebugSymbols = v%
|
|
WriteConfigSetting compilerSettingsSection$, "StripDebugSymbols", BoolToTFString$(StripDebugSymbols)
|
|
END IF
|
|
|
|
v% = o(addDebugSymbolsCheckBox).sel: IF v% <> 0 THEN v% = -1
|
|
IF Include_GDB_Debugging_Info <> v% THEN
|
|
Include_GDB_Debugging_Info = v%
|
|
WriteConfigSetting generalSettingsSection$, "DebugInfo", BoolToTFString$(Include_GDB_Debugging_Info)
|
|
END IF
|
|
|
|
v% = VAL(idetxt(o(maxParallelTextBox).txt))
|
|
IF v% > 0 AND v% <> MaxParallelProcesses THEN
|
|
MaxParallelProcesses = v%
|
|
WriteConfigSetting compilerSettingsSection$, "MaxParallelProcesses", str2$(MaxParallelProcesses)
|
|
END IF
|
|
|
|
ExtraCppFlags$ = idetxt(o(extraCppFlagsTextBox).txt)
|
|
WriteConfigSetting compilerSettingsSection$, "ExtraCppFlags", ExtraCppFlags$
|
|
|
|
ExtraLinkerFlags$ = idetxt(o(extraLinkerFlagsTextBox).txt)
|
|
WriteConfigSetting compilerSettingsSection$, "ExtraLinkerFlags", ExtraLinkerFlags$
|
|
|
|
' Clean compiled files, since they may change due to the different settings
|
|
PurgeTemporaryBuildFiles (os$), (MacOSX)
|
|
idechangemade = 1 'force recompilation
|
|
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
ideCompilerSettingsBox = 0
|
|
END FUNCTION
|
|
|
|
FUNCTION idemessagebox (titlestr$, messagestr$, buttons$)
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
messagestr$ = StrReplace$(messagestr$, "\n", CHR$(10))
|
|
MessageLines = 1
|
|
DIM FullMessage$(1 TO 8)
|
|
PrevScan = 1
|
|
DO
|
|
NextScan = INSTR(NextScan + 1, messagestr$, CHR$(10))
|
|
IF NextScan > 0 THEN
|
|
FullMessage$(MessageLines) = MID$(messagestr$, PrevScan, NextScan - PrevScan)
|
|
tw = LEN(FullMessage$(MessageLines)) + 2
|
|
IF tw > w THEN w = tw
|
|
PrevScan = NextScan + 1
|
|
MessageLines = MessageLines + 1
|
|
IF MessageLines > UBOUND(FullMessage$) THEN EXIT DO
|
|
ELSE
|
|
FullMessage$(MessageLines) = MID$(messagestr$, PrevScan)
|
|
tw = LEN(FullMessage$(MessageLines)) + 2
|
|
IF tw > w THEN w = tw
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
|
|
IF buttons$ = "" THEN buttons$ = "#OK"
|
|
totalButtons = 1
|
|
FOR i = 1 TO LEN(buttons$)
|
|
IF ASC(buttons$, i) = 59 THEN totalButtons = totalButtons + 1
|
|
NEXT
|
|
buttonsLen = LEN(buttons$) + totalButtons * 6
|
|
|
|
i = 0
|
|
w2 = LEN(titlestr$) + 4
|
|
IF w < w2 THEN w = w2
|
|
IF w < buttonsLen THEN w = buttonsLen
|
|
IF w > idewx - 4 THEN w = idewx - 4
|
|
idepar p, w, 3 + MessageLines, titlestr$
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 3 + MessageLines
|
|
o(i).txt = idenewtxt(StrReplace$(buttons$, ";", sep))
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7
|
|
FOR i = 1 TO MessageLines
|
|
IF LEN(FullMessage$(i)) > p.w - 2 THEN
|
|
FullMessage$(i) = LEFT$(FullMessage$(i), p.w - 5) + STRING$(3, 250)
|
|
END IF
|
|
_PRINTSTRING (p.x + (w \ 2 - LEN(FullMessage$(i)) \ 2) + 1, p.y + 1 + i), FullMessage$(i)
|
|
NEXT i
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
|
|
IF UCASE$(K$) >= "A" AND UCASE$(K$) <= "Z" THEN altletter$ = UCASE$(K$)
|
|
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF K$ = CHR$(27) THEN EXIT FUNCTION
|
|
|
|
IF K$ = CHR$(13) OR (info <> 0) THEN
|
|
idemessagebox = focus
|
|
ClearMouse
|
|
EXIT FUNCTION
|
|
END IF
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
|
|
|
|
FUNCTION ideyesnobox$ (titlestr$, messagestr$) 'returns "Y" or "N"
|
|
result = idemessagebox(titlestr$, messagestr$, "#Yes;#No")
|
|
IF result = 1 THEN ideyesnobox$ = "Y" ELSE ideyesnobox$ = "N"
|
|
END FUNCTION 'yes/no box
|
|
|
|
|
|
'SUB idecheckupdates
|
|
' FOR i = 1 TO 3
|
|
' SELECT CASE i
|
|
' CASE 1
|
|
' remoteFile$ = "www.qb64.org/getver.php"
|
|
' lookFor$ = "Version$ = "
|
|
' m$ = "Connecting to qb64.org...\n" + STRING$(10, 219) + STRING$(20, 176) + "\n"
|
|
' m$ = m$ + "Checking stable version (1/3)"
|
|
' temp$ = ideactivitybox$("setup", "Check for Newer Version", m$, "#Cancel", "")
|
|
' CASE 2
|
|
' remoteFile$ = "www.qb64.org/getdevver.php"
|
|
' lookFor$ = "Version$ = "
|
|
' m$ = "Connecting to qb64.org...\n" + STRING$(20, 219) + STRING$(10, 176) + "\n"
|
|
' m$ = m$ + "Checking development version (2/3)"
|
|
' temp$ = ideactivitybox$("setup", "Check for Newer Version", m$, "#Cancel", "")
|
|
' CASE 3
|
|
' remoteFile$ = "www.qb64.org/devbuilds2.php"
|
|
' lookFor$ = "document.getElementById('gitlink').innerHTML = "
|
|
' m$ = "Connecting to qb64.org...\n" + STRING$(30, 219) + "\n"
|
|
' m$ = m$ + "Checking development build (3/3)"
|
|
' temp$ = ideactivitybox$("setup", "Check for Newer Version", m$, "#Cancel", "")
|
|
' END SELECT
|
|
|
|
' DO
|
|
' temp$ = ideactivitybox$("update", "", "", "", "")
|
|
' IF LEN(temp$) THEN
|
|
' 'either ESC or click means "cancel" for this dialog in particular
|
|
' Result$ = Download$("", "", "", 0)
|
|
' EXIT SUB
|
|
' END IF
|
|
|
|
' Result$ = Download$(remoteFile$, contents$, lookFor$, 30)
|
|
' SELECT CASE CVI(LEFT$(Result$, 2))
|
|
' CASE 1 'Success
|
|
' found = CVL(MID$(Result$, 3, 4))
|
|
' SELECT CASE i
|
|
' CASE 1
|
|
' remoteVersion$ = MID$(contents$, found + LEN(lookFor$) + 1)
|
|
' remoteVersion$ = LEFT$(remoteVersion$, INSTR(remoteVersion$, CHR$(34)) - 1)
|
|
' CASE 2
|
|
' remoteDevVersion$ = MID$(contents$, found + LEN(lookFor$) + 1)
|
|
' remoteDevVersion$ = LEFT$(remoteDevVersion$, INSTR(remoteDevVersion$, CHR$(34)) - 1)
|
|
' CASE 3
|
|
' remoteDevBuild$ = MID$(contents$, found + LEN(lookFor$) + 1)
|
|
' remoteDevBuild$ = LEFT$(remoteDevBuild$, INSTR(remoteDevBuild$, CHR$(34)) - 1)
|
|
' END SELECT
|
|
' EXIT DO
|
|
' CASE 2, 3 'Can't reach server; Timeout
|
|
' EXIT DO
|
|
' END SELECT
|
|
|
|
' _LIMIT 100
|
|
' LOOP
|
|
' Result$ = Download$("", "", "", 0)
|
|
' NEXT
|
|
|
|
' m$ = "Current version: " + Version$
|
|
' m$ = m$ + ".\n"
|
|
|
|
' DIM button$(1 TO 3)
|
|
' button$(3) = "#Close"
|
|
' IF LEN(remoteVersion$) THEN
|
|
' button$(1) = "Get #Stable Release"
|
|
' IF INSTR(remoteVersion$, "Cannot") = 0 THEN
|
|
' IF remoteVersion$ > Version$ THEN
|
|
' 'higher version number in the stable release is newer than current version
|
|
' 'regardless of this being a dev build
|
|
' m$ = m$ + "\n- A new stable version is available: v" + remoteVersion$ + ";"
|
|
' ELSE
|
|
' IF INSTR(DevChannel$, "Development") = 0 THEN
|
|
' 'if remoteVersion$ is not higher than current and this is not
|
|
' 'a dev build, we're all good.
|
|
' m$ = m$ + "\n- You have the latest stable version: v" + Version$ + ";"
|
|
' button$(1) = "#OK"
|
|
' ELSE
|
|
' IF remoteVersion$ = Version$ THEN
|
|
' 'if this is a dev build and version numbers match, that probably means
|
|
' 'a stable version based on this dev build was released
|
|
' m$ = m$ + "\n- A new stable version is available: v" + remoteVersion$ + ";"
|
|
' ELSE
|
|
' 'if remoteVersion$ is not higher than current and this is not
|
|
' 'a dev build, we're all good.
|
|
' m$ = m$ + "\n- No new stable version available;"
|
|
' button$(1) = "#OK"
|
|
' END IF
|
|
' END IF
|
|
' END IF
|
|
' END IF
|
|
' ELSE
|
|
' m$ = m$ + "\n- Failed to check for updates. Try again later."
|
|
' button$(1) = "#OK"
|
|
' END IF
|
|
|
|
' IF LEN(remoteDevVersion$) THEN
|
|
' button$(2) = "Get #Dev Build"
|
|
' IF INSTR(remoteDevVersion$, "error: ") = 0 THEN
|
|
' IF INSTR(DevChannel$, "Development") = 0 THEN
|
|
' 'if this is not a dev build, it'll be offered
|
|
' m$ = m$ + "\n- Development build available: v" + remoteDevVersion$
|
|
' IF LEN(remoteDevBuild$) THEN m$ = m$ + ", " + remoteDevBuild$
|
|
' m$ = m$ + ";"
|
|
' ELSE
|
|
' IF remoteDevVersion$ >= Version$ THEN
|
|
' 'this is a dev build and remote version is same or higher
|
|
' m$ = m$ + "\n- Latest dev build available: v" + remoteDevVersion$
|
|
' IF LEN(remoteDevBuild$) THEN m$ = m$ + ", " + remoteDevBuild$
|
|
' m$ = m$ + ";"
|
|
' END IF
|
|
' END IF
|
|
' END IF
|
|
' ELSE
|
|
' m$ = m$ + "\n- Failed to check for dev builds. Try again later."
|
|
' button$(2) = "#Close"
|
|
' IF button$(1) = "#OK" THEN button$(2) = ""
|
|
' button$(3) = ""
|
|
' END IF
|
|
|
|
' buttons$ = ""
|
|
' FOR i = 1 TO 3
|
|
' IF LEN(button$(i)) THEN
|
|
' IF LEN(buttons$) THEN buttons$ = buttons$ + ";"
|
|
' buttons$ = buttons$ + button$(i)
|
|
' END IF
|
|
' NEXT
|
|
|
|
' result = idemessagebox("Check for Newer Version", m$, buttons$)
|
|
' IF result = 0 THEN EXIT SUB
|
|
|
|
' url$ = ""
|
|
' SELECT CASE button$(result)
|
|
' CASE "Get #Dev Build"
|
|
' url$ = "https://www.qb64.org/portal/development-build/"
|
|
' CASE "Get #Stable Release"
|
|
' url$ = "https://github.com/QB64Team/qb64/releases/latest"
|
|
' END SELECT
|
|
|
|
' IF LEN(url$) = 0 THEN EXIT SUB
|
|
|
|
' IF INSTR(_OS$, "WIN") THEN
|
|
' SHELL _HIDE _DONTWAIT "start " + url$
|
|
' ELSEIF INSTR(_OS$, "MAC") THEN
|
|
' SHELL _HIDE _DONTWAIT "open " + url$
|
|
' ELSE
|
|
' SHELL _HIDE _DONTWAIT "xdg-open " + url$
|
|
' END IF
|
|
'END SUB
|
|
|
|
|
|
FUNCTION ideactivitybox$ (action$, titlestr$, messagestr$, buttons$) STATIC
|
|
|
|
SELECT CASE LCASE$(action$)
|
|
CASE "setup"
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
REDIM p AS idedbptype
|
|
REDIM o(1 TO 100) AS idedbotype
|
|
REDIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
messagestr$ = StrReplace$(messagestr$, "\n", CHR$(10))
|
|
MessageLines = 1
|
|
REDIM FullMessage$(1 TO 8)
|
|
PrevScan = 1
|
|
DO
|
|
NextScan = INSTR(NextScan + 1, messagestr$, CHR$(10))
|
|
IF NextScan > 0 THEN
|
|
FullMessage$(MessageLines) = MID$(messagestr$, PrevScan, NextScan - PrevScan)
|
|
tw = LEN(FullMessage$(MessageLines)) + 2
|
|
IF tw > w THEN w = tw
|
|
PrevScan = NextScan + 1
|
|
MessageLines = MessageLines + 1
|
|
IF MessageLines > UBOUND(FullMessage$) THEN EXIT DO
|
|
ELSE
|
|
FullMessage$(MessageLines) = MID$(messagestr$, PrevScan)
|
|
tw = LEN(FullMessage$(MessageLines)) + 2
|
|
IF tw > w THEN w = tw
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
|
|
IF buttons$ = "" THEN buttons$ = "#OK"
|
|
totalButtons = 1
|
|
FOR i = 1 TO LEN(buttons$)
|
|
IF ASC(buttons$, i) = 59 THEN totalButtons = totalButtons + 1
|
|
NEXT
|
|
buttonsLen = LEN(buttons$) + totalButtons * 6
|
|
|
|
i = 0
|
|
w2 = LEN(titlestr$) + 4
|
|
IF w < w2 THEN w = w2
|
|
IF w < buttonsLen THEN w = buttonsLen
|
|
IF w > idewx - 4 THEN w = idewx - 4
|
|
idepar p, w, 3 + MessageLines, titlestr$
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 3 + MessageLines
|
|
o(i).txt = idenewtxt(StrReplace$(buttons$, ";", sep))
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
CASE "update"
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
COLOR 0, 7
|
|
FOR i = 1 TO MessageLines
|
|
IF LEN(FullMessage$(i)) > p.w - 2 THEN
|
|
FullMessage$(i) = LEFT$(FullMessage$(i), p.w - 5) + STRING$(3, 250)
|
|
END IF
|
|
_PRINTSTRING (p.x + (w \ 2 - LEN(FullMessage$(i)) \ 2) + 1, p.y + 1 + i), FullMessage$(i)
|
|
NEXT i
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
|
|
IF change THEN
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
|
|
IF UCASE$(K$) >= "A" AND UCASE$(K$) <= "Z" THEN altletter$ = UCASE$(K$)
|
|
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF K$ = CHR$(27) THEN ideactivitybox$ = MKI$(0)
|
|
|
|
IF K$ = CHR$(13) OR (info <> 0) THEN
|
|
ideactivitybox$ = MKI$(1) + MKL$(focus)
|
|
ClearMouse
|
|
END IF
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
END IF
|
|
END SELECT
|
|
END FUNCTION
|
|
|
|
|
|
FUNCTION idedisplaybox
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
i = 0
|
|
|
|
'note: manually set window position in case display is set too large by accident
|
|
p.w = 60
|
|
p.h = 18
|
|
p.x = (80 \ 2) - p.w \ 2
|
|
p.y = (25 \ 2) - p.h \ 2
|
|
p.nam = idenewtxt("Display")
|
|
|
|
a2$ = str2$(idewx)
|
|
i = i + 1
|
|
PrevFocus = 1
|
|
o(i).typ = 1
|
|
o(i).x = 3
|
|
o(i).y = 2
|
|
o(i).w = 10
|
|
o(i).nam = idenewtxt("Window #width")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
IF o(i).v1 > 0 THEN
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
END IF
|
|
|
|
a2$ = str2$(idewy + idesubwindow)
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 2
|
|
o(i).y = 5
|
|
o(i).w = 10
|
|
o(i).nam = idenewtxt("Window #height")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 7
|
|
IF INSTR(_OS$, "WIN") > 0 OR INSTR(_OS$, "MAC") > 0 THEN
|
|
o(i).nam = idenewtxt("#Remember position + size")
|
|
ELSE
|
|
o(i).nam = idenewtxt("#Remember size")
|
|
END IF
|
|
IF IDE_AutoPosition THEN o(i).sel = 1
|
|
|
|
i = i + 1
|
|
tmpNormalCursorStart = IDENormalCursorStart
|
|
o(i).typ = 1
|
|
o(i).x = 33
|
|
o(i).y = 2
|
|
o(i).nam = idenewtxt("Cursor #start")
|
|
o(i).txt = idenewtxt(str2$(IDENormalCursorStart))
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
tmpNormalCursorEnd = IDENormalCursorEnd
|
|
o(i).typ = 1
|
|
o(i).x = 35
|
|
o(i).y = 5
|
|
o(i).nam = idenewtxt("Cursor #end")
|
|
o(i).txt = idenewtxt(str2$(IDENormalCursorEnd))
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 9
|
|
o(i).nam = idenewtxt("#Use _FONT 8")
|
|
o(i).sel = IDE_UseFont8
|
|
prevFont8Setting = o(i).sel
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 10
|
|
o(i).nam = idenewtxt("Use monospace #TTF font:")
|
|
o(i).sel = idecustomfont
|
|
prevCustomFontSetting = o(i).sel
|
|
|
|
a2$ = idecustomfontfile$
|
|
prevFontFile$ = a2$
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 10
|
|
o(i).y = 12
|
|
o(i).nam = idenewtxt("#Font file")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
a2$ = str2$(idecustomfontheight)
|
|
prevFontSize$ = a2$
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 10
|
|
o(i).y = 15
|
|
o(i).nam = idenewtxt("Font size in #pixels")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = p.h
|
|
o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
LOCATE , , , tmpNormalCursorStart, tmpNormalCursorEnd
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with TextBox values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF o(focus).typ = 1 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
'width
|
|
a$ = idetxt(o(1).txt)
|
|
IF LEN(a$) > 3 THEN a$ = LEFT$(a$, 3) '3 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
NEXT
|
|
IF focus <> 1 THEN
|
|
IF LEN(a$) THEN a = VAL(a$) ELSE a = 0
|
|
IF a < 80 THEN a$ = "80"
|
|
END IF
|
|
idetxt(o(1).txt) = a$
|
|
|
|
'height
|
|
a$ = idetxt(o(2).txt)
|
|
IF LEN(a$) > 3 THEN a$ = LEFT$(a$, 3) '3 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
NEXT
|
|
IF focus <> 2 THEN
|
|
IF LEN(a$) THEN a = VAL(a$) ELSE a = 0
|
|
IF a < 25 THEN a$ = "25"
|
|
END IF
|
|
idetxt(o(2).txt) = a$
|
|
|
|
'cursor start
|
|
a$ = idetxt(o(4).txt)
|
|
IF LEN(a$) > 2 THEN a$ = LEFT$(a$, 2) '2 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
NEXT
|
|
IF LEN(a$) THEN a = VAL(a$) ELSE a = 0
|
|
IF focus <> 4 THEN
|
|
IF a < 0 THEN a$ = "0"
|
|
IF a > 31 THEN a$ = "31"
|
|
tmpNormalCursorStart = VAL(a$)
|
|
ELSE
|
|
IF a < 0 THEN a = 0
|
|
IF a > 31 THEN a = 31
|
|
tmpNormalCursorStart = a
|
|
END IF
|
|
idetxt(o(4).txt) = a$
|
|
|
|
'cursor end
|
|
a$ = idetxt(o(5).txt)
|
|
IF LEN(a$) > 2 THEN a$ = LEFT$(a$, 2) '2 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
NEXT
|
|
IF LEN(a$) THEN a = VAL(a$) ELSE a = 0
|
|
IF focus <> 5 THEN
|
|
IF a < 0 THEN a$ = "0"
|
|
IF a > 31 THEN a$ = "31"
|
|
tmpNormalCursorEnd = VAL(a$)
|
|
ELSE
|
|
IF a < 0 THEN a = 0
|
|
IF a > 31 THEN a = 31
|
|
tmpNormalCursorEnd = a
|
|
END IF
|
|
idetxt(o(5).txt) = a$
|
|
|
|
IF prevFont8Setting <> o(6).sel THEN
|
|
prevFont8Setting = o(6).sel
|
|
IF o(6).sel THEN o(7).sel = 0: prevCustomFontSetting = 0
|
|
END IF
|
|
|
|
IF prevCustomFontSetting <> o(7).sel THEN
|
|
prevCustomFontSetting = o(7).sel
|
|
IF o(7).sel THEN o(6).sel = 0: prevFont8Setting = 0
|
|
END IF
|
|
|
|
a$ = idetxt(o(8).txt)
|
|
IF LEN(a$) > 1024 THEN a$ = LEFT$(a$, 1024)
|
|
idetxt(o(8).txt) = a$
|
|
IF a$ <> prevFontFile$ THEN
|
|
prevFontFile$ = a$
|
|
IF o(7).sel = 0 THEN
|
|
o(6).sel = 0: prevFont8Setting = 0
|
|
o(7).sel = 1: prevCustomFontSetting = 1
|
|
END IF
|
|
END IF
|
|
|
|
a$ = idetxt(o(9).txt)
|
|
IF LEN(a$) > 2 THEN a$ = LEFT$(a$, 2) '2 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
NEXT
|
|
IF focus <> 9 THEN
|
|
IF LEN(a$) THEN a = VAL(a$) ELSE a = 0
|
|
IF a < 8 THEN a$ = "8"
|
|
END IF
|
|
idetxt(o(9).txt) = a$
|
|
IF a$ <> prevFontSize$ THEN
|
|
prevFontSize$ = a$
|
|
IF o(7).sel = 0 THEN
|
|
o(6).sel = 0: prevFont8Setting = 0
|
|
o(7).sel = 1: prevCustomFontSetting = 1
|
|
END IF
|
|
END IF
|
|
|
|
|
|
IF K$ = CHR$(27) OR (focus = 11 AND info <> 0) THEN EXIT FUNCTION
|
|
IF K$ = CHR$(13) OR (focus = 10 AND info <> 0) THEN
|
|
|
|
x = 0 'change to custom font
|
|
|
|
'get size in v%
|
|
v$ = idetxt(o(9).txt): IF v$ = "" THEN v$ = "0"
|
|
v% = VAL(v$)
|
|
IF v% < 8 THEN v% = 8
|
|
IF v% > 99 THEN v% = 99
|
|
IF v% <> idecustomfontheight THEN x = 1
|
|
|
|
IF o(6).sel <> IDE_UseFont8 THEN
|
|
IDE_UseFont8 = o(6).sel
|
|
idedisplaybox = 1
|
|
END IF
|
|
|
|
IF o(7).sel <> idecustomfont THEN
|
|
IF o(7).sel = 0 THEN
|
|
IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
|
|
_FREEFONT idecustomfonthandle
|
|
ELSE
|
|
x = 1
|
|
END IF
|
|
END IF
|
|
|
|
|
|
v$ = idetxt(o(8).txt): IF v$ <> idecustomfontfile$ THEN x = 1
|
|
|
|
IF o(7).sel = 1 AND x = 1 THEN
|
|
oldhandle = idecustomfonthandle
|
|
idecustomfonthandle = _LOADFONT(v$, v%, "MONOSPACE")
|
|
IF idecustomfonthandle = -1 THEN
|
|
'failed! - revert to default settings
|
|
o(7).sel = 0: idetxt(o(8).txt) = "C:\Windows\Fonts\lucon.ttf": idetxt(o(9).txt) = "21": IF IDE_UseFont8 THEN _FONT 8 ELSE _FONT 16
|
|
ELSE
|
|
_FONT idecustomfonthandle
|
|
END IF
|
|
IF idecustomfont = 1 THEN _FREEFONT oldhandle
|
|
END IF
|
|
|
|
'save changes
|
|
v$ = idetxt(o(1).txt): IF v$ = "" THEN v$ = "0"
|
|
v% = VAL(v$)
|
|
IF v% < 80 THEN v% = 80
|
|
IF v% > 999 THEN v% = 999
|
|
IF v% <> idewx THEN idedisplaybox = 1
|
|
idewx = v%
|
|
|
|
|
|
v$ = idetxt(o(2).txt): IF v$ = "" THEN v$ = "0"
|
|
v% = VAL(v$)
|
|
IF v% < 25 THEN v% = 25
|
|
IF v% > 999 THEN v% = 999
|
|
IF v% <> idewy THEN idedisplaybox = 1
|
|
idewy = v% - idesubwindow
|
|
|
|
v% = o(3).sel
|
|
IF v% <> 0 THEN v% = -1
|
|
IDE_AutoPosition = v%
|
|
|
|
v% = o(7).sel
|
|
IF v% <> 0 THEN v% = 1
|
|
idecustomfont = v%
|
|
|
|
v$ = idetxt(o(8).txt)
|
|
IF LEN(v$) > 1024 THEN v$ = LEFT$(v$, 1024)
|
|
idecustomfontfile$ = v$
|
|
v$ = v$ + SPACE$(1024 - LEN(v$))
|
|
|
|
v$ = idetxt(o(9).txt): IF v$ = "" THEN v$ = "0"
|
|
v% = VAL(v$)
|
|
IF v% < 8 THEN v% = 8
|
|
IF v% > 99 THEN v% = 99
|
|
idecustomfontheight = v%
|
|
|
|
|
|
WriteConfigSetting windowSettingsSection$, "IDE_Width", STR$(idewx)
|
|
WriteConfigSetting windowSettingsSection$, "IDE_Height", STR$(idewy)
|
|
IF idecustomfont THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont", "False"
|
|
END IF
|
|
IF IDE_UseFont8 THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_UseFont8", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_UseFont8", "False"
|
|
END IF
|
|
IF IDE_AutoPosition THEN
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoPosition", "True"
|
|
ELSE
|
|
WriteConfigSetting displaySettingsSection$, "IDE_AutoPosition", "False"
|
|
END IF
|
|
WriteConfigSetting displaySettingsSection$, "IDE_CustomFont$", idecustomfontfile$
|
|
WriteConfigSetting displaySettingsSection$, "IDE_CustomFontSize", STR$(idecustomfontheight)
|
|
|
|
IDENormalCursorStart = tmpNormalCursorStart
|
|
WriteConfigSetting displaySettingsSection$, "IDE_NormalCursorStart", str2$(IDENormalCursorStart)
|
|
|
|
IDENormalCursorEnd = tmpNormalCursorEnd
|
|
WriteConfigSetting displaySettingsSection$, "IDE_NormalCursorEnd", str2$(IDENormalCursorEnd)
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
FUNCTION idechoosecolorsbox
|
|
DIM bkpIDECommentColor AS _UNSIGNED LONG, bkpIDEMetaCommandColor AS _UNSIGNED LONG
|
|
DIM bkpIDEQuoteColor AS _UNSIGNED LONG, bkpIDETextColor AS _UNSIGNED LONG
|
|
DIM bkpIDEBackgroundColor AS _UNSIGNED LONG, bkpIDEKeywordColor AS _UNSIGNED LONG
|
|
DIM bkpIDEBackgroundColor2 AS _UNSIGNED LONG, bkpIDENumbersColor AS _UNSIGNED LONG
|
|
DIM bkpIDEBracketHighlightColor AS _UNSIGNED LONG, bkpIDEChromaColor AS _UNSIGNED LONG
|
|
|
|
TotalItems = 10
|
|
DIM SelectionIndicator$(1 TO TotalItems)
|
|
bkpIDECommentColor = IDECommentColor
|
|
bkpIDEMetaCommandColor = IDEMetaCommandColor
|
|
bkpIDEQuoteColor = IDEQuoteColor
|
|
bkpIDETextColor = IDETextColor
|
|
bkpIDEKeywordColor = IDEKeywordColor
|
|
bkpIDENumbersColor = IDENumbersColor
|
|
bkpIDEBackgroundColor = IDEBackgroundColor
|
|
bkpIDEBackgroundColor2 = IDEBackgroundColor2
|
|
bkpIDEBracketHighlightColor = IDEBracketHighlightColor
|
|
bkpIDEChromaColor = IDEChromaColor
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
LoadColorSchemes
|
|
_PALETTECOLOR 5, &HFF00A800, 0 'Original green may have been changed by the Help System, so 5 is now green
|
|
|
|
i = 0
|
|
idepar p, 73, 20, "IDE Colors"
|
|
|
|
l$ = CHR$(16) + "Normal Text"
|
|
l$ = l$ + sep + " Keywords"
|
|
l$ = l$ + sep + " Numbers"
|
|
l$ = l$ + sep + " Strings"
|
|
l$ = l$ + sep + " Metacommand/custom keywords"
|
|
l$ = l$ + sep + " Comments"
|
|
l$ = l$ + sep + " Background"
|
|
l$ = l$ + sep + " Current line background"
|
|
l$ = l$ + sep + " Bracket/selection highlight"
|
|
l$ = l$ + sep + " Menus and dialogs"
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 4
|
|
o(i).w = 30: o(i).h = 10
|
|
o(i).txt = idenewtxt(l$)
|
|
o(i).sel = 1
|
|
SelectedITEM = 1
|
|
PrevFocus = 1
|
|
o(i).nam = idenewtxt("#Item:")
|
|
|
|
a2$ = str2$(_RED32(IDETextColor))
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 66
|
|
o(i).y = 5
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
a2$ = str2$(_GREEN32(IDETextColor))
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 66
|
|
o(i).y = 8
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
a2$ = str2$(_BLUE32(IDETextColor))
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 66
|
|
o(i).y = 11
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 16
|
|
o(i).nam = idenewtxt("#Highlight brackets")
|
|
IF brackethighlight THEN o(i).sel = 1
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 17
|
|
o(i).nam = idenewtxt("#Multi-highlight (selection)")
|
|
IF multihighlight THEN o(i).sel = 1
|
|
|
|
i = i + 1
|
|
o(i).typ = 4 'check box
|
|
o(i).y = 18
|
|
o(i).nam = idenewtxt("Highlight #keywords and numbers")
|
|
IF keywordHighlight THEN o(i).sel = 1
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 20
|
|
o(i).txt = idenewtxt("#OK" + sep + "Restore #Defaults" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
|
|
result = ReadConfigSetting(colorSettingsSection$, "SchemeID", value$)
|
|
SchemeID = VAL(value$)
|
|
IF SchemeID > TotalColorSchemes THEN SchemeID = 0
|
|
|
|
IF SchemeID = 0 THEN
|
|
a2$ = "User-defined"
|
|
ELSE
|
|
'Validate this scheme first
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
IF FoundPipe > 0 THEN
|
|
IF LEN(MID$(ColorSchemes$(SchemeID), FoundPipe + 1)) = 90 THEN
|
|
a2$ = LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1)
|
|
ELSE
|
|
SchemeID = 0
|
|
a2$ = "User-defined"
|
|
END IF
|
|
ELSE
|
|
SchemeID = 0
|
|
a2$ = "User-defined"
|
|
END IF
|
|
END IF
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 9
|
|
o(i).y = 2
|
|
o(i).w = 38
|
|
o(i).nam = idenewtxt("#Scheme")
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'Color scheme selection arrows:
|
|
LOCATE p.y + 2, p.x + 2
|
|
IF mY = p.y + 2 AND mX >= p.x + 2 AND mX <= p.x + 4 THEN COLOR 15, 0 ELSE COLOR 15, 2
|
|
IF SchemeID <= 1 THEN COLOR 7, 2
|
|
PRINT " " + CHR$(17) + " ";
|
|
IF mY = p.y + 2 AND mX >= p.x + 5 AND mX <= p.x + 7 THEN COLOR 15, 0 ELSE COLOR 15, 2
|
|
IF SchemeID = LastValidColorScheme THEN COLOR 7, 2
|
|
PRINT " " + CHR$(16) + " ";
|
|
|
|
'Color scheme Save and Erase buttons:
|
|
LOCATE p.y + 2, p.x + 60
|
|
IF mY = p.y + 2 AND mX >= p.x + 60 AND mX <= p.x + 65 THEN COLOR 15, 0 ELSE COLOR 15, 2
|
|
IF SchemeID > 0 AND SchemeID <= PresetColorSchemes THEN COLOR 7, 2 'Disable if preset scheme
|
|
PRINT " Save ";
|
|
IF mY = p.y + 2 AND mX >= p.x + 66 AND mX <= p.x + 72 THEN COLOR 15, 0 ELSE COLOR 15, 2
|
|
IF SchemeID <= PresetColorSchemes THEN COLOR 7, 2 'Disable if preset scheme or unsaved user-defined
|
|
PRINT " Erase ";
|
|
|
|
COLOR , 7
|
|
|
|
_PALETTECOLOR 1, IDEBackgroundColor, 0
|
|
_PALETTECOLOR 2, _RGB32(84, 84, 84), 0 'dark gray - help system and interface details
|
|
_PALETTECOLOR 6, IDEBackgroundColor2, 0
|
|
_PALETTECOLOR 7, IDEChromaColor, 0
|
|
_PALETTECOLOR 8, IDENumbersColor, 0
|
|
_PALETTECOLOR 10, IDEMetaCommandColor, 0
|
|
_PALETTECOLOR 11, IDECommentColor, 0
|
|
_PALETTECOLOR 12, IDEKeywordColor, 0
|
|
_PALETTECOLOR 13, IDETextColor, 0
|
|
_PALETTECOLOR 14, IDEQuoteColor, 0
|
|
|
|
COLOR 0: LOCATE p.y + 5, p.x + 36: PRINT "R: ";
|
|
COLOR 4: PRINT STRING$(26, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(2).txt)): r = ((T / 255) * 26)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 39 + r, p.y + 5), slider$
|
|
|
|
COLOR 0: LOCATE p.y + 8, p.x + 36: PRINT "G: ";
|
|
COLOR 5: PRINT STRING$(26, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(3).txt)): r = ((T / 255) * 26)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 39 + r, p.y + 8), slider$
|
|
|
|
COLOR 0: LOCATE p.y + 11, p.x + 36: PRINT "B: ";
|
|
COLOR 9: PRINT STRING$(26, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(4).txt)): r = ((T / 255) * 26)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 39 + r, p.y + 11), slider$
|
|
|
|
SELECT EVERYCASE SelectedITEM
|
|
CASE 1 TO 9
|
|
COLOR 7, 1
|
|
_PRINTSTRING (p.x + 39, p.y + 13), CHR$(218) + STRING$(25, 196)
|
|
_PRINTSTRING (p.x + 39, p.y + 14), CHR$(179) + SPACE$(25)
|
|
_PRINTSTRING (p.x + 39, p.y + 15), CHR$(179) + SPACE$(25)
|
|
CASE 1: COLOR 13, 1: SampleText$ = "myVar% = " 'Normal text
|
|
CASE 2: COLOR 12, 1: SampleText$ = "CLS: PRINT" 'Keywords
|
|
CASE 3: COLOR 13, 1: SampleText$ = "myVar% = " 'Normal text
|
|
CASE 4: COLOR 14, 1: SampleText$ = SPACE$(6) + CHR$(34) + "Hello, world!" + CHR$(34) 'Strings
|
|
CASE 5: COLOR 10, 1: SampleText$ = "'$DYNAMIC" 'Metacommands
|
|
CASE 6: COLOR 11, 1: SampleText$ = "'TODO: review this block" 'Comments
|
|
CASE 7: COLOR 1, 1: SampleText$ = "" 'Background
|
|
CASE 8: COLOR 6, 6: SampleText$ = SPACE$(25) 'Current line background
|
|
CASE 9
|
|
COLOR 6, 6: SampleText$ = "" 'Bracket highlight
|
|
_PALETTECOLOR 6, IDEBracketHighlightColor, 0
|
|
CASE 10
|
|
COLOR 0, 7
|
|
_PRINTSTRING (p.x + 39, p.y + 13), CHR$(218) + STRING$(24, 196) + CHR$(191)
|
|
_PRINTSTRING (p.x + 39, p.y + 14), CHR$(179) + SPACE$(24) + CHR$(179)
|
|
_PRINTSTRING (p.x + 39, p.y + 15), CHR$(192) + STRING$(24, 196) + CHR$(217)
|
|
SampleText$ = " Open... Ctrl+O "
|
|
END SELECT
|
|
|
|
_PRINTSTRING (p.x + 40, p.y + 14), SampleText$
|
|
IF SelectedITEM = 1 OR SelectedITEM = 3 THEN
|
|
COLOR 8, 1
|
|
_PRINTSTRING (p.x + 49, p.y + 14), "5"
|
|
ELSEIF SelectedITEM = 2 THEN
|
|
COLOR 13, 1
|
|
_PRINTSTRING (p.x + 51, p.y + 14), "myVar%"
|
|
ELSEIF SelectedITEM = 4 THEN
|
|
COLOR 12, 1
|
|
_PRINTSTRING (p.x + 40, p.y + 14), "PRINT"
|
|
ELSEIF SelectedITEM = 5 THEN
|
|
COLOR 11, 1
|
|
_PRINTSTRING (p.x + 40, p.y + 14), "'"
|
|
ELSEIF SelectedITEM = 9 THEN
|
|
LOCATE p.y + 14, p.x + 40
|
|
COLOR 13, 1: PRINT "myVar% = ";
|
|
COLOR 12: PRINT "INT RND";
|
|
LOCATE p.y + 14, p.x + 52
|
|
COLOR 13, 6: PRINT "(";
|
|
LOCATE p.y + 14, p.x + 56
|
|
PRINT ")";
|
|
ELSEIF SelectedITEM = 10 THEN
|
|
COLOR 15, 7
|
|
_PRINTSTRING (p.x + 41, p.y + 14), "O"
|
|
END IF
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
IF mX <> prev.mX OR mY <> prev.mY THEN change = 1: prev.mX = mX: prev.mY = mY
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
T = o(i).typ
|
|
IF T THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with RGB values AND scheme name selected upon getting focus
|
|
PrevFocus = focus
|
|
IF (focus >= 2 AND focus <= 4) OR focus = 11 THEN
|
|
IF focus = 11 THEN tfocus = 9 ELSE tfocus = focus
|
|
o(tfocus).v1 = LEN(idetxt(o(tfocus).txt))
|
|
IF o(tfocus).v1 > 0 THEN o(tfocus).issel = -1
|
|
o(tfocus).sx1 = 0
|
|
IF (tfocus >= 2 AND tfocus <= 4) THEN prevTB.value$ = idetxt(o(tfocus).txt)
|
|
END IF
|
|
ELSEIF focus = PrevFocus THEN
|
|
'Check if new values have been entered into textboxes
|
|
IF focus >= 2 AND focus <= 4 THEN
|
|
IF prevTB.value$ <> idetxt(o(focus).txt) THEN
|
|
GOSUB NewUserScheme
|
|
prevTB.value$ = idetxt(o(focus).txt)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'Save and Erase color scheme (Buttons):
|
|
IF (SchemeID = 0 OR SchemeID > PresetColorSchemes) AND mCLICK THEN
|
|
IF mY = p.y + 2 AND mX >= p.x + 60 AND mX <= p.x + 65 THEN
|
|
'Save
|
|
IF SchemeID = 0 THEN
|
|
SaveNew:
|
|
SchemeString$ = LTRIM$(RTRIM$(idetxt(o(9).txt)))
|
|
IF LEN(SchemeString$) = 0 THEN SchemeString$ = "User-defined"
|
|
'Find the next free scheme index
|
|
i = 0
|
|
DO
|
|
i = i + 1
|
|
result = ReadConfigSetting(colorSchemesSection$, "Scheme" + str2$(i) + "$", value$)
|
|
IF value$ = "" OR value$ = "0" THEN EXIT DO
|
|
LOOP
|
|
|
|
'Build scheme string
|
|
SchemeString$ = SchemeString$ + "|"
|
|
FOR j = 1 TO 10
|
|
SELECT CASE j
|
|
CASE 1: CurrentColor~& = IDETextColor
|
|
CASE 2: CurrentColor~& = IDEKeywordColor
|
|
CASE 3: CurrentColor~& = IDENumbersColor
|
|
CASE 4: CurrentColor~& = IDEQuoteColor
|
|
CASE 5: CurrentColor~& = IDEMetaCommandColor
|
|
CASE 6: CurrentColor~& = IDECommentColor
|
|
CASE 7: CurrentColor~& = IDEBackgroundColor
|
|
CASE 8: CurrentColor~& = IDEBackgroundColor2
|
|
CASE 9: CurrentColor~& = IDEBracketHighlightColor
|
|
CASE 10: CurrentColor~& = IDEChromaColor
|
|
END SELECT
|
|
|
|
r$ = str2$(_RED32(CurrentColor~&)): r$ = STRING$(3 - LEN(r$), "0") + r$
|
|
g$ = str2$(_GREEN32(CurrentColor~&)): g$ = STRING$(3 - LEN(g$), "0") + g$
|
|
b$ = str2$(_BLUE32(CurrentColor~&)): b$ = STRING$(3 - LEN(b$), "0") + b$
|
|
SchemeString$ = SchemeString$ + r$ + g$ + b$
|
|
NEXT j
|
|
|
|
'Save user scheme
|
|
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", SchemeString$
|
|
LoadColorSchemes
|
|
SchemeID = PresetColorSchemes + i
|
|
ChangedScheme = -1
|
|
GOTO ApplyScheme
|
|
ELSE
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
SchemeString$ = LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1)
|
|
|
|
IF SchemeString$ <> LTRIM$(RTRIM$(idetxt(o(9).txt))) THEN
|
|
'User wants to save the current SchemeID under a different name
|
|
GOTO SaveNew
|
|
END IF
|
|
|
|
i = SchemeID - PresetColorSchemes
|
|
SchemeString$ = SchemeString$ + "|"
|
|
|
|
'Build scheme string
|
|
FOR j = 1 TO 10
|
|
SELECT CASE j
|
|
CASE 1: CurrentColor~& = IDETextColor
|
|
CASE 2: CurrentColor~& = IDEKeywordColor
|
|
CASE 3: CurrentColor~& = IDENumbersColor
|
|
CASE 4: CurrentColor~& = IDEQuoteColor
|
|
CASE 5: CurrentColor~& = IDEMetaCommandColor
|
|
CASE 6: CurrentColor~& = IDECommentColor
|
|
CASE 7: CurrentColor~& = IDEBackgroundColor
|
|
CASE 8: CurrentColor~& = IDEBackgroundColor2
|
|
CASE 9: CurrentColor~& = IDEBracketHighlightColor
|
|
CASE 10: CurrentColor~& = IDEChromaColor
|
|
END SELECT
|
|
|
|
r$ = str2$(_RED32(CurrentColor~&)): r$ = STRING$(3 - LEN(r$), "0") + r$
|
|
g$ = str2$(_GREEN32(CurrentColor~&)): g$ = STRING$(3 - LEN(g$), "0") + g$
|
|
b$ = str2$(_BLUE32(CurrentColor~&)): b$ = STRING$(3 - LEN(b$), "0") + b$
|
|
SchemeString$ = SchemeString$ + r$ + g$ + b$
|
|
NEXT j
|
|
|
|
'Save user scheme
|
|
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", SchemeString$
|
|
LoadColorSchemes
|
|
SchemeID = PresetColorSchemes + i
|
|
ChangedScheme = -1
|
|
GOTO ApplyScheme
|
|
END IF
|
|
o(9).v1 = LEN(idetxt(o(9).txt))
|
|
o(9).issel = -1
|
|
o(9).sx1 = 0
|
|
ELSEIF mY = p.y + 2 AND mX >= p.x + 66 AND mX <= p.x + 72 THEN
|
|
'Erase
|
|
IF SchemeID > PresetColorSchemes THEN
|
|
what$ = ideyesnobox("Erase color scheme", "This cannot be undone. Erase scheme?")
|
|
K$ = ""
|
|
IF what$ = "Y" THEN
|
|
i = SchemeID - PresetColorSchemes
|
|
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", "0"
|
|
LoadColorSchemes
|
|
SchemeID = SchemeID - 1
|
|
ChangedScheme = -1
|
|
SchemeArrow = -1
|
|
GOTO ValidateScheme
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
'Scheme selection arrows:
|
|
ChangedScheme = 0
|
|
SchemeArrow = 0
|
|
IF (mCLICK AND mY = p.y + 2 AND mX >= p.x + 2 AND mX <= p.x + 4) OR _
|
|
(K$ = CHR$(0) + CHR$(75) AND (focus = 1)) THEN
|
|
SchemeArrow = -1
|
|
IF SchemeID = 0 THEN
|
|
ChangedScheme = -1
|
|
GOTO LoadDefaultScheme
|
|
ELSE
|
|
IF SchemeID > 1 THEN SchemeID = SchemeID - 1: ChangedScheme = -1
|
|
END IF
|
|
ELSEIF (mCLICK AND mY = p.y + 2 AND mX >= p.x + 5 AND mX <= p.x + 7) OR _
|
|
(K$ = CHR$(0) + CHR$(77) AND (focus = 1)) THEN
|
|
SchemeArrow = 1
|
|
IF SchemeID = 0 THEN
|
|
ChangedScheme = -1
|
|
GOTO LoadDefaultScheme
|
|
ELSE
|
|
IF SchemeID < TotalColorSchemes THEN SchemeID = SchemeID + 1: ChangedScheme = -1
|
|
END IF
|
|
END IF
|
|
|
|
IF ChangedScheme THEN
|
|
'Validate this scheme first
|
|
IF SchemeArrow = 0 THEN SchemeArrow = 1
|
|
ValidateScheme:
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
IF FoundPipe > 0 THEN
|
|
IF LEN(MID$(ColorSchemes$(SchemeID), FoundPipe + 1)) = 90 THEN
|
|
a2$ = LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1)
|
|
ELSE
|
|
SchemeID = SchemeID + SchemeArrow
|
|
IF SchemeID > TotalColorSchemes THEN SchemeID = TotalColorSchemes: SchemeArrow = -1
|
|
IF SchemeID < 1 THEN SchemeID = 1
|
|
GOTO ValidateScheme
|
|
END IF
|
|
ELSE
|
|
SchemeID = SchemeID + SchemeArrow
|
|
IF SchemeID > TotalColorSchemes THEN SchemeID = TotalColorSchemes: SchemeArrow = -1
|
|
IF SchemeID < 1 THEN SchemeID = 1
|
|
GOTO ValidateScheme
|
|
END IF
|
|
ApplyScheme:
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
idetxt(o(9).txt) = LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1)
|
|
o(9).v1 = LEN(idetxt(o(9).txt))
|
|
o(9).issel = -1
|
|
o(9).sx1 = 0
|
|
ColorData$ = RIGHT$(ColorSchemes$(SchemeID), 90)
|
|
i = 1
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDETextColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEKeywordColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDENumbersColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEQuoteColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEMetaCommandColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDECommentColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEBackgroundColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEBackgroundColor2 = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEBracketHighlightColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
r$ = MID$(ColorData$, i, 3): i = i + 3: g$ = MID$(ColorData$, i, 3): i = i + 3: b$ = MID$(ColorData$, i, 3): i = i + 3
|
|
IDEChromaColor = _RGB32(VAL(r$), VAL(g$), VAL(b$))
|
|
GOTO ChangeTextBoxes
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 5 AND mX >= p.x + 39 AND mX <= p.x + 39 + 26 THEN
|
|
newValue = (mX - p.x - 39) * (255 / 26)
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
idetxt(o(4).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 2
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
GOSUB NewUserScheme
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 8 AND mX >= p.x + 39 AND mX <= p.x + 39 + 26 THEN
|
|
newValue = (mX - p.x - 39) * (255 / 26)
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
idetxt(o(4).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 3
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
GOSUB NewUserScheme
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 11 AND mX >= p.x + 39 AND mX <= p.x + 39 + 26 THEN
|
|
newValue = (mX - p.x - 39) * (255 / 26)
|
|
idetxt(o(4).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 4
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
GOSUB NewUserScheme
|
|
END IF
|
|
|
|
ChangedWithKeys = 0
|
|
IF K$ = CHR$(0) + CHR$(72) AND (focus = 2 OR focus = 3 OR focus = 4) THEN 'Up
|
|
idetxt(o(focus).txt) = str2$(VAL(idetxt(o(focus).txt)) + 1)
|
|
o(focus).issel = -1: o(focus).sx1 = 0: o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
ChangedWithKeys = -1
|
|
GOSUB NewUserScheme
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(80) AND (focus = 2 OR focus = 3 OR focus = 4) THEN 'Down
|
|
idetxt(o(focus).txt) = str2$(VAL(idetxt(o(focus).txt)) - 1)
|
|
o(focus).issel = -1: o(focus).sx1 = 0: o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
ChangedWithKeys = -1
|
|
GOSUB NewUserScheme
|
|
END IF
|
|
|
|
IF SelectedITEM <> o(1).sel AND o(1).sel > 0 THEN
|
|
SelectedITEM = o(1).sel
|
|
FOR i = 1 TO 10: SelectionIndicator$(i) = " ": NEXT i
|
|
SelectionIndicator$(SelectedITEM) = CHR$(16)
|
|
|
|
i = 0
|
|
i = i + 1: l$ = SelectionIndicator$(i) + "Normal Text"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Keywords"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Numbers"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Strings"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Metacommand/custom keywords"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Comments"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Background"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Current line background"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Bracket/selection highlight"
|
|
i = i + 1: l$ = l$ + sep + SelectionIndicator$(i) + "Menus and dialogs"
|
|
idetxt(o(1).txt) = l$
|
|
|
|
ChangeTextBoxes:
|
|
SELECT CASE SelectedITEM
|
|
CASE 1: CurrentColor~& = IDETextColor
|
|
CASE 2: CurrentColor~& = IDEKeywordColor
|
|
CASE 3: CurrentColor~& = IDENumbersColor
|
|
CASE 4: CurrentColor~& = IDEQuoteColor
|
|
CASE 5: CurrentColor~& = IDEMetaCommandColor
|
|
CASE 6: CurrentColor~& = IDECommentColor
|
|
CASE 7: CurrentColor~& = IDEBackgroundColor
|
|
CASE 8: CurrentColor~& = IDEBackgroundColor2
|
|
CASE 9: CurrentColor~& = IDEBracketHighlightColor
|
|
CASE 10: CurrentColor~& = IDEChromaColor
|
|
END SELECT
|
|
idetxt(o(2).txt) = str2$(_RED32(CurrentColor~&))
|
|
idetxt(o(3).txt) = str2$(_GREEN32(CurrentColor~&))
|
|
idetxt(o(4).txt) = str2$(_BLUE32(CurrentColor~&))
|
|
IF focus >= 2 AND focus <= 4 AND ChangedScheme THEN
|
|
prevTB.value$ = idetxt(o(focus).txt)
|
|
END IF
|
|
END IF
|
|
|
|
'Check RGB values range (0-255)
|
|
FOR checkRGB = 2 TO 4
|
|
a$ = idetxt(o(checkRGB).txt)
|
|
IF LEN(a$) > 3 THEN a$ = LEFT$(a$, 3) '3 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
NEXT
|
|
IF LEN(a$) THEN
|
|
a = VAL(a$)
|
|
IF a > 255 THEN a$ = "255"
|
|
IF a < 0 THEN a$ = "0"
|
|
ELSE
|
|
IF ChangedWithKeys = -1 THEN a$ = "0"
|
|
END IF
|
|
idetxt(o(checkRGB).txt) = a$
|
|
NEXT checkRGB
|
|
|
|
'Check for valid scheme name
|
|
FoundPipe = INSTR(idetxt(o(9).txt), "|")
|
|
IF FoundPipe > 0 THEN
|
|
a2$ = LEFT$(idetxt(o(9).txt), FoundPipe - 1) + MID$(idetxt(o(9).txt), FoundPipe + 1)
|
|
idetxt(o(9).txt) = a2$
|
|
IF o(9).v1 >= FoundPipe THEN o(9).v1 = o(9).v1 - 1
|
|
END IF
|
|
|
|
IF SchemeID > 0 THEN
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
IF RTRIM$(LTRIM$(idetxt(o(9).txt))) <> LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1) THEN
|
|
'A different scheme name is the beginning of editing a new one
|
|
SchemeID = 0
|
|
END IF
|
|
END IF
|
|
|
|
CurrentColor~& = _RGB32(VAL(idetxt(o(2).txt)), VAL(idetxt(o(3).txt)), VAL(idetxt(o(4).txt)))
|
|
SELECT CASE SelectedITEM
|
|
CASE 1: IDETextColor = CurrentColor~& 'Normal text
|
|
CASE 2: IDEKeywordColor = CurrentColor~& 'Keywords
|
|
CASE 3: IDENumbersColor = CurrentColor~& 'Numbers
|
|
CASE 4: IDEQuoteColor = CurrentColor~& 'Strings
|
|
CASE 5: IDEMetaCommandColor = CurrentColor~& 'Metacommands
|
|
CASE 6: IDECommentColor = CurrentColor~& 'Comments
|
|
CASE 7: IDEBackgroundColor = CurrentColor~& 'Background
|
|
CASE 8: IDEBackgroundColor2 = CurrentColor~& 'Current line background
|
|
CASE 9: IDEBracketHighlightColor = CurrentColor~& 'Bracket highlight
|
|
CASE 10: IDEChromaColor = CurrentColor~&
|
|
END SELECT
|
|
|
|
IF K$ = CHR$(27) OR (focus = 10 AND info <> 0) THEN
|
|
IDECommentColor = bkpIDECommentColor
|
|
IDEMetaCommandColor = bkpIDEMetaCommandColor
|
|
IDEQuoteColor = bkpIDEQuoteColor
|
|
IDETextColor = bkpIDETextColor
|
|
IDEKeywordColor = bkpIDEKeywordColor
|
|
IDENumbersColor = bkpIDENumbersColor
|
|
IDEBackgroundColor = bkpIDEBackgroundColor
|
|
IDEBackgroundColor2 = bkpIDEBackgroundColor2
|
|
IDEBracketHighlightColor = bkpIDEBracketHighlightColor
|
|
IDEChromaColor = bkpIDEChromaColor
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (focus = 9 AND info <> 0) THEN
|
|
LoadDefaultScheme:
|
|
GOSUB enableHighlighter
|
|
SchemeID = 1
|
|
FoundPipe = INSTR(ColorSchemes$(SchemeID), "|")
|
|
idetxt(o(9).txt) = LEFT$(ColorSchemes$(SchemeID), FoundPipe - 1)
|
|
info = 0
|
|
GOTO ApplyScheme
|
|
END IF
|
|
|
|
IF (focus = 8 AND info <> 0) OR _
|
|
(focus = 1 AND K$ = CHR$(13)) OR _
|
|
(focus = 2 AND K$ = CHR$(13)) OR _
|
|
(focus = 3 AND K$ = CHR$(13)) OR _
|
|
(focus = 4 AND K$ = CHR$(13)) OR _
|
|
(focus = 5 AND K$ = CHR$(13)) OR _
|
|
(focus = 6 AND K$ = CHR$(13)) OR _
|
|
(focus = 7 AND K$ = CHR$(13)) OR _
|
|
(focus = 11 AND K$ = CHR$(13)) THEN
|
|
'save changes
|
|
GOSUB enableHighlighter
|
|
|
|
WriteConfigSetting colorSettingsSection$, "SchemeID", str2$(SchemeID)
|
|
FOR i = 1 TO 10
|
|
SELECT CASE i
|
|
CASE 1: CurrentColor~& = IDETextColor: colorid$ = "TextColor"
|
|
CASE 2: CurrentColor~& = IDEKeywordColor: colorid$ = "KeywordColor"
|
|
CASE 3: CurrentColor~& = IDENumbersColor: colorid$ = "NumbersColor"
|
|
CASE 4: CurrentColor~& = IDEQuoteColor: colorid$ = "QuoteColor"
|
|
CASE 5: CurrentColor~& = IDEMetaCommandColor: colorid$ = "MetaCommandColor"
|
|
CASE 6: CurrentColor~& = IDECommentColor: colorid$ = "CommentColor"
|
|
CASE 7: CurrentColor~& = IDEBackgroundColor: colorid$ = "BackgroundColor"
|
|
CASE 8: CurrentColor~& = IDEBackgroundColor2: colorid$ = "BackgroundColor2"
|
|
CASE 9: CurrentColor~& = IDEBracketHighlightColor: colorid$ = "HighlightColor"
|
|
CASE 10: CurrentColor~& = IDEChromaColor: colorid$ = "ChromaColor"
|
|
END SELECT
|
|
WriteConfigSetting colorSettingsSection$, colorid$, rgbs$(CurrentColor~&)
|
|
NEXT i
|
|
|
|
v% = o(5).sel
|
|
IF v% <> 0 THEN v% = -1
|
|
brackethighlight = v%
|
|
|
|
IF brackethighlight THEN
|
|
WriteConfigSetting generalSettingsSection$, "BracketHighlight", "True"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "BracketHighlight", "False"
|
|
END IF
|
|
|
|
v% = o(6).sel
|
|
IF v% <> 0 THEN v% = -1
|
|
multihighlight = v%
|
|
|
|
IF multihighlight THEN
|
|
WriteConfigSetting generalSettingsSection$, "MultiHighlight", "True"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "MultiHighlight", "False"
|
|
END IF
|
|
|
|
v% = o(7).sel
|
|
IF v% <> 0 THEN v% = -1
|
|
keywordHighlight = v%
|
|
|
|
IF keywordHighlight THEN
|
|
WriteConfigSetting generalSettingsSection$, "KeywordHighlight", "True"
|
|
ELSE
|
|
WriteConfigSetting generalSettingsSection$, "KeywordHighlight", "False"
|
|
END IF
|
|
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
idechoosecolorsbox = 0
|
|
|
|
EXIT FUNCTION
|
|
NewUserScheme:
|
|
IF SchemeID > 0 AND SchemeID <= PresetColorSchemes THEN
|
|
'If one of the preset schemes is currently selected,
|
|
'create a new one. User-defined types can be freely
|
|
'edited.
|
|
SchemeID = 0
|
|
idetxt(o(9).txt) = "User-defined"
|
|
END IF
|
|
RETURN
|
|
|
|
enableHighlighter:
|
|
IF DisableSyntaxHighlighter THEN
|
|
DisableSyntaxHighlighter = 0
|
|
WriteConfigSetting generalSettingsSection$, "DisableSyntaxHighlighter", "False"
|
|
menu$(OptionsMenuID, OptionsMenuDisableSyntax) = CHR$(7) + "Syntax #Highlighter"
|
|
END IF
|
|
RETURN
|
|
END FUNCTION
|
|
|
|
|
|
FUNCTION idergbmixer$ (editing)
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
i = 0
|
|
|
|
idepar p, 70, 11, "RGB Color Mixer"
|
|
|
|
a2$ = "127"
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 63
|
|
o(i).y = 2
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
a2$ = "127"
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 63
|
|
o(i).y = 5
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
a2$ = "127"
|
|
i = i + 1
|
|
o(i).typ = 1
|
|
o(i).x = 63
|
|
o(i).y = 8
|
|
o(i).txt = idenewtxt(a2$)
|
|
o(i).v1 = LEN(a2$)
|
|
o(i).issel = -1
|
|
o(i).sx1 = 0
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 11
|
|
o(i).txt = idenewtxt("#Insert" + sep + "C#opy" + sep + "#Cancel")
|
|
o(i).dft = 1
|
|
|
|
prev.ideselect = ideselect
|
|
|
|
IF editing THEN
|
|
'Parse selection for RGB values:
|
|
a$ = ""
|
|
a2$ = ""
|
|
IF ideselect THEN
|
|
IF ideselecty1 = idecy THEN 'single line selected
|
|
a$ = idegetline(idecy)
|
|
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 EXIT FOR
|
|
NEXT
|
|
END IF
|
|
END IF
|
|
a2$ = UCASE$(LTRIM$(RTRIM$(a2$)))
|
|
|
|
IF LEN(a2$) = 0 THEN
|
|
RGB_Lookup:
|
|
'No selection found. Let's look for RGB values in the current line
|
|
All_RGB$ = ""
|
|
CurrentLine$ = idegetline(idecy)
|
|
a$ = UCASE$(CurrentLine$)
|
|
|
|
'In case there are multiple RGB values, we'll stick to the
|
|
'one closer to the cursor.
|
|
Found_RGB = 0
|
|
DO
|
|
Found_RGB = INSTR(Found_RGB + 1, a$, "RGB")
|
|
IF Found_RGB = 0 THEN EXIT DO
|
|
FindBracket1 = INSTR(Found_RGB, a$, "(")
|
|
FindBracket2 = INSTR(FindBracket1, a$, ")")
|
|
IF FindBracket1 > 0 AND FindBracket2 > 0 THEN
|
|
All_RGB$ = All_RGB$ + MKI$(Found_RGB)
|
|
END IF
|
|
LOOP
|
|
|
|
IF LEN(All_RGB$) = 0 THEN GOTO NoRGBFound
|
|
|
|
IF LEN(All_RGB$) = 2 THEN
|
|
'IF only one RGB reference was found in the current line, then this is it
|
|
a2$ = MID$(a$, CVI(All_RGB$))
|
|
InsertRGBAt = CVI(All_RGB$)
|
|
ELSE
|
|
Check_RGB = 1
|
|
DO
|
|
IF idecx >= CVI(MID$(All_RGB$, (Check_RGB + 1) * 2 - 1, 2)) THEN
|
|
Check_RGB = Check_RGB + 1
|
|
IF Check_RGB = LEN(All_RGB$) \ 2 THEN EXIT DO
|
|
ELSE
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
a2$ = MID$(a$, CVI(MID$(All_RGB$, Check_RGB * 2 - 1, 2)))
|
|
InsertRGBAt = CVI(MID$(All_RGB$, Check_RGB * 2 - 1, 2))
|
|
END IF
|
|
END IF
|
|
|
|
'Read RGB values and fill the textboxes
|
|
DIM newSyntax AS _BYTE
|
|
IF LEFT$(a2$, 4) = "RGB(" OR _
|
|
LEFT$(a2$, 6) = "RGB32(" OR _
|
|
LEFT$(a2$, 5) = "RGBA(" OR _
|
|
LEFT$(a2$, 7) = "RGBA32(" THEN
|
|
IF LEFT$(a2$, 6) = "RGB32(" THEN newSyntax = -1
|
|
IF InsertRGBAt = 0 THEN InsertRGBAt = sx1
|
|
FindComma1 = INSTR(a2$, ",")
|
|
IF FindComma1 > 0 THEN
|
|
FindComma2 = INSTR(FindComma1 + 1, a2$, ",")
|
|
IF FindComma2 > 0 THEN
|
|
r$ = "": g$ = "": b$ = ""
|
|
FOR i = FindComma1 - 1 TO 1 STEP -1
|
|
IF ASC(a2$, i) >= 48 AND ASC(a2$, i) <= 57 THEN
|
|
r$ = MID$(a2$, i, 1) + r$
|
|
ELSE
|
|
EXIT FOR
|
|
END IF
|
|
NEXT i
|
|
|
|
FOR i = FindComma1 + 1 TO FindComma2 - 1
|
|
IF ASC(a2$, i) = 32 OR (ASC(a2$, i) >= 48 AND ASC(a2$, i) <= 57) THEN
|
|
g$ = g$ + MID$(a2$, i, 1)
|
|
ELSE
|
|
EXIT FOR
|
|
END IF
|
|
NEXT i
|
|
|
|
FOR i = FindComma2 + 1 TO LEN(a2$)
|
|
IF ASC(a2$, i) = 32 OR (ASC(a2$, i) >= 48 AND ASC(a2$, i) <= 57) THEN
|
|
b$ = b$ + MID$(a2$, i, 1)
|
|
ELSE
|
|
EXIT FOR
|
|
END IF
|
|
NEXT i
|
|
|
|
r = VAL(r$): IF r < 0 THEN r = 0
|
|
IF r > 255 THEN r = 255
|
|
g = VAL(g$): IF g < 0 THEN g = 0
|
|
IF g > 255 THEN g = 255
|
|
b = VAL(b$): IF b < 0 THEN b = 0
|
|
IF b > 255 THEN b = 255
|
|
|
|
idetxt(o(1).txt) = str2$(r)
|
|
idetxt(o(2).txt) = str2$(g)
|
|
idetxt(o(3).txt) = str2$(b)
|
|
|
|
FOR i = 1 TO 3
|
|
o(i).sx1 = 0
|
|
o(i).v1 = LEN(idetxt(o(i).txt))
|
|
IF o(i).v1 > 0 THEN o(i).issel = -1
|
|
NEXT i
|
|
ELSEIF newSyntax THEN 'in case it's _RGB32(intensity, alpha)
|
|
r$ = ""
|
|
FOR i = FindComma1 - 1 TO 1 STEP -1
|
|
IF ASC(a2$, i) >= 48 AND ASC(a2$, i) <= 57 THEN
|
|
r$ = MID$(a2$, i, 1) + r$
|
|
ELSE
|
|
EXIT FOR
|
|
END IF
|
|
NEXT i
|
|
|
|
r = VAL(r$): IF r < 0 THEN r = 0
|
|
IF r > 255 THEN r = 255
|
|
g = r
|
|
b = r
|
|
|
|
idetxt(o(1).txt) = str2$(r)
|
|
idetxt(o(2).txt) = str2$(g)
|
|
idetxt(o(3).txt) = str2$(b)
|
|
|
|
FOR i = 1 TO 3
|
|
o(i).sx1 = 0
|
|
o(i).v1 = LEN(idetxt(o(i).txt))
|
|
IF o(i).v1 > 0 THEN o(i).issel = -1
|
|
NEXT i
|
|
END IF
|
|
ELSEIF newSyntax THEN
|
|
'_RGB32(intensity)?
|
|
FindComma1 = INSTR(a2$, ")")
|
|
IF FindComma1 THEN
|
|
r$ = ""
|
|
FOR i = FindComma1 - 1 TO 1 STEP -1
|
|
IF ASC(a2$, i) >= 48 AND ASC(a2$, i) <= 57 THEN
|
|
r$ = MID$(a2$, i, 1) + r$
|
|
ELSE
|
|
EXIT FOR
|
|
END IF
|
|
NEXT i
|
|
|
|
r = VAL(r$): IF r < 0 THEN r = 0
|
|
IF r > 255 THEN r = 255
|
|
g = r
|
|
b = r
|
|
|
|
idetxt(o(1).txt) = str2$(r)
|
|
idetxt(o(2).txt) = str2$(g)
|
|
idetxt(o(3).txt) = str2$(b)
|
|
|
|
FOR i = 1 TO 3
|
|
o(i).sx1 = 0
|
|
o(i).v1 = LEN(idetxt(o(i).txt))
|
|
IF o(i).v1 > 0 THEN o(i).issel = -1
|
|
NEXT i
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
'If a selection is present, it spans only one line, but
|
|
'no _RGB is selected, let's try to find some _RGB around.
|
|
IF ideselect AND ideselecty1 = idecy THEN
|
|
ideselect = 0
|
|
GOTO RGB_Lookup
|
|
END IF
|
|
END IF
|
|
END IF
|
|
NoRGBFound:
|
|
CurrentColor~& = _RGB32(VAL(idetxt(o(1).txt)), VAL(idetxt(o(2).txt)), VAL(idetxt(o(3).txt)))
|
|
_PALETTECOLOR 12, CurrentColor~&, 0
|
|
_PALETTECOLOR 5, &HFF00A800, 0 'Original green may have been changed by the Help System, so 5 is now green
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
LOCATE p.y + 2, p.x + 13: PRINT "R: ";
|
|
COLOR 4: PRINT STRING$(46, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(1).txt)): r = ((T / 255) * 46)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 15 + r, p.y + 2), slider$
|
|
|
|
COLOR 0: LOCATE p.y + 5, p.x + 13: PRINT "G: ";
|
|
COLOR 5: PRINT STRING$(46, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(2).txt)): r = ((T / 255) * 46)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 15 + r, p.y + 5), slider$
|
|
|
|
COLOR 0: LOCATE p.y + 8, p.x + 13: PRINT "B: ";
|
|
COLOR 9: PRINT STRING$(46, 196);
|
|
slider$ = CHR$(197)
|
|
T = VAL(idetxt(o(3).txt)): r = ((T / 255) * 46)
|
|
IF T = 0 THEN slider$ = CHR$(195)
|
|
IF T = 255 THEN slider$ = CHR$(180)
|
|
_PRINTSTRING (p.x + 15 + r, p.y + 8), slider$
|
|
|
|
COLOR 0: _PRINTSTRING (p.x + 19, p.y + 9), "Hold CTRL to drag all sliders at once."
|
|
|
|
COLOR 12
|
|
FOR i = 2 TO 8
|
|
_PRINTSTRING (p.x + 2, p.y + i), STRING$(10, 219)
|
|
NEXT i
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
T = o(i).typ
|
|
IF T THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF focus <> PrevFocus THEN
|
|
'Always start with RGB values selected upon getting focus
|
|
PrevFocus = focus
|
|
IF focus >= 1 AND focus <= 3 THEN
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
IF o(focus).v1 > 0 THEN o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 2 AND mX >= p.x + 15 AND mX <= p.x + 15 + 46 THEN
|
|
newValue = (mX - p.x - 15) * (255 / 46)
|
|
idetxt(o(1).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 1
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 5 AND mX >= p.x + 15 AND mX <= p.x + 15 + 46 THEN
|
|
newValue = (mX - p.x - 15) * (255 / 46)
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(1).txt) = str2$(newValue)
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 2
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
|
|
IF mB AND mY = p.y + 8 AND mX >= p.x + 15 AND mX <= p.x + 15 + 46 THEN
|
|
newValue = (mX - p.x - 15) * (255 / 46)
|
|
idetxt(o(3).txt) = str2$(newValue)
|
|
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN
|
|
idetxt(o(1).txt) = str2$(newValue)
|
|
idetxt(o(2).txt) = str2$(newValue)
|
|
END IF
|
|
focus = 3
|
|
o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
o(focus).issel = -1
|
|
o(focus).sx1 = 0
|
|
END IF
|
|
|
|
ChangedWithKeys = 0
|
|
IF K$ = CHR$(0) + CHR$(72) AND (focus = 1 OR focus = 2 OR focus = 3) THEN 'Up
|
|
idetxt(o(focus).txt) = str2$(VAL(idetxt(o(focus).txt)) + 1)
|
|
o(focus).issel = -1: o(focus).sx1 = 0: o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
ChangedWithKeys = -1
|
|
END IF
|
|
|
|
IF K$ = CHR$(0) + CHR$(80) AND (focus = 1 OR focus = 2 OR focus = 3) THEN 'Down
|
|
idetxt(o(focus).txt) = str2$(VAL(idetxt(o(focus).txt)) - 1)
|
|
o(focus).issel = -1: o(focus).sx1 = 0: o(focus).v1 = LEN(idetxt(o(focus).txt))
|
|
ChangedWithKeys = -1
|
|
END IF
|
|
|
|
'Check RGB values range (0-255)
|
|
FOR checkRGB = 1 TO 3
|
|
a$ = idetxt(o(checkRGB).txt)
|
|
IF LEN(a$) > 3 THEN a$ = LEFT$(a$, 3) '3 character limit
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF i = 2 AND ASC(a$, 1) = 48 THEN a$ = "0": EXIT FOR
|
|
IF a < 48 OR a > 57 THEN a$ = "": EXIT FOR
|
|
NEXT
|
|
IF LEN(a$) THEN
|
|
a = VAL(a$)
|
|
IF a > 255 THEN a$ = "255"
|
|
IF a < 0 THEN a$ = "0"
|
|
ELSE
|
|
IF ChangedWithKeys = -1 THEN a$ = "0"
|
|
END IF
|
|
idetxt(o(checkRGB).txt) = a$
|
|
NEXT checkRGB
|
|
|
|
CurrentColor~& = _RGB32(VAL(idetxt(o(1).txt)), VAL(idetxt(o(2).txt)), VAL(idetxt(o(3).txt)))
|
|
IF newSyntax AND (idetxt(o(1).txt) = idetxt(o(2).txt) AND idetxt(o(2).txt) = idetxt(o(3).txt)) THEN
|
|
CurrentRGB$ = idetxt(o(1).txt)
|
|
ELSE
|
|
CurrentRGB$ = idetxt(o(1).txt) + ", " + idetxt(o(2).txt) + ", " + idetxt(o(3).txt)
|
|
END IF
|
|
_PALETTECOLOR 12, CurrentColor~&, 0
|
|
|
|
IF K$ = CHR$(27) OR (focus = 6 AND info <> 0) THEN
|
|
ideselect = prev.ideselect
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (focus = 5 AND info <> 0) THEN
|
|
'Return the current RGB string
|
|
IF (idetxt(o(1).txt) = idetxt(o(2).txt) AND idetxt(o(2).txt) = idetxt(o(3).txt)) THEN
|
|
CurrentRGB$ = "_RGB32(" + idetxt(o(1).txt) + ")"
|
|
ELSE
|
|
CurrentRGB$ = "_RGB32(" + idetxt(o(1).txt) + ", " + idetxt(o(2).txt) + ", " + idetxt(o(3).txt) + ")"
|
|
END IF
|
|
|
|
_CLIPBOARD$ = CurrentRGB$
|
|
ideselect = prev.ideselect
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (focus = 4 AND info <> 0) OR _
|
|
(focus = 1 AND K$ = CHR$(13)) OR _
|
|
(focus = 2 AND K$ = CHR$(13)) OR _
|
|
(focus = 3 AND K$ = CHR$(13)) OR _
|
|
(focus = 4 AND K$ = CHR$(13)) THEN
|
|
IF CurrentLine$ = "" THEN CurrentLine$ = idegetline(idecy)
|
|
IF editing THEN
|
|
'If we're changing an existing statement, let's insert the values
|
|
IF InsertRGBAt > 0 THEN
|
|
FindBracket1 = INSTR(InsertRGBAt, CurrentLine$, "(")
|
|
FindBracket2 = INSTR(FindBracket1, CurrentLine$, ")")
|
|
OldRGB$ = MID$(CurrentLine$, FindBracket1, FindBracket2 - FindBracket1 + 1)
|
|
IF (newSyntax AND CountItems(OldRGB$, ",") = 1) OR CountItems(OldRGB$, ",") = 3 THEN 'If the current statement has the ALPHA parameter
|
|
FOR i = FindBracket2 TO FindBracket1 STEP -1
|
|
IF ASC(CurrentLine$, i) = 44 THEN FindBracket2 = i: EXIT FOR
|
|
NEXT i
|
|
END IF
|
|
NewLine$ = LEFT$(CurrentLine$, FindBracket1)
|
|
IF FindBracket2 = 0 THEN FindBracket2 = FindBracket1
|
|
NewLine$ = NewLine$ + CurrentRGB$
|
|
NewLine$ = NewLine$ + MID$(CurrentLine$, FindBracket2)
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
idesetline idecy, NewLine$
|
|
|
|
'Select the inserted bit
|
|
ideselectx1 = FindBracket1 + 1
|
|
idecx = ideselectx1 + LEN(CurrentRGB$)
|
|
ideselecty1 = idecy
|
|
prev.ideselect = 1
|
|
CurrentRGB$ = "" 'return nothing since we've already inserted it above
|
|
END IF
|
|
END IF
|
|
|
|
IF LEN(CurrentRGB$) THEN
|
|
'Return the current RGB string
|
|
IF (idetxt(o(1).txt) = idetxt(o(2).txt) AND idetxt(o(2).txt) = idetxt(o(3).txt)) THEN
|
|
CurrentRGB$ = "_RGB32(" + idetxt(o(1).txt) + ")"
|
|
ELSE
|
|
CurrentRGB$ = "_RGB32(" + idetxt(o(1).txt) + ", " + idetxt(o(2).txt) + ", " + idetxt(o(3).txt) + ")"
|
|
END IF
|
|
END IF
|
|
|
|
idergbmixer$ = CurrentRGB$
|
|
ideselect = prev.ideselect
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
FUNCTION CountItems (SearchString$, Item$)
|
|
DO
|
|
Found = INSTR(Found + 1, SearchString$, Item$)
|
|
IF Found = 0 THEN EXIT DO
|
|
Total = Total + 1
|
|
LOOP
|
|
CountItems = Total
|
|
END FUNCTION
|
|
|
|
|
|
SUB iderestrict417 (p417)
|
|
x = 0
|
|
IF p417 AND 4 THEN x = x + 1
|
|
IF p417 AND 8 THEN x = x + 1
|
|
IF x > 1 THEN p417 = p417 AND 243
|
|
END SUB
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION CTRL2
|
|
IF MacOSX THEN
|
|
IF _KEYDOWN(100309) THEN CTRL2 = 1
|
|
IF _KEYDOWN(100310) THEN CTRL2 = 1
|
|
END IF
|
|
END FUNCTION
|
|
|
|
|
|
|
|
SUB GetInput
|
|
STATIC ASCvalue$
|
|
|
|
IF iCHECKLATER THEN iCHECKLATER = 0: EXIT SUB
|
|
'Clear/Update immediate return values
|
|
iCHANGED = 0
|
|
KSTATECHANGED = 0
|
|
mCLICK = 0: mCLICK2 = 0: mRELEASE = 0: mRELEASE2 = 0
|
|
mWHEEL = 0
|
|
K$ = "": KB = 0
|
|
mOB = mB: mOB2 = mB2
|
|
KOALT = KALT: KALTPRESS = 0: KALTRELEASE = 0
|
|
'Flush INKEY$ buffer (for good measure)
|
|
DO: LOOP UNTIL INKEY$ = ""
|
|
'Keyboard event?
|
|
k = _KEYHIT
|
|
|
|
'Steve Edit on 07-04-2014 to add extended ASCII creation with ALT-plus numkeys
|
|
IF (_KEYDOWN(100307) OR _KEYDOWN(100308)) AND (k >= -57 AND k <= -48) THEN
|
|
ASCvalue$ = ASCvalue$ + CHR$(-k)
|
|
END IF
|
|
IF NOT _KEYDOWN(100307) AND NOT _KEYDOWN(100308) THEN
|
|
IF LEN(ASCvalue$) THEN
|
|
KB = VAL(RIGHT$(ASCvalue$, 3))
|
|
IF KB > 0 AND KB < 256 THEN
|
|
K$ = CHR$(KB)
|
|
k = KB
|
|
iCHANGED = -1
|
|
AltSpecial = -1
|
|
END IF
|
|
ASCvalue$ = ""
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
'End of Edit
|
|
|
|
IF k THEN
|
|
IF k < 0 THEN k = -k: release = 1
|
|
'modifiers
|
|
IF k = KEY_LSHIFT OR k = KEY_RSHIFT THEN
|
|
IF release = 1 THEN KSHIFT = 0 ELSE KSHIFT = -1
|
|
iCHANGED = -1: KSTATECHANGED = -1
|
|
END IF
|
|
IF k = KEY_LALT OR k = KEY_RALT THEN
|
|
IF release = 1 THEN
|
|
KALT = 0: KALTRELEASE = -1
|
|
ELSE
|
|
KALT = -1: KALTPRESS = -1
|
|
END IF
|
|
iCHANGED = -1: KSTATECHANGED = -1
|
|
END IF
|
|
IF k = KEY_LCTRL OR k = KEY_RCTRL THEN
|
|
IF release = 1 THEN KCTRL = 0: KCONTROL = 0 ELSE KCTRL = -1: KCONTROL = -1
|
|
iCHANGED = -1: KSTATECHANGED = -1
|
|
END IF
|
|
IF k = KEY_LAPPLE OR k = KEY_RAPPLE THEN
|
|
IF release = 1 THEN KCONTROL = 0 ELSE KCONTROL = -1
|
|
iCHANGED = -1: KSTATECHANGED = -1
|
|
END IF
|
|
'presses
|
|
IF release = 0 THEN
|
|
iCHANGED = -1
|
|
IF k <= 255 THEN K$ = CHR$(k)
|
|
IF k >= 256 AND k <= 65535 AND ((k AND 255) = 0) THEN K$ = CHR$(0) + CHR$(k \ 256)
|
|
KB = k
|
|
END IF
|
|
IF iCHANGED THEN EXIT SUB
|
|
END IF
|
|
DO WHILE _MOUSEINPUT
|
|
iCHANGED = 1
|
|
IF MouseButtonSwapped THEN
|
|
mB = _MOUSEBUTTON(2): mB2 = _MOUSEBUTTON(1)
|
|
ELSE
|
|
mB = _MOUSEBUTTON(1): mB2 = _MOUSEBUTTON(2)
|
|
END IF
|
|
mWHEEL = mWHEEL + _MOUSEWHEEL
|
|
mX = _MOUSEX: mY = _MOUSEY
|
|
IF mB <> 0 AND mOB = 0 THEN mCLICK = -1: EXIT SUB
|
|
IF mB2 <> 0 AND mOB2 = 0 THEN mCLICK2 = -1: EXIT SUB
|
|
IF mB = 0 AND mOB <> 0 THEN mRELEASE = -1: EXIT SUB
|
|
IF mB2 = 0 AND mOB2 <> 0 THEN mRELEASE2 = -1: EXIT SUB
|
|
LOOP
|
|
END SUB
|
|
|
|
SUB ClearMouse
|
|
iCHANGED = 0
|
|
mB = 0
|
|
mB2 = 0
|
|
mCLICK = 0
|
|
mRELEASE = 0
|
|
DO WHILE _MOUSEBUTTON(1) OR _MOUSEBUTTON(2)
|
|
i = _MOUSEINPUT
|
|
LOOP
|
|
END SUB
|
|
|
|
|
|
SUB Help_ShowText
|
|
|
|
STATIC setup
|
|
IF setup = 0 AND UBOUND(back$) = 1 THEN
|
|
setup = 1
|
|
IF IdeContextHelpSF = 0 THEN
|
|
a$ = Wiki$(Back$(1))
|
|
WikiParse a$
|
|
END IF
|
|
END IF
|
|
|
|
REDIM Help_LineLen(Help_wh)
|
|
|
|
COLOR 7, 0
|
|
|
|
'CLS
|
|
'FOR y = Help_wy1 - 1 TO Help_wy2 + 1
|
|
' FOR x = Help_wx1 - 1 TO Help_wx2 + 1
|
|
' LOCATE y, x: PRINT chr$(219);
|
|
' NEXT
|
|
'NEXT
|
|
|
|
sy = Help_wy1
|
|
FOR y = Help_sy TO Help_sy + Help_wh - 1
|
|
IF y <= help_h THEN
|
|
'PRINT CVL(MID$(Help_Line$, (y - 1) * 4 + 1, 4)), LEN(Help_Txt$)
|
|
l = CVL(MID$(Help_Line$, (y - 1) * 4 + 1, 4))
|
|
x = l
|
|
x3 = 1
|
|
|
|
sx = Help_wx1
|
|
c = ASC(Help_Txt$, x): col = ASC(Help_Txt$, x + 1)
|
|
LOCATE sy, sx
|
|
DO UNTIL c = 13
|
|
COLOR col AND 15, col \ 16
|
|
IF IdeSystem = 3 AND Help_Select = 2 THEN
|
|
IF y >= Help_SelY1 AND y <= Help_SelY2 THEN
|
|
IF x3 >= Help_SelX1 AND x3 <= Help_SelX2 THEN
|
|
COLOR 0, 7
|
|
END IF
|
|
END IF
|
|
END IF
|
|
IF x3 >= Help_sx THEN
|
|
IF sx <= Help_wx2 THEN
|
|
PRINT CHR$(c);
|
|
sx = sx + 1
|
|
END IF
|
|
END IF
|
|
x3 = x3 + 1: x = x + 4: c = ASC(Help_Txt$, x): col = ASC(Help_Txt$, x + 1)
|
|
LOOP
|
|
|
|
Help_LineLen(y - Help_sy) = x3 - 1
|
|
|
|
FOR x4 = 1 TO Help_wx2 - POS(0) + 1
|
|
IF col = 0 THEN col = 7
|
|
COLOR col AND 15, col \ 16
|
|
IF IdeSystem = 3 AND Help_Select = 2 THEN
|
|
IF y >= Help_SelY1 AND y <= Help_SelY2 THEN
|
|
IF x3 >= Help_SelX1 AND x3 <= Help_SelX2 THEN
|
|
COLOR 0, 7
|
|
END IF
|
|
END IF
|
|
END IF
|
|
PRINT " ";
|
|
x3 = x3 + 1
|
|
NEXT
|
|
|
|
ELSE
|
|
|
|
sx = Help_wx1
|
|
LOCATE sy, sx
|
|
x3 = Help_sx
|
|
FOR x4 = 1 TO Help_ww
|
|
COLOR 7, 0
|
|
IF IdeSystem = 3 AND Help_Select = 2 THEN
|
|
IF y >= Help_SelY1 AND y <= Help_SelY2 THEN
|
|
IF x3 >= Help_SelX1 AND x3 <= Help_SelX2 THEN
|
|
COLOR 0, 7
|
|
END IF
|
|
END IF
|
|
END IF
|
|
PRINT " ";
|
|
x3 = x3 + 1
|
|
NEXT
|
|
Help_LineLen(y - Help_sy) = 0
|
|
|
|
END IF
|
|
sy = sy + 1
|
|
NEXT
|
|
|
|
'LOCATE Help_cy - Help_sy + Help_wy1, Help_cx - Help_sx + Help_wx1
|
|
'COLOR 15, 4
|
|
'PRINT CHR$(SCREEN(CSRLIN, POS(0)));
|
|
|
|
'c = 0
|
|
'DO
|
|
' old_kcontrol = KCONTROL
|
|
' GetInput
|
|
' IF KB > 0 THEN c = 1
|
|
' IF mCLICK THEN c = 1
|
|
' IF mWHEEL THEN c = 1
|
|
' IF KCONTROL AND old_kcontrol = 0 THEN c = 0
|
|
' IF mB THEN c = 1
|
|
'LOOP UNTIL c
|
|
|
|
END SUB
|
|
|
|
|
|
|
|
FUNCTION idesearchedbox$
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ln = 0
|
|
l$ = ""
|
|
REDIM SearchHistory(0) AS STRING
|
|
RetrieveSearchHistory SearchHistory()
|
|
FOR i = 1 to UBOUND(SearchHistory)
|
|
l$ = SearchHistory(i) + sep + l$
|
|
NEXT
|
|
'72,19
|
|
|
|
h = idewy + idesubwindow - 9
|
|
IF ln < h THEN h = ln
|
|
IF h < 3 THEN h = 3
|
|
|
|
i = 0
|
|
idepar p, 20, h, ""
|
|
p.x = idewx - 24
|
|
p.y = idewy - 6 - h
|
|
IF p.y < 3 THEN
|
|
p.h = p.h - abs(3 - p.y)
|
|
h = p.h
|
|
p.y = 3
|
|
END IF
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).x = -1: o(i).y = 0
|
|
|
|
o(i).w = 22: o(i).h = h
|
|
o(i).txt = idenewtxt(l$)
|
|
o(i).sel = 1
|
|
o(i).nam = idenewtxt("Find")
|
|
|
|
'i = i + 1
|
|
'o(i).typ = 3
|
|
'o(i).y = idewy - 6
|
|
'o(i).txt = idenewtxt("#OK" + sep + "#Cancel")
|
|
'o(i).dft = 1
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'quick exit
|
|
IF mCLICK THEN
|
|
IF mX < p.x - 1 OR mY < p.y OR mX > p.x + p.w + 2 OR mY > p.y + p.h + 1 THEN
|
|
idesearchedbox$ = ""
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(27) THEN
|
|
idesearchedbox$ = ""
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF mCLICK THEN
|
|
IF mX > p.x - 1 AND mY > p.y AND mX < p.x + p.w + 2 AND mY < p.y + p.h + 1 THEN
|
|
f$ = idetxt(o(1).stx)
|
|
idesearchedbox$ = f$
|
|
EXIT FUNCTION
|
|
END IF
|
|
END IF
|
|
|
|
IF K$ = CHR$(13) OR (info = 1 AND focus = 1) THEN
|
|
f$ = idetxt(o(1).stx)
|
|
idesearchedbox$ = f$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
|
|
|
|
END FUNCTION
|
|
|
|
|
|
SUB IdeImportBookmarks (f2$)
|
|
IdeBmkN = 0
|
|
f$ = CRLF + f2$ + CRLF
|
|
fh = FREEFILE: OPEN ".\internal\temp\bookmarks.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$: CLOSE #fh
|
|
x = INSTR(UCASE$(a$), UCASE$(f$))
|
|
IF x THEN 'retrieve bookmark data
|
|
l = CVL(MID$(a$, x + LEN(f$), 4))
|
|
x1 = x + LEN(f$) + 4
|
|
d$ = MID$(a$, x1, l)
|
|
n = l \ 16
|
|
FOR i = 1 TO n
|
|
by = CVL(MID$(d$, (i - 1) * 16 + 1, 4))
|
|
bx = CVL(MID$(d$, (i - 1) * 16 + 1 + 4, 4))
|
|
IF by <= iden THEN
|
|
IdeBmkN = IdeBmkN + 1
|
|
IF IdeBmkN > UBOUND(IdeBmk) THEN x = UBOUND(IdeBmk) * 2: REDIM _PRESERVE IdeBmk(x) AS IdeBmkType
|
|
IdeBmk(IdeBmkN).y = by
|
|
IdeBmk(IdeBmkN).x = bx
|
|
IdeBmk(IdeBmkN).reserved = 0: IdeBmk(IdeBmkN).reserved2 = 0
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
'at the same time, import breakpoint and skip line data
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", f2$, "total breakpoints"))
|
|
IF x THEN
|
|
FOR i = 1 TO x
|
|
j = VAL(ReadSetting$(".\internal\temp\debug.ini", f2$, "breakpoint" + STR$(i)))
|
|
IF j > UBOUND(IdeBreakpoints) THEN EXIT FOR
|
|
IdeBreakpoints(j) = -1
|
|
NEXT
|
|
END IF
|
|
|
|
x = VAL(ReadSetting$(".\internal\temp\debug.ini", f2$, "total skips"))
|
|
IF x THEN
|
|
FOR i = 1 TO x
|
|
j = VAL(ReadSetting$(".\internal\temp\debug.ini", f2$, "skip" + STR$(i)))
|
|
IF j > UBOUND(IdeSkipLines) THEN EXIT FOR
|
|
IdeSkipLines(j) = -1
|
|
NEXT
|
|
END IF
|
|
END SUB
|
|
|
|
SUB IdeSaveBookmarks (f2$)
|
|
f$ = CRLF + f2$ + CRLF
|
|
fh = FREEFILE: OPEN ".\internal\temp\bookmarks.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$: CLOSE #fh
|
|
x = INSTR(UCASE$(a$), UCASE$(f$))
|
|
IF x THEN 'remove any old bookmark data
|
|
l = CVL(MID$(a$, x + LEN(f$), 4))
|
|
x2 = x + LEN(f$) + 4 + l - 1
|
|
a$ = LEFT$(a$, x - 1) + RIGHT$(a$, LEN(a$) - x2)
|
|
END IF
|
|
'add new bookmark data
|
|
'build bookmark data
|
|
d$ = ""
|
|
FOR i = 1 TO IdeBmkN
|
|
d$ = d$ + MKL$(IdeBmk(i).y) + MKL$(IdeBmk(i).x) + MKL$(IdeBmk(i).reserved) + MKL$(IdeBmk(i).reserved2)
|
|
NEXT
|
|
a$ = f$ + MKL$(LEN(d$)) + d$ + a$
|
|
fh = FREEFILE: OPEN ".\internal\temp\bookmarks.bin" FOR OUTPUT AS #fh: CLOSE #fh
|
|
fh = FREEFILE: OPEN ".\internal\temp\bookmarks.bin" FOR BINARY AS #fh: PUT #fh, , a$: CLOSE #fh
|
|
|
|
'at the same time, save breakpoint and skip line data
|
|
IF vWatchOn THEN
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "total breakpoints", "0"
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "total skips", "0"
|
|
|
|
x = 0
|
|
FOR i = 1 TO UBOUND(IdeBreakpoints)
|
|
IF IdeBreakpoints(i) THEN
|
|
x = x + 1
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "breakpoint" + STR$(x), str2$(i)
|
|
END IF
|
|
NEXT
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "total breakpoints", str2$(x)
|
|
|
|
x = 0
|
|
FOR i = 1 TO UBOUND(IdeSkipLines)
|
|
IF IdeSkipLines(i) THEN
|
|
x = x + 1
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "skip" + STR$(x), str2$(i)
|
|
END IF
|
|
NEXT
|
|
WriteSetting ".\internal\temp\debug.ini", f2$, "total skips", str2$(x)
|
|
END IF
|
|
END SUB
|
|
|
|
FUNCTION iderecentbox$
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
l$ = ""
|
|
dialogWidth = 72
|
|
totalRecent = 0
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
|
|
a$ = RIGHT$(a$, LEN(a$) - 2)
|
|
REDIM tempList$(100)
|
|
DO WHILE LEN(a$)
|
|
ai = INSTR(a$, CRLF)
|
|
IF ai THEN
|
|
f$ = LEFT$(a$, ai - 1): IF ai = LEN(a$) - 1 THEN a$ = "" ELSE a$ = RIGHT$(a$, LEN(a$) - ai - 3)
|
|
IF LEN(f$) + 6 > dialogWidth THEN dialogWidth = LEN(f$) + 6
|
|
totalRecent = totalRecent + 1
|
|
IF totalRecent > UBOUND(tempList$) THEN
|
|
REDIM _PRESERVE tempList$(UBOUND(tempList$) + 100)
|
|
END IF
|
|
tempList$(totalRecent) = f$
|
|
IF LEN(l$) THEN l$ = l$ + sep + f$ ELSE l$ = f$
|
|
END IF
|
|
LOOP
|
|
CLOSE #fh
|
|
|
|
'72,19
|
|
i = 0
|
|
dialogHeight = (totalRecent) + 3
|
|
IF dialogHeight > idewy + idesubwindow - 6 THEN
|
|
dialogHeight = idewy + idesubwindow - 6
|
|
END IF
|
|
|
|
IF dialogWidth > idewx - 8 THEN dialogWidth = idewx - 8
|
|
idepar p, dialogWidth, dialogHeight, "Open"
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 1
|
|
'68
|
|
o(i).w = dialogWidth - 4: o(i).h = dialogHeight - 3
|
|
o(i).txt = idenewtxt(l$)
|
|
o(i).sel = 1
|
|
o(i).nam = idenewtxt("Recent Programs")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = dialogHeight
|
|
o(i).txt = idenewtxt("#Open" + sep + "#Cancel" + sep + "Clear #list" + sep + "#Remove broken links")
|
|
o(i).dft = 1
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(27) OR (focus = 3 AND info <> 0) THEN
|
|
iderecentbox$ = ""
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 1) OR (focus = 2 AND info <> 0) OR (info = 1 AND focus = 1) THEN
|
|
f$ = tempList$(ABS(o(1).sel))
|
|
iderecentbox$ = f$
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 4) OR (focus = 4 AND info <> 0) OR (info = 1 AND focus = 4) THEN
|
|
iderecentbox$ = "<C>"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 5) OR (focus = 5 AND info <> 0) OR (info = 1 AND focus = 5) THEN
|
|
iderecentbox$ = "<R>"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
|
|
|
|
END FUNCTION
|
|
|
|
|
|
|
|
SUB IdeMakeFileMenu
|
|
m = 1: i = 0
|
|
menu$(m, i) = "File": i = i + 1
|
|
menu$(m, i) = "#New Ctrl+N": i = i + 1
|
|
menuDesc$(m, i - 1) = "Closes current program and starts a blank one"
|
|
menu$(m, i) = "#Open... Ctrl+O": i = i + 1
|
|
menuDesc$(m, i - 1) = "Loads a program into memory"
|
|
menu$(m, i) = "#Save Ctrl+S": i = i + 1
|
|
menuDesc$(m, i - 1) = "Writes current program to a file on disk"
|
|
menu$(m, i) = "Save #As...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Saves current program with specified name"
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
|
|
a$ = RIGHT$(a$, LEN(a$) - 2)
|
|
maxRecentInFileMenu = UBOUND(IdeRecentLink, 1)
|
|
maxLengthRecentFiles = 35
|
|
FOR r = 1 TO maxRecentInFileMenu + 1
|
|
IF r <= maxRecentInFileMenu THEN IdeRecentLink(r, 1) = ""
|
|
ai = INSTR(a$, CRLF)
|
|
IF ai THEN
|
|
IF r = 1 THEN menu$(m, i) = "-": i = i + 1
|
|
f$ = LEFT$(a$, ai - 1): IF ai = LEN(a$) - 1 THEN a$ = "" ELSE a$ = RIGHT$(a$, LEN(a$) - ai - 3)
|
|
IF r <= maxRecentInFileMenu THEN IdeRecentLink(r, 2) = f$
|
|
'f$ = MID$(f$, _INSTRREV(f$, pathsep$) + 1)
|
|
IF LEN(f$) > maxLengthRecentFiles THEN f$ = STRING$(3, 250) + RIGHT$(f$, maxLengthRecentFiles - 3)
|
|
f$ = "#" + str2$(r) + " " + f$
|
|
IF r = maxRecentInFileMenu + 1 THEN f$ = "#Recent..."
|
|
menu$(m, i) = f$
|
|
IF r <= maxRecentInFileMenu THEN
|
|
IdeRecentLink(r, 1) = f$
|
|
f$ = "Open '" + IdeRecentLink(r, 2) + "'"
|
|
ai = 3
|
|
DO UNTIL LEN(f$) <= idewx - 2
|
|
ai = ai + 1
|
|
f$ = "Open '" + STRING$(3, 250) + MID$(IdeRecentLink(r, 2), ai) + "'"
|
|
LOOP
|
|
menuDesc$(m, i) = f$
|
|
END IF
|
|
i = i + 1
|
|
END IF
|
|
NEXT
|
|
CLOSE #fh
|
|
IF menu$(m, i - 1) <> "#Recent..." AND menu$(m, i - 1) <> "Save #As..." THEN
|
|
menu$(m, i) = "#Clear Recent...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Clears list of recently loaded files"
|
|
ELSE
|
|
menuDesc$(m, i - 1) = "Displays a complete list of recently loaded files"
|
|
END IF
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "E#xit": i = i + 1
|
|
menuDesc$(m, i - 1) = "Exits QB64-PE"
|
|
menusize(m) = i - 1
|
|
END SUB
|
|
|
|
SUB IdeMakeContextualMenu
|
|
REDIM SubFuncLIST(0) AS STRING
|
|
DIM Selection$
|
|
|
|
m = idecontextualmenuID: i = 0
|
|
menu$(m, i) = "Contextual": i = i + 1
|
|
|
|
IF IdeDebugMode = 2 THEN
|
|
menu$(m, i) = "#Continue F5": i = i + 1
|
|
menuDesc$(m, i - 1) = "Runs until the end of the current procedure is reached"
|
|
menu$(m, i) = "Step O#ut F6": i = i + 1
|
|
menuDesc$(m, i - 1) = "Runs until the end of the current procedure is reached"
|
|
menu$(m, i) = "Ste#p Into F7": i = i + 1
|
|
menuDesc$(m, i - 1) = "Runs the next line of code and pauses execution"
|
|
menu$(m, i) = "Step #Over F8": i = i + 1
|
|
menuDesc$(m, i - 1) = "Runs the next line of code without entering subs/functions"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Set #Next Line Ctrl+G": i = i + 1
|
|
menuDesc$(m, i - 1) = "Jumps to the selected line before continuing execution"
|
|
menu$(m, i) = "#Run To This Line Ctrl+Shift+G": i = i + 1
|
|
menuDesc$(m, i - 1) = "Runs until the selected line is reached"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Toggle #Breakpoint F9": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets/clears breakpoint at cursor location"
|
|
menu$(m, i) = "Clear All Breakpoints F10": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes all breakpoints"
|
|
menu$(m, i) = "Toggle #Skip Line Ctrl+P": i = i + 1
|
|
menuDesc$(m, i - 1) = "Sets/clears flag to skip line"
|
|
menu$(m, i) = "#Unskip All Lines Ctrl+F10": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes all line skip flags"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "SUBs... F2": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays a list of SUB/FUNCTION procedures"
|
|
menu$(m, i) = "#Watch List... F4": i = i + 1
|
|
menuDesc$(m, i - 1) = "Adds variables to watch list"
|
|
menu$(m, i) = "Call Stack... F12": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays the call stack of the current program's execution"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Exit $DEBUG mode ESC": i = i + 1
|
|
menuDesc$(m, i - 1) = "Disconnects from the running program and returns control to the IDE"
|
|
ELSE
|
|
IF IdeSystem = 1 OR IdeSystem = 2 THEN
|
|
'Figure out if the user wants to search for a selected term
|
|
Selection$ = getSelectedText$(0)
|
|
sela2$ = Selection$
|
|
IF LEN(Selection$) > 0 THEN
|
|
idecontextualSearch$ = Selection$
|
|
IF LEN(sela2$) > 22 THEN
|
|
sela2$ = LEFT$(sela2$, 19) + STRING$(3, 250)
|
|
END IF
|
|
menu$(m, i) = "Find '" + sela2$ + "'": i = i + 1
|
|
menuDesc$(m, i - 1) = "Searches for the text currently selected"
|
|
END IF
|
|
|
|
'build SUB/FUNCTION list:
|
|
TotalSF = 0
|
|
FOR y = 1 TO iden
|
|
a$ = idegetline(y)
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
sf = 0
|
|
nca$ = UCASE$(a$)
|
|
IF LEFT$(nca$, 4) = "SUB " THEN sf = 1: sf$ = "SUB "
|
|
IF LEFT$(nca$, 9) = "FUNCTION " THEN sf = 2: sf$ = "FUNC "
|
|
IF sf THEN
|
|
IF RIGHT$(nca$, 7) = " STATIC" THEN
|
|
a$ = RTRIM$(LEFT$(a$, LEN(a$) - 7))
|
|
END IF
|
|
|
|
IF sf = 1 THEN
|
|
a$ = RIGHT$(a$, LEN(a$) - 4)
|
|
ELSE
|
|
a$ = RIGHT$(a$, LEN(a$) - 9)
|
|
END IF
|
|
|
|
a$ = LTRIM$(RTRIM$(a$))
|
|
x = INSTR(a$, "(")
|
|
IF x THEN
|
|
n$ = RTRIM$(LEFT$(a$, x - 1))
|
|
ELSE
|
|
n$ = a$
|
|
cleanSubName n$
|
|
END IF
|
|
|
|
n2$ = n$
|
|
IF LEN(n2$) > 1 THEN
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(n2$, 1)))
|
|
n2$ = LEFT$(n$, LEN(n2$) - 1) 'removes sigil, if any
|
|
LOOP
|
|
END IF
|
|
|
|
'Populate SubFuncLIST()
|
|
TotalSF = TotalSF + 1
|
|
REDIM _PRESERVE SubFuncLIST(1 TO TotalSF) AS STRING
|
|
SubFuncLIST(TotalSF) = MKL$(y) + CHR$(sf) + n2$
|
|
END IF
|
|
NEXT
|
|
|
|
'identify if word or character at current cursor position is in the help system OR a sub/func
|
|
a2$ = UCASE$(getWordAtCursor$)
|
|
|
|
'check if cursor is on sub/func/label name
|
|
IF LEN(LTRIM$(RTRIM$(Selection$))) > 0 THEN
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(Selection$, 1)))
|
|
Selection$ = LEFT$(Selection$, LEN(Selection$) - 1) 'removes sigil, if any
|
|
IF LEN(Selection$) = 0 THEN EXIT DO
|
|
LOOP
|
|
Selection$ = LTRIM$(RTRIM$(Selection$))
|
|
END IF
|
|
|
|
IF RIGHT$(a2$, 1) = "$" THEN a3$ = LEFT$(a2$, LEN(a2$) - 1) ELSE a3$ = a2$ 'creates a new version without $
|
|
|
|
IF LEN(a3$) > 0 OR LEN(Selection$) > 0 THEN
|
|
|
|
FOR CheckSF = 1 TO TotalSF
|
|
IF a3$ = UCASE$(MID$(SubFuncLIST(CheckSF), 6)) OR UCASE$(Selection$) = UCASE$(MID$(SubFuncLIST(CheckSF), 6)) THEN
|
|
CurrSF$ = FindCurrentSF$(idecy)
|
|
IF LEN(CurrSF$) = 0 THEN GOTO SkipCheckCurrSF
|
|
|
|
DO UNTIL alphanumeric(ASC(RIGHT$(CurrSF$, 1)))
|
|
CurrSF$ = LEFT$(CurrSF$, LEN(CurrSF$) - 1) 'removes sigil, if any
|
|
IF LEN(CurrSF$) = 0 THEN EXIT DO
|
|
LOOP
|
|
CurrSF$ = UCASE$(CurrSF$)
|
|
|
|
SkipCheckCurrSF:
|
|
IF ASC(SubFuncLIST(CheckSF), 5) = 1 THEN
|
|
CursorSF$ = "SUB "
|
|
ELSE
|
|
CursorSF$ = "FUNCTION "
|
|
END IF
|
|
CursorSF$ = CursorSF$ + MID$(SubFuncLIST(CheckSF), 6)
|
|
|
|
IF UCASE$(CursorSF$) = CurrSF$ THEN
|
|
EXIT FOR
|
|
ELSE
|
|
menu$(m, i) = "#Go To " + CursorSF$: i = i + 1
|
|
menuDesc$(m, i - 1) = "Jumps to procedure definition"
|
|
SubFuncLIST(1) = SubFuncLIST(CheckSF)
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT CheckSF
|
|
|
|
v = 0
|
|
CurrSF$ = FindCurrentSF$(idecy)
|
|
IF validname(a2$) THEN v = HashFind(a2$, HASHFLAG_LABEL, ignore, r)
|
|
CheckThisLabel:
|
|
IF v THEN
|
|
LabelLineNumber = Labels(r).SourceLineNumber
|
|
ThisLabelScope$ = FindCurrentSF$(LabelLineNumber)
|
|
IF ThisLabelScope$ <> CurrSF$ AND v = 2 THEN
|
|
v = HashFindCont(ignore, r)
|
|
GOTO CheckThisLabel
|
|
END IF
|
|
IF LabelLineNumber > 0 AND LabelLineNumber <> idecy THEN
|
|
menu$(m, i) = "Go To #Label " + RTRIM$(Labels(r).cn): i = i + 1
|
|
menuDesc$(m, i - 1) = "Jumps to label"
|
|
REDIM _PRESERVE SubFuncLIST(1 TO UBOUND(SubFuncLIST) + 1) AS STRING
|
|
SubFuncLIST(UBOUND(SubFuncLIST)) = MKL$(Labels(r).SourceLineNumber)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF LEN(a2$) > 0 THEN
|
|
'check if a2$ is in help links
|
|
lnks = 0
|
|
l2$ = findHelpTopic$(a2$, lnks, -1)
|
|
|
|
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
|
|
menuDesc$(m, i - 1) = "Opens help article on the selected term"
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
IF i > 1 THEN
|
|
menu$(m, i) = "-": i = i + 1
|
|
END IF
|
|
|
|
'--------- Check if _RGB mixer should be offered: -----------------------------------------
|
|
a$ = idegetline(idecy)
|
|
IF ideselect THEN
|
|
IF ideselecty1 <> idecy THEN GOTO NoRGBFound 'multi line selected
|
|
END IF
|
|
|
|
Found_RGB = 0
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGB(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGB32(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGBA(")
|
|
Found_RGB = Found_RGB + INSTR(UCASE$(a$), "RGBA32(")
|
|
IF Found_RGB THEN
|
|
menu$(m, i) = "#RGB Color Mixer...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Allows mixing colors to edit/insert _RGB statements"
|
|
menu$(m, i) = "-": i = i + 1
|
|
END IF
|
|
NoRGBFound:
|
|
'--------- _RGB mixer check done. --------------------------------------------
|
|
|
|
IF (ideselect <> 0) THEN
|
|
menu$(m, i) = "Cu#t Shift+Del or Ctrl+X": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text and copies it to clipboard"
|
|
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
|
|
menuDesc$(m, i - 1) = "Copies selected text to clipboard"
|
|
END IF
|
|
|
|
clip$ = _CLIPBOARD$ 'read clipboard
|
|
IF LEN(clip$) THEN
|
|
menu$(m, i) = "#Paste Shift+Ins or Ctrl+V": i = i + 1
|
|
menuDesc$(m, i - 1) = "Inserts clipboard contents at current location"
|
|
END IF
|
|
|
|
IF ideselect THEN
|
|
menu$(m, i) = "Cl#ear Del": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text"
|
|
END IF
|
|
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
|
|
menuDesc$(m, i - 1) = "Selects all contents of current program"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "To#ggle Comment Ctrl+T": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles comment (') on the current selection"
|
|
menu$(m, i) = "Add Co#mment (') Ctrl+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Adds comment marker (') to the current selection"
|
|
menu$(m, i) = "Remove Comme#nt (') Ctrl+Shift+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes comment marker (') from the current selection"
|
|
IF ideselect THEN
|
|
y1 = idecy
|
|
y2 = ideselecty1
|
|
IF y1 = y2 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
|
|
menu$(m, i) = "#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
menu$(m, i) = "-": i = i + 1
|
|
END IF
|
|
ELSE
|
|
menu$(m, i) = "#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
menu$(m, i) = "-": i = i + 1
|
|
END IF
|
|
ELSE
|
|
menu$(m, i) = "-": i = i + 1
|
|
END IF
|
|
menu$(m, i) = "New #SUB...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new subprocedure at the end of the current program"
|
|
menu$(m, i) = "New #FUNCTION...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new function at the end of the current program"
|
|
ELSEIF IdeSystem = 3 THEN
|
|
IF (Help_Select = 2) THEN
|
|
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
|
|
menuDesc$(m, i - 1) = "Copies selected text to clipboard"
|
|
END IF
|
|
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
|
|
menuDesc$(m, i - 1) = "Selects all contents of current article"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Contents Page": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays help contents page"
|
|
menu$(m, i) = "Keyword #Index": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays keyword index page"
|
|
menu$(m, i) = "#Keywords by Usage": i = i + 1
|
|
menuDesc$(m, i - 1) = "Displays keywords index by usage"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "#Update Current Page": i = i + 1
|
|
menuDesc$(m, i - 1) = "Downloads the latest version of this article from the wiki"
|
|
menu$(m, i) = "Update All #Pages...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Downloads the latest version of all articles from the wiki"
|
|
menu$(m, i) = "View Current Page On #Wiki": i = i + 1
|
|
menuDesc$(m, i - 1) = "Launches the default browser and navigates to the current article on the wiki"
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "Clo#se Help ESC": i = i + 1
|
|
menuDesc$(m, i - 1) = "Closes help window"
|
|
END IF
|
|
END IF
|
|
menusize(m) = i - 1
|
|
END SUB
|
|
|
|
SUB IdeMakeEditMenu
|
|
m = ideeditmenuID: i = 0
|
|
menu$(m, i) = "Edit": i = i + 1
|
|
|
|
IF IdeSystem = 1 THEN
|
|
menu$(m, i) = "#Undo Ctrl+Z": i = i + 1
|
|
menuDesc$(m, i - 1) = "Restores program state before last edit"
|
|
menu$(m, i) = "#Redo Ctrl+Y": i = i + 1
|
|
menuDesc$(m, i - 1) = "Redoes latest undo action"
|
|
ELSE
|
|
menu$(m, i) = "~#Undo Ctrl+Z": i = i + 1
|
|
menuDesc$(m, i - 1) = "Restores program state before last edit"
|
|
menu$(m, i) = "~#Redo Ctrl+Y": i = i + 1
|
|
menuDesc$(m, i - 1) = "Redoes latest undo action"
|
|
END IF
|
|
menu$(m, i) = "-": i = i + 1
|
|
|
|
IF (IdeSystem = 1 AND ideselect = 1) OR IdeSystem = 2 THEN
|
|
menu$(m, i) = "Cu#t Shift+Del or Ctrl+X": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text and copies it to clipboard"
|
|
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
|
|
menuDesc$(m, i - 1) = "Copies selected text to clipboard"
|
|
ELSEIF (IdeSystem = 3 AND Help_Select = 2) THEN
|
|
menu$(m, i) = "~Cu#t Shift+Del or Ctrl+X": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text and copies it to clipboard"
|
|
menu$(m, i) = "#Copy Ctrl+Ins or Ctrl+C": i = i + 1
|
|
menuDesc$(m, i - 1) = "Copies selected text to clipboard"
|
|
ELSE
|
|
menu$(m, i) = "~Cu#t Shift+Del or Ctrl+X": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text and copies it to clipboard"
|
|
menu$(m, i) = "~#Copy Ctrl+Ins or Ctrl+C": i = i + 1
|
|
menuDesc$(m, i - 1) = "Copies selected text to clipboard"
|
|
END IF
|
|
|
|
clip$ = _CLIPBOARD$ 'read clipboard
|
|
IF (LEN(clip$) > 0 AND IdeSystem = 1) OR IdeSystem = 2 THEN
|
|
menu$(m, i) = "#Paste Shift+Ins or Ctrl+V": i = i + 1
|
|
menuDesc$(m, i - 1) = "Inserts clipboard contents at current location"
|
|
ELSE
|
|
menu$(m, i) = "~#Paste Shift+Ins or Ctrl+V": i = i + 1
|
|
menuDesc$(m, i - 1) = "Inserts clipboard contents at current location"
|
|
END IF
|
|
|
|
IF (IdeSystem = 1 AND ideselect = 1) OR IdeSystem = 2 THEN
|
|
menu$(m, i) = "Cl#ear Del": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text"
|
|
ELSE
|
|
menu$(m, i) = "~Cl#ear Del": i = i + 1
|
|
menuDesc$(m, i - 1) = "Deletes selected text"
|
|
END IF
|
|
|
|
menu$(m, i) = "Select #All Ctrl+A": i = i + 1
|
|
menuDesc$(m, i - 1) = "Selects all contents of current program"
|
|
|
|
IF IdeSystem = 1 THEN
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "To#ggle Comment Ctrl+T": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles comment (') on the current selection"
|
|
menu$(m, i) = "Add Co#mment (') Ctrl+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Adds comment marker (') to the current selection"
|
|
menu$(m, i) = "Remove Comme#nt (') Ctrl+Shift+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes comment marker (') from the current selection"
|
|
IF ideselect THEN
|
|
y1 = idecy
|
|
y2 = ideselecty1
|
|
IF y1 = y2 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
|
|
menu$(m, i) = "~#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "~#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
ELSE
|
|
menu$(m, i) = "#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
END IF
|
|
ELSE
|
|
menu$(m, i) = "#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
END IF
|
|
ELSE
|
|
menu$(m, i) = "~#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "~#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
END IF
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "New #SUB...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new subprocedure at the end of the current program"
|
|
menu$(m, i) = "New #FUNCTION...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new function at the end of the current program"
|
|
ELSE
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "~To#ggle Comment Ctrl+T": i = i + 1
|
|
menuDesc$(m, i - 1) = "Toggles comment (') on the current selection"
|
|
menu$(m, i) = "~Add Co#mment (') Ctrl+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Adds comment marker (') to the current selection"
|
|
menu$(m, i) = "~Remove Comme#nt (') Ctrl+Shift+R": i = i + 1
|
|
menuDesc$(m, i - 1) = "Removes comment marker (') from the current selection"
|
|
menu$(m, i) = "~#Increase Indent TAB": i = i + 1
|
|
menuDesc$(m, i - 1) = "Increases indentation of the current selection"
|
|
menu$(m, i) = "~#Decrease Indent"
|
|
menuDesc$(m, i) = "Decreases indentation of the current selection"
|
|
IF INSTR(_OS$, "WIN") OR INSTR(_OS$, "MAC") THEN menu$(m, i) = menu$(m, i) + " Shift+TAB"
|
|
i = i + 1
|
|
menu$(m, i) = "-": i = i + 1
|
|
menu$(m, i) = "~New #SUB...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new subprocedure at the end of the current program"
|
|
menu$(m, i) = "~New #FUNCTION...": i = i + 1
|
|
menuDesc$(m, i - 1) = "Creates a new function at the end of the current program"
|
|
END IF
|
|
menusize(m) = i - 1
|
|
END SUB
|
|
|
|
SUB IdeAddRecent (f2$)
|
|
f$ = f2$
|
|
|
|
f$ = removeDoubleSlashes(f$)
|
|
|
|
f$ = CRLF + f$ + CRLF
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\recent.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
|
|
x = INSTR(UCASE$(a$), UCASE$(f$))
|
|
IF x THEN
|
|
a$ = f$ + LEFT$(a$, x - 1) + RIGHT$(a$, LEN(a$) - (x + LEN(f$) - 1))
|
|
ELSE
|
|
a$ = f$ + a$
|
|
END IF
|
|
PUT #fh, 1, a$
|
|
CLOSE #fh
|
|
IdeMakeFileMenu
|
|
END SUB
|
|
|
|
FUNCTION removeDoubleSlashes$(f$)
|
|
x = INSTR(f$, "//")
|
|
DO WHILE x
|
|
f$ = LEFT$(f$, x - 1) + MID$(f$, x + 1)
|
|
x = INSTR(f$, "//")
|
|
LOOP
|
|
|
|
x = INSTR(f$, "\\")
|
|
DO WHILE x
|
|
f$ = LEFT$(f$, x - 1) + MID$(f$, x + 1)
|
|
x = INSTR(f$, "\\")
|
|
LOOP
|
|
|
|
removeDoubleSlashes$ = f$
|
|
END FUNCTION
|
|
|
|
SUB IdeAddSearched (s2$)
|
|
s$ = s2$ + CRLF
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\searched.bin" FOR BINARY AS #fh: a$ = SPACE$(LOF(fh)): GET #fh, , a$
|
|
x = INSTR(UCASE$(a$), UCASE$(s$))
|
|
IF x THEN
|
|
a$ = s$ + LEFT$(a$, x - 1) + RIGHT$(a$, LEN(a$) - (x + LEN(s$) - 1))
|
|
ELSE
|
|
a$ = s$ + a$
|
|
END IF
|
|
PUT #fh, 1, a$
|
|
CLOSE #fh
|
|
END SUB
|
|
|
|
FUNCTION ideupdatehelpbox
|
|
ideupdatehelpbox = 0 'all good, getting 1 on error
|
|
IF Help_Recaching = 2 THEN
|
|
DIM FullMessage$(1 TO 2)
|
|
UpdateStep = 1
|
|
Help_ww = 78
|
|
GOTO startMainLoop
|
|
END IF
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
IF idehelp = 0 THEN
|
|
old_idesubwindow = idesubwindow: old_idewy = idewy
|
|
idesubwindow = idewy \ 2: idewy = idewy - idesubwindow
|
|
Help_wx1 = 2: Help_wy1 = idewy + 1: Help_wx2 = idewx - 1: Help_wy2 = idewy + idesubwindow - 2: Help_ww = Help_wx2 - Help_wx1 + 1: Help_wh = Help_wy2 - Help_wy1 + 1
|
|
idesubwindow = old_idesubwindow: idewy = old_idewy
|
|
END IF
|
|
|
|
MessageLines = 2
|
|
DIM FullMessage$(1 TO 2)
|
|
UpdateStep = 1
|
|
|
|
i = 0
|
|
w2 = LEN(titlestr$) + 4
|
|
IF w < w2 THEN w = w2
|
|
IF w > idewx - 4 THEN w = idewx - 4
|
|
idepar p, 60, 6, "Update Help"
|
|
|
|
i = i + 1
|
|
ButtonID = i
|
|
o(i).typ = 3
|
|
o(i).y = 6
|
|
o(i).txt = idenewtxt("#Cancel")
|
|
o(i).dft = 1
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
startMainLoop:
|
|
DO 'main loop
|
|
IF Help_Recaching = 2 GOTO updateRoutine
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'update steps
|
|
SELECT CASE UpdateStep
|
|
CASE 1
|
|
FullMessage$(2) = "Generating list of cached content..."
|
|
CASE 2
|
|
FullMessage$(2) = "Adding core help pages to list..."
|
|
CASE 3
|
|
FullMessage$(2) = "Regenerating keyword list..."
|
|
CASE 4
|
|
FullMessage$(2) = "Building download queue..."
|
|
CASE 5
|
|
FullMessage$(1) = "Updating help content file " + str2$(n) + "/" + str2$(c) +"..."
|
|
END SELECT
|
|
|
|
FOR i = 1 TO MessageLines
|
|
IF i = 1 THEN COLOR 0, 7 ELSE COLOR 2, 7
|
|
IF LEN(FullMessage$(i)) > p.w - 2 THEN
|
|
FullMessage$(i) = LEFT$(FullMessage$(i), p.w - 5) + STRING$(3, 250)
|
|
END IF
|
|
_PRINTSTRING (p.x + (p.w \ 2 - LEN(FullMessage$(i)) \ 2) + 1, p.y + 1 + i), FullMessage$(i)
|
|
NEXT i
|
|
|
|
COLOR 0, 7
|
|
IF UpdateStep = 5 THEN
|
|
maxprogresswidth = 52 'arbitrary
|
|
percentage = INT(n / c * 100)
|
|
percentagechars = INT(maxprogresswidth * n / c)
|
|
'percentageMsg$ = "[" + STRING$(percentagechars, 254) + SPACE$(maxprogresswidth - percentagechars) + "]" + STR$(percentage) + "%"
|
|
percentageMsg$ = STRING$(percentagechars, 219) + STRING$(maxprogresswidth - percentagechars, 176) + STR$(percentage) + "%"
|
|
_PRINTSTRING (p.x + (p.w \ 2 - LEN(percentageMsg$) \ 2) + 1, p.y + 4), percentageMsg$
|
|
ELSEIF UpdateStep = 6 THEN
|
|
percentageMsg$ = STRING$(maxprogresswidth, 219) + " 100%"
|
|
_PRINTSTRING (p.x + (p.w \ 2 - LEN(percentageMsg$) \ 2) + 1, p.y + 4), percentageMsg$
|
|
END IF
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
GetInput
|
|
IF mCLICK THEN mousedown = 1
|
|
IF mRELEASE THEN mouseup = 1
|
|
alt = KALT
|
|
oldalt = alt
|
|
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
|
|
IF UCASE$(K$) = "C" THEN altletter$ = UCASE$(K$)
|
|
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
'specific post controls
|
|
IF K$ = CHR$(27) OR K$ = CHR$(13) OR (info <> 0) THEN
|
|
IF UpdateStep < 6 THEN q$ = ideyesnobox("", "Cancel download?") ELSE q$ = "Y"
|
|
IF q$ = "Y" THEN EXIT FUNCTION
|
|
END IF
|
|
'end of custom controls
|
|
|
|
updateRoutine:
|
|
'-------- update routine -------------------------------------
|
|
SELECT CASE UpdateStep
|
|
CASE 1
|
|
'Create a list of all files to be recached
|
|
IF Help_Recaching < 2 THEN
|
|
f$ = CHR$(0) + idezfilelist$("internal/help", 2, "*.txt") + CHR$(0)
|
|
IF LEN(f$) = 2 THEN f$ = CHR$(0)
|
|
ELSE
|
|
f$ = CHR$(0) 'no dir scan for 'qb64pe -u' (build time update)
|
|
END IF
|
|
|
|
'Prepend core pages to list
|
|
f$ = CHR$(0) + "Keyword_Reference_-_By_usage.txt" + f$
|
|
f$ = CHR$(0) + "QB64_Help_Menu.txt" + f$
|
|
f$ = CHR$(0) + "QB64_FAQ.txt" + f$
|
|
UpdateStep = UpdateStep + 1
|
|
CASE 2
|
|
UpdateStep = UpdateStep + 1
|
|
CASE 3
|
|
'Download and PARSE alphabetical index to build required F1 help links
|
|
FullMessage$(1) = "Regenerating keyword list..."
|
|
a$ = Wiki$("Keyword Reference - Alphabetical")
|
|
IF INSTR(a$, "{{PageInternalError}}") > 0 THEN ideupdatehelpbox = 1: EXIT DO
|
|
WikiParse a$ 'update links.bin and check for plugin templates
|
|
UpdateStep = UpdateStep + 1
|
|
CASE 4
|
|
'Add all linked pages to download list (if not already in list)
|
|
fh = FREEFILE
|
|
OPEN "internal\help\links.bin" FOR INPUT AS #fh
|
|
DO UNTIL EOF(fh)
|
|
LINE INPUT #fh, l$
|
|
IF LEN(l$) THEN
|
|
c = INSTR(l$, ","): l$ = RIGHT$(l$, LEN(l$) - c)
|
|
IF Help_Recaching < 2 OR LEFT$(l$, 3) <> "_gl" THEN 'ignore _GL pages for 'qb64pe -u' (build time update)
|
|
'Escape all invalid and other critical chars in filenames
|
|
PageName2$ = ""
|
|
FOR i = 1 TO LEN(l$)
|
|
c = ASC(l$, i)
|
|
SELECT CASE c
|
|
CASE 32 ' '(space)
|
|
PageName2$ = PageName2$ + "_"
|
|
CASE 34, 36, 38, 42, 43, 47, 58, 60, 62, 63, 92, 124 '("$&*+/:<>?\|)
|
|
PageName2$ = PageName2$ + "%" + HEX$(c)
|
|
CASE ELSE
|
|
PageName2$ = PageName2$ + CHR$(c)
|
|
END SELECT
|
|
NEXT
|
|
PageName2$ = PageName2$ + ".txt"
|
|
IF INSTR(f$, CHR$(0) + PageName2$ + CHR$(0)) = 0 THEN
|
|
f$ = f$ + PageName2$ + CHR$(0)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
LOOP
|
|
CLOSE #fh
|
|
|
|
'Redownload all listed files
|
|
IF f$ <> CHR$(0) THEN
|
|
c = 0 'count files to download
|
|
FOR x = 2 TO LEN(f$)
|
|
IF ASC(f$, x) = 0 THEN c = c + 1
|
|
NEXT
|
|
c = c - 1
|
|
|
|
f$ = RIGHT$(f$, LEN(f$) - 1)
|
|
z$ = CHR$(0)
|
|
n = 0
|
|
ELSE
|
|
GOTO stoprecache
|
|
END IF
|
|
FullMessage$(2) = ""
|
|
UpdateStep = UpdateStep + 1
|
|
CASE 5
|
|
IF LEN(f$) > 0 THEN
|
|
x2 = INSTR(f$, z$)
|
|
f2$ = LEFT$(f$, x2 - 1): f$ = RIGHT$(f$, LEN(f$) - x2)
|
|
|
|
IF RIGHT$(f2$, 4) = ".txt" THEN
|
|
f2$ = LEFT$(f2$, LEN(f2$) - 4)
|
|
n = n + 1
|
|
FullMessage$(2) = "Page title: " + f2$
|
|
ignore$ = Wiki$(f2$)
|
|
WikiParse ignore$ 'just check for plugin templates
|
|
END IF
|
|
ELSE
|
|
UpdateStep = UpdateStep + 1
|
|
END IF
|
|
CASE 6
|
|
stoprecache:
|
|
IF Help_Recaching = 2 THEN EXIT DO
|
|
FullMessage$(1) = "All pages updated."
|
|
FullMessage$(2) = ""
|
|
idetxt(o(ButtonID).txt) = "#Close"
|
|
_LIMIT 20
|
|
END SELECT
|
|
'-------- end of update routine ------------------------------
|
|
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
END FUNCTION
|
|
|
|
FUNCTION ideASCIIbox$(relaunch)
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
STATIC ASCIIWarningShown
|
|
relaunch = 0
|
|
|
|
i = 0
|
|
idepar p, 56, 21, "ASCII Chart"
|
|
|
|
i = i + 1
|
|
o(i).typ = 1 'hidden text box to give focus to the chart
|
|
o(i).y = 3
|
|
o(i).x = 5
|
|
o(i).w = 5
|
|
|
|
TYPE position
|
|
x AS INTEGER
|
|
y AS INTEGER
|
|
caption AS STRING
|
|
END TYPE
|
|
DIM asciiTable(1 TO 255) AS position
|
|
|
|
a = 0
|
|
x = 5
|
|
y = 2
|
|
FOR i = 0 TO 15
|
|
FOR j = 0 TO 15
|
|
a = a + 1
|
|
IF a > 255 THEN EXIT FOR
|
|
asciiTable(a).x = p.x + x
|
|
asciiTable(a).y = p.y + y
|
|
asciiTable(a).caption = " " + CHR$(a) + " "
|
|
x = x + 3
|
|
NEXT
|
|
IF a > 255 THEN EXIT FOR
|
|
x = 5
|
|
y = y + 1
|
|
NEXT
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = 21
|
|
o(i).txt = idenewtxt("#Insert character" + sep + "Insert C#HR$" + sep + "#Close")
|
|
o(i).dft = 1
|
|
|
|
Selected = 1
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
IF focus = 1 THEN
|
|
idebox p.x + 4, p.y + 1, 50, 18
|
|
END IF
|
|
|
|
Hover = 0
|
|
FOR i = 1 TO 255
|
|
IF mX >= asciiTable(i).x AND mX <= asciiTable(i).x + 2 AND mY = asciiTable(i).y THEN
|
|
IF mouseMoved THEN Hover = i: COLOR 7, 0
|
|
IF mCLICK THEN
|
|
Selected = i
|
|
focus = 1
|
|
IF timeElapsedSince(lastClick!) <= .3 and lastClickOn = i THEN
|
|
'double click on chart
|
|
relaunch = -1
|
|
GOTO insertChar
|
|
END IF
|
|
lastClick! = TIMER
|
|
lastClickOn = i
|
|
END IF
|
|
ELSE
|
|
COLOR 2, 7
|
|
END IF
|
|
IF Selected = i THEN COLOR 15, 0
|
|
_PRINTSTRING (asciiTable(i).x, asciiTable(i).y), asciiTable(i).caption
|
|
NEXT
|
|
|
|
COLOR 0, 7
|
|
IF Selected > 0 THEN
|
|
_PRINTSTRING (p.x + 5, p.y + 19), "Selected:" + STR$(Selected)
|
|
END IF
|
|
|
|
COLOR 2, 7
|
|
IF Hover > 0 AND Hover <> Selected THEN
|
|
_PRINTSTRING (p.x + 5, p.y + 20), "Hovered: " + STR$(Hover)
|
|
END IF
|
|
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN
|
|
SCREEN , , 0, 0
|
|
IF focus = 1 THEN
|
|
IF Selected THEN
|
|
LOCATE asciiTable(Selected).y, asciiTable(Selected).x + 1, 1
|
|
END IF
|
|
ELSE
|
|
LOCATE cy, cx, 1
|
|
END IF
|
|
SCREEN , , 1, 0
|
|
END IF
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
mouseMoved = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
IF mX <> prev.mX OR mY <> prev.mY THEN change = 1: prev.mX = mX: prev.mY = mY: mouseMoved = -1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF mY > p.y AND mY < p.y + p.h AND mX > p.x AND mX < p.x + p.w THEN
|
|
IF Hover = 0 AND mCLICK THEN focus = 1
|
|
END IF
|
|
|
|
IF (K$ = CHR$(13) AND focus = 1) THEN
|
|
GOTO insertChar
|
|
END IF
|
|
|
|
IF focus = 2 AND (K$ = CHR$(13) OR info <> 0) THEN
|
|
insertChar:
|
|
IF Selected < 32 AND ASCIIWarningShown = 0 THEN
|
|
ASCIIWarningShown = -1
|
|
result = idemessagebox("Control Characters", "Inserting ASCII control characters (1-32) may cause\nunexpected IDE behavior. Consider inserting CHR$ instead.\nProceed anyway?", "#Yes;#No;#Cancel")
|
|
IF result = 2 THEN EXIT FUNCTION
|
|
IF result = 3 THEN GOTO dlgLoop
|
|
END IF
|
|
ideASCIIbox$ = CHR$(Selected)
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF (focus = 3 AND (info <> 0 OR K$ = CHR$(13))) THEN
|
|
ideASCIIbox$ = "CHR$(" + str2$(Selected) + ")"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'Cancel:
|
|
IF (info <> 0 OR K$ = CHR$(13)) AND focus = 4 THEN EXIT FUNCTION
|
|
|
|
IF K$ = CHR$(27) THEN EXIT FUNCTION
|
|
|
|
IF focus = 1 THEN 'chart control (keyboard)
|
|
KCTRL = _KEYDOWN(100305) OR _KEYDOWN(100306)
|
|
SELECT CASE KB
|
|
CASE 18176: Selected = 1 'Home
|
|
CASE 20224: Selected = 255 'End
|
|
CASE 19712 'Right
|
|
IF KCTRL AND Selected > 0 THEN
|
|
DO UNTIL Selected MOD 16 = 0 OR Selected = 255
|
|
Selected = Selected + 1
|
|
LOOP
|
|
ELSE
|
|
Selected = Selected + 1
|
|
END IF
|
|
IF Selected > 255 THEN Selected = 1
|
|
CASE 19200 'Left
|
|
IF KCTRL AND Selected > 0 THEN
|
|
DO UNTIL Selected MOD 16 = 1
|
|
Selected = Selected - 1
|
|
LOOP
|
|
ELSE
|
|
Selected = Selected - 1
|
|
END IF
|
|
IF Selected < 1 THEN Selected = 255
|
|
CASE 20480 'Down
|
|
IF KCTRL AND Selected > 0 THEN
|
|
IF Selected = 240 THEN
|
|
Selected = 255
|
|
ELSE
|
|
DO UNTIL Selected >= 240
|
|
Selected = Selected + 16
|
|
LOOP
|
|
END IF
|
|
IF Selected > 255 THEN Selected = 255
|
|
ELSE
|
|
IF Selected = 240 THEN
|
|
'corner case
|
|
Selected = 255
|
|
ELSEIF Selected + 16 <= 255 THEN
|
|
Selected = Selected + 16
|
|
ELSE
|
|
Selected = Selected + 16 - 256
|
|
END IF
|
|
END IF
|
|
CASE 18432 'Up
|
|
IF KCTRL AND Selected > 0 THEN
|
|
DO UNTIL Selected <= 16
|
|
Selected = Selected - 16
|
|
LOOP
|
|
IF Selected < 1 THEN Selected = 1
|
|
ELSE
|
|
IF Selected = 16 THEN
|
|
'corner case
|
|
Selected = 240
|
|
ELSEIF Selected - 16 >= 1 THEN
|
|
Selected = Selected - 16
|
|
ELSE
|
|
Selected = Selected - 16 + 256
|
|
END IF
|
|
END IF
|
|
END SELECT
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
|
|
dlgLoop:
|
|
LOOP
|
|
|
|
END FUNCTION
|
|
|
|
|
|
FUNCTION idef1box$ (lnks$, lnks)
|
|
|
|
'-------- generic dialog box header --------
|
|
PCOPY 0, 2
|
|
PCOPY 0, 1
|
|
SCREEN , , 1, 0
|
|
focus = 1
|
|
DIM p AS idedbptype
|
|
DIM o(1 TO 100) AS idedbotype
|
|
DIM sep AS STRING * 1
|
|
sep = CHR$(0)
|
|
'-------- end of generic dialog box header --------
|
|
|
|
'-------- init --------
|
|
|
|
|
|
'72,19
|
|
i = 0
|
|
idepar p, 40, lnks + 3, "Contextual help"
|
|
|
|
i = i + 1
|
|
o(i).typ = 2
|
|
o(i).y = 1
|
|
'68
|
|
o(i).w = 36: o(i).h = lnks
|
|
o(i).txt = idenewtxt(lnks$)
|
|
o(i).sel = 1
|
|
o(i).nam = idenewtxt("Which?")
|
|
|
|
i = i + 1
|
|
o(i).typ = 3
|
|
o(i).y = lnks + 3
|
|
o(i).txt = idenewtxt("#OK")
|
|
o(i).dft = 1
|
|
|
|
'-------- end of init --------
|
|
|
|
'-------- generic init --------
|
|
FOR i = 1 TO 100: o(i).par = p: NEXT 'set parent info of objects
|
|
'-------- end of generic init --------
|
|
|
|
DO 'main loop
|
|
|
|
'-------- generic display dialog box & objects --------
|
|
idedrawpar p
|
|
f = 1: cx = 0: cy = 0
|
|
FOR i = 1 TO 100
|
|
IF o(i).typ THEN
|
|
'prepare object
|
|
|
|
o(i).foc = focus - f 'focus offset
|
|
o(i).cx = 0: o(i).cy = 0
|
|
idedrawobj o(i), f 'display object
|
|
IF o(i).cx THEN cx = o(i).cx: cy = o(i).cy
|
|
END IF
|
|
NEXT i
|
|
lastfocus = f - 1
|
|
'-------- end of generic display dialog box & objects --------
|
|
|
|
'-------- custom display changes --------
|
|
'-------- end of custom display changes --------
|
|
|
|
'update visual page and cursor position
|
|
PCOPY 1, 0
|
|
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
|
|
|
|
'-------- read input --------
|
|
change = 0
|
|
DO
|
|
GetInput
|
|
IF mWHEEL THEN change = 1
|
|
IF KB THEN change = 1
|
|
IF mCLICK THEN mousedown = 1: change = 1
|
|
IF mRELEASE THEN mouseup = 1: change = 1
|
|
IF mB THEN change = 1
|
|
alt = KALT: IF alt <> oldalt THEN change = 1
|
|
oldalt = alt
|
|
_LIMIT 100
|
|
LOOP UNTIL change
|
|
IF alt AND NOT KCTRL THEN idehl = 1 ELSE idehl = 0
|
|
'convert "alt+letter" scancode to letter's ASCII character
|
|
altletter$ = ""
|
|
IF alt AND NOT KCTRL THEN
|
|
IF LEN(K$) = 1 THEN
|
|
k = ASC(UCASE$(K$))
|
|
IF k >= 65 AND k <= 90 THEN altletter$ = CHR$(k)
|
|
END IF
|
|
END IF
|
|
SCREEN , , 0, 0: LOCATE , , 0: SCREEN , , 1, 0
|
|
'-------- end of read input --------
|
|
|
|
'-------- generic input response --------
|
|
info = 0
|
|
IF K$ = "" THEN K$ = CHR$(255)
|
|
IF KSHIFT = 0 AND K$ = CHR$(9) THEN focus = focus + 1
|
|
IF (KSHIFT AND K$ = CHR$(9)) OR (INSTR(_OS$, "MAC") AND K$ = CHR$(25)) THEN focus = focus - 1: K$ = ""
|
|
IF focus < 1 THEN focus = lastfocus
|
|
IF focus > lastfocus THEN focus = 1
|
|
f = 1
|
|
FOR i = 1 TO 100
|
|
t = o(i).typ
|
|
IF t THEN
|
|
focusoffset = focus - f
|
|
ideobjupdate o(i), focus, f, focusoffset, K$, altletter$, mB, mousedown, mouseup, mX, mY, info, mWHEEL
|
|
END IF
|
|
NEXT
|
|
'-------- end of generic input response --------
|
|
|
|
IF K$ = CHR$(13) OR (focus = 2 AND info <> 0) OR (info = 1 AND focus = 1) THEN
|
|
f$ = idetxt(o(1).stx)
|
|
idef1box$ = f$
|
|
EXIT FUNCTION
|
|
ELSEIF K$ = CHR$(27) THEN
|
|
idef1box$ = "C"
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
'end of custom controls
|
|
mousedown = 0
|
|
mouseup = 0
|
|
LOOP
|
|
|
|
|
|
|
|
END FUNCTION
|
|
|
|
'After Cormen, Leiserson, Rivest & Stein "Introduction To Algoritms" via Wikipedia
|
|
SUB sort (arr() AS STRING * 998)
|
|
FOR i& = LBOUND(arr) + 1 TO UBOUND(arr)
|
|
x$ = arr(i&)
|
|
j& = i& - 1
|
|
WHILE j& >= LBOUND(arr)
|
|
IF arr(j&) <= x$ THEN EXIT WHILE
|
|
arr$(j& + 1) = arr$(j&)
|
|
j& = j& - 1
|
|
WEND
|
|
arr$(j& + 1) = x$
|
|
NEXT i&
|
|
END SUB
|
|
|
|
FUNCTION FindProposedTitle$
|
|
'Finds the first occurence of _TITLE to suggest a file name
|
|
'when saving for the first time or saving as.
|
|
|
|
DIM c AS _BYTE, q AS _BYTE, i
|
|
FOR i = 1 TO iden
|
|
thisline$ = idegetline(i)
|
|
thisline$ = LTRIM$(RTRIM$(thisline$))
|
|
found_TITLE = INSTR(UCASE$(thisline$), "_TITLE " + CHR$(34))
|
|
IF found_TITLE > 0 THEN
|
|
FindQuoteComment thisline$, found_TITLE, c, q
|
|
IF NOT q THEN
|
|
Find_ClosingQuote = INSTR(found_TITLE + 8, thisline$, CHR$(34))
|
|
IF Find_ClosingQuote > 0 THEN
|
|
TempFound_TITLE$ = MID$(thisline$, found_TITLE + 8, (Find_ClosingQuote - found_TITLE) - 8)
|
|
END IF
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
|
|
InvalidChars$ = ":/\?*><|" + CHR$(34)
|
|
FOR i = 1 TO LEN(TempFound_TITLE$)
|
|
ThisChar$ = MID$(TempFound_TITLE$, i, 1)
|
|
IF INSTR(InvalidChars$, ThisChar$) = 0 THEN
|
|
Found_TITLE$ = Found_TITLE$ + ThisChar$
|
|
END IF
|
|
NEXT i
|
|
|
|
FindProposedTitle$ = LTRIM$(RTRIM$(Found_TITLE$))
|
|
END FUNCTION
|
|
|
|
FUNCTION FindCurrentSF$ (whichline)
|
|
'Get the SUB/FUNCTION name 'whichline' is in.
|
|
'The FOR...NEXT loop goes backwards from 'whichline' to the start of the program
|
|
'to see if we're inside a SUB/FUNCTION. EXITs FOR once that is figured.
|
|
|
|
sfname$ = ""
|
|
IF whichline > 0 THEN
|
|
FOR currSF_CHECK = whichline TO 1 STEP -1
|
|
thisline$ = idegetline(currSF_CHECK)
|
|
thisline$ = LTRIM$(RTRIM$(thisline$))
|
|
isSF = 0
|
|
ncthisline$ = UCASE$(thisline$)
|
|
IF LEFT$(ncthisline$, 4) = "SUB " THEN isSF = 1
|
|
IF LEFT$(ncthisline$, 9) = "FUNCTION " THEN isSF = 2
|
|
IF LEFT$(ncthisline$, 7) = "END SUB" AND currSF_CHECK < whichline THEN EXIT FOR
|
|
IF LEFT$(ncthisline$, 12) = "END FUNCTION" AND currSF_CHECK < whichline THEN EXIT FOR
|
|
IF isSF THEN
|
|
IF RIGHT$(ncthisline$, 7) = " STATIC" THEN
|
|
thisline$ = RTRIM$(LEFT$(thisline$, LEN(thisline$) - 7))
|
|
END IF
|
|
|
|
IF isSF = 1 THEN
|
|
thisline$ = RIGHT$(thisline$, LEN(thisline$) - 4)
|
|
ELSE
|
|
thisline$ = RIGHT$(thisline$, LEN(thisline$) - 9)
|
|
END IF
|
|
thisline$ = LTRIM$(RTRIM$(thisline$))
|
|
checkargs = INSTR(thisline$, "(")
|
|
IF checkargs THEN
|
|
sfname$ = RTRIM$(LEFT$(thisline$, checkargs - 1))
|
|
ELSE
|
|
sfname$ = thisline$
|
|
END IF
|
|
|
|
'It could be that SUB or FUNCTION is inside a DECLARE LIBRARY.
|
|
'In such case, it must be ignored:
|
|
InsideDECLARE = 0
|
|
FOR declib_CHECK = currSF_CHECK TO 1 STEP -1
|
|
thisline$ = idegetline(declib_CHECK)
|
|
thisline$ = LTRIM$(RTRIM$(thisline$))
|
|
ncthisline$ = UCASE$(thisline$)
|
|
IF LEFT$(ncthisline$, 8) = "DECLARE " AND INSTR(ncthisline$, " LIBRARY") > 0 THEN InsideDECLARE = -1: EXIT FOR
|
|
IF LEFT$(ncthisline$, 11) = "END DECLARE" THEN EXIT FOR
|
|
NEXT
|
|
|
|
IF InsideDECLARE = -1 THEN
|
|
sfname$ = ""
|
|
ELSE
|
|
'Ok, we're not inside a DECLARE LIBRARY block.
|
|
'But what if we're past the end of this module's SUBs and FUNCTIONs,
|
|
'and all that's left is a bunch of comments or $INCLUDES?
|
|
'We'll also check for that:
|
|
endedSF = 0
|
|
FOR endSF_CHECK = whichline TO iden
|
|
thisline$ = idegetline(endSF_CHECK)
|
|
thisline$ = LTRIM$(RTRIM$(thisline$))
|
|
ncthisline$ = UCASE$(thisline$)
|
|
IF LEFT$(ncthisline$, 7) = "END SUB" THEN endedSF = 1: EXIT FOR
|
|
IF LEFT$(ncthisline$, 12) = "END FUNCTION" THEN endedSF = 2: EXIT FOR
|
|
IF LEFT$(ncthisline$, 4) = "SUB " AND endSF_CHECK = whichline THEN endedSF = 1: EXIT FOR
|
|
IF LEFT$(ncthisline$, 9) = "FUNCTION " AND endSF_CHECK = whichline THEN endedSF = 2: EXIT FOR
|
|
IF LEFT$(ncthisline$, 4) = "SUB " AND InsideDECLARE = 0 THEN EXIT FOR
|
|
IF LEFT$(ncthisline$, 9) = "FUNCTION " AND InsideDECLARE = 0 THEN EXIT FOR
|
|
IF LEFT$(ncthisline$, 8) = "DECLARE " AND INSTR(ncthisline$, " LIBRARY") > 0 THEN InsideDECLARE = -1
|
|
IF LEFT$(ncthisline$, 11) = "END DECLARE" THEN InsideDECLARE = 0
|
|
NEXT
|
|
IF endedSF = 0 THEN sfname$ = "" ELSE EXIT FOR
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
FindCurrentSF$ = sfname$
|
|
END FUNCTION
|
|
|
|
SUB AddQuickNavHistory
|
|
|
|
IF QuickNavTotal > 0 THEN
|
|
IF QuickNavHistory(QuickNavTotal).idecy = idecy THEN EXIT SUB
|
|
END IF
|
|
|
|
QuickNavTotal = QuickNavTotal + 1
|
|
REDIM _PRESERVE QuickNavHistory(1 TO QuickNavTotal) AS QuickNavType
|
|
|
|
QuickNavHistory(QuickNavTotal).idecy = idecy
|
|
QuickNavHistory(QuickNavTotal).idecx = idecx
|
|
QuickNavHistory(QuickNavTotal).idesy = idesy
|
|
QuickNavHistory(QuickNavTotal).idesx = idesx
|
|
END SUB
|
|
|
|
SUB UpdateIdeInfo
|
|
'show info message (if any)
|
|
IF LEN(IdeInfo) THEN
|
|
IF ASC(IdeInfo, 1) = 0 THEN
|
|
'Show progress bar
|
|
IdeInfo = MID$(IdeInfo, 2)
|
|
Percentage% = VAL(MID$(IdeInfo, 1, 3))
|
|
COLOR 13, 1
|
|
_PRINTSTRING (2, idewy - 1), STRING$(((idewx - 2) * Percentage%) / 100, "_")
|
|
END IF
|
|
END IF
|
|
a$ = IdeInfo
|
|
IF LEN(a$) > (idewx - 20) THEN a$ = LEFT$(a$, (idewx - 23)) + STRING$(3, 250)
|
|
IF LEN(a$) < (idewx - 20) THEN a$ = a$ + SPACE$((idewx - 20) - LEN(a$))
|
|
COLOR 0, 3
|
|
_PRINTSTRING (2, idewy + idesubwindow), a$
|
|
|
|
IF LEN(versionStringStatus$) = 0 THEN
|
|
versionStringStatus$ = " v" + Version$
|
|
versionStringStatus$ = versionStringStatus$ + " "
|
|
END IF
|
|
'_PRINTSTRING (idewx - 22 - LEN(versionStringStatus$), idewy + idesubwindow), CHR$(179)
|
|
COLOR 2, 3
|
|
_PRINTSTRING (idewx - 21 - LEN(versionStringStatus$), idewy + idesubwindow), versionStringStatus$
|
|
|
|
PCOPY 3, 0
|
|
END SUB
|
|
|
|
SUB UpdateMenuHelpLine (a$)
|
|
IF LEN(a$) > (idewx - 2) THEN a$ = LEFT$(a$, (idewx - 4)) + STRING$(3, 250)
|
|
COLOR 0, 3
|
|
_PRINTSTRING (1, idewy + idesubwindow), SPACE$(idewx)
|
|
_PRINTSTRING (2, idewy + idesubwindow), a$
|
|
END SUB
|
|
|
|
FUNCTION DarkenFGBG (Action AS _BYTE)
|
|
'Darken the interface while compilation is taking place,
|
|
'to give a sense of temporary unavailability:
|
|
IF Action = 1 THEN
|
|
TempDarkerBGColor~& = _RGB32(_RED32(IDEBackgroundColor) * .5, _GREEN32(IDEBackgroundColor) * .5, _BLUE32(IDEBackgroundColor) * .5)
|
|
TempDarkerBG2Color~& = _RGB32(_RED32(IDEBackgroundColor2) * .5, _GREEN32(IDEBackgroundColor2) * .5, _BLUE32(IDEBackgroundColor2) * .5)
|
|
TempDarkerFGColor~& = _RGB32(_RED32(IDETextColor) * .5, _GREEN32(IDETextColor) * .5, _BLUE32(IDETextColor) * .5)
|
|
TempDarkerKWColor~& = _RGB32(_RED32(IDEKeywordColor) * .5, _GREEN32(IDEKeywordColor) * .5, _BLUE32(IDEKeywordColor) * .5)
|
|
TempDarkerNumColor~& = _RGB32(_RED32(IDENumbersColor) * .5, _GREEN32(IDENumbersColor) * .5, _BLUE32(IDENumbersColor) * .5)
|
|
TempDarkerCommentColor~& = _RGB32(_RED32(IDECommentColor) * .5, _GREEN32(IDECommentColor) * .5, _BLUE32(IDECommentColor) * .5)
|
|
TempDarkerIDEChromaColor~& = _RGB32(_RED32(IDEChromaColor) * .5, _GREEN32(IDEChromaColor) * .5, _BLUE32(IDEChromaColor) * .5)
|
|
TempDarkerMetaColor~& = _RGB32(_RED32(IDEMetaCommandColor) * .5, _GREEN32(IDEMetaCommandColor) * .5, _BLUE32(IDEMetaCommandColor) * .5)
|
|
TempDarkerQuoteColor~& = _RGB32(_RED32(IDEQuoteColor) * .5, _GREEN32(IDEQuoteColor) * .5, _BLUE32(IDEQuoteColor) * .5)
|
|
_PALETTECOLOR 1, TempDarkerBGColor~&, 0
|
|
_PALETTECOLOR 5, TempDarkerBGColor~&, 0
|
|
_PALETTECOLOR 6, TempDarkerBG2Color~&, 0
|
|
_PALETTECOLOR 7, TempDarkerIDEChromaColor~&, 0
|
|
_PALETTECOLOR 8, TempDarkerNumColor~&, 0
|
|
_PALETTECOLOR 10, TempDarkerMetaColor~&, 0
|
|
_PALETTECOLOR 11, TempDarkerCommentColor~&, 0
|
|
_PALETTECOLOR 12, TempDarkerKWColor~&, 0
|
|
_PALETTECOLOR 13, TempDarkerFGColor~&, 0
|
|
_PALETTECOLOR 14, TempDarkerQuoteColor~&, 0
|
|
ELSE
|
|
_PALETTECOLOR 1, IDEBackgroundColor, 0
|
|
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
|
_PALETTECOLOR 6, IDEBackgroundColor2, 0
|
|
_PALETTECOLOR 7, IDEChromaColor, 0
|
|
_PALETTECOLOR 8, IDENumbersColor, 0
|
|
_PALETTECOLOR 10, IDEMetaCommandColor, 0
|
|
_PALETTECOLOR 11, IDECommentColor, 0
|
|
_PALETTECOLOR 12, IDEKeywordColor, 0
|
|
_PALETTECOLOR 13, IDETextColor, 0
|
|
_PALETTECOLOR 14, IDEQuoteColor, 0
|
|
END IF
|
|
|
|
DarkenFGBG = 0
|
|
END SUB
|
|
|
|
SUB HideBracketHighlight
|
|
'Restore the screen and hide any bracket highlights
|
|
'as we're limited to 16 colors and the highlight
|
|
'color will be used differently in this dialog.
|
|
oldBracketHighlightSetting = brackethighlight
|
|
oldMultiHighlightSetting = multihighlight
|
|
oldShowLineNumbersUseBG = ShowLineNumbersUseBG
|
|
brackethighlight = 0
|
|
multihighlight = 0
|
|
ShowLineNumbersUseBG = 0
|
|
SCREEN , , 0
|
|
HideCurrentLineHighlight = -1
|
|
ideshowtext
|
|
HideCurrentLineHighlight = 0
|
|
brackethighlight = oldBracketHighlightSetting
|
|
multihighlight = oldMultiHighlightSetting
|
|
ShowLineNumbersUseBG = oldShowLineNumbersUseBG
|
|
END SUB
|
|
|
|
SUB LoadColorSchemes
|
|
DIM i AS LONG
|
|
'Preset built-in schemes
|
|
PresetColorSchemes = 10
|
|
REDIM ColorSchemes$(1 TO PresetColorSchemes): i = 0
|
|
i = i + 1: ColorSchemes$(i) = "Super dark blue|216216216069118147216098078255167000085206085098098098000000039000049078000088108170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Dark blue|226226226069147216245128177255177000085255085049196196000000069000068108000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "QB64 Original|226226226147196235245128177255255085085255085085255255000000170000108177000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Classic QB4.5|177177177177177177177177177177177177177177177177177177000000170000000170000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "CF Dark|226226226115222227255043138255178034185237049157118137043045037010000020088088088170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Dark side|255255255206206000245010098000177000085255085049186245011022029100100100000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Camouflage|196196196255255255245128177255177000137177147147137020000039029098069020000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Plum|186186186255255255245128177255108000085186078085186255059000059088088128000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "Light green|051051051000000216245128177255157255147177093206206206234255234206255206000147177170170170"
|
|
i = i + 1: ColorSchemes$(i) = "All white|051051051000000216245128177206147000059177000206206206255255255245245245000147177170170170"
|
|
TotalColorSchemes = PresetColorSchemes
|
|
LastValidColorScheme = TotalColorSchemes
|
|
|
|
'Load user color schemes
|
|
i = 0
|
|
DO
|
|
i = i + 1
|
|
result = ReadConfigSetting(colorSchemesSection$, "Scheme" + str2$(i) + "$", value$)
|
|
IF result THEN
|
|
TotalColorSchemes = TotalColorSchemes + 1
|
|
IF TotalColorSchemes > UBOUND(ColorSchemes$) THEN
|
|
REDIM _PRESERVE ColorSchemes$(1 TO UBOUND(ColorSchemes$) + 10)
|
|
END IF
|
|
ColorSchemes$(TotalColorSchemes) = value$
|
|
FoundPipe = INSTR(value$, "|")
|
|
IF FoundPipe > 0 THEN
|
|
IF LEN(MID$(value$, FoundPipe + 1)) = 81 THEN
|
|
'Extended schemes (9 colors):
|
|
LastValidColorScheme = TotalColorSchemes
|
|
value$ = value$ + "170170170"
|
|
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", value$
|
|
ColorSchemes$(TotalColorSchemes) = value$
|
|
ELSEIF LEN(MID$(value$, FoundPipe + 1)) = 90 THEN
|
|
'Extended schemes (10 colors):
|
|
LastValidColorScheme = TotalColorSchemes
|
|
ELSEIF LEN(MID$(value$, FoundPipe + 1)) = 54 THEN
|
|
'Version 1.1 schemes (only 6 colors)
|
|
'Convert to extended scheme:
|
|
temp$ = LEFT$(value$, FoundPipe)
|
|
temp$ = temp$ + MID$(value$, FoundPipe + 1, 9) + "069147216245128177"
|
|
temp$ = temp$ + MID$(value$, FoundPipe + 10) + "000147177170170170"
|
|
ColorSchemes$(TotalColorSchemes) = temp$
|
|
WriteConfigSetting colorSchemesSection$, "Scheme" + str2$(i) + "$", temp$
|
|
LastValidColorScheme = TotalColorSchemes
|
|
ELSE
|
|
GOTO DiscardInvalid
|
|
END IF
|
|
ELSE
|
|
DiscardInvalid:
|
|
ColorSchemes$(TotalColorSchemes) = "0"
|
|
END IF
|
|
ELSE
|
|
'No more schemes found
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
'End of color schemes
|
|
END SUB
|
|
|
|
FUNCTION BinaryFormatCheck% (pathToCheck$, pathSepToCheck$, fileToCheck$)
|
|
|
|
file$ = pathToCheck$ + pathSepToCheck$ + fileToCheck$
|
|
|
|
fh = FREEFILE
|
|
OPEN file$ FOR BINARY AS #fh
|
|
a$ = SPACE$(LOF(fh))
|
|
GET #fh, 1, a$
|
|
IF INSTR(a$, CHR$(0)) = 0 THEN CLOSE #fh: EXIT FUNCTION 'not a binary file
|
|
a$ = ""
|
|
GET #fh, 1, Format%
|
|
GET #fh, , Version%
|
|
CLOSE #fh
|
|
|
|
SELECT CASE Format%
|
|
CASE 2300 'VBDOS
|
|
result = idemessagebox("Invalid format", "VBDOS binary format not supported.", "")
|
|
BinaryFormatCheck% = 1
|
|
CASE 764 'QBX 7.1
|
|
result = idemessagebox("Invalid format", "QBX 7.1 binary format not supported.", "")
|
|
BinaryFormatCheck% = 1
|
|
CASE 252 'QuickBASIC 4.5
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
convertUtility$ = "internal\utilities\QB45BIN.exe"
|
|
ELSE
|
|
convertUtility$ = "./internal/utilities/QB45BIN"
|
|
END IF
|
|
IF _FILEEXISTS(convertUtility$) THEN
|
|
what$ = ideyesnobox("Binary format", "QuickBASIC 4.5 binary format detected. Convert to plain text?")
|
|
IF what$ = "Y" THEN
|
|
ConvertIt:
|
|
IF FileHasExtension(file$) THEN
|
|
FOR i = LEN(file$) TO 1 STEP -1
|
|
IF ASC(file$, i) = 46 THEN
|
|
'keep previous extension
|
|
ofile$ = LEFT$(file$, i - 1) + " (converted)" + MID$(file$, i)
|
|
EXIT FOR
|
|
END IF
|
|
NEXT
|
|
ELSE
|
|
ofile$ = file$ + " (converted).bas"
|
|
END IF
|
|
|
|
SCREEN , , 3, 0
|
|
dummy = DarkenFGBG(1)
|
|
clearStatusWindow 0
|
|
COLOR 15, 1
|
|
_PRINTSTRING (2, idewy - 3), "Converting... "
|
|
PCOPY 3, 0
|
|
|
|
convertLine$ = convertUtility$ + " " + QuotedFilename$(file$) + " -o " + QuotedFilename$(ofile$)
|
|
SHELL _HIDE convertLine$
|
|
|
|
clearStatusWindow 0
|
|
dummy = DarkenFGBG(0)
|
|
PCOPY 3, 0
|
|
|
|
IF _FILEEXISTS(ofile$) = 0 THEN
|
|
result = idemessagebox("Binary format", "Conversion failed.", "")
|
|
BinaryFormatCheck% = 2 'conversion failed
|
|
ELSE
|
|
pathToCheck$ = getfilepath$(ofile$)
|
|
IF LEN(pathToCheck$) THEN
|
|
fileToCheck$ = MID$(ofile$, LEN(pathToCheck$) + 1)
|
|
pathToCheck$ = LEFT$(pathToCheck$, LEN(pathToCheck$) - 1) 'remove path separator
|
|
ELSE
|
|
fileToCheck$ = ofile$
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
BinaryFormatCheck% = 1
|
|
END IF
|
|
ELSE
|
|
IF _FILEEXISTS("internal/support/converter/QB45BIN.bas") = 0 THEN
|
|
result = idemessagebox("Binary format", "Conversion utility not found. Cannot open QuickBASIC 4.5 binary format.", "")
|
|
BinaryFormatCheck% = 1
|
|
EXIT FUNCTION
|
|
END IF
|
|
what$ = ideyesnobox("Binary format", "QuickBASIC 4.5 binary format detected. Convert to plain text?")
|
|
IF what$ = "Y" THEN
|
|
'Compile the utility first, then convert the file
|
|
IF _DIREXISTS("./internal/utilities") = 0 THEN MKDIR "./internal/utilities"
|
|
PCOPY 3, 0
|
|
SCREEN , , 3, 0
|
|
dummy = DarkenFGBG(1)
|
|
clearStatusWindow 0
|
|
COLOR 15, 1
|
|
_PRINTSTRING (2, idewy - 3), "Preparing to convert..."
|
|
PCOPY 3, 0
|
|
IF INSTR(_OS$, "WIN") THEN
|
|
SHELL _HIDE "qb64pe -x internal/support/converter/QB45BIN.bas -o internal/utilities/QB45BIN"
|
|
ELSE
|
|
SHELL _HIDE "./qb64pe -x ./internal/support/converter/QB45BIN.bas -o ./internal/utilities/QB45BIN"
|
|
END IF
|
|
IF _FILEEXISTS(convertUtility$) THEN GOTO ConvertIt
|
|
clearStatusWindow 0
|
|
dummy = DarkenFGBG(0)
|
|
PCOPY 3, 0
|
|
result = idemessagebox("Binary format", "Error launching conversion utility.", "")
|
|
END IF
|
|
BinaryFormatCheck% = 1
|
|
END IF
|
|
END SELECT
|
|
END FUNCTION
|
|
|
|
FUNCTION removesymbol2$ (varname$)
|
|
i = INSTR(varname$, "~"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "`"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "%"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "&"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "!"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "#"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(varname$, "$"): IF i THEN GOTO foundsymbol
|
|
removesymbol2$ = varname$
|
|
EXIT FUNCTION
|
|
foundsymbol:
|
|
IF i = 1 THEN removesymbol2$ = varname$: EXIT FUNCTION
|
|
removesymbol2$ = LEFT$(varname$, i - 1)
|
|
END FUNCTION
|
|
|
|
SUB cleanSubName (n$)
|
|
x = INSTR(n$, "'"): IF x THEN n$ = LEFT$(n$, x - 1)
|
|
x = INSTR(n$, ":"): IF x THEN n$ = LEFT$(n$, x - 1)
|
|
x = INSTR(n$, " "): IF x THEN n$ = LEFT$(n$, x - 1)
|
|
END SUB
|
|
|
|
SUB clearStatusWindow(whichLine)
|
|
COLOR 7, 1
|
|
IF whichLine = 0 THEN
|
|
FOR whichLine = 1 TO 3
|
|
_PRINTSTRING (2, (idewy - 4) + whichLine), SPACE$(idewx - 2)
|
|
NEXT
|
|
ELSE
|
|
_PRINTSTRING (2, (idewy - 4) + whichLine), SPACE$(idewx - 2)
|
|
END IF
|
|
END SUB
|
|
|
|
SUB setStatusMessage(row, text$, fg)
|
|
COLOR fg
|
|
_PRINTSTRING (2, (idewy - 4) + row), text$
|
|
PCOPY 3, 0
|
|
END SUB
|
|
|
|
FUNCTION getWordAtCursor$
|
|
a$ = idegetline(idecy)
|
|
x = idecx
|
|
IF x <= LEN(a$) THEN
|
|
IF ASC(a$, x) = 32 AND x > 1 THEN
|
|
IF ASC(a$, x - 1) <> 32 THEN x = x - 1
|
|
END IF
|
|
try:
|
|
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
|
|
symbol$ = CHR$(ASC(a$, x))
|
|
IF symbol$ = CHR$(32) THEN EXIT FUNCTION
|
|
IF symbol$ = "~" THEN getWordAtCursor$ = "~": EXIT FUNCTION
|
|
IF symbol$ = "`" THEN getWordAtCursor$ = "`": EXIT FUNCTION
|
|
IF symbol$ = "%" AND MID$(a$, x + 1) = "&" THEN getWordAtCursor$ = "%&": EXIT FUNCTION
|
|
IF symbol$ = "&" AND MID$(a$, x - 1) = "%" THEN getWordAtCursor$ = "%&": EXIT FUNCTION
|
|
x1 = x
|
|
DO WHILE x1 > 1
|
|
IF MID$(a$, x1 - 1, 1) = symbol$ THEN x1 = x1 - 1 ELSE EXIT DO
|
|
LOOP
|
|
x2 = x
|
|
DO WHILE x2 < LEN(a$)
|
|
IF MID$(a$, x2 + 1, 1) = symbol$ THEN x2 = x2 + 1 ELSE EXIT DO
|
|
LOOP
|
|
a2$ = MID$(a$, x1, x2 - x1 + 1)
|
|
END IF
|
|
getWordAtCursor$ = a2$ 'a2$ now holds the word or character at current cursor position
|
|
ELSEIF x = LEN(a$) + 1 AND x > 1 THEN
|
|
IF ASC(a$, x - 1) <> 32 THEN x = x - 1: GOTO try
|
|
END IF
|
|
END FUNCTION
|
|
|
|
FUNCTION getSelectedText$(multiline AS _BYTE)
|
|
IF ideselect THEN
|
|
sy1 = ideselecty1
|
|
sy2 = idecy
|
|
IF sy1 > sy2 THEN SWAP sy1, sy2
|
|
sx1 = ideselectx1
|
|
sx2 = idecx
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
FOR y = sy1 TO sy2
|
|
IF y <= iden THEN
|
|
a$ = idegetline(y)
|
|
IF sy1 = sy2 THEN 'single line select
|
|
FOR x = sx1 TO sx2 - 1
|
|
IF x <= LEN(a$) THEN clip$ = clip$ + MID$(a$, x, 1) ELSE clip$ = clip$ + " "
|
|
NEXT
|
|
ELSE 'multiline select
|
|
IF NOT multiline THEN EXIT FUNCTION
|
|
IF idecx = 1 AND y = sy2 AND idecy > sy1 THEN GOTO nofinalcopy
|
|
clip$ = clip$ + a$ + CHR$(13) + CHR$(10)
|
|
nofinalcopy:
|
|
IF y = sy2 AND idecx > 1 AND LEN(a$) > 0 THEN clip$ = LEFT$(clip$, LEN(clip$) - 2)
|
|
END IF
|
|
END IF
|
|
NEXT
|
|
getSelectedText$ = clip$
|
|
END IF
|
|
END FUNCTION
|
|
|
|
SUB delselect
|
|
sy1 = ideselecty1
|
|
sy2 = idecy
|
|
IF sy1 > sy2 THEN SWAP sy1, sy2
|
|
sx1 = ideselectx1
|
|
sx2 = idecx
|
|
IF sx1 > sx2 THEN SWAP sx1, sx2
|
|
nolastlinedel = 0
|
|
IF sy1 <> sy2 AND idecx = 1 AND idecy > sy1 THEN sy2 = sy2 - 1: nolastlinedel = 1 'ignore last line of multi-line select?
|
|
|
|
|
|
FOR y = sy2 TO sy1 STEP -1
|
|
IF sy1 = sy2 AND nolastlinedel = 0 THEN 'single line select
|
|
a$ = idegetline(y)
|
|
a2$ = ""
|
|
IF sx1 <= LEN(a$) THEN a2$ = LEFT$(a$, sx1 - 1) ELSE a2$ = a$
|
|
IF sx2 <= LEN(a$) THEN a2$ = a2$ + RIGHT$(a$, LEN(a$) - sx2 + 1)
|
|
idesetline y, a2$
|
|
ELSE 'multiline select
|
|
IF iden = 1 AND y = 1 THEN idesetline y, "" ELSE idedelline y
|
|
END IF
|
|
NEXT
|
|
|
|
idecx = sx1: IF sy1 <> sy2 OR nolastlinedel = 1 THEN idecx = 1
|
|
idecy = sy1
|
|
ideselect = 0
|
|
END SUB
|
|
|
|
SUB insertAtCursor (tempk$)
|
|
'insert
|
|
IF ideselect THEN delselect
|
|
a$ = idegetline(idecy)
|
|
IF LEN(a$) < idecx - 1 THEN a$ = a$ + SPACE$(idecx - 1 - LEN(a$))
|
|
a$ = LEFT$(a$, idecx - 1) + tempk$ + RIGHT$(a$, LEN(a$) - idecx + 1)
|
|
idesetline idecy, converttabs$(a$)
|
|
|
|
IF PasteCursorAtEnd THEN
|
|
'Place the cursor at the end of the inserted content:
|
|
idecx = idecx + LEN(tempk$)
|
|
END IF
|
|
|
|
idechangemade = 1
|
|
startPausedPending = 0
|
|
END SUB
|
|
|
|
FUNCTION findHelpTopic$(topic$, lnks, firstOnly AS _BYTE)
|
|
'check if topic$ is in help links
|
|
' - returns a list of help links separated by CHR$(0)
|
|
' - returns the total number of links found by changing 'lnks'
|
|
lnks = 0: lnks$ = CHR$(0)
|
|
fh = FREEFILE
|
|
'----------
|
|
linksFileExist = _FILEEXISTS("internal\help\links.bin")
|
|
IF linksFileExist THEN
|
|
OPEN "internal\help\links.bin" FOR INPUT AS #fh
|
|
linksFileEmpty = (LOF(fh) = 0): CLOSE #fh
|
|
END IF
|
|
IF (NOT linksFileExist) OR linksFileEmpty THEN
|
|
q$ = ideyesnobox("Help problem", "The help system is not yet initialized,\ndo it now? (Make sure you're online.)")
|
|
PCOPY 3, 0: SCREEN , , 3, 0
|
|
IF q$ = "N" GOTO noLinksFile
|
|
Help_IgnoreCache = 1
|
|
a$ = Wiki$("Keyword Reference - Alphabetical")
|
|
Help_IgnoreCache = 0
|
|
IF INSTR(a$, "{{PageInternalError}}") THEN
|
|
lnks = 1: lnks$ = lnks$ + "Initialize" + CHR$(0)
|
|
GOTO noLinksFile
|
|
END IF
|
|
Help_ww = 78: WikiParse a$ 'assume standard IDE width for parsing
|
|
END IF
|
|
'----------
|
|
a2$ = UCASE$(topic$)
|
|
OPEN "internal\help\links.bin" FOR INPUT AS #fh
|
|
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$) OR (qb64prefix_set = 1 AND LEFT$(l1$, 1) = "_" AND a2$ = MID$(l1$, 2)) THEN
|
|
IF INSTR(lnks$, CHR$(0) + l2$ + CHR$(0)) = 0 THEN
|
|
lnks = lnks + 1
|
|
IF firstOnly THEN findHelpTopic$ = l2$: CLOSE #fh: EXIT FUNCTION
|
|
IF l2$ = l1$ THEN
|
|
lnks$ = CHR$(0) + l2$ + lnks$
|
|
ELSE
|
|
lnks$ = lnks$ + l2$ + CHR$(0)
|
|
END IF
|
|
END IF
|
|
END IF
|
|
LOOP
|
|
CLOSE #fh
|
|
noLinksFile:
|
|
findHelpTopic$ = lnks$
|
|
END FUNCTION
|
|
|
|
FUNCTION isnumber (__a$)
|
|
a$ = UCASE$(__a$)
|
|
IF LEN(a$) = 0 THEN EXIT FUNCTION
|
|
|
|
IF INSTR("@&H@&O@&B@", "@" + LEFT$(a$, 2) + "@") THEN isnumber = 1: EXIT FUNCTION
|
|
|
|
i = INSTR(a$, "~"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "`"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "%"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "&"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "!"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "#"): IF i THEN GOTO foundsymbol
|
|
i = INSTR(a$, "$"): IF i THEN GOTO foundsymbol
|
|
GOTO proceedWithoutSymbol
|
|
foundsymbol:
|
|
IF i = 1 THEN EXIT FUNCTION
|
|
symbol$ = RIGHT$(a$, LEN(a$) - i + 1)
|
|
IF symboltype(symbol$) = 0 THEN EXIT FUNCTION
|
|
a$ = LEFT$(a$, i - 1)
|
|
|
|
proceedWithoutSymbol:
|
|
ff = 0
|
|
ee = 0
|
|
dd = 0
|
|
neg = 0
|
|
FOR i = 1 TO LEN(a$)
|
|
a = ASC(a$, i)
|
|
IF a = 45 THEN
|
|
IF (i = 1 AND LEN(a$) > 1) OR (i > 1 AND ((dd > 0 AND dd = i - 1) OR (ee > 0 AND ee = i - 1) OR (ff > 0 AND ff = i - 1))) THEN neg = (i = 1): _CONTINUE
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF a = 46 THEN
|
|
IF dp = 1 THEN EXIT FUNCTION
|
|
dp = 1
|
|
_CONTINUE
|
|
END IF
|
|
IF a = 68 THEN 'dD
|
|
IF dd > 0 OR ee > 0 OR ff > 0 THEN EXIT FUNCTION
|
|
dd = i
|
|
IF neg <> 0 AND dd = 2 THEN EXIT FUNCTION
|
|
_CONTINUE
|
|
END IF
|
|
IF a = 69 THEN 'eE
|
|
IF dd > 0 OR ee > 0 OR ff > 0 THEN EXIT FUNCTION
|
|
ee = i
|
|
IF neg <> 0 AND ee = 2 THEN EXIT FUNCTION
|
|
_CONTINUE
|
|
END IF
|
|
IF a = 70 THEN 'fF
|
|
IF dd > 0 OR ee > 0 OR ff > 0 THEN EXIT FUNCTION
|
|
ff = i
|
|
IF neg <> 0 AND ff = 2 THEN EXIT FUNCTION
|
|
_CONTINUE
|
|
END IF
|
|
IF a = 43 THEN '+
|
|
IF (dd > 0 AND dd = i - 1) OR (ee > 0 AND ee = i - 1) OR (ff > 0 AND ff = i - 1) THEN _CONTINUE
|
|
EXIT FUNCTION
|
|
END IF
|
|
|
|
IF a >= 48 AND a <= 57 THEN _CONTINUE
|
|
EXIT FUNCTION
|
|
NEXT
|
|
isnumber = 1
|
|
END FUNCTION
|
|
|
|
'$INCLUDE:'wiki\wiki_methods.bas'
|
|
|
|
SUB printWrapStatus (x AS INTEGER, y AS INTEGER, initialX AS INTEGER, __text$)
|
|
DIM text$, nextWord$
|
|
DIM AS INTEGER i, findSep, findColorMarker, changeColor, changeColorAfter
|
|
text$ = __text$
|
|
|
|
LOCATE y, x
|
|
DO WHILE LEN(_TRIM$(text$))
|
|
findSep = INSTR(text$, " ")
|
|
IF findSep THEN
|
|
nextWord$ = LEFT$(text$, findSep)
|
|
ELSE
|
|
findSep = LEN(text$)
|
|
nextWord$ = text$
|
|
END IF
|
|
text$ = MID$(text$, findSep + 1)
|
|
IF POS(0) + LEN(nextWord$) > _WIDTH THEN
|
|
IF CSRLIN + 1 <= (idewy - 4) + 3 THEN
|
|
LOCATE CSRLIN + 1, initialX
|
|
ELSE
|
|
'no more room for printing
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
|
|
changeColor = 0
|
|
changeColorAfter = 0
|
|
skipSpace = 0
|
|
FOR i = 0 TO 2
|
|
findColorMarker = INSTR(nextWord$, CHR$(i))
|
|
IF findColorMarker = 1 THEN
|
|
nextWord$ = MID$(nextWord$, 2)
|
|
changeColor = i + 1
|
|
GOSUB applyColorChange
|
|
ELSEIF findColorMarker > 0 THEN
|
|
nextWord$ = LEFT$(nextWord$, findColorMarker - 1) + MID$(nextWord$, findColorMarker + 1)
|
|
IF RIGHT$(nextWord$, 1) = " " THEN
|
|
nextWord$ = RTRIM$(nextWord$)
|
|
skipSpace = -1
|
|
END IF
|
|
changeColorAfter = i + 1
|
|
END IF
|
|
NEXT
|
|
|
|
PRINT nextWord$;
|
|
|
|
IF changeColorAfter THEN
|
|
changeColor = changeColorAfter
|
|
GOSUB applyColorChange
|
|
IF skipSpace THEN LOCATE , POS(0) + 1
|
|
END IF
|
|
LOOP
|
|
EXIT SUB
|
|
|
|
applyColorChange:
|
|
SELECT EVERYCASE changeColor
|
|
CASE 1
|
|
IF _DEFAULTCOLOR <> 11 THEN COLOR 11 ELSE COLOR 7
|
|
CASE 2
|
|
COLOR 7, 1
|
|
CASE 3
|
|
COLOR 12, 6
|
|
END SELECT
|
|
RETURN
|
|
END SUB
|
|
|
|
FUNCTION GetBytes$(__value$, numberOfBytes&)
|
|
STATIC previousValue$, getBytesPosition&
|
|
|
|
value$ = __value$
|
|
IF value$ <> previousValue$ THEN
|
|
previousValue$ = value$
|
|
getBytesPosition& = 1
|
|
END IF
|
|
|
|
IF numberOfBytes& = 0 THEN EXIT FUNCTION
|
|
|
|
GetBytes$ = MID$(value$, getBytesPosition&, numberOfBytes&)
|
|
getBytesPosition& = getBytesPosition& + numberOfBytes&
|
|
END FUNCTION
|
|
|
|
SUB RetrieveSearchHistory (SearchHistory() as string)
|
|
fh = FREEFILE
|
|
OPEN ".\internal\temp\searched.bin" FOR BINARY AS #fh
|
|
redim _preserve SearchHistory(1 to 10000) AS STRING 'large initial array to hold the data
|
|
IF LOF(FH) THEN
|
|
Do until eof(fh)
|
|
ln = ln + 1
|
|
if ln > ubound(SearchHistory) then redim _preserve SearchHistory(1 to ln + 10000) AS STRING 'large resize, it necessary
|
|
line input #fh, SearchHistory(ln)
|
|
Loop
|
|
redim _preserve SearchHistory(1 to ln) AS STRING'resize to proper size before exit
|
|
ELSE
|
|
REDIM SearchHistory(1) AS STRING
|
|
SearchHistory(1) = ""
|
|
END IF
|
|
CLOSE #fh
|
|
end sub
|
|
|
|
'FUNCTION Download$ (url$, outputVar$, lookFor$, timelimit) STATIC
|
|
' 'as seen on http://www.qb64.org/wiki/Downloading_Files
|
|
' 'adapted for use in the IDE
|
|
|
|
' DIM theClient AS LONG, l AS LONG
|
|
' DIM prevUrl$, prevUrl2$, url2$, x AS LONG
|
|
' DIM e$, url3$, x$, t!, a2$, a$, i AS LONG
|
|
' DIM i2 AS LONG, i3 AS LONG, d$, fh AS LONG
|
|
|
|
' IF url$ <> prevUrl$ OR url$ = "" THEN
|
|
' prevUrl$ = url$
|
|
' IF url$ = "" THEN
|
|
' prevUrl2$ = ""
|
|
' IF theClient THEN CLOSE theClient: theClient = 0
|
|
' EXIT FUNCTION
|
|
' END IF
|
|
' url2$ = url$
|
|
' x = INSTR(url2$, "/")
|
|
' IF x THEN url2$ = LEFT$(url$, x - 1)
|
|
' IF url2$ <> prevUrl2$ THEN
|
|
' prevUrl2$ = url2$
|
|
' IF theClient THEN CLOSE theClient: theClient = 0
|
|
' theClient = _OPENCLIENT("TCP/IP:80:" + url2$)
|
|
' IF theClient = 0 THEN Download = MKI$(2): prevUrl$ = "": EXIT FUNCTION
|
|
' END IF
|
|
' e$ = CHR$(13) + CHR$(10) ' end of line characters
|
|
' url3$ = RIGHT$(url$, LEN(url$) - x + 1)
|
|
' x$ = "GET " + url3$ + " HTTP/1.1" + e$
|
|
' x$ = x$ + "Host: " + url2$ + e$ + e$
|
|
' PUT #theClient, , x$
|
|
' t! = TIMER ' start time
|
|
' END IF
|
|
|
|
' GET #theClient, , a2$
|
|
' a$ = a$ + a2$
|
|
' i = INSTR(a$, lookFor$)
|
|
' IF i THEN
|
|
' outputVar$ = a$
|
|
' Download = MKI$(1) + MKL$(i) 'indicates download was successful
|
|
' prevUrl$ = ""
|
|
' prevUrl2$ = ""
|
|
' a$ = ""
|
|
' CLOSE theClient
|
|
' theClient = 0
|
|
' EXIT FUNCTION
|
|
' END IF ' i
|
|
' IF TIMER > t! + timelimit THEN CLOSE theClient: theClient = 0: Download = MKI$(3): prevUrl$ = "": EXIT FUNCTION
|
|
' Download = MKI$(0) 'still working
|
|
'END FUNCTION
|
|
|
|
|