in src/dataEditor/dataEditorClient.ts [390:648]
private async messageReceiver(message: EditorMessage) {
switch (message.command) {
case MessageCommand.showMessage:
switch (message.data.messageLevel as MessageLevel) {
case MessageLevel.Error:
vscode.window.showErrorMessage(message.data.message)
break
case MessageLevel.Info:
vscode.window.showInformationMessage(message.data.message)
break
case MessageLevel.Warn:
vscode.window.showWarningMessage(message.data.message)
break
}
break
case MessageCommand.scrollViewport:
await this.scrollViewport(
this.panel,
this.currentViewportId,
message.data.scrollOffset,
message.data.bytesPerRow
)
break
case MessageCommand.editorOnChange:
{
this.displayState.editorEncoding = message.data.encoding
const encodeDataAs =
message.data.editMode === EditByteModes.Single
? 'hex'
: this.displayState.editorEncoding
if (
message.data.selectionData &&
message.data.selectionData.length > 0
) {
await this.panel.webview.postMessage({
command: MessageCommand.editorOnChange,
display: dataToEncodedStr(
Buffer.from(message.data.selectionData),
encodeDataAs
),
})
}
}
break
case MessageCommand.applyChanges:
await edit(
this.omegaSessionId,
message.data.offset,
message.data.originalSegment,
message.data.editedSegment
)
await this.sendChangesInfo()
break
case MessageCommand.undoChange:
await undo(this.omegaSessionId)
await this.sendChangesInfo()
this.panel.webview.postMessage({
command: MessageCommand.clearChanges,
})
break
case MessageCommand.redoChange:
await redo(this.omegaSessionId)
await this.sendChangesInfo()
this.panel.webview.postMessage({
command: MessageCommand.clearChanges,
})
break
case MessageCommand.profile:
{
const startOffset: number = message.data.startOffset
const length: number = message.data.length
const byteProfile: number[] = await profileSession(
this.omegaSessionId,
startOffset,
length
)
const characterCount = await countCharacters(
this.omegaSessionId,
startOffset,
length
)
const contentTypeResponse = await getContentType(
this.omegaSessionId,
startOffset,
length
)
const languageResponse = await getLanguage(
this.omegaSessionId,
startOffset,
length,
characterCount.getByteOrderMark()
)
await this.panel.webview.postMessage({
command: MessageCommand.profile,
data: {
startOffset: startOffset,
length: length,
byteProfile: byteProfile,
numAscii: numAscii(byteProfile),
language: languageResponse.getLanguage(),
contentType: contentTypeResponse.getContentType(),
characterCount: {
byteOrderMark: characterCount.getByteOrderMark(),
byteOrderMarkBytes: characterCount.getByteOrderMarkBytes(),
singleByteCount: characterCount.getSingleByteChars(),
doubleByteCount: characterCount.getDoubleByteChars(),
tripleByteCount: characterCount.getTripleByteChars(),
quadByteCount: characterCount.getQuadByteChars(),
invalidBytes: characterCount.getInvalidBytes(),
},
},
})
}
break
case MessageCommand.clearChanges:
if (
(await vscode.window.showInformationMessage(
'Are you sure you want to revert all changes?',
{ modal: true },
'Yes',
'No'
)) === 'Yes'
) {
await clear(this.omegaSessionId)
await this.sendChangesInfo()
this.panel.webview.postMessage({
command: MessageCommand.clearChanges,
})
}
break
case MessageCommand.save:
await this.saveFile(this.fileToEdit)
break
case MessageCommand.saveAs:
{
const uri = await vscode.window.showSaveDialog({
title: 'Save Session',
saveLabel: 'Save',
})
if (uri && uri.fsPath) {
await this.saveFile(uri.fsPath)
}
}
break
case MessageCommand.saveSegment:
{
const uri = await vscode.window.showSaveDialog({
title: 'Save Segment',
saveLabel: 'Save',
})
if (uri && uri.fsPath) {
await this.saveFileSegment(
uri.fsPath,
message.data.offset,
message.data.length
)
}
}
break
case MessageCommand.requestEditedData:
{
const [selectionData, selectionDisplay] = fillRequestData(message)
await this.panel.webview.postMessage({
command: MessageCommand.requestEditedData,
data: {
data: Uint8Array.from(selectionData),
dataDisplay: selectionDisplay,
},
})
}
break
case MessageCommand.replace:
{
const searchDataBytes = encodedStrToData(
message.data.searchData,
message.data.encoding
)
const replaceDataBytes = encodedStrToData(
message.data.replaceData,
message.data.encoding
)
const nextOffset = await replaceOneSession(
this.omegaSessionId,
searchDataBytes,
replaceDataBytes,
message.data.caseInsensitive,
message.data.isReverse,
message.data.searchOffset,
message.data.searchLength,
message.data.overwriteOnly
)
if (nextOffset === -1) {
vscode.window.showErrorMessage('No replacement took place')
} else {
await this.sendChangesInfo()
}
await this.panel.webview.postMessage({
command: MessageCommand.replaceResults,
data: {
replacementsCount: nextOffset === -1 ? 0 : 1,
nextOffset: nextOffset,
searchDataBytesLength: searchDataBytes.length,
replaceDataBytesLength: replaceDataBytes.length,
},
})
}
break
case MessageCommand.search:
{
const searchDataBytes = encodedStrToData(
message.data.searchData,
message.data.encoding
)
const searchResults = await searchSession(
this.omegaSessionId,
searchDataBytes,
message.data.caseInsensitive,
message.data.isReverse,
message.data.searchOffset,
message.data.searchLength,
message.data.limit + 1
)
if (searchResults.length === 0) {
vscode.window.showInformationMessage(
`No more matches found for '${message.data.searchData}'`
)
}
let overflow = false
if (searchResults.length > message.data.limit) {
overflow = true
searchResults.pop()
}
await this.panel.webview.postMessage({
command: MessageCommand.searchResults,
data: {
searchResults: searchResults,
searchDataBytesLength: searchDataBytes.length,
overflow: overflow,
},
})
}
break
}
}