func buildOutputArea()

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
}