[kaffe] CVS kaffe (robilad): Resynced with GNU Classpath: AWT accessiblity improvements

Kaffe CVS cvs-commits at kaffe.org
Thu Dec 2 20:20:55 PST 2004


PatchSet 5515 
Date: 2004/12/03 01:56:19
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath: AWT accessiblity improvements

2004-12-02  Dalibor Topic  <robilad at kaffe.org>

        * libraries/javalib/java/awt/Button.java,
        libraries/javalib/java/awt/Checkbox.java,
        libraries/javalib/java/awt/Choice.java,
        libraries/javalib/java/awt/Menu.java,
        libraries/javalib/java/awt/MenuItem.java,
        libraries/javalib/java/awt/PopupMenu.java,
        libraries/javalib/java/awt/TextArea.java,
        libraries/javalib/java/awt/TextComponent.java,
        libraries/javalib/java/awt/TextField.java:
        Resynced with GNU Classpath.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Menu.java (AccessibleAWTMenu
        getAccessibleContext): Implement.
        * java/awt/PopupMenu.java (AccessibleAWTPopupMenu
        getAccessibleContext): Implement.
        * java/awt/TextComponent.java (AccessibleAWTTextComponent
        getAccessibleContext): Implement.
        (TextComponent): Extends Accessible.
        (getIndexAtPoint, getCharacterBounds): New methods.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Button.java
        (AccessibleAWTButton.getAccessibleActionDescription): Explain the
        source of 'click'.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Checkbox.java: Remove stub comments.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Button.java
        (AccessibleAWTButton.getAccessibleActionDescription): Return
        'click'.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Checkbox.java (AccessibleAWTCheckBox): Remove todo
        comments.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Checkbox.java (itemStateChanged): Implement function.
        (getAccessibleContext): Add AccessibleAWTCheckBox to item listeners.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/TextArea.java (AccessibleAWTTextArea,
        getAccessibleContext): Implement.
        * java/awt/TextField.java (AccessibleAWTTextField,
        getAccessibleContext): Implement.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Checkbox.java (AccessibleAWTCheckBox): Implement.
        (getAccessibleContext): Implement.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/MenuItem.java (AccessibleAWTMenuItem): Implement.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/Choice.java (AccessibleAWTChoice): Implement.

        2004-11-23 Jerry Quinn <jlquinn at optonline.net>

        * java/awt/MenuItem.java (AccessibleAWTMenuItem): Implement.

Members: 
	ChangeLog:1.3061->1.3062 
	libraries/javalib/java/awt/Button.java:1.6->1.7 
	libraries/javalib/java/awt/Checkbox.java:1.2->1.3 
	libraries/javalib/java/awt/Choice.java:1.3->1.4 
	libraries/javalib/java/awt/Menu.java:1.11->1.12 
	libraries/javalib/java/awt/MenuItem.java:1.14->1.15 
	libraries/javalib/java/awt/PopupMenu.java:1.9->1.10 
	libraries/javalib/java/awt/TextArea.java:1.4->1.5 
	libraries/javalib/java/awt/TextComponent.java:1.2->1.3 
	libraries/javalib/java/awt/TextField.java:1.3->1.4 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3061 kaffe/ChangeLog:1.3062
--- kaffe/ChangeLog:1.3061	Fri Dec  3 00:56:16 2004
+++ kaffe/ChangeLog	Fri Dec  3 01:56:19 2004
@@ -1,5 +1,79 @@
 2004-12-02  Dalibor Topic  <robilad at kaffe.org>
 
+	* libraries/javalib/java/awt/Button.java,
+	libraries/javalib/java/awt/Checkbox.java,
+	libraries/javalib/java/awt/Choice.java,
+	libraries/javalib/java/awt/Menu.java,
+	libraries/javalib/java/awt/MenuItem.java,
+	libraries/javalib/java/awt/PopupMenu.java,
+	libraries/javalib/java/awt/TextArea.java,
+	libraries/javalib/java/awt/TextComponent.java,
+	libraries/javalib/java/awt/TextField.java:
+	Resynced with GNU Classpath.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Menu.java (AccessibleAWTMenu
+        getAccessibleContext): Implement.
+        * java/awt/PopupMenu.java (AccessibleAWTPopupMenu
+        getAccessibleContext): Implement.
+        * java/awt/TextComponent.java (AccessibleAWTTextComponent
+        getAccessibleContext): Implement.
+        (TextComponent): Extends Accessible.
+        (getIndexAtPoint, getCharacterBounds): New methods.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Button.java
+        (AccessibleAWTButton.getAccessibleActionDescription): Explain the
+        source of 'click'.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Checkbox.java: Remove stub comments.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Button.java
+        (AccessibleAWTButton.getAccessibleActionDescription): Return
+        'click'.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Checkbox.java (AccessibleAWTCheckBox): Remove todo
+        comments.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Checkbox.java (itemStateChanged): Implement function.
+        (getAccessibleContext): Add AccessibleAWTCheckBox to item listeners.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/TextArea.java (AccessibleAWTTextArea,
+        getAccessibleContext): Implement.
+        * java/awt/TextField.java (AccessibleAWTTextField,
+        getAccessibleContext): Implement.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Checkbox.java (AccessibleAWTCheckBox): Implement.
+        (getAccessibleContext): Implement.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/MenuItem.java (AccessibleAWTMenuItem): Implement.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/Choice.java (AccessibleAWTChoice): Implement.
+
+	2004-11-23 Jerry Quinn <jlquinn at optonline.net>
+
+        * java/awt/MenuItem.java (AccessibleAWTMenuItem): Implement.
+
+2004-12-02  Dalibor Topic  <robilad at kaffe.org>
+
 	* libraries/javalib/javax/swing/DefaultSingleSelectionModel.java,
 	libraries/javalib/javax/swing/JPasswordField.java,
 	libraries/javalib/javax/swing/tree/AbstractLayoutCache.java:
Index: kaffe/libraries/javalib/java/awt/Button.java
diff -u kaffe/libraries/javalib/java/awt/Button.java:1.6 kaffe/libraries/javalib/java/awt/Button.java:1.7
--- kaffe/libraries/javalib/java/awt/Button.java:1.6	Wed Nov 24 21:49:17 2004
+++ kaffe/libraries/javalib/java/awt/Button.java	Fri Dec  3 01:56:21 2004
@@ -1,5 +1,5 @@
 /* Button.java -- AWT button widget
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -44,13 +44,21 @@
 import java.lang.reflect.Array;
 import java.util.EventListener;
 
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRelation;
+import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleValue;
+
 /**
   * This class provides a button widget for the AWT. 
   *
   * @author Aaron M. Renn (arenn at urbanophile.com)
   * @author Tom Tromey <tromey at cygnus.com>
   */
-public class Button extends Component implements java.io.Serializable
+public class Button extends Component
+  implements java.io.Serializable, Accessible
 {
 
 /*
@@ -85,6 +93,101 @@
    * The number used to generate the name returned by getName.
    */
   private static transient long next_button_number;
+  
+  protected class AccessibleAWTButton extends AccessibleAWTComponent
+    implements AccessibleAction, AccessibleValue
+  {
+    protected AccessibleAWTButton() { }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
+     */
+    public int getAccessibleActionCount()
+    {
+      // Only 1 action possible
+      return 1;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
+     */
+    public String getAccessibleActionDescription(int i)
+    {
+      // JDK 1.4.2 returns the string "click" for action 0.  However, the API
+      // docs don't say what the string to be returned is, beyond being a
+      // description of the action.  So we return the same thing for
+      // compatibility with 1.4.2.
+      if (i == 0)
+        return "click";
+      return null;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
+     */
+    public boolean doAccessibleAction(int i)
+    {
+      if (i != 0)
+        return false;
+      processActionEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, actionCommand));
+      return true;
+    }
+    
+    public String getAccessibleName()
+    {
+      return label;
+    }
+    
+    public AccessibleAction getAccessibleAction()
+    {
+      return this;
+    }
+    
+    public AccessibleValue getAccessibleValue()
+    {
+      return this;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
+     */
+    public Number getCurrentAccessibleValue()
+    {
+      // Docs say return 1 if selected, but buttons can't be selected, right?
+      return new Integer(0);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
+     */
+    public boolean setCurrentAccessibleValue(Number number)
+    {
+      // Since there's no selection with buttons, we're ignoring this.
+      // TODO someone who knows shoulw check this.
+      return false;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue()
+     */
+    public Number getMinimumAccessibleValue()
+    {
+      return new Integer(0);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue()
+     */
+    public Number getMaximumAccessibleValue()
+    {
+      return new Integer(0);
+    }
+    
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.PUSH_BUTTON;
+    }
+  }
 
 /*************************************************************************/
 
@@ -324,6 +427,11 @@
 {
   return getName () + "," + getX () + "," + getY () + ","
     + getWidth () + "x" + getHeight () + ",label=" + getLabel ();
+}
+
+public AccessibleContext getAccessibleContext()
+{
+  return new AccessibleAWTButton();
 }
 
   /**
Index: kaffe/libraries/javalib/java/awt/Checkbox.java
diff -u kaffe/libraries/javalib/java/awt/Checkbox.java:1.2 kaffe/libraries/javalib/java/awt/Checkbox.java:1.3
--- kaffe/libraries/javalib/java/awt/Checkbox.java:1.2	Thu Jul 22 19:20:21 2004
+++ kaffe/libraries/javalib/java/awt/Checkbox.java	Fri Dec  3 01:56:21 2004
@@ -43,6 +43,13 @@
 import java.awt.peer.CheckboxPeer;
 import java.io.Serializable;
 
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
+import javax.accessibility.AccessibleValue;
+
 /**
  * This class implements a component which has an on/off state.  Two
  * or more Checkboxes can be grouped by a CheckboxGroup.
@@ -50,7 +57,8 @@
  * @author Aaron M. Renn (arenn at urbanophile.com)
  * @author Tom Tromey <tromey at redhat.com>
  */
-public class Checkbox extends Component implements ItemSelectable, Serializable
+public class Checkbox extends Component
+  implements ItemSelectable, Accessible, Serializable
 {
 
 // FIXME: Need readObject/writeObject for this.
@@ -86,6 +94,96 @@
 // The list of listeners for this object.
 private transient ItemListener item_listeners;
 
+protected class AccessibleAWTCheckBox
+  extends AccessibleAWTComponent
+  implements ItemListener, AccessibleAction, AccessibleValue
+{
+  
+
+  /* (non-Javadoc)
+   * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
+   */
+  public void itemStateChanged(ItemEvent event)
+  {
+    firePropertyChange(ACCESSIBLE_STATE_PROPERTY,
+		       state ? null : AccessibleState.CHECKED,
+                       state ? AccessibleState.CHECKED : null);
+  }
+  
+  public AccessibleAction getAccessibleAction()
+  {
+    return this;
+  }
+  
+  public AccessibleValue getAccessibleValue()
+  {
+    return this;
+  }
+  
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
+   */
+  public int getAccessibleActionCount()
+  {
+    // 1.4.1 does this
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
+   */
+  public String getAccessibleActionDescription(int i)
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
+   */
+  public boolean doAccessibleAction(int i)
+  {
+    return false;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
+   */
+  public Number getCurrentAccessibleValue()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
+   */
+  public boolean setCurrentAccessibleValue(Number number)
+  {
+    return false;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue()
+   */
+  public Number getMinimumAccessibleValue()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue()
+   */
+  public Number getMaximumAccessibleValue()
+  {
+    return null;
+  }
+  
+  public AccessibleRole getAccessibleRole() 
+  {
+    return AccessibleRole.CHECK_BOX;
+  }
+  
+}
+
 /*************************************************************************/
 
 /*
@@ -390,6 +488,13 @@
 {
   return ("label=" + label + ",state=" + state + ",group=" + group
 	  + "," + super.paramString());
+}
+
+public AccessibleContext getAccessibleContext()
+{
+  AccessibleAWTCheckBox ac = new AccessibleAWTCheckBox();
+  addItemListener(ac);
+  return ac;
 }
 
 } // class Checkbox 
Index: kaffe/libraries/javalib/java/awt/Choice.java
diff -u kaffe/libraries/javalib/java/awt/Choice.java:1.3 kaffe/libraries/javalib/java/awt/Choice.java:1.4
--- kaffe/libraries/javalib/java/awt/Choice.java:1.3	Wed Oct 27 19:08:27 2004
+++ kaffe/libraries/javalib/java/awt/Choice.java	Fri Dec  3 01:56:21 2004
@@ -45,6 +45,10 @@
 import java.util.EventListener;
 import java.util.Vector;
 
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRole;
+
 /**
   * This class implements a drop down choice list.
   *
@@ -79,6 +83,53 @@
 // Listener chain
 private ItemListener item_listeners;
 
+  protected class AccessibleAWTChoice
+    extends Component.AccessibleAWTComponent
+    implements AccessibleAction
+  {
+    public AccessibleAction getAccessibleAction()
+    {
+      return this;
+    }
+
+    // FIXME: I think this is right, but should be checked by someone who
+    // knows better.
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.POPUP_MENU;
+    }
+	  
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
+     */
+    public int getAccessibleActionCount()
+    {
+      return pItems.size();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
+     */
+    public String getAccessibleActionDescription(int i)
+    {
+      return (String) pItems.get(i);
+    }
+	  
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
+     */
+    public boolean doAccessibleAction(int i)
+    {
+      if (i < 0 || i >= pItems.size())
+	return false;
+	    
+      Choice.this.processItemEvent(new ItemEvent(Choice.this,
+						 ItemEvent.ITEM_STATE_CHANGED,
+						 this, ItemEvent.SELECTED));
+      return true;
+    }
+  }
+
 /*************************************************************************/
 
 /*
@@ -511,5 +562,10 @@
   public ItemListener[] getItemListeners ()
   {
     return (ItemListener[]) getListeners (ItemListener.class);
+  }
+
+  public AccessibleContext getAccessibleContext()
+  {
+    return new AccessibleAWTChoice();
   }
 } // class Choice 
Index: kaffe/libraries/javalib/java/awt/Menu.java
diff -u kaffe/libraries/javalib/java/awt/Menu.java:1.11 kaffe/libraries/javalib/java/awt/Menu.java:1.12
--- kaffe/libraries/javalib/java/awt/Menu.java:1.11	Mon Oct  4 09:01:30 2004
+++ kaffe/libraries/javalib/java/awt/Menu.java	Fri Dec  3 01:56:21 2004
@@ -43,6 +43,9 @@
 import java.util.Enumeration;
 import java.util.Vector;
 
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRole;
+
 /**
   * This class represents a pull down or tear off menu in Java's AWT.
   *
@@ -432,7 +435,28 @@
 	  + super.paramString());
 }
 
-// Accessibility API not yet implemented.
-// public AccessibleContext getAccessibleContext()
+  /**
+   * Basic Accessibility class for Menu.  Details get provided in derived
+   * classes.
+   */
+  protected class AccessibleAWTMenu extends AccessibleAWTMenuItem
+  {
+    protected AccessibleAWTMenu()
+    {
+    }
+
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.MENU;
+    }
+  }
+
+  /* (non-Javadoc)
+   * @see java.awt.MenuComponent#getAccessibleContext()
+   */
+  public AccessibleContext getAccessibleContext()
+  {
+    return new AccessibleAWTMenu();
+  }
 
 } // class Menu
Index: kaffe/libraries/javalib/java/awt/MenuItem.java
diff -u kaffe/libraries/javalib/java/awt/MenuItem.java:1.14 kaffe/libraries/javalib/java/awt/MenuItem.java:1.15
--- kaffe/libraries/javalib/java/awt/MenuItem.java:1.14	Mon Sep 27 17:41:07 2004
+++ kaffe/libraries/javalib/java/awt/MenuItem.java	Fri Dec  3 01:56:22 2004
@@ -45,13 +45,18 @@
 import java.lang.reflect.Array;
 import java.util.EventListener;
 
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleValue;
+
 /**
   * This class represents an item in a menu.
   *
   * @author Aaron M. Renn (arenn at urbanophile.com)
   */
 public class MenuItem extends MenuComponent
-  implements Serializable
+  implements Serializable, Accessible
 {
 
 /*
@@ -94,6 +99,110 @@
 
 // The list of action listeners for this menu item.
 private transient ActionListener action_listeners;
+
+  protected class AccessibleAWTMenuItem
+    extends MenuComponent.AccessibleAWTMenuComponent
+    implements AccessibleAction, AccessibleValue
+  {
+    /** Constructor */
+    public AccessibleAWTMenuItem()
+    {
+      super();
+    }
+
+
+
+    public String getAccessibleName()
+    {
+      return label;
+    }
+
+    public AccessibleAction getAccessibleAction()
+    {
+      return this;
+    }
+
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.MENU_ITEM;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionCount()
+     */
+    public int getAccessibleActionCount()
+    {
+      return 1;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int)
+     */
+    public String getAccessibleActionDescription(int i)
+    {
+      if (i == 0)
+       return label;
+      else
+       return null;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleAction#doAccessibleAction(int)
+     */
+    public boolean doAccessibleAction(int i)
+    {
+      if (i != 0)
+       return false;
+      processActionEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, actionCommand));
+      return true;
+    }
+
+    public AccessibleValue getAccessibleValue()
+    {
+      return this;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue()
+     */
+    public Number getCurrentAccessibleValue()
+    {
+      return (enabled) ? new Integer(1) : new Integer(0);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number)
+     */
+    public boolean setCurrentAccessibleValue(Number number)
+    {
+      if (number.intValue() == 0)
+       {
+         setEnabled(false);
+         return false;
+       }
+
+      setEnabled(true);
+      return true;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue()
+     */
+    public Number getMinimumAccessibleValue()
+    {
+      return new Integer(0);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue()
+     */
+    public Number getMaximumAccessibleValue()
+    {
+      return new Integer(0);
+    }
+
+  }
+
 
 /*************************************************************************/
 
Index: kaffe/libraries/javalib/java/awt/PopupMenu.java
diff -u kaffe/libraries/javalib/java/awt/PopupMenu.java:1.9 kaffe/libraries/javalib/java/awt/PopupMenu.java:1.10
--- kaffe/libraries/javalib/java/awt/PopupMenu.java:1.9	Mon Oct  4 09:01:32 2004
+++ kaffe/libraries/javalib/java/awt/PopupMenu.java	Fri Dec  3 01:56:22 2004
@@ -40,6 +40,9 @@
 
 import java.awt.peer.PopupMenuPeer;
 
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleRole;
+
 /**
   * This class implement an AWT popup menu widget
   *
@@ -134,6 +137,24 @@
       pmp.show (component, x, y);
     }
 }
+
+  protected class AccessibleAWTPopupMenu extends AccessibleAWTMenu
+  {
+    protected AccessibleAWTPopupMenu()
+    {
+    }
+
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.POPUP_MENU;
+    }
+
+  }
+
+  public AccessibleContext getAccessibleContext()
+  {
+    return new AccessibleAWTPopupMenu();
+  }
 
 } // class PopupMenu
 
Index: kaffe/libraries/javalib/java/awt/TextArea.java
diff -u kaffe/libraries/javalib/java/awt/TextArea.java:1.4 kaffe/libraries/javalib/java/awt/TextArea.java:1.5
--- kaffe/libraries/javalib/java/awt/TextArea.java:1.4	Tue Oct 12 00:24:58 2004
+++ kaffe/libraries/javalib/java/awt/TextArea.java	Fri Dec  3 01:56:22 2004
@@ -44,6 +44,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleStateSet;
+
 
 /**
  * A TextArea is a text component capable of displaying multiple lines
@@ -596,5 +599,22 @@
   private static synchronized long getUniqueLong ()
   {
     return next_text_number++;
+  }
+
+  protected class AccessibleAWTTextArea extends AccessibleAWTTextComponent
+  {
+    protected AccessibleAWTTextArea()
+    {
+    }
+
+    public AccessibleStateSet getAccessibleStateSet()
+    {
+      return super.getAccessibleStateSet();
+    }
+  }
+
+  public AccessibleContext getAccessibleContext()
+  {
+    return new AccessibleAWTTextArea();
   }
 }
Index: kaffe/libraries/javalib/java/awt/TextComponent.java
diff -u kaffe/libraries/javalib/java/awt/TextComponent.java:1.2 kaffe/libraries/javalib/java/awt/TextComponent.java:1.3
--- kaffe/libraries/javalib/java/awt/TextComponent.java:1.2	Thu Jul 22 19:37:02 2004
+++ kaffe/libraries/javalib/java/awt/TextComponent.java	Fri Dec  3 01:56:22 2004
@@ -42,8 +42,16 @@
 import java.awt.event.TextListener;
 import java.awt.peer.TextComponentPeer;
 import java.io.Serializable;
+import java.text.BreakIterator;
 import java.util.EventListener;
 
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
+import javax.accessibility.AccessibleStateSet;
+import javax.accessibility.AccessibleText;
+import javax.swing.text.AttributeSet;
+
 /**
   * This class provides common functionality for widgets than 
   * contain text.
@@ -51,7 +59,7 @@
   * @author Aaron M. Renn (arenn at urbanophile.com)
   */
 public class TextComponent extends Component
-  implements Serializable
+  implements Serializable, Accessible
 {
 
 /*
@@ -90,6 +98,219 @@
   */
 protected transient TextListener textListener;
 
+  protected class AccessibleAWTTextComponent
+    extends AccessibleAWTComponent
+    implements AccessibleText, TextListener
+  {
+    // Constructor
+    // Adds a listener for tracking caret changes
+    public AccessibleAWTTextComponent()
+    {
+      TextComponent.this.addTextListener(this);
+    }
+
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.TEXT;
+    }
+
+    public AccessibleStateSet getAccessibleStateSet()
+    {
+      // TODO: Docs say PropertyChangeEvent will fire if this state changes.
+      // That means that the event has to fire when editable changes.
+      AccessibleStateSet ss = super.getAccessibleStateSet();
+      if (editable)
+        ss.add(AccessibleState.EDITABLE);
+      return ss;
+    }
+
+    public AccessibleText getAccessibleText()
+    {
+      return this;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getIndexAtPoint(java.awt.Point)
+     */
+    public int getIndexAtPoint(Point point)
+    {
+      return TextComponent.this.getIndexAtPoint(point);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getCharacterBounds(int)
+     */
+    public Rectangle getCharacterBounds(int index)
+    {
+      return TextComponent.this.getCharacterBounds(index);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getCharCount()
+     */
+    public int getCharCount()
+    {
+      return text.length();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getCaretPosition()
+     */
+    public int getCaretPosition()
+    {
+      return TextComponent.this.getCaretPosition();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getAtIndex(int, int)
+     */
+    public String getAtIndex(int part, int index)
+    {
+      if (index < 0 || index >= text.length())
+        return null;
+      BreakIterator it = null;
+      switch (part)
+      {
+       case CHARACTER:
+         return text.substring(index, index + 1);
+       case WORD:
+         it = BreakIterator.getWordInstance();
+         break;
+       case SENTENCE:
+         it = BreakIterator.getSentenceInstance();
+         break;
+       default:
+         return null;
+      }
+         it.setText(text);
+         int start = index;
+         if (!it.isBoundary(index))
+           start = it.preceding(index);
+         int end = it.following(index);
+         if (end == -1)
+           return text.substring(index);
+         else
+           return text.substring(index, end);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getAfterIndex(int, int)
+     */
+    public String getAfterIndex(int part, int index) {
+      if (index < 0 || index >= text.length())
+        return null;
+      BreakIterator it = null;
+      switch (part)
+      {
+       case CHARACTER:
+         return text.substring(index, index + 1);
+       case WORD:
+         it = BreakIterator.getWordInstance();
+         break;
+       case SENTENCE:
+         it = BreakIterator.getSentenceInstance();
+         break;
+       default:
+         return null;
+      }
+         it.setText(text);
+         int start = index;
+         if (!it.isBoundary(index))
+           start = it.following(index);
+         // Make sure there was a complete unit.  I.e. if index is in the middle
+         // of a word, return null if there is no word after the that one.
+         if (start == -1)
+           return null;
+         int end = it.following(start);
+         if (end == -1)
+           return text.substring(index);
+         else
+           return text.substring(index, end);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.accessibility.AccessibleText#getBeforeIndex(int, int)
+     */
+    public String getBeforeIndex(int part, int index)
+    {
+      if (index < 1 || index >= text.length())
+        return null;
+      BreakIterator it = null;
+      switch (part)
+      {
+       case CHARACTER:
+         return text.substring(index - 1, index);
+       case WORD:
+         it = BreakIterator.getWordInstance();
+         break;
+       case SENTENCE:
+         it = BreakIterator.getSentenceInstance();
+         break;
+       default:
+         return null;
+      }
+         it.setText(text);
+         int end = index;
+         if (!it.isBoundary(index))
+           end = it.preceding(index);
+         // Make sure there was a complete unit.  I.e. if index is in the middle
+         // of a word, return null if there is no word before that one.
+         if (end == -1)
+           return null;
+         int start = it.preceding(end);
+         if (start == -1)
+           return text.substring(0, end);
+         else
+           return text.substring(start, end);
+    }

*** Patch too long, truncated ***




More information about the kaffe mailing list