/* |
|
* 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; |
|
/** |
|
* <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); |
|
} |
|
} |