/* * @(#)NavigationFilter.java 1.4 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ 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 * * @version 1.4 12/19/03 * @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 * @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. */ 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); } }