String (@NlsContexts.Label String text, Function<? super String, String> escapeFunction, int highlightStartOffset, int highlightEndOffset, boolean isDisabled, boolean strikeout, boolean isDisabledBeforeHighlight, Color background) { StringBuilder buf = new StringBuilder(text.length()); if (!mySimpleDesignMode) { setBackground(background); } String[] lines = UIUtil.splitText(text, getFontMetrics(BOLD_FONT), // disable splitting by width, to avoid depending on platform's font in tests ApplicationManager.getApplication().isUnitTestMode() ? Integer.MAX_VALUE : myWidthLimit, ','); int lineOffset = 0; boolean hasHighlighting = highlightStartOffset >= 0 && highlightEndOffset > highlightStartOffset; TextRange highlightingRange = hasHighlighting ? new TextRange(highlightStartOffset, highlightEndOffset) : null; for (int i = 0; i < lines.length; i++) { String line = lines[i]; OneLineComponent component = getOneLineComponent(i); TextRange lRange = new TextRange(lineOffset, lineOffset + line.length()); TextRange hr = highlightingRange == null ? null : lRange.intersection(highlightingRange); hr = hr == null ? null : hr.shiftRight(-lineOffset); String before = escapeString(hr == null ? line : line.substring(0, hr.getStartOffset()), escapeFunction); String in = hr == null ? "" : escapeString(hr.substring(line), escapeFunction); String after = hr == null ? "" : escapeString(line.substring(hr.getEndOffset()), escapeFunction); TextRange escapedHighlightingRange = in.isEmpty() ? null : TextRange.create(before.length(), before.length() + in.length()); buf.append(component.setup(before + in + after, isDisabled, strikeout, background, escapedHighlightingRange, isDisabledBeforeHighlight && (highlightStartOffset < 0 || highlightEndOffset > lineOffset))); lineOffset += line.length(); } trimComponents(lines.length); return buf.toString(); }