Hi,
this adds a simple demonstration for the NavigationFilter class to the Swing
Activity board. It installs a NavigationFilter that restricts cursor movement to
be word-wise. It works well on the RI but currently causes an endless recursive
loop on Classpath. Seems like I have overlooked something. :)

I will file a PR and fix that tomorrow.

Here is the ChangeLog:

2006-04-18  Robert Schuster  <[EMAIL PROTECTED]>

        * examples/gnu/classpath/examples/swing/NavigationFilterDemo.java:
        New file.
        * examples/gnu/classpath/examples/swing/Demo.java:
        (mkMenuBar): Added NavigationFilter demo.

cya
Robert
Index: examples/gnu/classpath/examples/swing/Demo.java
===================================================================
RCS file: /cvsroot/classpath/classpath/examples/gnu/classpath/examples/swing/Demo.java,v
retrieving revision 1.44
diff -u -r1.44 Demo.java
--- examples/gnu/classpath/examples/swing/Demo.java	18 Apr 2006 19:37:48 -0000	1.44
+++ examples/gnu/classpath/examples/swing/Demo.java	18 Apr 2006 20:50:54 -0000
@@ -153,6 +153,9 @@
 
     examples.add(new JMenuItem(new PopupAction("DocumentFilter",
                                      DocumentFilterDemo.createDemoFactory())));
+
+    examples.add(new JMenuItem(new PopupAction("NavigationFilter",
+                                               NavigationFilterDemo.createDemoFactory())));
     
     final JMenuItem vmMenu;
     
Index: examples/gnu/classpath/examples/swing/NavigationFilterDemo.java
===================================================================
RCS file: examples/gnu/classpath/examples/swing/NavigationFilterDemo.java
diff -N examples/gnu/classpath/examples/swing/NavigationFilterDemo.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ examples/gnu/classpath/examples/swing/NavigationFilterDemo.java	18 Apr 2006 20:50:54 -0000
@@ -0,0 +1,206 @@
+/* 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.x);
+
+          // 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.x);
+
+          // 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:
+          // Simply calculate the next word's start offset.
+          return Utilities.getNextWord(text, newpos);
+        default:
+          // Do whatever the super implementation did.
+          return super.getNextVisualPositionFrom(text, pos, bias,
+                                                 direction, biasRet);
+      }
+    }
+    
+  }
+  
+}

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to