1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-05 03:00:25 +00:00

Adds support for watching multiple indexes arrays of UDTs.

Not multiple dimensions yet tho.
This commit is contained in:
FellippeHeitor 2021-08-24 02:13:42 -03:00
parent 62f3496c36
commit 38fe93a6cf
4 changed files with 517 additions and 134 deletions

View file

@ -7,8 +7,8 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
STATIC AS _OFFSET vw_idehwnd STATIC AS _OFFSET vw_idehwnd
STATIC vw_buffer$ STATIC vw_buffer$
DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize DIM AS LONG vw_i, vw_tempIndex, vw_localIndex, vw_varSize, vw_cmdsize
DIM AS LONG vw_arrayelementsize DIM AS LONG vw_arrayelementsize, vw_element, vw_elementoffset, vw_storage
DIM AS _OFFSET vw_address, vw_elementoffset, vw_lbound, vw_ubound DIM AS _OFFSET vw_address, vw_lbound, vw_ubound
DIM AS _MEM vw_m, vw_m2 DIM AS _MEM vw_m, vw_m2
DIM AS _BYTE vw_isarray DIM AS _BYTE vw_isarray
DIM vw_start!, vw_temp$, vw_cmd$, vw_value$, vw_k&, vw_buf$, vw_scope$, vw_varType$ DIM vw_start!, vw_temp$, vw_cmd$, vw_value$, vw_k&, vw_buf$, vw_scope$, vw_varType$
@ -261,16 +261,18 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
vw_localIndex = CVL(MID$(vw_value$, 6, 4)) vw_localIndex = CVL(MID$(vw_value$, 6, 4))
vw_arrayIndex = CVL(MID$(vw_value$, 10, 4)) vw_arrayIndex = CVL(MID$(vw_value$, 10, 4))
vw_arrayelementsize = CVL(MID$(vw_value$, 14, 4)) vw_arrayelementsize = CVL(MID$(vw_value$, 14, 4))
vw_elementoffset = _CV(_OFFSET, MID$(vw_value$, 18, LEN(vw_elementoffset))) vw_element = CVL(MID$(vw_value$, 18, 4))
vw_varSize = CVL(MID$(vw_value$, 18 + LEN(vw_elementoffset), 4)) vw_elementoffset = CVL(MID$(vw_value$, 22, 4))
vw_varSize = CVL(MID$(vw_value$, 26, 4))
IF vw_varSize = 0 THEN GOTO cmdProcessingDone IF vw_varSize = 0 THEN GOTO cmdProcessingDone
vw_i = CVI(MID$(vw_value$, 22 + LEN(vw_elementoffset), 2)) vw_storage = CVL(MID$(vw_value$, 30, 4))
vw_i = CVI(MID$(vw_value$, 34, 2))
IF vw_i THEN IF vw_i THEN
vw_scope$ = MID$(vw_value$, 24 + LEN(vw_elementoffset), vw_i) vw_scope$ = MID$(vw_value$, 36, vw_i)
vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset) + vw_i, 2)) vw_i = CVI(MID$(vw_value$, 36 + vw_i, 2))
vw_varType$ = RIGHT$(vw_value$, vw_i) vw_varType$ = RIGHT$(vw_value$, vw_i)
ELSE ELSE
vw_i = CVI(MID$(vw_value$, 24 + LEN(vw_elementoffset), 2)) vw_i = CVI(MID$(vw_value$, 36, 2))
vw_varType$ = RIGHT$(vw_value$, vw_i) vw_varType$ = RIGHT$(vw_value$, vw_i)
END IF END IF
IF vw_cmd$ = "get global var" THEN IF vw_cmd$ = "get global var" THEN
@ -368,7 +370,7 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET)
_MEMCOPY vw_m, vw_m.OFFSET, vw_m.SIZE TO vw_m2, vw_m2.OFFSET _MEMCOPY vw_m, vw_m.OFFSET, vw_m.SIZE TO vw_m2, vw_m2.OFFSET
END IF END IF
vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKL$(vw_arrayIndex) + vw_buf$ vw_cmd$ = "address read:" + MKL$(vw_tempIndex) + MKL$(vw_arrayIndex) + MKL$(vw_element) + MKL$(vw_storage) + vw_buf$
GOSUB SendCommand GOSUB SendCommand
CASE "set global address", "set local address" CASE "set global address", "set local address"
vw_localIndex = CVL(LEFT$(vw_value$, 4)) vw_localIndex = CVL(LEFT$(vw_value$, 4))

View file

@ -12,7 +12,7 @@ DIM SHARED IdeInfo AS STRING
DIM SHARED IdeContextHelpSF AS _BYTE DIM SHARED IdeContextHelpSF AS _BYTE
DIM SHARED host&, debugClient&, hostport$, variableWatchList$ DIM SHARED host&, debugClient&, hostport$, variableWatchList$
DIM SHARED vWatchArrayReceivedData$(1 TO 1000), nextvWatchArraySlot DIM SHARED vWatchReceivedData$(1 TO 1000), nextvWatchDataSlot
DIM SHARED startPausedPending AS _BYTE DIM SHARED startPausedPending AS _BYTE
DIM SHARED IdeSystem AS LONG DIM SHARED IdeSystem AS LONG

View file

@ -742,9 +742,7 @@ FUNCTION ide2 (ignore)
'$DEBUG mode on '$DEBUG mode on
IdeDebugMode = 1 IdeDebugMode = 1
FOR x = 1 TO totalVariablesCreated REDIM vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$)) 'empty data array
IF usedVariableList(x).isarray = 0 THEN usedVariableList(x).mostRecentValue = ""
NEXT
EnterDebugMode: EnterDebugMode:
IF idehelp THEN IF idehelp THEN
@ -7144,7 +7142,7 @@ SUB DebugMode
END IF END IF
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$ cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$
GOSUB SendCommand GOSUB SendCommand
usedVariableList(tempIndex&).mostRecentValue = MID$(result$, 5) 'usedVariableList(tempIndex&).mostRecentValue = MID$(result$, 5)
PCOPY 3, 0: SCREEN , , 3, 0 PCOPY 3, 0: SCREEN , , 3, 0
WHILE _MOUSEINPUT: WEND WHILE _MOUSEINPUT: WEND
GOSUB UpdateDisplay GOSUB UpdateDisplay
@ -7152,7 +7150,7 @@ SUB DebugMode
END SELECT END SELECT
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$ cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) + MKL$(varSize&) + value$
GOSUB SendCommand GOSUB SendCommand
usedVariableList(tempIndex&).mostRecentValue = result$ 'usedVariableList(tempIndex&).mostRecentValue = result$
PCOPY 3, 0: SCREEN , , 3, 0 PCOPY 3, 0: SCREEN , , 3, 0
WHILE _MOUSEINPUT: WEND WHILE _MOUSEINPUT: WEND
@ -7387,7 +7385,9 @@ SUB DebugMode
DO WHILE LEN(temp$) DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4)) tempIndex& = CVL(LEFT$(temp$, 4))
tempArrayIndex& = CVL(MID$(temp$, 5, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4))
temp$ = MID$(temp$, 9) tempElement& = CVL(MID$(temp$, 9, 4))
tempStorage& = CVL(MID$(temp$, 13, 4))
temp$ = MID$(temp$, 17)
IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN
cmd$ = "get global var:" cmd$ = "get global var:"
ELSE ELSE
@ -7400,8 +7400,15 @@ SUB DebugMode
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex) cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).localIndex)
cmd$ = cmd$ + MKL$(tempArrayIndex&) cmd$ = cmd$ + MKL$(tempArrayIndex&)
cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize) cmd$ = cmd$ + MKL$(usedVariableList(tempIndex&).arrayElementSize)
cmd$ = cmd$ + _MK$(_OFFSET, usedVariableList(tempIndex&).elementOffset) 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$(varSize&)
cmd$ = cmd$ + MKL$(tempStorage&)
cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc)) cmd$ = cmd$ + MKI$(LEN(usedVariableList(tempIndex&).subfunc))
cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc cmd$ = cmd$ + usedVariableList(tempIndex&).subfunc
cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$ cmd$ = cmd$ + MKI$(LEN(varType$)) + varType$
@ -7416,7 +7423,9 @@ SUB DebugMode
CASE "address read" CASE "address read"
tempIndex& = CVL(LEFT$(value$, 4)) tempIndex& = CVL(LEFT$(value$, 4))
tempArrayIndex& = CVL(MID$(value$, 5, 4)) tempArrayIndex& = CVL(MID$(value$, 5, 4))
recvData$ = MID$(value$, 9) tempElement& = CVL(MID$(value$, 9, 4))
tempStorage& = CVL(MID$(value$, 13, 4))
recvData$ = MID$(value$, 17)
GOSUB GetVarSize GOSUB GetVarSize
SELECT CASE varType$ SELECT CASE varType$
CASE "_BYTE", "BYTE": recvData$ = STR$(_CV(_BYTE, recvData$)) CASE "_BYTE", "BYTE": recvData$ = STR$(_CV(_BYTE, recvData$))
@ -7434,15 +7443,7 @@ SUB DebugMode
CASE "_UNSIGNED _OFFSET", "UNSIGNED OFFSET": recvData$ = STR$(_CV(_UNSIGNED _OFFSET, recvData$)) CASE "_UNSIGNED _OFFSET", "UNSIGNED OFFSET": recvData$ = STR$(_CV(_UNSIGNED _OFFSET, recvData$))
'CASE "STRING": 'no conversion required 'CASE "STRING": 'no conversion required
END SELECT END SELECT
IF usedVariableList(tempIndex&).isarray THEN vWatchReceivedData$(tempStorage&) = recvData$
seqIndex& = INSTR(usedVariableList(tempIndex&).indexes, MKL$(tempArrayIndex&))
IF seqIndex& <= LEN(usedVariableList(tempIndex&).mostRecentValue) - 3 THEN
storageSlot& = CVL(MID$(usedVariableList(tempIndex&).mostRecentValue, seqIndex&, 4))
vWatchArrayReceivedData$(storageSlot&) = recvData$
END IF
ELSE
usedVariableList(tempIndex&).mostRecentValue = recvData$
END IF
IF PauseMode THEN GOSUB UpdateDisplay IF PauseMode THEN GOSUB UpdateDisplay
CASE "current sub" CASE "current sub"
currentSub$ = value$ currentSub$ = value$
@ -7609,7 +7610,7 @@ SUB DebugMode
CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET": varSize& = LEN(dummy%&) CASE "_OFFSET", "_UNSIGNED _OFFSET", "OFFSET", "UNSIGNED OFFSET": varSize& = LEN(dummy%&)
CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&) CASE "STRING": varSize& = LEN(dummy%&) + LEN(dummy&)
CASE ELSE 'UDT? CASE ELSE 'UDT?
varType$ = usedVariableList(tempIndex&).elementTypes varType$ = getelement(usedVariableList(tempIndex&).elementTypes, tempElement&)
IF LEN(varType$) THEN GOTO checkVarType IF LEN(varType$) THEN GOTO checkVarType
END SELECT END SELECT
RETURN RETURN
@ -7627,7 +7628,7 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
'new setup 'new setup
previousVariableWatchList$ = variableWatchList$ previousVariableWatchList$ = variableWatchList$
longestVarName = CVL(LEFT$(variableWatchList$, 4)) longestVarName = CVL(LEFT$(variableWatchList$, 4))
totalVisibleVariables = (LEN(variableWatchList$) - 4) \ 8 totalVisibleVariables = (LEN(variableWatchList$) - 4) \ 16
this.h = totalVisibleVariables + 2 this.h = totalVisibleVariables + 2
IF this.h > idewy - 10 THEN this.h = idewy - 10 IF this.h > idewy - 10 THEN this.h = idewy - 10
IF this.h < 5 THEN this.h = 5 IF this.h < 5 THEN this.h = 5
@ -7666,7 +7667,9 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
DO WHILE LEN(temp$) DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4)) tempIndex& = CVL(LEFT$(temp$, 4))
tempArrayIndex& = CVL(MID$(temp$, 5, 4)) tempArrayIndex& = CVL(MID$(temp$, 5, 4))
temp$ = MID$(temp$, 9) tempElement& = CVL(MID$(temp$, 9, 4))
tempStorage& = CVL(MID$(temp$, 13, 4))
temp$ = MID$(temp$, 17)
i = i + 1 i = i + 1
IF this.firstVisible > i AND WatchListToConsole <> 0 THEN _CONTINUE IF this.firstVisible > i AND WatchListToConsole <> 0 THEN _CONTINUE
y = y + 1 y = y + 1
@ -7677,20 +7680,19 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, totalVisibleVariabl
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + _ thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + _
LTRIM$(STR$(tempArrayIndex&)) + ")" LTRIM$(STR$(tempArrayIndex&)) + ")"
END IF END IF
thisName$ = thisName$ + usedVariableList(tempIndex&).elements IF tempElement& THEN
tempElementList$ = MID$(usedVariableList(tempIndex&).elements, 5)
thisName$ = thisName$ + getelement$(tempElementList$, tempElement&)
END IF
item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = " item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = "
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
thisIsAString = (INSTR(usedVariableList(tempIndex&).varType, "STRING *") > 0 OR usedVariableList(tempIndex&).varType = "STRING") IF tempElement& THEN
IF usedVariableList(tempIndex&).isarray THEN tempVarType$ = getelement$(usedVariableList(tempIndex&).elementTypes, tempElement&)
seqIndex& = INSTR(usedVariableList(tempIndex&).indexes, MKL$(tempArrayIndex&))
IF seqIndex& <= LEN(usedVariableList(tempIndex&).mostRecentValue) - 3 THEN
storageSlot& = CVL(MID$(usedVariableList(tempIndex&).mostRecentValue, seqIndex&, 4))
tempValue$ = vWatchArrayReceivedData$(storageSlot&)
END IF
ELSE ELSE
tempValue$ = usedVariableList(tempIndex&).mostRecentValue tempVarType$ = usedVariableList(tempIndex&).varType
END IF END IF
thisIsAString = (INSTR(tempVarType$, "STRING *") > 0 OR tempVarType$ = "STRING")
tempValue$ = vWatchReceivedData$(tempStorage&)
IF thisIsAString THEN IF thisIsAString THEN
item$ = item$ + CHR$(34) + tempValue$ + CHR$(34) item$ = item$ + CHR$(34) + tempValue$ + CHR$(34)
ELSE ELSE
@ -7783,6 +7785,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
TYPE varDlgList TYPE varDlgList
AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator
AS _BYTE selected AS _BYTE selected
AS STRING varType
END TYPE END TYPE
REDIM varDlgList(1 TO totalVariablesCreated) AS varDlgList REDIM varDlgList(1 TO totalVariablesCreated) AS varDlgList
@ -7965,7 +7968,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
i = o(varListBox).sel i = o(varListBox).sel
IF usedVariableList(varDlgList(i).index).subfunc = currentScope$ OR usedVariableList(varDlgList(i).index).subfunc = "" THEN IF usedVariableList(varDlgList(i).index).subfunc = currentScope$ OR usedVariableList(varDlgList(i).index).subfunc = "" THEN
'scope is valid 'scope is valid
a2$ = usedVariableList(varDlgList(i).index).mostRecentValue 'a2$ = usedVariableList(varDlgList(i).index).mostRecentValue
IF INSTR(usedVariableList(varDlgList(i).index).varType, "STRING") THEN IF INSTR(usedVariableList(varDlgList(i).index).varType, "STRING") THEN
thisWidth = idewx - 20 thisWidth = idewx - 20
ELSE ELSE
@ -7994,34 +7997,85 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
(IdeDebugMode > 0 AND focus = 6 AND info <> 0) THEN (IdeDebugMode > 0 AND focus = 6 AND info <> 0) THEN
variableWatchList$ = "" variableWatchList$ = ""
longestVarName = 0 longestVarName = 0
nextvWatchArraySlot = 0 nextvWatchDataSlot = 0
FOR y = 1 TO totalVariablesCreated FOR y = 1 TO totalVariablesCreated
usedVariableList(y).mostRecentValue = ""
IF usedVariableList(y).watch THEN IF usedVariableList(y).watch THEN
thisLen = LEN(usedVariableList(y).name) + LEN(usedVariableList(y).elements) thisLen = LEN(usedVariableList(y).name)
IF usedVariableList(y).isarray THEN IF usedVariableList(y).isarray THEN
thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(y).indexes, 4)))) - 1 thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(y).indexes, 4)))) - 1
END IF END IF
IF LEN(usedVariableList(y).elements) THEN
thisLen = thisLen + CVL(LEFT$(usedVariableList(y).elements, 4))
END IF
IF thisLen > longestVarName THEN IF thisLen > longestVarName THEN
longestVarName = thisLen longestVarName = thisLen
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4) IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4)
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName) MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
END IF END IF
IF usedVariableList(y).isarray THEN
IF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) = 0 THEN
'array of native data type
temp$ = usedVariableList(y).indexes temp$ = usedVariableList(y).indexes
DO WHILE LEN(temp$) DO WHILE LEN(temp$)
variableWatchList$ = variableWatchList$ + MKL$(y) + LEFT$(temp$, 4) nextvWatchDataSlot = nextvWatchDataSlot + 1
nextvWatchArraySlot = nextvWatchArraySlot + 1 WHILE nextvWatchDataSlot > UBOUND(vWatchReceivedData$)
WHILE nextvWatchArraySlot > UBOUND(vWatchArrayReceivedData$) REDIM _PRESERVE vWatchReceivedData$(1 TO UBOUND(vWatchReceivedData$) + 999)
REDIM _PRESERVE vWatchArrayReceivedData$(1 TO UBOUND(vWatchArrayReceivedData$) + 999)
WEND WEND
usedVariableList(y).mostRecentValue = usedVariableList(y).mostRecentValue + MKL$(nextvWatchArraySlot) variableWatchList$ = variableWatchList$ + MKL$(y) + LEFT$(temp$, 4) + MKL$(0) + MKL$(nextvWatchDataSlot)
vWatchArrayReceivedData$(nextvWatchArraySlot) = "" usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
vWatchReceivedData$(nextvWatchDataSlot) = ""
temp$ = MID$(temp$, 5) temp$ = MID$(temp$, 5)
LOOP LOOP
ELSE ELSEIF usedVariableList(y).isarray <> 0 AND LEN(usedVariableList(y).elements) > 0 THEN
variableWatchList$ = variableWatchList$ + MKL$(y) + MKL$(0) 'array of UDT
temp$ = usedVariableList(y).indexes
DO WHILE LEN(temp$)
thisTempElement$ = MKL$(y) + LEFT$(temp$, 4)
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
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(nextvWatchDataSlot)
usedVariableList(y).storage = usedVariableList(y).storage + MKL$(nextvWatchDataSlot)
vWatchReceivedData$(nextvWatchDataSlot) = ""
LOOP
temp$ = MID$(temp$, 5)
LOOP
ELSEIF usedVariableList(y).isarray = 0 AND LEN(usedVariableList(y).elements) > 0 THEN
'single variable of UDT
thisTempElement$ = 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
variableWatchList$ = variableWatchList$ + thisTempElement$ + MKL$(i) + MKL$(nextvWatchDataSlot)
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$(y) + MKL$(0) + MKL$(0) + MKL$(nextvWatchDataSlot)
usedVariableList(y).storage = MKL$(nextvWatchDataSlot)
END IF END IF
END IF END IF
NEXT NEXT
@ -8071,9 +8125,6 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
temp$ = parseRange$(v$) temp$ = parseRange$(v$)
usedVariableList(varDlgList(y).index).indexes = temp$ usedVariableList(varDlgList(y).index).indexes = temp$
temp$ = formatRange$(temp$) temp$ = formatRange$(temp$)
IF usedVariableList(varDlgList(y).index).watchRange <> temp$ THEN
usedVariableList(x).mostRecentValue = ""
END IF
usedVariableList(varDlgList(y).index).watchRange = temp$ usedVariableList(varDlgList(y).index).watchRange = temp$
ELSE ELSE
usedVariableList(varDlgList(y).index).indexes = "" usedVariableList(varDlgList(y).index).indexes = ""
@ -8093,23 +8144,37 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
varType$ = usedVariableList(varDlgList(y).index).varType varType$ = usedVariableList(varDlgList(y).index).varType
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING" IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
nativeDataTypes$ = "@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@"
IF INSTR(nativeDataTypes$, varType$) = 0 THEN IF INSTR(nativeDataTypes$, varType$) = 0 THEN
'It's a UDT 'It's a UDT
temp$ = usedVariableList(varDlgList(y).index).name + "." elementIndexes$ = ""
v$ = ideinputbox$("Watch UDT", temp$, "", "", 45, 0, ok) 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, ok)
PCOPY 2, 0
PCOPY 2, 1
SCREEN , , 1, 0
IF ok THEN IF ok THEN
IF LEFT$(v$, 1) <> "." THEN v$ = "." + v$ longestElementName = 0
usedVariableList(varDlgList(y).index).elements = v$ usedVariableList(varDlgList(y).index).elements = ""
v$ = lineformat$(UCASE$(v$))
getid usedVariableList(varDlgList(y).index).id getid usedVariableList(varDlgList(y).index).id
IF id.t = 0 THEN IF id.t = 0 THEN
typ = id.arraytype AND 511 typ = id.arraytype AND 511
IF id.arraytype AND ISINCONVENTIONALMEMORY THEN IF id.arraytype AND ISINCONVENTIONALMEMORY THEN
typ = typ - ISINCONVENTIONALMEMORY typ = typ - ISINCONVENTIONALMEMORY
END IF END IF
END IF
IF usedVariableList(varDlgList(y).index).isarray THEN
usedVariableList(varDlgList(y).index).arrayElementSize = udtxsize(typ) usedVariableList(varDlgList(y).index).arrayElementSize = udtxsize(typ)
IF udtxbytealign(typ) THEN 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 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
@ -8118,68 +8183,90 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
ELSE ELSE
usedVariableList(varDlgList(y).index).arrayElementSize = 0 usedVariableList(varDlgList(y).index).arrayElementSize = 0
END IF END IF
Error_Happened = 0
result$ = udtreference$("", v$, typ) temp$ = v$
IF Error_Happened THEN 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 Error_Happened = 0
result = idemessagebox("Error", Error_Message, "#OK") result$ = udtreference$("", v$, typ)
usedVariableList(varDlgList(y).index).watch = 0 IF Error_Happened THEN
usedVariableList(varDlgList(y).index).elements = "" 'shouldn't ever happen
usedVariableList(varDlgList(y).index).elementOffset = 0 Error_Happened = 0
GOTO unWatch result = idemessagebox("Error", Error_Message, "#OK")
ELSE usedVariableList(varDlgList(y).index).watch = 0
typ = typ - ISUDT usedVariableList(varDlgList(y).index).elements = ""
typ = typ - ISREFERENCE usedVariableList(varDlgList(y).index).elementOffset = ""
IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY GOTO unWatch
SELECT CASE typ ELSE
CASE BYTETYPE typ = typ - ISUDT
usedVariableList(varDlgList(y).index).elementTypes = "_BYTE" typ = typ - ISREFERENCE
CASE UBYTETYPE IF typ AND ISINCONVENTIONALMEMORY THEN typ = typ - ISINCONVENTIONALMEMORY
usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _BYTE" SELECT CASE typ
CASE INTEGERTYPE CASE BYTETYPE
usedVariableList(varDlgList(y).index).elementTypes = "INTEGER" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_BYTE" + sp
CASE UINTEGERTYPE CASE UBYTETYPE
usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED INTEGER" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _BYTE" + sp
CASE LONGTYPE CASE INTEGERTYPE
usedVariableList(varDlgList(y).index).elementTypes = "LONG" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "INTEGER" + sp
CASE ULONGTYPE CASE UINTEGERTYPE
usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED LONG" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED INTEGER" + sp
CASE INTEGER64TYPE CASE LONGTYPE
usedVariableList(varDlgList(y).index).elementTypes = "_INTEGER64" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "LONG" + sp
CASE UINTEGER64TYPE CASE ULONGTYPE
usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _INTEGER64" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED LONG" + sp
CASE SINGLETYPE CASE INTEGER64TYPE
usedVariableList(varDlgList(y).index).elementTypes = "SINGLE" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_INTEGER64" + sp
CASE DOUBLETYPE CASE UINTEGER64TYPE
usedVariableList(varDlgList(y).index).elementTypes = "DOUBLE" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_UNSIGNED _INTEGER64" + sp
CASE FLOATTYPE CASE SINGLETYPE
usedVariableList(varDlgList(y).index).elementTypes = "_FLOAT" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "SINGLE" + sp
CASE OFFSETTYPE CASE DOUBLETYPE
usedVariableList(varDlgList(y).index).elementTypes = "_OFFSET" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "DOUBLE" + sp
CASE UOFFSETTYPE CASE FLOATTYPE
usedVariableList(varDlgList(y).index).elementTypes = "_UNSIGNED _OFFSET" usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_FLOAT" + sp
CASE ELSE CASE OFFSETTYPE
IF typ AND ISSTRING THEN usedVariableList(varDlgList(y).index).elementTypes = usedVariableList(varDlgList(y).index).elementTypes + "_OFFSET" + sp
IF (typ AND ISFIXEDLENGTH) = 0 THEN CASE UOFFSETTYPE
usedVariableList(varDlgList(y).index).elementTypes = "STRING" 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 ELSE
'E contains the UDT element index at this point 'shouldn't ever happen
usedVariableList(varDlgList(y).index).elementTypes = "STRING *" + STR$(udtetypesize(E)) usedVariableList(varDlgList(y).index).watch = 0
usedVariableList(varDlgList(y).index).elements = ""
usedVariableList(varDlgList(y).index).elementOffset = ""
result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK")
GOTO unWatch
END IF END IF
ELSE END SELECT
usedVariableList(varDlgList(y).index).watch = 0 usedVariableList(varDlgList(y).index).elementOffset = usedVariableList(varDlgList(y).index).elementOffset + MKL$(VAL(MID$(result$, _INSTRREV(result$, sp3) + 1)))
usedVariableList(varDlgList(y).index).elements = "" END IF
usedVariableList(varDlgList(y).index).elementOffset = 0 '-------
result = idemessagebox("Error", "Cannot add full UDT to Watch List", "#OK") LOOP
GOTO unWatch 'remove trailing sp:
END IF usedVariableList(varDlgList(y).index).elements = LEFT$(usedVariableList(varDlgList(y).index).elements, LEN(usedVariableList(varDlgList(y).index).elements) - 1)
END SELECT usedVariableList(varDlgList(y).index).elementTypes = LEFT$(usedVariableList(varDlgList(y).index).elementTypes, LEN(usedVariableList(varDlgList(y).index).elementTypes) - 1)
usedVariableList(varDlgList(y).index).elementOffset = VAL(MID$(result$, _INSTRREV(result$, sp3) + 1))
END IF
ELSE ELSE
usedVariableList(varDlgList(y).index).watch = 0 usedVariableList(varDlgList(y).index).watch = 0
usedVariableList(varDlgList(y).index).elements = ""
usedVariableList(varDlgList(y).index).elementOffset = 0
GOTO unWatch GOTO unWatch
END IF END IF
END IF END IF
@ -8252,7 +8339,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF LEN(searchTerm$) THEN IF LEN(searchTerm$) THEN
thisScope$ = usedVariableList(x).subfunc thisScope$ = usedVariableList(x).subfunc
IF thisScope$ = "" THEN thisScope$ = mainmodule$ IF thisScope$ = "" THEN thisScope$ = mainmodule$
item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ + usedVariableList(x).mostRecentValue item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$
IF multiSearch(item$, searchTerm$) = 0 THEN IF multiSearch(item$, searchTerm$) = 0 THEN
_CONTINUE 'skip variable if no field matches the search _CONTINUE 'skip variable if no field matches the search
END IF END IF
@ -8292,13 +8379,17 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN
'it's ok 'it's ok
ELSE ELSE
usedVariableList(x).mostRecentValue = "" 'usedVariableList(x).mostRecentValue = ""
END IF END IF
IF LEN(searchTerm$) THEN IF LEN(searchTerm$) THEN
thisScope$ = usedVariableList(x).subfunc thisScope$ = usedVariableList(x).subfunc
IF thisScope$ = "" THEN thisScope$ = mainmodule$ IF thisScope$ = "" THEN thisScope$ = mainmodule$
item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$ + usedVariableList(x).mostRecentValue item$ = usedVariableList(x).name + usedVariableList(x).varType + thisScope$
IF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 AND LEN(usedVariableList(x).storage) = 4 THEN
'single var
item$ = item$ + vWatchReceivedData$(CVL(usedVariableList(x).storage))
END IF
IF multiSearch(item$, searchTerm$) = 0 THEN IF multiSearch(item$, searchTerm$) = 0 THEN
_CONTINUE 'skip variable if no field matches the search _CONTINUE 'skip variable if no field matches the search
END IF END IF
@ -8356,22 +8447,24 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN IF usedVariableList(x).subfunc = currentScope$ OR usedVariableList(x).subfunc = "" THEN
IF usedVariableList(x).watch THEN IF usedVariableList(x).watch THEN
thisIsAString = (INSTR(usedVariableList(x).varType, "STRING *") > 0 OR usedVariableList(x).varType = "STRING") thisIsAString = (INSTR(usedVariableList(x).varType, "STRING *") > 0 OR usedVariableList(x).varType = "STRING")
IF usedVariableList(x).isarray THEN IF usedVariableList(x).isarray <> 0 AND LEN(usedVariableList(x).elements) = 0 THEN
temp$ = usedVariableList(x).mostRecentValue 'array of native data type
temp$ = usedVariableList(x).storage
IF LEN(temp$) THEN l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) + "{" IF LEN(temp$) THEN l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) + "{"
DO WHILE LEN(temp$) DO WHILE LEN(temp$)
storageSlot& = CVL(LEFT$(temp$, 4)) storageSlot& = CVL(LEFT$(temp$, 4))
temp$ = MID$(temp$, 5) temp$ = MID$(temp$, 5)
IF thisIsAString THEN l$ = l$ + CHR$(34) IF thisIsAString THEN l$ = l$ + CHR$(34)
l$ = l$ + StrReplace$(vWatchArrayReceivedData$(storageSlot&), CHR$(0), " ") l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
IF thisIsAString THEN l$ = l$ + CHR$(34) IF thisIsAString THEN l$ = l$ + CHR$(34)
IF LEN(temp$) THEN l$ = l$ + "," IF LEN(temp$) THEN l$ = l$ + ","
LOOP LOOP
IF LEN(usedVariableList(x).mostRecentValue) THEN l$ = l$ + "}" IF LEN(usedVariableList(x).storage) THEN l$ = l$ + "}"
ELSE ELSEIF usedVariableList(x).isarray = 0 AND LEN(usedVariableList(x).elements) = 0 THEN
storageSlot& = CVL(usedVariableList(x).storage)
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor) l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
IF thisIsAString THEN l$ = l$ + CHR$(34) IF thisIsAString THEN l$ = l$ + CHR$(34)
l$ = l$ + StrReplace$(usedVariableList(x).mostRecentValue, CHR$(0), " ") l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
IF thisIsAString THEN l$ = l$ + CHR$(34) IF thisIsAString THEN l$ = l$ + CHR$(34)
END IF END IF
END IF END IF
@ -8385,6 +8478,291 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
RETURN RETURN
END FUNCTION END FUNCTION
FUNCTION ideelementwatchbox$(currentPath$, elementIndexes$, level, 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
idepar p, dialogWidth, dialogHeight, "Add UDT Elements"
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
o(buttonSet).txt = idenewtxt("#Add All" + sep + "#Remove All" + sep + "#Close")
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 'add all
FOR y = 1 TO totalElements
varType$ = varDlgList(y).varType
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
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
_CONTINUE
END IF
IF (focus = 3 AND info <> 0) THEN '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
_CONTINUE
END IF
IF K$ = CHR$(27) OR (focus = 4 AND info <> 0) THEN
'build element list to return
FOR y = 1 TO totalElements
IF varDlgList(y).selected THEN
varType$ = varDlgList(y).varType
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
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
ok = LEN(returnList$) > 0
IF level = 0 THEN returnList$ = StrReplace$(returnList$, currentPath$, ".")
ideelementwatchbox$ = returnList$
IF mousedown THEN
DO
GetInput
_LIMIT 100
LOOP UNTIL mRELEASE
END IF
EXIT FUNCTION
END IF
IF mCLICK AND focus = 1 THEN 'list click
IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(varListBox).sel THEN
GOTO toggleWatch
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
varDlgList(y).selected = NOT varDlgList(y).selected
IF varDlgList(y).selected THEN
varType$ = varDlgList(y).varType
IF INSTR(varType$, "STRING *") THEN varType$ = "STRING"
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, ok2)
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
_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
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$) FUNCTION formatRange$(__text$)
'__text$ is a series of MKL$(values) concatenated '__text$ is a series of MKL$(values) concatenated
temp$ = __text$ temp$ = __text$

View file

@ -33,6 +33,9 @@ vWatchVariableExclusions$ = "@__LONG_VWATCH_LINENUMBER@__LONG_VWATCH_SUBLEVEL@__
"@__STRING_VWATCH_SUBNAME@__STRING_VWATCH_CALLSTACK@__ARRAY_BYTE_VWATCH_BREAKPOINTS" + _ "@__STRING_VWATCH_SUBNAME@__STRING_VWATCH_CALLSTACK@__ARRAY_BYTE_VWATCH_BREAKPOINTS" + _
"@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@__ARRAY_STRING_VWATCH_STACK@" "@__ARRAY_BYTE_VWATCH_SKIPLINES@__STRING_VWATCH_INTERNALSUBNAME@__ARRAY_STRING_VWATCH_STACK@"
DIM SHARED nativeDataTypes$
nativeDataTypes$ = "@_BYTE@_UNSIGNED _BYTE@BYTE@UNSIGNED BYTE@INTEGER@_UNSIGNED INTEGER@UNSIGNED INTEGER@LONG@_UNSIGNED LONG@UNSIGNED LONG@_INTEGER64@INTEGER64@_UNSIGNED _INTEGER64@UNSIGNED INTEGER64@SINGLE@DOUBLE@_FLOAT@FLOAT@STRING@"
DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState DIM SHARED qb64prefix_set_recompileAttempts, qb64prefix_set_desiredState
DIM SHARED opex_recompileAttempts, opex_desiredState DIM SHARED opex_recompileAttempts, opex_desiredState
DIM SHARED opexarray_recompileAttempts, opexarray_desiredState DIM SHARED opexarray_recompileAttempts, opexarray_desiredState
@ -112,9 +115,9 @@ TYPE usedVarList
AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex
AS LONG arrayElementSize AS LONG arrayElementSize
AS _BYTE used, watch, isarray AS _BYTE used, watch, isarray
AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue AS STRING name, cname, varType, includedFile, subfunc
AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs
AS _OFFSET elementOffset AS STRING elementOffset, storage
END TYPE END TYPE
DIM SHARED totalVariablesCreated AS LONG DIM SHARED totalVariablesCreated AS LONG
@ -25956,7 +25959,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
usedVariableList(i).id = currentid usedVariableList(i).id = currentid
usedVariableList(i).used = 0 usedVariableList(i).used = 0
usedVariableList(i).watch = 0 usedVariableList(i).watch = 0
usedVariableList(i).mostRecentValue = "" usedVariableList(i).storage = ""
usedVariableList(i).linenumber = linenumber usedVariableList(i).linenumber = linenumber
usedVariableList(i).includeLevel = inclevel usedVariableList(i).includeLevel = inclevel
IF inclevel > 0 THEN IF inclevel > 0 THEN
@ -25989,7 +25992,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
usedVariableList(i).indexes = "" usedVariableList(i).indexes = ""
usedVariableList(i).elements = "" usedVariableList(i).elements = ""
usedVariableList(i).elementTypes = "" usedVariableList(i).elementTypes = ""
usedVariableList(i).elementOffset = 0 usedVariableList(i).elementOffset = ""
totalVariablesCreated = totalVariablesCreated + 1 totalVariablesCreated = totalVariablesCreated + 1
END IF END IF
CASE ELSE 'find and mark as used CASE ELSE 'find and mark as used