in plc4go/tools/plc4xpcapanalyzer/ui/ui.go [219:317]
func buildOutputArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) *tview.Grid {
outputAreaHeader := newPrimitive("Output")
outputArea := tview.NewGrid().
SetRows(3, 0, 10).
SetColumns(0, 30).
AddItem(outputAreaHeader, 0, 0, 1, 1, 0, 0, false)
{
var jumpToMessageItem func(messageNumber int) bool
{
outputView := tview.NewTextView().
SetDynamicColors(true).
SetRegions(true).
SetWordWrap(false).
SetWrap(false).
SetChangedFunc(func() {
application.Draw()
})
jumpToMessageItem = func(messageNumber int) bool {
regionId := strconv.Itoa(messageNumber)
if outputView.GetRegionText(regionId) == "" {
return false
}
outputView.Highlight(regionId).ScrollToHighlight()
return true
}
messageOutput = outputView
messageOutputClear = func() {
outputView.SetText("")
}
outputView.SetDoneFunc(func(key tcell.Key) {
currentSelection := outputView.GetHighlights()
if key == tcell.KeyEnter {
if len(currentSelection) > 0 {
outputView.Highlight()
} else {
outputView.Highlight("0").ScrollToHighlight()
}
} else if len(currentSelection) > 0 {
index, _ := strconv.Atoi(currentSelection[0])
if key == tcell.KeyTab {
index = (index + 1) % numberOfMessagesReceived
} else if key == tcell.KeyBacktab {
index = (index - 1 + numberOfMessagesReceived) % numberOfMessagesReceived
} else {
return
}
outputView.Highlight(strconv.Itoa(index)).ScrollToHighlight()
}
})
outputView.SetBorder(false)
outputArea.AddItem(outputView, 1, 0, 1, 1, 0, 0, false)
}
{
consoleView := tview.NewTextView().
SetDynamicColors(true).
SetMaxLines(config.MaxConsoleLines).
SetChangedFunc(func() {
application.Draw()
})
consoleOutput = consoleView
consoleOutputClear = func() {
consoleView.SetText("")
}
consoleView.SetBorder(false)
outputArea.AddItem(consoleView, 2, 0, 1, 1, 0, 0, false)
}
{
receivedMessagesList := tview.NewList()
messageReceived = func(messageNumber int, receiveTime time.Time, message apiModel.PlcMessage) {
application.QueueUpdateDraw(func() {
receivedMessagesList.AddItem(fmt.Sprintf("No %d @%s (api)", messageNumber, receiveTime.Format("15:04:05.999999")), "", 0x0, func() {
if ok := jumpToMessageItem(messageNumber); !ok {
plc4xpcapanalyzerLog.Debug().Msg("Adding new message to console output")
_, _ = fmt.Fprintf(tview.ANSIWriter(messageOutput), "Message nr: %[1]d\n[\"%[1]d\"]%s[\"\"]\n", messageNumber, message)
jumpToMessageItem(messageNumber)
}
})
})
}
spiMessageReceived = func(messageNumber int, receiveTime time.Time, message spi.Message) {
application.QueueUpdateDraw(func() {
receivedMessagesList.AddItem(fmt.Sprintf("No %d @%s (spi)", messageNumber, receiveTime.Format("15:04:05.999999")), "", 0x0, func() {
if ok := jumpToMessageItem(messageNumber); !ok {
plc4xpcapanalyzerLog.Debug().Msg("Adding new spi message to console output")
_, _ = fmt.Fprintf(tview.ANSIWriter(messageOutput), "Message nr: %[1]d\n[\"%[1]d\"]%s[\"\"]\n", messageNumber, message)
jumpToMessageItem(messageNumber)
}
})
})
}
outputArea.AddItem(receivedMessagesList, 0, 1, 3, 1, 0, 0, false)
}
}
return outputArea
}