/*
* @(#)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:
*
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);
}
}