public void moveCaretToNewLine(int lineDelta) { ArrayList<TypedLayout> lines = getLines(); int newLineNumber = caretLocation.line + lineDelta; if (newLineNumber >= 0 && newLineNumber < lines.size()) { TextLocation origin = verticalOrigin != null ? verticalOrigin : caretLocation; int desiredX = lines.get(origin.line).getX(origin.index); TypedLayout newLine = lines.get(newLineNumber); int newIndex = newLine.getIndexAt(desiredX); TextLocation newLocation = TextLocation.at(newLineNumber, newIndex); setCaretLocation(newLocation); verticalOrigin = origin; } }