blob: 96206b82cabc22c3a64d01b4ef3a42bc622266f8 [file] [log] [blame]
/*
* Copyright (c) 2000, 2006, 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;
/**
* <code>NavigationFilter</code> 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
* <code>NavigationFilter</code>, assuming
* the <code>JTextComponent</code> has a non-null
* <code>NavigationFilter</code> set. In this manner
* the <code>NavigationFilter</code> can effectively restrict where the
* cursor can be positioned. Similarly <code>DefaultCaret</code> will call
* into the <code>NavigationFilter</code> when the user is changing the
* selection to further restrict where the cursor can be positioned.
* <p>
* Subclasses can conditionally call into supers implementation to restrict
* where the cursor can be placed, or call directly into the
* <code>FilterBypass</code>.
*
* @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 <code>FilterBypass</code> with the passed
* in arguments. Subclasses may wish to conditionally
* call super with a different location, or invoke the necessary method
* on the <code>FilterBypass</code>
*
* @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 <code>FilterBypass</code> with the passed
* in arguments. Subclasses may wish to conditionally
* call super with a different location, or invoke the necessary
* methods on the <code>FilterBypass</code>.
*
* @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:
* <ul>
* <li>SwingConstants.WEST
* <li>SwingConstants.EAST
* <li>SwingConstants.NORTH
* <li>SwingConstants.SOUTH
* </ul>
* @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 <code>direction</code>
* 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);
}
}