/* * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.swing.text; import java.awt.Shape; /** * NavigationFilter can be used to restrict where the cursor can * be positioned. When the default cursor positioning actions attempt to * reposition the cursor they will call into the * NavigationFilter, assuming * the JTextComponent has a non-null * NavigationFilter set. In this manner * the NavigationFilter can effectively restrict where the * cursor can be positioned. Similarly DefaultCaret will call * into the NavigationFilter when the user is changing the * selection to further restrict where the cursor can be positioned. *

* Subclasses can conditionally call into supers implementation to restrict * where the cursor can be placed, or call directly into the * FilterBypass. * * @see javax.swing.text.Caret * @see javax.swing.text.DefaultCaret * @see javax.swing.text.View * * @since 1.4 */ public class NavigationFilter { /** * Invoked prior to the Caret setting the dot. The default implementation * calls directly into the FilterBypass with the passed * in arguments. Subclasses may wish to conditionally * call super with a different location, or invoke the necessary method * on the FilterBypass * * @param fb FilterBypass that can be used to mutate caret position * @param dot the position >= 0 * @param bias Bias to place the dot at */ public void setDot(FilterBypass fb, int dot, Position.Bias bias) { fb.setDot(dot, bias); } /** * Invoked prior to the Caret moving the dot. The default implementation * calls directly into the FilterBypass with the passed * in arguments. Subclasses may wish to conditionally * call super with a different location, or invoke the necessary * methods on the FilterBypass. * * @param fb FilterBypass that can be used to mutate caret position * @param dot the position >= 0 * @param bias Bias for new location */ public void moveDot(FilterBypass fb, int dot, Position.Bias bias) { fb.moveDot(dot, bias); } /** * Returns the next visual position to place the caret at from an * existing position. The default implementation simply forwards the * method to the root View. Subclasses may wish to further restrict the * location based on additional criteria. * * @param text JTextComponent containing text * @param pos Position used in determining next position * @param bias Bias used in determining next position * @param direction the direction from the current position that can * be thought of as the arrow keys typically found on a keyboard. * This will be one of the following values: *

* @param biasRet Used to return resulting Bias of next position * @return the location within the model that best represents the next * location visual position * @exception BadLocationException for a bad location within a document model * @exception IllegalArgumentException if direction * doesn't have one of the legal values above */ public int getNextVisualPositionFrom(JTextComponent text, int pos, Position.Bias bias, int direction, Position.Bias[] biasRet) throws BadLocationException { return text.getUI().getNextVisualPositionFrom(text, pos, bias, direction, biasRet); } /** * Used as a way to circumvent calling back into the caret to * position the cursor. Caret implementations that wish to support * a NavigationFilter must provide an implementation that will * not callback into the NavigationFilter. * @since 1.4 */ public static abstract class FilterBypass { /** * Returns the Caret that is changing. * * @return Caret that is changing */ public abstract Caret getCaret(); /** * Sets the caret location, bypassing the NavigationFilter. * * @param dot the position >= 0 * @param bias Bias to place the dot at */ public abstract void setDot(int dot, Position.Bias bias); /** * Moves the caret location, bypassing the NavigationFilter. * * @param dot the position >= 0 * @param bias Bias for new location */ public abstract void moveDot(int dot, Position.Bias bias); } }