boolean (@NotNull VisualPosition visualPosition) { if (myDocument.getTextLength() == 0) return false; LogicalPosition logicalPosition = visualToLogicalPosition(visualPosition); int offset = logicalPositionToOffset(logicalPosition); if (!logicalPosition.equals(offsetToLogicalPosition(offset))) return false; // virtual space if (myEditor.getSoftWrapModel().getSoftWrap(offset) != null) { VisualPosition beforeWrapPosition = offsetToVisualPosition(offset, true, true); if (visualPosition.line == beforeWrapPosition.line && (visualPosition.column > beforeWrapPosition.column || visualPosition.column == beforeWrapPosition.column && visualPosition.leansRight)) { return false; } VisualPosition afterWrapPosition = offsetToVisualPosition(offset, false, false); if (visualPosition.line == afterWrapPosition.line && (visualPosition.column < afterWrapPosition.column || visualPosition.column == afterWrapPosition.column && !visualPosition.leansRight)) { return false; } } int line = myDocument.getLineNumber(offset); LineLayout layout = myTextLayoutCache.getLineLayout(line); return layout.isRtlLocation(offset - myDocument.getLineStartOffset(line), logicalPosition.leansForward); }