| /************************************************************** |
| * |
| * 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 javax.accessibility.AccessibleContext; |
| |
| import com.sun.star.uno.*; |
| import com.sun.star.accessibility.*; |
| |
| /** |
| * Specialized container for MenuBar and Popup-Menu(s) |
| * FIXME: join with Menu ? |
| */ |
| public class MenuContainer extends Container implements javax.accessibility.Accessible { |
| |
| protected XAccessibleSelection unoAccessibleSelection = null; |
| |
| protected MenuContainer(javax.accessibility.AccessibleRole role, XAccessible xAccessible, XAccessibleContext xAccessibleContext) { |
| super(role, xAccessible, xAccessibleContext); |
| } |
| |
| protected class AccessibleMenuContainerListener extends AccessibleContainerListener { |
| |
| protected AccessibleMenuContainerListener() { |
| super(); |
| } |
| |
| /** Called by OpenOffice process to notify property changes */ |
| public void notifyEvent(AccessibleEventObject event) { |
| switch (event.EventId) { |
| |
| // #i56539# Java 1.5 does not fire ACCESSIBLE_SELECTION_PROPERTY for menus |
| case AccessibleEventId.SELECTION_CHANGED: |
| break; |
| |
| default: |
| super.notifyEvent(event); |
| } |
| } |
| } |
| |
| protected XAccessibleEventListener createEventListener() { |
| return new AccessibleMenuContainerListener(); |
| } |
| |
| /** Creates the AccessibleContext associated with this object */ |
| public javax.accessibility.AccessibleContext createAccessibleContext() { |
| return new AccessibleMenuContainer(); |
| } |
| |
| protected class AccessibleMenuContainer extends AccessibleContainer implements javax.accessibility.AccessibleSelection { |
| |
| protected AccessibleMenuContainer() { |
| unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface(XAccessibleSelection.class, |
| unoAccessibleContext); |
| } |
| |
| /** Returns the AccessibleSelection interface for this object */ |
| public javax.accessibility.AccessibleSelection getAccessibleSelection() { |
| return this; |
| } |
| |
| /* |
| * AccessibleSelection |
| */ |
| |
| /** Returns an Accessible representing the specified selected child of the object */ |
| public javax.accessibility.Accessible getAccessibleSelection(int i) { |
| try { |
| return (javax.accessibility.Accessible) AccessibleObjectFactory.getAccessibleComponent( |
| unoAccessibleSelection.getSelectedAccessibleChild(i)); |
| } catch (com.sun.star.uno.Exception e) { |
| 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 |
| } |
| } |
| } |
| |