Here you can find the source of getNextVisualPosition(final View v, final int pos, final Position.Bias b0, final int direction, final Position.Bias[] biasRet)
private static int getNextVisualPosition(final View v, final int pos, final Position.Bias b0, final int direction, final Position.Bias[] biasRet)
//package com.java2s; /*/*from w ww .ja v a2 s.co m*/ * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import javax.swing.SwingConstants; import javax.swing.text.AbstractDocument; import javax.swing.text.Document; import javax.swing.text.Element; import javax.swing.text.Position; import javax.swing.text.StyleConstants; import javax.swing.text.View; public class Main { static final Position.Bias backward = Position.Bias.Backward; static final Position.Bias forward = Position.Bias.Forward; private static int getNextVisualPosition(final View v, final int pos, final Position.Bias b0, final int direction, final Position.Bias[] biasRet) { boolean toWest = (direction == SwingConstants.WEST); Document document = v.getDocument(); int length = document.getLength(); if (!isBidirectional(document)) { return getTrivialVisualPosition(toWest, pos, b0, length, biasRet, true); } Element bidiRoot = ((AbstractDocument) document).getBidiRootElement(); Element elem = getElementByPosition(bidiRoot, pos); boolean isLTR = isLTR(elem); int start = elem.getStartOffset(); int end = elem.getEndOffset() - 1; int posInNeighboringElement = toWest ? Math.max(start - 1, 0) : Math.min(end + 1, length); Element neighboringElement = getElementByPosition(bidiRoot, posInNeighboringElement); Element paragraph = getElementByPosition(document.getDefaultRootElement(), pos); int startParagraph = paragraph.getStartOffset(); int endParagraph = paragraph.getEndOffset() - 1; boolean nextIsLTR = isLTR(getElementByPosition(bidiRoot, Math.min(endParagraph + 1, length))); int result = checkBoundaryCondition(pos, b0, biasRet, neighboringElement, isLTR, toWest, start, length, startParagraph, endParagraph, nextIsLTR); return result >= 0 ? result : getBidiVisualPosition(start, end, neighboringElement, pos, b0, biasRet, length, toWest, isLTR); } public static final boolean isBidirectional(final Document document) { if (!(document instanceof AbstractDocument)) { return false; } Element bidiRoot = ((AbstractDocument) document).getBidiRootElement(); return (bidiRoot != null && bidiRoot.getElementCount() >= 2); } private static int getTrivialVisualPosition(final boolean toWest, final int pos, final Position.Bias bias, final int docLength, final Position.Bias[] biasRet, final boolean isLTR) { boolean condition = (toWest && isLTR) || (!toWest && !isLTR); return condition ? Math.max(pos - 1, 0) : Math.min(pos + 1, docLength); } private static Element getElementByPosition(final Element rootElement, final int pos) { int index = rootElement.getElementIndex(pos); return rootElement.getElement(index); } static final boolean isLTR(final Element element) { return isLTR(StyleConstants.getBidiLevel(element.getAttributes())); } public static final boolean isLTR(final int level) { return (level & 1) == 0; } private static int checkBoundaryCondition(final int pos, final Position.Bias b0, final Position.Bias[] biasRet, final Element neighboringElement, final boolean isLTR, final boolean toWest, final int start, final int length, final int startParagraph, final int endParagraph, final boolean nextIsLTR) { if (toWest && isLTR) { if (pos == startParagraph) { return Math.max(0, pos - 1); } else if (neighboringElement.getStartOffset() == startParagraph && pos == start && b0 == backward) { return Math.max(0, startParagraph - 1); } } else if (!toWest) { if (b0 == forward && pos == length) { biasRet[0] = b0; return pos; } if (b0 == forward && pos == endParagraph) { if (nextIsLTR) { return pos + 1; } biasRet[0] = backward; return neighboringElement.getEndOffset(); } } return -1; } static final int getBidiVisualPosition(final int start, final int end, final Element neighbouringElement, final int pos, final Position.Bias b0, final Position.Bias[] biasRet, final int length, final boolean toWest, final boolean isLTR) { boolean direction = toWest ^ isLTR; if (pos == end && direction && b0 == forward) { biasRet[0] = backward; return pos + 1; } else if (pos == start + 1 && pos <= end && !direction) { return pos - 1; } else if (pos == start) { if (direction) { return (b0 == forward) ? pos + 1 : pos - 1; } biasRet[0] = b0; return neighbouringElement.getStartOffset(); } else { return getTrivialVisualPosition(toWest, pos, b0, length, biasRet, isLTR); } } }