| /* NavigationFilterDemo.java -- An example for the NavigationFilter class. |
| Copyright (C) 2006 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath examples. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| */ |
| |
| |
| package gnu.classpath.examples.swing; |
| |
| import java.awt.BorderLayout; |
| import java.awt.Point; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| |
| import javax.swing.JButton; |
| import javax.swing.JComponent; |
| import javax.swing.JFrame; |
| import javax.swing.JPanel; |
| import javax.swing.JTextArea; |
| import javax.swing.SwingConstants; |
| import javax.swing.SwingUtilities; |
| import javax.swing.text.BadLocationException; |
| import javax.swing.text.JTextComponent; |
| import javax.swing.text.NavigationFilter; |
| import javax.swing.text.Position; |
| import javax.swing.text.Utilities; |
| |
| /** |
| * A demonstration of the <code>javax.swing.text.NavigationFilter</code> class. |
| * |
| * <p>It shows a NavigationFilter which lets you walk word-wise |
| * through a text.</p> |
| * |
| * @author Robert Schuster |
| */ |
| public class NavigationFilterDemo |
| extends JPanel |
| implements ActionListener |
| { |
| |
| JTextArea textArea; |
| |
| /** |
| * Creates a new demo instance. |
| */ |
| public NavigationFilterDemo() |
| { |
| createContent(); |
| // initFrameContent() is only called (from main) when running this app |
| // standalone |
| } |
| |
| /** |
| * When the demo is run independently, the frame is displayed, so we should |
| * initialise the content panel (including the demo content and a close |
| * button). But when the demo is run as part of the Swing activity board, |
| * only the demo content panel is used, the frame itself is never displayed, |
| * so we can avoid this step. |
| */ |
| void initFrameContent() |
| { |
| JPanel closePanel = new JPanel(); |
| JButton closeButton = new JButton("Close"); |
| closeButton.setActionCommand("CLOSE"); |
| closeButton.addActionListener(this); |
| closePanel.add(closeButton); |
| add(closePanel, BorderLayout.SOUTH); |
| } |
| |
| private void createContent() |
| { |
| setLayout(new BorderLayout()); |
| |
| add(textArea = new JTextArea(10, 20)); |
| |
| textArea.setWrapStyleWord(true); |
| |
| textArea.setLineWrap(true); |
| |
| textArea.setNavigationFilter(new WordFilter()); |
| |
| textArea.setText("GNU Classpath, Essential Libraries for Java, " + |
| "is a GNU project to create free core class " + |
| "libraries for use with virtual machines and " + |
| "compilers for the java programming language."); |
| } |
| |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getActionCommand().equals("CLOSE")) |
| System.exit(0); |
| |
| } |
| |
| public static void main(String[] args) |
| { |
| SwingUtilities.invokeLater |
| (new Runnable() |
| { |
| public void run() |
| { |
| NavigationFilterDemo app = new NavigationFilterDemo(); |
| app.initFrameContent(); |
| JFrame frame = new JFrame("NavigationFilterDemo"); |
| frame.getContentPane().add(app); |
| frame.pack(); |
| frame.setVisible(true); |
| frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
| } |
| }); |
| } |
| |
| /** |
| * Returns a DemoFactory that creates a NavigationFilterDemo. |
| * |
| * @return a DemoFactory that creates a NavigationFilterDemo |
| */ |
| public static DemoFactory createDemoFactory() |
| { |
| return new DemoFactory() |
| { |
| public JComponent createDemo() |
| { |
| return new NavigationFilterDemo(); |
| } |
| }; |
| } |
| |
| class WordFilter extends NavigationFilter |
| { |
| public int getNextVisualPositionFrom(JTextComponent text, |
| int pos, |
| Position.Bias bias, |
| int direction, |
| Position.Bias[] biasRet) |
| throws BadLocationException |
| { |
| Point pt; |
| |
| int newpos = pos; |
| switch (direction) |
| { |
| case SwingConstants.NORTH: |
| // Find out where the caret want to be positioned ideally. |
| pt = text.getCaret().getMagicCaretPosition(); |
| |
| // Calculate its position above. |
| newpos = Utilities.getPositionAbove(text, pos, (pt != null) ? pt.x : 0); |
| |
| // If we have a valid position, then calculate the next word start |
| // from there. |
| if (newpos != -1) |
| return Utilities.getWordStart(text, newpos); |
| else |
| return pos; |
| case SwingConstants.SOUTH: |
| // Find out where the caret want to be positioned ideally. |
| pt = text.getCaret().getMagicCaretPosition(); |
| |
| // Calculate its position below. |
| newpos = Utilities.getPositionBelow(text, pos, (pt != null) ? pt.x : 0); |
| |
| // If we have a valid position, then calculate the next word start |
| // from there. |
| if (newpos != -1) |
| return Utilities.getWordStart(text, newpos); |
| else |
| return pos; |
| case SwingConstants.WEST: |
| // Calculate the next word start. |
| newpos = Utilities.getWordStart(text, newpos);; |
| |
| // If that means that the caret will not move, return |
| // the start of the previous word. |
| if (newpos != pos) |
| return newpos; |
| else |
| return Utilities.getPreviousWord(text, newpos); |
| case SwingConstants.EAST: |
| return Utilities.getNextWord(text, newpos); |
| default: |
| // Do whatever the super implementation did. |
| return super.getNextVisualPositionFrom(text, pos, bias, |
| direction, biasRet); |
| } |
| } |
| |
| } |
| |
| } |