| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| package org.openoffice.java.accessibility; |
| |
| import com.sun.star.accessibility.*; |
| import com.sun.star.uno.AnyConverter; |
| import com.sun.star.uno.UnoRuntime; |
| |
| |
| public class Menu extends AbstractButton |
| implements javax.accessibility.Accessible { |
| private java.util.Vector children; |
| protected XAccessibleSelection unoAccessibleSelection = null; |
| |
| protected Menu(XAccessible xAccessible, |
| XAccessibleContext xAccessibleContext) { |
| super(xAccessible, xAccessibleContext); |
| |
| try { |
| // Create a vector with the correct initial capacity |
| int count = unoAccessibleContext.getAccessibleChildCount(); |
| children = new java.util.Vector(count); |
| |
| // Fill the vector with objects |
| for (int i = 0; i < count; i++) { |
| java.awt.Component c = getComponent(unoAccessibleContext.getAccessibleChild(i)); |
| |
| if (c != null) { |
| children.add(c); |
| } |
| } |
| } catch (com.sun.star.uno.RuntimeException e) { |
| if (Build.DEBUG) { |
| System.err.println( |
| "RuntimeException caught during menu initialization: " + |
| e.getMessage()); |
| } |
| |
| if (children == null) { |
| children = new java.util.Vector(0); |
| } |
| } catch (com.sun.star.lang.IndexOutOfBoundsException e) { |
| } |
| } |
| |
| protected synchronized void add(XAccessible unoAccessible) { |
| // The AccessBridge for Windows expects an instance of AccessibleContext |
| // as parameters |
| java.awt.Component c = getComponent(unoAccessible); |
| |
| if (c != null) { |
| try { |
| children.add(unoAccessible.getAccessibleContext() |
| .getAccessibleIndexInParent(), c); |
| firePropertyChange(javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, |
| null, |
| ((javax.accessibility.Accessible) c).getAccessibleContext()); |
| } catch (com.sun.star.uno.RuntimeException e) { |
| } |
| } |
| } |
| |
| protected synchronized void remove(XAccessible unoAccessible) { |
| // The AccessBridge for Windows expects an instance of AccessibleContext |
| // as parameters |
| java.awt.Component c = getComponent(unoAccessible); |
| |
| if (c != null) { |
| try { |
| children.remove(c); |
| firePropertyChange(javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, |
| ((javax.accessibility.Accessible) c).getAccessibleContext(), |
| null); |
| } catch (com.sun.star.uno.RuntimeException e) { |
| } |
| } |
| } |
| |
| protected void add(Object any) { |
| try { |
| add((XAccessible) AnyConverter.toObject( |
| AccessibleObjectFactory.XAccessibleType, any)); |
| } catch (com.sun.star.lang.IllegalArgumentException e) { |
| } |
| } |
| |
| protected void remove(Object any) { |
| try { |
| remove((XAccessible) AnyConverter.toObject( |
| AccessibleObjectFactory.XAccessibleType, any)); |
| } catch (com.sun.star.lang.IllegalArgumentException e) { |
| } |
| } |
| |
| protected synchronized int indexOf(Object child) { |
| return children.indexOf(child); |
| } |
| |
| protected java.awt.Component getComponent(XAccessible unoAccessible) { |
| java.awt.Component c = AccessibleObjectFactory.getAccessibleComponent(unoAccessible); |
| |
| if (c == null) { |
| c = AccessibleObjectFactory.createAccessibleComponent(unoAccessible); |
| |
| if (c instanceof javax.accessibility.Accessible) { |
| ((javax.accessibility.Accessible) c).getAccessibleContext() |
| .setAccessibleParent(this); |
| } |
| } |
| |
| return c; |
| } |
| |
| protected XAccessibleEventListener createEventListener() { |
| return new AccessibleMenuListener(); |
| } |
| |
| /** Creates the AccessibleContext associated with this object */ |
| public javax.accessibility.AccessibleContext createAccessibleContext() { |
| return new AccessibleMenu(); |
| } |
| |
| /** |
| * Update the proxy objects appropriatly on property change events |
| */ |
| protected class AccessibleMenuListener |
| extends AccessibleUNOComponentListener { |
| protected AccessibleMenuListener() { |
| super(); |
| } |
| |
| /** Called by OpenOffice process to notify property changes */ |
| public void notifyEvent(AccessibleEventObject event) { |
| switch (event.EventId) { |
| case AccessibleEventId.CHILD: |
| |
| if (AnyConverter.isObject(event.OldValue)) { |
| remove(event.OldValue); |
| } |
| |
| if (AnyConverter.isObject(event.NewValue)) { |
| add(event.NewValue); |
| } |
| |
| break; |
| |
| // #i56539# Java 1.5 does not fire ACCESSIBLE_SELECTION_PROPERTY for menus |
| case AccessibleEventId.SELECTION_CHANGED: |
| break; |
| |
| default: |
| super.notifyEvent(event); |
| } |
| } |
| } |
| |
| protected class AccessibleMenu extends AccessibleAbstractButton |
| implements javax.accessibility.AccessibleSelection { |
| protected AccessibleMenu() { |
| unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface(XAccessibleSelection.class, |
| unoAccessibleContext); |
| } |
| |
| /** Gets the role of this object */ |
| public javax.accessibility.AccessibleRole getAccessibleRole() { |
| return javax.accessibility.AccessibleRole.MENU; |
| } |
| |
| /** Gets the 0-based index of this object in its accessible parent */ |
| public int getAccessibleIndexInParent() { |
| if (getAccessibleParent() instanceof Menu) { |
| return ((Menu) getAccessibleParent()).indexOf(Menu.this); |
| } else { |
| return super.getAccessibleIndexInParent(); |
| } |
| } |
| |
| /** Returns the number of accessible children of the object */ |
| public synchronized int getAccessibleChildrenCount() { |
| return children.size(); |
| } |
| |
| /** Returns the specified Accessible child of the object */ |
| public synchronized javax.accessibility.Accessible getAccessibleChild( |
| int i) { |
| try { |
| if (i < children.size()) { |
| return (javax.accessibility.Accessible) children.get(i); |
| } else { |
| return null; |
| } |
| } catch (ArrayIndexOutOfBoundsException e) { |
| return null; |
| } |
| } |
| |
| /** Returns the AccessibleSelection interface for this object */ |
| public javax.accessibility.AccessibleSelection getAccessibleSelection() { |
| // This method is called to determine the SELECTABLE state of every |
| // child, so don't do the query interface here. |
| return this; |
| } |
| |
| /* |
| * AccessibleComponent |
| */ |
| |
| /** Returns the Accessible child, if one exists, contained at the local coordinate Point */ |
| public javax.accessibility.Accessible getAccessibleAt(java.awt.Point p) { |
| try { |
| java.awt.Component c = AccessibleObjectFactory.getAccessibleComponent(unoAccessibleComponent.getAccessibleAtPoint( |
| new com.sun.star.awt.Point(p.x, p.y))); |
| |
| return (javax.accessibility.Accessible) c; |
| } catch (com.sun.star.uno.RuntimeException e) { |
| return null; |
| } |
| } |
| |
| /* |
| * AccessibleSelection |
| */ |
| |
| /** Returns an Accessible representing the specified selected child of the object */ |
| public javax.accessibility.Accessible getAccessibleSelection(int i) { |
| try { |
| return (javax.accessibility.Accessible) getComponent(unoAccessibleSelection.getSelectedAccessibleChild( |
| i)); |
| } catch (java.lang.Exception e) { |
| /* |
| * Possible exceptions are: |
| * java.lang.NullPointerException |
| * com.sun.star.uno.RuntimeException |
| * com.sun.star.lang.IndexOutOfBoundsException |
| */ |
| return null; |
| } |
| } |
| |
| /** Adds the specified Accessible child of the object to the object's selection */ |
| public void addAccessibleSelection(int i) { |
| try { |
| javax.accessibility.Accessible a = getAccessibleChild(i); |
| |
| // selecting menu items invokes the click action in Java 1.5 |
| if( a instanceof MenuItem ) |
| a.getAccessibleContext().getAccessibleAction().doAccessibleAction(0); |
| else |
| unoAccessibleSelection.selectAccessibleChild(i); |
| } catch (java.lang.Exception e) { |
| /* |
| * Possible exceptions are: |
| * java.lang.NullPointerException |
| * com.sun.star.uno.RuntimeException |
| * com.sun.star.lang.IndexOutOfBoundsException |
| */ |
| } |
| } |
| |
| /** Clears the selection in the object, so that no children in the object are selected */ |
| public void clearAccessibleSelection() { |
| try { |
| unoAccessibleSelection.clearAccessibleSelection(); |
| } catch (com.sun.star.uno.RuntimeException e) { |
| } |
| } |
| |
| /** Returns the number of Accessible children currently selected */ |
| public int getAccessibleSelectionCount() { |
| try { |
| return unoAccessibleSelection.getSelectedAccessibleChildCount(); |
| } catch (com.sun.star.uno.RuntimeException e) { |
| return 0; |
| } |
| } |
| |
| /** Determines if the current child of this object is selected */ |
| public boolean isAccessibleChildSelected(int i) { |
| try { |
| return unoAccessibleSelection.isAccessibleChildSelected(i); |
| } catch (java.lang.Exception e) { |
| /* |
| * Possible exceptions are: |
| * java.lang.NullPointerException |
| * com.sun.star.uno.RuntimeException |
| * com.sun.star.lang.IndexOutOfBoundsException |
| */ |
| return false; |
| } |
| } |
| |
| /** Removes the specified child of the object from the object's selection */ |
| public void removeAccessibleSelection(int i) { |
| if (isAccessibleChildSelected(i)) { |
| clearAccessibleSelection(); |
| } |
| } |
| |
| /** Causes every child of the object to be selected if the object supports multiple selection */ |
| public void selectAllAccessibleSelection() { |
| // not supported |
| } |
| } |
| } |