Index: java/awt/CheckboxMenuItem.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/CheckboxMenuItem.java,v retrieving revision 1.15 diff -u -r1.15 CheckboxMenuItem.java --- java/awt/CheckboxMenuItem.java 16 Nov 2004 09:59:11 -0000 1.15 +++ java/awt/CheckboxMenuItem.java 29 Dec 2004 14:17:51 -0000 @@ -43,6 +43,11 @@ import java.awt.peer.CheckboxMenuItemPeer; import java.util.EventListener; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleValue; + /** * This class implements a menu item that has a checkbox on it indicating * the selected state of some option. @@ -50,7 +55,8 @@ * @author Aaron M. Renn (address@hidden) * @author Tom Tromey */ -public class CheckboxMenuItem extends MenuItem implements ItemSelectable +public class CheckboxMenuItem extends MenuItem + implements ItemSelectable, Accessible { /* @@ -315,5 +321,30 @@ { return (ItemListener[]) getListeners (ItemListener.class); } + + + protected class AccessibleAWTCheckboxMenuItem extends AccessibleAWTMenuItem + implements AccessibleAction, AccessibleValue + { + // I think the base class provides the necessary implementation + } + + /** + * Gets the AccessibleContext associated with this List. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTCheckboxMenuItem(); + } + return accessibleContext; + } + } // class CheckboxMenuItem Index: java/awt/Choice.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Choice.java,v retrieving revision 1.17 diff -u -r1.17 Choice.java --- java/awt/Choice.java 23 Nov 2004 18:04:46 -0000 1.17 +++ java/awt/Choice.java 29 Dec 2004 14:17:51 -0000 @@ -45,6 +45,7 @@ import java.util.EventListener; import java.util.Vector; +import javax.accessibility.Accessible; import javax.accessibility.AccessibleAction; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; @@ -54,7 +55,8 @@ * * @author Aaron M. Renn (address@hidden) */ -public class Choice extends Component implements ItemSelectable, Serializable +public class Choice extends Component + implements ItemSelectable, Serializable, Accessible { /* Index: java/awt/Dialog.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Dialog.java,v retrieving revision 1.18 diff -u -r1.18 Dialog.java --- java/awt/Dialog.java 17 Apr 2004 15:48:57 -0000 1.18 +++ java/awt/Dialog.java 29 Dec 2004 14:17:51 -0000 @@ -40,6 +40,11 @@ import java.awt.peer.DialogPeer; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + /** * A dialog box widget class. * @@ -511,5 +516,41 @@ this.undecorated = undecorated; } + + protected class AccessibleAWTDialog extends AccessibleAWTWindow + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.DIALOG; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isResizable()) + states.add(AccessibleState.RESIZABLE); + if (isModal()) + states.add(AccessibleState.MODAL); + return states; + } + } + + /** + * Gets the AccessibleContext associated with this Dialog. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTDialog(); + } + return accessibleContext; + } + } // class Dialog Index: java/awt/Frame.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Frame.java,v retrieving revision 1.25 diff -u -r1.25 Frame.java --- java/awt/Frame.java 11 Oct 2004 13:11:56 -0000 1.25 +++ java/awt/Frame.java 29 Dec 2004 14:17:51 -0000 @@ -41,6 +41,11 @@ import java.awt.peer.FramePeer; import java.util.Vector; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + /** * This class is a top-level window with a title bar and window * decorations. @@ -549,4 +554,40 @@ { return next_frame_number++; } + + protected class AccessibleAWTFrame extends AccessibleAWTWindow + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.FRAME; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isResizable()) + states.add(AccessibleState.RESIZABLE); + if ((state & ICONIFIED) != 0) + states.add(AccessibleState.ICONIFIED); + return states; + } + } + + /** + * Gets the AccessibleContext associated with this Frame. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTFrame(); + } + return accessibleContext; + } + } Index: java/awt/List.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/List.java,v retrieving revision 1.20 diff -u -r1.20 List.java --- java/awt/List.java 16 Nov 2004 09:59:11 -0000 1.20 +++ java/awt/List.java 29 Dec 2004 14:17:51 -0000 @@ -47,6 +47,11 @@ import java.util.Vector; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleSelection; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; /** * Class that implements a listbox widget @@ -106,6 +111,7 @@ // The list of ActionListeners for this object. private ActionListener action_listeners; + /*************************************************************************/ /* @@ -1076,4 +1082,185 @@ { return (ItemListener[]) getListeners (ItemListener.class); } + + // Accessibility internal class + protected class AccessibleAWTList extends AccessibleAWTComponent + implements AccessibleSelection, ItemListener, ActionListener + { + protected class AccessibleAWTListChild extends AccessibleAWTComponent + implements Accessible + { + private int index; + private List parent; + + public AccessibleAWTListChild(List parent, int indexInParent) + { + this.parent = parent; + index = indexInParent; + if (parent == null) + index = -1; + } + + /* (non-Javadoc) + * @see javax.accessibility.Accessible#getAccessibleContext() + */ + public AccessibleContext getAccessibleContext() + { + return this; + } + + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.LIST_ITEM; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (parent.isIndexSelected(index)) + states.add(AccessibleState.SELECTED); + return states; + } + + public int getAccessibleIndexInParent() + { + return index; + } + + } + + public AccessibleAWTList() + { + addItemListener(this); + addActionListener(this); + } + + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.LIST; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + states.add(AccessibleState.SELECTABLE); + if (isMultipleMode()) + states.add(AccessibleState.MULTISELECTABLE); + return states; + } + + public int getAccessibleChildrenCount() + { + return getItemCount(); + } + + public Accessible getAccessibleChild(int i) + { + if (i >= getItemCount()) + return null; + return new AccessibleAWTListChild(List.this, i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelectionCount() + */ + public int getAccessibleSelectionCount() + { + return getSelectedIndexes().length; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelection() + */ + public AccessibleSelection getAccessibleSelection() + { + return this; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelection(int) + */ + public Accessible getAccessibleSelection(int i) + { + int[] items = getSelectedIndexes(); + if (i >= items.length) + return null; + return new AccessibleAWTListChild(List.this, items[i]); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#isAccessibleChildSelected(int) + */ + public boolean isAccessibleChildSelected(int i) + { + return isIndexSelected(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#addAccessibleSelection(int) + */ + public void addAccessibleSelection(int i) + { + select(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#removeAccessibleSelection(int) + */ + public void removeAccessibleSelection(int i) + { + deselect(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#clearAccessibleSelection() + */ + public void clearAccessibleSelection() + { + for (int i = 0; i < getItemCount(); i++) + deselect(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#selectAllAccessibleSelection() + */ + public void selectAllAccessibleSelection() + { + if (isMultipleMode()) + for (int i = 0; i < getItemCount(); i++) + select(i); + } + + /* (non-Javadoc) + * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) + */ + public void itemStateChanged(ItemEvent event) + { + } + + /* (non-Javadoc) + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed(ActionEvent event) + { + } + + } + + /** + * Gets the AccessibleContext associated with this List. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTList(); + } + return accessibleContext; + } } // class List Index: java/awt/MenuComponent.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/MenuComponent.java,v retrieving revision 1.18 diff -u -r1.18 MenuComponent.java --- java/awt/MenuComponent.java 27 Sep 2004 15:11:46 -0000 1.18 +++ java/awt/MenuComponent.java 29 Dec 2004 14:17:51 -0000 @@ -130,7 +130,7 @@ * @see #getAccessibleContext() * @serial the accessibility information for this component. */ - private AccessibleContext accessibleContext; + AccessibleContext accessibleContext; /** * Was the name of the component set? This value defaults Index: java/awt/MenuItem.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/MenuItem.java,v retrieving revision 1.18 diff -u -r1.18 MenuItem.java --- java/awt/MenuItem.java 23 Nov 2004 18:04:46 -0000 1.18 +++ java/awt/MenuItem.java 29 Dec 2004 14:17:51 -0000 @@ -47,6 +47,7 @@ import javax.accessibility.Accessible; import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleValue; @@ -579,7 +580,21 @@ ",actionCommand=" + actionCommand + "," + super.paramString()); } -// Accessibility API not yet implemented. -// public AccessibleContext getAccessibleContext() +/** + * Gets the AccessibleContext associated with this MenuItem. + * The context is created, if necessary. + * + * @return the associated context + */ +public AccessibleContext getAccessibleContext() +{ + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTMenuItem(); + } + return accessibleContext; +} } // class MenuItem Index: java/awt/ScrollPane.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/ScrollPane.java,v retrieving revision 1.21 diff -u -r1.21 ScrollPane.java --- java/awt/ScrollPane.java 27 Sep 2004 15:11:46 -0000 1.21 +++ java/awt/ScrollPane.java 29 Dec 2004 14:17:51 -0000 @@ -43,6 +43,8 @@ import java.awt.peer.ScrollPanePeer; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; /** * This widget provides a scrollable region that allows a single @@ -587,5 +589,30 @@ { wheelScrollingEnabled = enable; } + + protected class AccessibleAWTScrollPane extends AccessibleAWTContainer + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.SCROLL_PANE; + } + } + + /** + * Gets the AccessibleContext associated with this Scrollbar. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTScrollPane(); + } + return accessibleContext; + } } // class ScrollPane Index: java/awt/Scrollbar.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Scrollbar.java,v retrieving revision 1.21 diff -u -r1.21 Scrollbar.java --- java/awt/Scrollbar.java 16 Nov 2004 09:59:11 -0000 1.21 +++ java/awt/Scrollbar.java 29 Dec 2004 14:17:52 -0000 @@ -45,6 +45,12 @@ import java.util.EventListener; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRelation; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.accessibility.AccessibleValue; /** * This class implements a scrollbar widget. @@ -769,5 +775,82 @@ { return next_scrollbar_number++; } + + protected class AccessibleAWTScrollbar extends AccessibleAWTComponent + implements AccessibleValue + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.SCROLL_BAR; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (getOrientation() == HORIZONTAL) + states.add(AccessibleState.HORIZONTAL); + else + states.add(AccessibleState.VERTICAL); + if (getValueIsAdjusting()) + states.add(AccessibleState.BUSY); + return states; + } + + public AccessibleValue getAccessibleValue() + { + return this; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue() + */ + public Number getCurrentAccessibleValue() + { + return new Integer(getValue()); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number) + */ + public boolean setCurrentAccessibleValue(Number number) + { + setValue(number.intValue()); + return true; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue() + */ + public Number getMinimumAccessibleValue() + { + return new Integer(getMinimum()); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue() + */ + public Number getMaximumAccessibleValue() + { + return new Integer(getMaximum()); + } + } + + /** + * Gets the AccessibleContext associated with this Scrollbar. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTScrollbar(); + } + return accessibleContext; + } + } // class Scrollbar Index: java/awt/Window.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/awt/Window.java,v retrieving revision 1.39 diff -u -r1.39 Window.java --- java/awt/Window.java 11 Dec 2004 08:20:49 -0000 1.39 +++ java/awt/Window.java 29 Dec 2004 14:17:52 -0000 @@ -56,6 +56,9 @@ import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; /** * This class represents a top-level window with no decorations. @@ -84,11 +87,26 @@ private transient WindowFocusListener windowFocusListener; private transient WindowStateListener windowStateListener; private transient GraphicsConfiguration graphicsConfiguration; - private transient AccessibleContext accessibleContext; private transient boolean shown; private transient Component windowFocusOwner; + + protected class AccessibleAWTWindow extends AccessibleAWTContainer + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.WINDOW; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isActive()) + states.add(AccessibleState.ACTIVE); + return states; + } + } /** * This (package access) constructor is used by subclasses that want @@ -672,8 +690,34 @@ } } } + + /** + * Identifies if this window is active. The active window is a Frame or + * Dialog that has focus or owns the active window. + * + * @return true if active, else false. + * @since 1.4 + */ + public boolean isActive() + { + KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); + return manager.getActiveWindow() == this; + } /** + * Identifies if this window is focused. A window is focused if it is the + * focus owner or it contains the focus owner. + * + * @return true if focused, else false. + * @since 1.4 + */ + public boolean isFocused() + { + KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); + return manager.getFocusedWindow() == this; + } + + /** * Returns the child window that has focus if this window is active. * This method returns null if this window is not active * or no children have focus. @@ -770,11 +814,21 @@ applyResourceBundle(rb); } + /** + * Gets the AccessibleContext associated with this Window. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - // FIXME - //return null; - throw new Error ("Not implemented"); + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + /* Create the context */ + accessibleContext = new AccessibleAWTWindow(); + } + return accessibleContext; } /**