private void prepareForNextRead() {
            optDecodeChar.ifPresent(decodedChar -> {
                // Now advance the counters/trackers for the next char
                currCharOffset += decodedChar.getCharCount();
                currByteOffset += decodedChar.getByteCount();

                if (isFirstChar) {
                    isFirstChar = false;
                } else if (decodedChar.isLineBreak()) {
                    currLineNo++;
                    currColNo = 1;

                    if (!isMultiLine && currLineNo > 1) {
                        // Multi line data so we want to keep adding chars all the way to the end
                        // of the line so we don't get part lines in the UI.
                        isMultiLine = true;
                    }
                    if (!foundRange) {
                        // Not found our requested range yet so reset the current line so far
                        // to the offset of the next char
                        startOfCurrLineCharOffset = currCharOffset;
                        clearCurrentLine();
                    }
                } else {
                    // This is a debatable one. Is a simple smiley emoji one col or two?
                    // Java will say the string has length 2
                    currColNo += decodedChar.getCharCount();
                }
            });
        }
Called for each decoded char found in the range (or just after it with line continuation)
stroom-data/stroom-data-store-impl/src/main/java/stroom/data/store/impl/DataFetcher.java