FloatList (int startOffset, int endOffset) { assert startOffset <= endOffset; FloatList result = new FloatArrayList(); if (myDocument.getTextLength() == 0) { int minX = myCorrector.emptyTextX(); result.add(minX); result.add(minX); } else { float lastX = -1; for (VisualLineFragmentsIterator.Fragment fragment : VisualLineFragmentsIterator.create(myView, startOffset, false, true)) { int minOffset = fragment.getMinOffset(); int maxOffset = fragment.getMaxOffset(); if (startOffset == endOffset) { lastX = fragment.getEndX(); Inlay inlay = fragment.getCurrentInlay(); if (inlay != null) { if (startOffset == minOffset && inlay.isRelatedToPrecedingText()) { float x = fragment.getStartX(); result.add(x); result.add(x); break; } else { continue; } } if (startOffset >= minOffset && startOffset < maxOffset) { float x = fragment.offsetToX(startOffset); result.add(x); result.add(x); break; } } else if (startOffset < maxOffset && endOffset > minOffset) { float x1 = minOffset == maxOffset ? fragment.getStartX() : fragment.offsetToX(Math.max(minOffset, startOffset)); float x2 = minOffset == maxOffset ? fragment.getEndX() : fragment.offsetToX(Math.min(maxOffset, endOffset)); if (x1 > x2) { float tmp = x1; x1 = x2; x2 = tmp; } if (result.isEmpty() || x1 > result.getFloat(result.size() - 1)) { result.add(x1); result.add(x2); } else { result.set(result.size() - 1, x2); } } } if (startOffset == endOffset && result.isEmpty() && lastX >= 0) { result.add(lastX); result.add(lastX); } } return result; }