diff options
author | Oliver Braun <obr@openoffice.org> | 2002-12-06 10:25:41 +0000 |
---|---|---|
committer | Oliver Braun <obr@openoffice.org> | 2002-12-06 10:25:41 +0000 |
commit | 9df11d876f65cb54b7faab25f0832659a0467d01 (patch) | |
tree | 48001e0289f157bd516f658f506f027e47ceba8d | |
parent | e2e672057a694324bf33088b9c432971b707ae69 (diff) |
#100456# post all events to the Java event queue
34 files changed, 8526 insertions, 400 deletions
diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AbstractButton.java b/accessibility/bridge/org/openoffice/java/accessibility/AbstractButton.java new file mode 100644 index 000000000000..890c45fd1a89 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AbstractButton.java @@ -0,0 +1,223 @@ +/************************************************************************* + * + * $RCSfile: AbstractButton.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import java.text.BreakIterator; + +import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.accessibility.AccessibleText; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Rectangle; +import com.sun.star.uno.UnoRuntime; + +import drafts.com.sun.star.accessibility.*; + +/** + */ +public abstract class AbstractButton extends Component { + + protected AbstractButton() { + super(); + } + + protected class AccessibleAbstractButtonListener extends AccessibleUNOComponentListener { + + protected AccessibleAbstractButtonListener() { + super(); + } + + protected void setComponentState(short state, boolean enable) { + switch (state) { + case AccessibleStateType.ARMED: + fireStatePropertyChange(AccessibleState.ARMED, enable); + break; + case AccessibleStateType.CHECKED: + fireStatePropertyChange(AccessibleState.CHECKED, enable); + break; + case AccessibleStateType.PRESSED: + fireStatePropertyChange(AccessibleState.PRESSED, enable); + break; + default: + super.setComponentState(state, enable); + break; + } + } + } + + protected abstract class AccessibleAbstractButton extends AccessibleUNOComponent + implements AccessibleAction /*, AccessibleExtendedComponent */ { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleAbstractButton() { + super(); + } + + /* + * AccessibleContext + */ + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + try { + XAccessibleStateSet unoAccessibleStateSet = + unoAccessible.getAccessibleContext().getAccessibleStateSet(); + if (unoAccessibleStateSet.contains(AccessibleStateType.ARMED)) { + states.add(AccessibleState.ARMED); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.PRESSED)) { + states.add(AccessibleState.PRESSED); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.CHECKED)) { + states.add(AccessibleState.CHECKED); + } + } catch (com.sun.star.uno.RuntimeException e) { + } catch (NullPointerException e) { + } + return states; + } + + /** Gets the AccessibleAction associated with this object that supports one or more actions */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + return this; + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class,unoAccessibleComponent); + if (unoAccessibleText != null) { + return new AccessibleTextImpl(unoAccessibleText); + } else { + return null; + } + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the locale of the component */ + public java.util.Locale getLocale() throws java.awt.IllegalComponentStateException { + // The java loader sets the UI locale as default at startup + return java.util.Locale.getDefault(); + } + + /* + * AccessibleAction + */ + + /** Performs the specified Action on the object */ + public boolean doAccessibleAction(int param) { + if (param == 0) { + // Actions of MenuItems may also be performed if the item is not + // visible, so just try .. + try { + XAccessibleComponent xAccessibleComponent = AbstractButton.this.unoAccessibleComponent; + if (xAccessibleComponent != null) { + // Query for XAccessibleValue interface + XAccessibleAction xAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, + xAccessibleComponent); + + if (xAccessibleAction != null) { + return xAccessibleAction.doAccessibleAction(0); + } + } + } + + // Catch any type of uno exception + catch(com.sun.star.uno.Exception e) { + return false; + } + } + + return false; + } + + /** Returns a description of the specified action of the object */ + public java.lang.String getAccessibleActionDescription(int param) { + return javax.swing.UIManager.getString("AbstractButton.clickText"); + } + + /** Returns the number of accessible actions available in this object */ + public int getAccessibleActionCount() { + return 1; + } + } +} + + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleActionImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleActionImpl.java new file mode 100644 index 000000000000..22bc17dd9c4e --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleActionImpl.java @@ -0,0 +1,105 @@ +/************************************************************************* + * + * $RCSfile: AccessibleActionImpl.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:30 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.XAccessibleAction; + +/** The AccessibleActionWrapper maps the calls to the java AccessibleAction interface + * to the corresponding methods of the UNO XAccessibleAction interface. + */ +public class AccessibleActionImpl implements javax.accessibility.AccessibleAction { + + protected XAccessibleAction unoObject; + + /** Creates new AccessibleActionWrapper */ + public AccessibleActionImpl(XAccessibleAction xAccessibleAction) { + unoObject = xAccessibleAction; + } + + public boolean doAccessibleAction(int param) { + try { + return unoObject.doAccessibleAction(param); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + return false; + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } + } + + public java.lang.String getAccessibleActionDescription(int param) { + try { + return unoObject.getAccessibleActionDescription(param); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + return null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public int getAccessibleActionCount() { + try { + return unoObject.getAccessibleActionCount(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleComponentImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleComponentImpl.java new file mode 100644 index 000000000000..538695132916 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleComponentImpl.java @@ -0,0 +1,258 @@ +/************************************************************************* + * + * $RCSfile: AccessibleComponentImpl.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.AccessibleStateType; +import drafts.com.sun.star.accessibility.XAccessibleContext; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +// import drafts.com.sun.star.accessibility.XAccessibleExtendedComponent; +import com.sun.star.uno.UnoRuntime; + +public class AccessibleComponentImpl implements javax.accessibility.AccessibleComponent { + + protected XAccessibleComponent unoObject; +// protected XAccessibleExtendedComponent unoAccessibleExtendedComponent = null; + + /** Creates new AccessibleComponentImpl */ + public AccessibleComponentImpl(XAccessibleComponent xAccessibleComponent) { + unoObject = xAccessibleComponent; + } + + protected boolean hasState(short state) { + try { + XAccessibleContext unoAccessibleContext = (XAccessibleContext) + UnoRuntime.queryInterface(XAccessibleContext.class, unoObject); + // All UNO accessibility implementations must support XAccessibleContext + // and return a valid XAccessibleStateSet .. + return unoAccessibleContext.getAccessibleStateSet().contains(state); + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } catch (java.lang.NullPointerException e) { + System.err.println("XAccessibleContext unsupported or no XAccessibleStateSet returned."); + return false; + } + } + + /* + * XAccessibleComponent + */ + + public java.awt.Color getBackground() { + try { + return new java.awt.Color(unoObject.getBackground()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public void setBackground(java.awt.Color c) { + // Not supported by UNO accessibility API + } + + public java.awt.Color getForeground() { + try { + return new java.awt.Color(unoObject.getForeground()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public void setForeground(java.awt.Color c) { + // Not supported by UNO accessibility API + } + + public java.awt.Cursor getCursor() { + // Not supported by UNO accessibility API + return null; + } + + public void setCursor(java.awt.Cursor cursor) { + // Not supported by UNO accessibility API + } + + public java.awt.Font getFont() { + // FIXME + return null; + } + + public void setFont(java.awt.Font f) { + // Not supported by UNO accessibility API + } + + public java.awt.FontMetrics getFontMetrics(java.awt.Font f) { + // FIXME + return null; + } + + public boolean isEnabled() { + return hasState(AccessibleStateType.ENABLED); + } + + public void setEnabled(boolean b) { + // Not supported by UNO accessibility API + } + + public boolean isVisible() { + return hasState(AccessibleStateType.VISIBLE); + } + + public void setVisible(boolean b) { + // Not supported by UNO accessibility API + } + + public boolean isShowing() { + return hasState(AccessibleStateType.SHOWING); + } + + public boolean contains(java.awt.Point p) { + try { + return unoObject.contains(new com.sun.star.awt.Point(p.x, p.y)); + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } + } + + public java.awt.Point getLocationOnScreen() { + try { + com.sun.star.awt.Point unoPoint = unoObject.getLocationOnScreen(); + return new java.awt.Point(unoPoint.X, unoPoint.Y); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public java.awt.Point getLocation() { + try { + com.sun.star.awt.Point unoPoint = unoObject.getLocation(); + return new java.awt.Point( unoPoint.X, unoPoint.Y ); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public void setLocation(java.awt.Point p) { + // Not supported by UNO accessibility API + } + + public java.awt.Rectangle getBounds() { + try { + com.sun.star.awt.Rectangle unoRect = unoObject.getBounds(); + return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public void setBounds(java.awt.Rectangle r) { + // Not supported by UNO accessibility API + } + + public java.awt.Dimension getSize() { + try { + com.sun.star.awt.Size unoSize = unoObject.getSize(); + return new java.awt.Dimension(unoSize.Width, unoSize.Height); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public void setSize(java.awt.Dimension d) { + // Not supported by UNO accessibility API + } + + public javax.accessibility.Accessible getAccessibleAt(java.awt.Point p) { + // Not supported by this implementation + return null; + } + + public boolean isFocusTraversable() { + return hasState(AccessibleStateType.FOCUSABLE); + } + + public void requestFocus() { + unoObject.grabFocus(); + } + + /** + * Adds the specified focus listener to receive focus events from + * this component when this component gains input focus. + * If listener <code>l</code> is <code>null</code>, + * no exception is thrown and no action is performed. + */ + + public void addFocusListener(java.awt.event.FocusListener l) { + // Not supported by this implementation + } + + /** + * Removes the specified focus listener so that it no longer + * receives focus events from this component. This method performs + * no function, nor does it throw an exception, if the listener + * specified by the argument was not previously added to this component. + * If listener <code>l</code> is <code>null</code>, + * no exception is thrown and no action is performed. + */ + + public void removeFocusListener(java.awt.event.FocusListener l) { + // Not supported by this implementation + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleEditableTextImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleEditableTextImpl.java new file mode 100644 index 000000000000..5ecc9119c000 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleEditableTextImpl.java @@ -0,0 +1,401 @@ +/************************************************************************* + * + * $RCSfile: AccessibleEditableTextImpl.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import com.sun.star.awt.*; +import com.sun.star.style.*; +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.AccessibleTextType; +import drafts.com.sun.star.accessibility.XAccessibleEditableText; + +import javax.accessibility.AccessibleText; +import javax.swing.text.StyleConstants; + +/** The GenericAccessibleEditableText mapps the calls to the java AccessibleEditableText + * interface to the corresponding methods of the UNO XAccessibleEditableText interface. + */ +public class AccessibleEditableTextImpl extends AccessibleTextImpl implements javax.accessibility.AccessibleEditableText { + final static double toPointFactor = 1 / (7/10 + 34.5); + + /** Creates new GenericAccessibleEditableText object */ + public AccessibleEditableTextImpl(XAccessibleEditableText xAccessibleEditableText) { + super(xAccessibleEditableText); + } + + /** Cuts the text between two indices into the system clipboard */ + public void cut(int startIndex, int endIndex) { + try { + ((XAccessibleEditableText) unoObject).cutText(startIndex, endIndex); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Deletes the text between two indices */ + public void delete(int startIndex, int endIndex) { + try { + ((XAccessibleEditableText) unoObject).deleteText(startIndex, endIndex); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Returns the text range between two indices */ + public String getTextRange(int startIndex, int endIndex) { + try { + return unoObject.getTextRange(startIndex, endIndex); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } + + /** Inserts the specified string at the given index */ + public void insertTextAtIndex(int index, String s){ + try { + ((XAccessibleEditableText) unoObject).insertText(s, index); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Pastes the text form the system clipboard into the text starting at the specified index */ + public void paste(int startIndex) { + try { + ((XAccessibleEditableText) unoObject).pasteText(startIndex); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Replaces the text between two indices with the specified string */ + public void replaceText(int startIndex, int endIndex, String s) { + try { + ((XAccessibleEditableText) unoObject).replaceText(startIndex, endIndex, s); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Selects the text between two indices */ + public void selectText(int startIndex, int endIndex) { + try { + unoObject.setSelection(startIndex, endIndex); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Sets the attributes for the text between two indices */ + public void setAttributes(int startIndex, int endIndex, javax.swing.text.AttributeSet as) { + java.util.Vector propertyValues = new java.util.Vector(); + + // Convert Alignment attribute + Object attribute = as.getAttribute(StyleConstants.Alignment); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaAdjust"; + + switch (StyleConstants.getAlignment(as)) { + case StyleConstants.ALIGN_RIGHT: + propertyValue.Value = ParagraphAdjust.RIGHT; + break; + case StyleConstants.ALIGN_CENTER: + propertyValue.Value = ParagraphAdjust.CENTER; + break; + case StyleConstants.ALIGN_JUSTIFIED: + propertyValue.Value = ParagraphAdjust.BLOCK; + break; + default: + propertyValue.Value = ParagraphAdjust.LEFT; + break; + } + propertyValues.add(propertyValue); + } + + // Convert Background attribute + attribute = as.getAttribute(StyleConstants.Background); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharBackColor"; + propertyValue.Value = new Integer(StyleConstants.getBackground(as).getRGB()); + propertyValues.add(propertyValue); + } + + // FIXME: BidiLevel + + // Set Bold attribute + attribute = as.getAttribute(StyleConstants.Bold); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharWeight"; + if (StyleConstants.isBold(as)) { + propertyValue.Value = new Float(150); + } else { + propertyValue.Value = new Float(100); + } + propertyValues.add(propertyValue); + } + + // FIXME: Java 1.4 ComponentAttribute, ComponentElementName, ComposedTextAttribute + + // Set FirstLineIndent attribute + attribute = as.getAttribute(StyleConstants.FirstLineIndent); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaFirstLineIndent"; + propertyValue.Value = new Double(StyleConstants.getFirstLineIndent(as) / toPointFactor); + propertyValues.add(propertyValue); + } + + // Set font family attribute + attribute = as.getAttribute(StyleConstants.FontFamily); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharFontPitch"; + + if (StyleConstants.getFontFamily(as).equals( "Proportional" )) { + propertyValue.Value = new Short("2"); + } else { + propertyValue.Value = new Short("1"); + } + propertyValues.add(propertyValue); + } + + // Set font size attribute + attribute = as.getAttribute(StyleConstants.FontSize); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharHeight"; + propertyValue.Value = new Integer(StyleConstants.getFontSize(as)); + propertyValues.add(propertyValue); + } + + // Map foreground color + attribute = as.getAttribute(StyleConstants.Foreground); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharColor"; + propertyValue.Value = new Integer (StyleConstants.getForeground(as).getRGB()); + propertyValues.add(propertyValue); + } + + // FIXME: IconAttribute, IconElementName + + // Set italic attribute + attribute = as.getAttribute(StyleConstants.Italic); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharPosture"; + + if (StyleConstants.isItalic(as)) { + propertyValue.Value = FontSlant.ITALIC; + } else { + propertyValue.Value = FontSlant.DONTKNOW; + } + propertyValues.add(propertyValue); + } + + // Set left indent attribute + attribute = as.getAttribute(StyleConstants.LeftIndent); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaFirstLeftMargin"; + propertyValue.Value = new Integer(new Double(StyleConstants.getLeftIndent(as) / toPointFactor).intValue()); + propertyValues.add(propertyValue); + } + + // Set right indent attribute + attribute = as.getAttribute(StyleConstants.RightIndent); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaFirstRightMargin"; + propertyValue.Value = new Integer(new Double(StyleConstants.getRightIndent(as) / toPointFactor).intValue()); + propertyValues.add(propertyValue); + } + + // Set line spacing attribute + attribute = as.getAttribute(StyleConstants.LineSpacing); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaLineSpacing"; + propertyValue.Value = new Integer(new Double(StyleConstants.getLineSpacing(as) / toPointFactor).intValue()); + propertyValues.add(propertyValue); + } + + // FIXME: Java 1.4 NameAttribute, Orientation, ResolveAttribute + + // Set space above attribute + attribute = as.getAttribute(StyleConstants.SpaceAbove); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaTopMargin"; + propertyValue.Value = new Integer(new Double( StyleConstants.getSpaceAbove(as) / toPointFactor).intValue()); + propertyValues.add(propertyValue); + } + + // Set space below attribute + attribute = as.getAttribute(StyleConstants.SpaceBelow); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaBottomMargin"; + propertyValue.Value = new Integer(new Double(StyleConstants.getSpaceBelow(as) / toPointFactor).intValue()); + propertyValues.add(propertyValue); + } + + // Set strike through attribute + attribute = as.getAttribute(StyleConstants.StrikeThrough); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharPosture"; + if (StyleConstants.isStrikeThrough(as)) { + propertyValue.Value = new Short(FontStrikeout.SINGLE); + } else { + propertyValue.Value = new Short(FontStrikeout.NONE); + } + propertyValues.add(propertyValue); + } + + // Set sub-/superscript attribute + attribute = as.getAttribute(StyleConstants.Superscript); + if (null == attribute) { + attribute = as.getAttribute(StyleConstants.Subscript); + } + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharEscapement"; + + if (StyleConstants.isSuperscript(as)) { + propertyValue.Value = new Short( "1" ); + } else if (StyleConstants.isSubscript(as)) { + propertyValue.Value = new Short( "-1" ); + } else { + propertyValue.Value = new Short( "0" ); + } + propertyValues.add(propertyValue); + } + + // Set tabset attribute + attribute = as.getAttribute(StyleConstants.TabSet); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "ParaTabStops"; + + javax.swing.text.TabSet tabSet = StyleConstants.getTabSet(as); + java.util.ArrayList tabStops = new java.util.ArrayList(tabSet.getTabCount()); + + for (int i = 0, max = tabSet.getTabCount(); i < max; i++) { + javax.swing.text.TabStop tab = tabSet.getTab(i); + com.sun.star.style.TabStop unoTab = new com.sun.star.style.TabStop(); + + unoTab.Position = new Double(tab.getPosition() / toPointFactor).intValue(); + + switch (tab.getAlignment()) { + case javax.swing.text.TabStop.ALIGN_CENTER: + unoTab.Alignment = TabAlign.CENTER; + break; + case javax.swing.text.TabStop.ALIGN_RIGHT: + unoTab.Alignment = TabAlign.RIGHT; + break; + case javax.swing.text.TabStop.ALIGN_DECIMAL: + unoTab.Alignment = TabAlign.DECIMAL; + break; + default: + unoTab.Alignment = TabAlign.LEFT; + break; + } + + tabStops.add(unoTab); + } + propertyValue.Value = (com.sun.star.style.TabStop[]) tabStops.toArray(); + propertyValues.add(propertyValue); + } + + // Set underline attribute + attribute = as.getAttribute(StyleConstants.Underline); + if (null != attribute) { + com.sun.star.beans.PropertyValue propertyValue = new com.sun.star.beans.PropertyValue(); + propertyValue.Name = "CharUnderline"; + + if (StyleConstants.isUnderline(as)) { + propertyValue.Value = new Short(FontUnderline.SINGLE); + } else { + propertyValue.Value = new Short(FontUnderline.NONE); + } + propertyValues.add(propertyValue); + } + + try { + ((XAccessibleEditableText) unoObject).setAttributes(startIndex, endIndex, (com.sun.star.beans.PropertyValue[]) propertyValues.toArray()); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Sets the text contents to the specified string */ + public void setTextContents(String s) { + try { + ((XAccessibleEditableText) unoObject).setText(s); + } catch (com.sun.star.uno.RuntimeException e) { + } + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleExtendedState.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleExtendedState.java new file mode 100644 index 000000000000..860ccf871d33 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleExtendedState.java @@ -0,0 +1,70 @@ +/************************************************************************* + * + * $RCSfile: AccessibleExtendedState.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +public class AccessibleExtendedState extends javax.accessibility.AccessibleState { + public static final AccessibleExtendedState MANAGES_DESCENDANTS = new AccessibleExtendedState("managesDescendants"); + + protected AccessibleExtendedState(String key) { + super(key); + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleIconImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleIconImpl.java new file mode 100644 index 000000000000..c8498aea6fec --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleIconImpl.java @@ -0,0 +1,107 @@ +/************************************************************************* + * + * $RCSfile: AccessibleIconImpl.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.XAccessibleImage; + +/** + */ +public class AccessibleIconImpl implements javax.accessibility.AccessibleIcon { + + XAccessibleImage unoAccessibleImage; + + public AccessibleIconImpl(XAccessibleImage xImage) { + unoAccessibleImage = xImage; + } + + /** Gets the description of the icon */ + public String getAccessibleIconDescription() { + try { + return unoAccessibleImage.getAccessibleImageDescription(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the height of the icon */ + public int getAccessibleIconHeight() { + try { + return unoAccessibleImage.getAccessibleImageHeight(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Gets the width of the icon */ + public int getAccessibleIconWidth() { + try { + return unoAccessibleImage.getAccessibleImageWidth(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Sets the description of the icon */ + public void setAccessibleIconDescription(String s) { + // Not supported + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java index d72fe0fc0c61..260a09287253 100644 --- a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessibleObjectFactory.java,v $ * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * - * last change: $Author: sab $ $Date: 2002-11-19 13:53:10 $ + * last change: $Author: obr $ $Date: 2002-12-06 11:25:32 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -68,22 +68,16 @@ import javax.accessibility.Accessible; import javax.accessibility.AccessibleStateSet; import com.sun.star.uno.*; -import drafts.com.sun.star.accessibility.AccessibleRole; -import drafts.com.sun.star.accessibility.AccessibleStateType; -import drafts.com.sun.star.accessibility.XAccessible; -import drafts.com.sun.star.accessibility.XAccessibleContext; -import drafts.com.sun.star.accessibility.XAccessibleStateSet; +import drafts.com.sun.star.accessibility.*; /** */ -public class AccessibleObjectFactory implements XGlobalFocusListener { +public class AccessibleObjectFactory extends java.awt.FocusTraversalPolicy { // This type is needed for conversions from/to uno Any - public static final Type XAccessibleType = new Type(XAccessible.class); public static boolean autoPopulate = true; java.util.Hashtable objectList = new java.util.Hashtable(); - XAccessibilityInformationProvider infoProvider; private static AccessibleObjectFactory defaultFactory = new AccessibleObjectFactory(); @@ -97,48 +91,42 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { return defaultFactory; } - /** Sets a new AccessibleInformationProvider to be used by this factory object */ - public void setInformationProvider(XAccessibilityInformationProvider provider) { - infoProvider = provider; -// provider.setGlobalFocusListener(this); + /** Returns the Component that should receive the focus after aComponent */ + public java.awt.Component getComponentAfter(java.awt.Container focusCycleRoot, + java.awt.Component aComponent) { + return null; } - /** Returns the AccessibleInformationProvider currently used by this factory object */ - public XAccessibilityInformationProvider getInformationProvider() { - return infoProvider; + /** Returns the Component that should receive the focus before aComponent */ + public java.awt.Component getComponentBefore(java.awt.Container focusCycleRoot, + java.awt.Component aComponent) { + return null; } - public AccessibleObject getAccessibleObject(XAccessible xAccessible, boolean create, Accessible parent) { - AccessibleObject o = null; - - if(xAccessible != null) { - // Retrieve unique id for the original UNO object to be used as a hash key - String oid = UnoRuntime.generateOid(xAccessible); - - // Check if we already have a wrapper object for this context - synchronized (objectList) { - WeakReference r = (WeakReference) objectList.get(oid); - if(r != null) { - o = (AccessibleObject) r.get(); - } - } + /** Returns the default Component to focus */ + public java.awt.Component getDefaultComponent(java.awt.Container focusCycleRoot) { + return null; + } - if( o == null && create ) { - o = new AccessibleObject(xAccessible, parent); + /** Returns the first Component in the traversal cycle */ + public java.awt.Component getFirstComponent(java.awt.Container focusCycleRoot) { + return null; + } - // Add the newly created object to the cache list - synchronized (objectList) { - objectList.put(oid, new WeakReference(o)); - if( Build.DEBUG ) { -// System.out.println("Object cache now contains " + objectList.size() + " objects."); - } - } - } + /** Returns the Component that should receive the focus when a Window is made visible for the first time */ + public java.awt.Component getInitialComponent(java.awt.Window window) { + if (window instanceof NativeFrame) { + return ((NativeFrame) window).getInitialComponent(); } + return null; + } - return o; + /** Returns the last Component in the traversal cycle */ + public java.awt.Component getLastComponent(java.awt.Container focusCycleRoot) { + return null; } +/* public AccessibleUNOComponent createAccessibleContext(XAccessibleContext xAccessibleContext) { AccessibleUNOComponent ac = null; @@ -149,21 +137,10 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { XAccessibleStateSet xStateSet = null; switch(role) { - case AccessibleRole.CHECKBOX: - ac = new AccessibleButton( - javax.accessibility.AccessibleRole.CHECK_BOX, - javax.accessibility.AccessibleState.CHECKED, - xAccessibleContext - ); - break; - case AccessibleRole.COMBOBOX: - ac = new AccessibleComboBox(xAccessibleContext); - break; case AccessibleRole.LIST: ac = new AccessibleList(xAccessibleContext); break; case AccessibleRole.MENUBAR: - case AccessibleRole.PAGETABLIST: case AccessibleRole.POPUPMENU: ac = new AccessibleContainer( AccessibleRoleMap.toAccessibleRole(role), @@ -214,29 +191,12 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.PARAGRAPH: ac = new AccessibleParagraph(xAccessibleContext); break; - case AccessibleRole.PUSHBUTTON: - ac = new AccessibleButton( - javax.accessibility.AccessibleRole.PUSH_BUTTON, - javax.accessibility.AccessibleState.SELECTED, - xAccessibleContext - ); - break; - case AccessibleRole.RADIOBUTTON: - ac = new AccessibleButton( - javax.accessibility.AccessibleRole.RADIO_BUTTON, - javax.accessibility.AccessibleState.CHECKED, - xAccessibleContext - ); - break; case AccessibleRole.SCROLLBAR: ac = new AccessibleScrollBar(xAccessibleContext); break; - case AccessibleRole.SEPARATOR: - ac = new AccessibleSeparator(xAccessibleContext); - break; case AccessibleRole.TABLE: xStateSet = xAccessibleContext.getAccessibleStateSet(); - if(xStateSet != null && ! xStateSet.contains(AccessibleStateType.MANAGES_DESCENDANT)) { + if(xStateSet != null && ! xStateSet.contains(AccessibleStateType.CHILDREN_TRANSIENT)) { ac = new AccessibleTextTable(xAccessibleContext); } else { ac = new AccessibleSpreadsheet(xAccessibleContext); @@ -255,16 +215,9 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.FOOTER: case AccessibleRole.FOOTNOTE: case AccessibleRole.HEADER: - case AccessibleRole.LAYEREDPANE: - case AccessibleRole.OPTIONPANE: - case AccessibleRole.PAGETAB: + case AccessibleRole.PAGETABLIST: case AccessibleRole.PANEL: - case AccessibleRole.ROOTPANE: - case AccessibleRole.SCROLLPANE: - case AccessibleRole.SPLITPANE: - case AccessibleRole.STATUSBAR: case AccessibleRole.TOOLBAR: - case AccessibleRole.WINDOW: ac = new AccessibleWindow( AccessibleRoleMap.toAccessibleRole(role), xAccessibleContext @@ -275,10 +228,6 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { System.out.println("Unmapped role: " + AccessibleRoleMap.toAccessibleRole(role) + " (id = " + role + ")"); } - ac = new AccessibleWindow( - AccessibleRoleMap.toAccessibleRole(role), - xAccessibleContext - ); break; } @@ -288,152 +237,364 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { listener = (AccessibleEventListener) ac; } - /* The accessible event broadcaster will never be removed by a removeEventListener - * call. This requires that the UNO accessibility objects get activly destructed - * using dispose(). - */ - ac.initialize(infoProvider.getAccessibleContextInfo(xAccessibleContext, listener)); - } - - catch(com.sun.star.uno.RuntimeException e) { - } - } - - if( Build.DEBUG && ac == null ) { - System.out.println("AccessibleObjectFactory: returning null object"); - } - return ac; } -/* - public AccessibleObject removeAccessibleObject(XAccessible xAccessible) { - XAccessibleContext xAccessibleContext = null; - - if(xAccessible == null) { - return null; - } +*/ + private java.awt.EventQueue eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); - // Save the round trip to C++ UNO if possible - if(xAccessible instanceof XAccessibleContext) { - xAccessibleContext = (XAccessibleContext) xAccessible; - } else { - xAccessibleContext = xAccessible.getAccessibleContext(); - } + public java.awt.EventQueue getEventQueue() { + return eventQueue; + } - // Ensure that we really got an UNO accessible context - if(xAccessibleContext == null) { - return null; - } + public java.awt.Component getAccessibleComponent(XAccessible xAccessible) { + java.awt.Component c = null; + if (xAccessible != null) { + // Retrieve unique id for the original UNO object to be used as a hash key + String oid = UnoRuntime.generateOid(xAccessible); - // Retrieve unique id for the original UNO object to be used as a hash key - String oid = UnoRuntime.generateOid(xAccessibleContext); - AccessibleObject o = null; - // Check if we already have a wrapper object for this context - synchronized (objectList) { - // Do not remove the object from the list, may need to recycle - // them as long as they are do garbage collected - WeakReference r = (WeakReference) objectList.get(oid); - if(r != null) { - o = (AccessibleObject) r.get(); + // Check if we already have a wrapper object for this context + synchronized (objectList) { + WeakReference r = (WeakReference) objectList.get(oid); + if(r != null) { + c = (java.awt.Component) r.get(); + } } } - - // FIXME create dummy for objects not found. - - return null; + return c; } -*/ - public static XAccessible toXAccessible(Object any) { - if(AnyConverter.isObject(any)) { + + /** + * returns the child component that has the initial input focus + */ + protected void populateContainer(java.awt.Container parent, XAccessibleContext parentAC, java.awt.Window frame) { + if (parentAC != null) { try { - return (XAccessible) AnyConverter.toObject(XAccessibleType, any); + int childCount = parentAC.getAccessibleChildCount(); + for (int i=0; i<childCount; i++) { + XAccessible child = parentAC.getAccessibleChild(i); + if (child != null) { + XAccessibleContext childAC = child.getAccessibleContext(); + java.awt.Component c = createAccessibleComponent(child, childAC, frame); + if (c != null) { + if (c instanceof java.awt.Container) { + populateContainer((java.awt.Container) c, childAC, frame); + } + parent.add(c); + } + } else if (Build.DEBUG) { + System.err.println("ignoring not accessible child " + i); + } + } } - catch(com.sun.star.lang.IllegalArgumentException e) { - // FIXME: output + catch (java.lang.Exception e) { + System.err.println("Exception caught: " + e.getMessage()); + e.printStackTrace(); } } - - return null; } - public java.lang.Object[] getAccessibleObjectSet(java.lang.Object o) { - java.lang.Object[] list = null; - - if( o instanceof java.lang.Object[] ) { - list = (java.lang.Object[]) o; - } else if( o instanceof com.sun.star.uno.Any && AnyConverter.isArray(o) ) { + protected java.awt.Component createAccessibleComponent(XAccessible xAccessible) { + if (xAccessible != null) { try { - list = (java.lang.Object[]) AnyConverter.toArray(o); - } - - catch(com.sun.star.lang.IllegalArgumentException e) { - // this should never happen - } - } - - if( list != null ) { - java.util.ArrayList set = new java.util.ArrayList(list.length); - - for(int i=0; i<list.length; i++) { - AccessibleObject ao = getAccessibleObject(toXAccessible(list[i]), true, null); - if( ao != null ) { - set.add(ao); + XAccessibleContext xAccessibleContext = xAccessible.getAccessibleContext(); + if (xAccessibleContext != null) { + java.awt.Component c = createAccessibleComponentImpl(xAccessible, + xAccessibleContext.getAccessibleRole(), (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class,xAccessibleContext), + xAccessibleContext.getAccessibleStateSet()); + if (c != null) { + if (c instanceof java.awt.Container) { + populateContainer(((java.awt.Container) c), xAccessibleContext, null); + } + return c; + } } + } catch (com.sun.star.uno.RuntimeException e) { } - - set.trimToSize(); - return set.toArray(); } - return null; } - public void releaseAccessibleObject(AccessibleObject o) { - synchronized (objectList) { - objectList.remove(o.toString()); - if( Build.DEBUG ) { - System.out.println("Object cache now contains " + objectList.size() + " objects."); + protected java.awt.Component createAccessibleComponent(XAccessible xAccessible, XAccessibleContext xAccessibleContext, + java.awt.Window frame) { + if (xAccessibleContext != null) { + try { + XAccessibleStateSet xAccessibleStateSet = xAccessibleContext.getAccessibleStateSet(); + java.awt.Component c = createAccessibleComponentImpl(xAccessible, + xAccessibleContext.getAccessibleRole(), (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class, xAccessibleContext), + xAccessibleStateSet); + if (c != null) { + // Set this component as initial component + if (xAccessibleStateSet.contains(AccessibleStateType.FOCUSED)) { + if (frame instanceof Dialog) { + ((Dialog) frame).setInitialComponent(c); + } else if (frame instanceof Frame) { + ((Frame) frame).setInitialComponent(c); + } + } + return c; + } + } catch (com.sun.star.uno.RuntimeException e) { + System.err.println("Exception caught: " + e.getMessage()); + e.printStackTrace(); } } + return null; } - // Traverses the accessibility hierarchy to ensure global focus event notifications - public static void populate(javax.accessibility.AccessibleContext ac) { - // ignore objects that have transient state - if( ac != null ) { - AccessibleStateSet as = ac.getAccessibleStateSet(); - if( null != as && - !as.contains(javax.accessibility.AccessibleState.TRANSIENT) && - !as.contains(AccessibleStateTypeMap.get(AccessibleStateType.MANAGES_DESCENDANT)) - ) - { - int n = ac.getAccessibleChildrenCount(); - for( int i = 0; i < n; i++ ) { - Accessible a = ac.getAccessibleChild(i); - if( a != null ) { - populate(a.getAccessibleContext()); - } + protected java.awt.Component createAccessibleComponentImpl(XAccessible xAccessible, short role, + XAccessibleComponent xAccessibleComponent, XAccessibleStateSet xAccessibleStateSet) { + java.awt.Component c = null; + switch (role) { + case AccessibleRole.CANVAS: + c = new Container(javax.accessibility.AccessibleRole.CANVAS, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.CHECKBOX: + c = new CheckBox(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.COMBOBOX: + // There is a different understanding of combo boxes in VCL than in Java: + // the Java combo boxes correspond to the VCL DropDown[Combo|List]Boxes, + // while all Combo-/ListBoxes if VCL return the role COMBOBOX + XAccessibleAction xAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, xAccessibleComponent); + if (xAccessibleAction != null && xAccessibleAction.getAccessibleActionCount() > 0) { +// c = new ComboBox(xAccessible, xAccessibleComponent, xAccessibleAction); + c = new Container(javax.accessibility.AccessibleRole.COMBO_BOX, + xAccessible, xAccessibleComponent); + } else { + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + } + break; + case AccessibleRole.DOCUMENT: + c = new Container(javax.accessibility.AccessibleRole.CANVAS, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.EMBEDDED_OBJECT: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.ENDNOTE: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.FILLER: + c = new Container(javax.accessibility.AccessibleRole.FILLER, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.FOOTNOTE: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.FOOTER: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.GRAPHIC: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.HEADER: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.ICON: + c = new Icon(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.LABEL: + c = new Label(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.LAYEREDPANE: + c = new Container(javax.accessibility.AccessibleRole.LAYERED_PANE, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.LIST: + c = new List(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.MENU: + c = new Menu(xAccessible, xAccessibleComponent); + // !!! FIXME !!! + // Menu items are always visible, but change SHOWING state +// if (!xAccessibleStateSet.contains(AccessibleStateType.SHOWING)) { +// c.setVisible(false); +// } + break; + case AccessibleRole.MENUBAR: + c = new MenuBar(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.MENUITEM: + c = new MenuItem(xAccessible, xAccessibleComponent); + c.setFocusable(false); + // Menu items are always visible, but change SHOWING state +// if (!xAccessibleStateSet.contains(AccessibleStateType.SHOWING)) { +// c.setVisible(false); +// } + break; + case AccessibleRole.POPUPMENU: + c = new PopupMenu(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.OPTIONPANE: + c = new Container(javax.accessibility.AccessibleRole.OPTION_PANE, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.PAGETAB: + c = new Container(javax.accessibility.AccessibleRole.PAGE_TAB, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.PAGETABLIST: + c = new PageTabList(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.PARAGRAPH: + case AccessibleRole.HEADING: + c = new TextComponent(xAccessible, xAccessibleComponent, true); + break; + case AccessibleRole.PANEL: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.PUSHBUTTON: + c = new Button(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.RADIOBUTTON: + c = new RadioButton(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.ROOTPANE: + c = new Container(javax.accessibility.AccessibleRole.ROOT_PANE, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.SCROLLBAR: + if (xAccessibleStateSet.contains(AccessibleStateType.VERTICAL)) { + c = new ScrollBar(xAccessible, xAccessibleComponent, + javax.swing.SwingConstants.VERTICAL); + } else { + c = new ScrollBar(xAccessible, xAccessibleComponent); + } + break; + case AccessibleRole.SCROLLPANE: + c = new Container(javax.accessibility.AccessibleRole.SCROLL_PANE, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.SEPARATOR: + if (xAccessibleStateSet.contains(AccessibleStateType.VERTICAL)) { + c = new Separator(xAccessible, xAccessibleComponent, + javax.swing.SwingConstants.VERTICAL); + } else { + c = new Separator(xAccessible, xAccessibleComponent); + } + break; + case AccessibleRole.SHAPE: + c = new Container(javax.accessibility.AccessibleRole.CANVAS, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.SPLITPANE: + c = new Container(javax.accessibility.AccessibleRole.SPLIT_PANE, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.STATUSBAR: + c = new Container(javax.accessibility.AccessibleRole.STATUS_BAR, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.TABLE: + c = new Table(xAccessible, xAccessibleComponent, + xAccessibleStateSet.contains(AccessibleStateType.MULTISELECTABLE)); + break; + case AccessibleRole.TEXT: + c = new TextComponent(xAccessible, xAccessibleComponent, + xAccessibleStateSet.contains(AccessibleStateType.MULTILINE)); + break; + case AccessibleRole.TEXT_FRAME: + c = new Container(javax.accessibility.AccessibleRole.PANEL, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.TOGGLEBUTTON: + c = new ToggleButton(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.TOOLBAR: + c = new Container(javax.accessibility.AccessibleRole.TOOL_BAR, + xAccessible, xAccessibleComponent); + break; + case AccessibleRole.TREE: + c = new Tree(xAccessible, xAccessibleComponent); + break; + case AccessibleRole.VIEWPORT: + c = new Container(javax.accessibility.AccessibleRole.VIEWPORT, + xAccessible, xAccessibleComponent); + break; + default: + System.err.println("Unmapped accessible object " + role); + System.err.println("usually mapped to " + AccessibleRoleAdapter.getAccessibleRole(role)); + c = new Container(AccessibleRoleAdapter.getAccessibleRole(role), + xAccessible, xAccessibleComponent); + break; + } + if (c != null) { + // Add the newly created object to the cache list + synchronized (objectList) { + objectList.put(c.toString(), new WeakReference(c)); + if (Build.DEBUG) { +// System.out.println("Object cache now contains " + objectList.size() + " objects."); } } + // Set the boundings of the component if it is visible .. + if (xAccessibleStateSet.contains(AccessibleStateType.VISIBLE)) { + com.sun.star.awt.Rectangle r = xAccessibleComponent.getBounds(); + c.setBounds(r.X, r.Y, r.Width, r.Height); + } else { + c.setVisible(false); + } + // Set the components' enabled enabled.. + if (!xAccessibleStateSet.contains(AccessibleStateType.ENABLED)) { + c.setEnabled(false); + } } - } - /* - * XGlobalFocusListener - */ - - public void focusGained(XAccessible xAccessible) { - AccessibleObject ao = getAccessibleObject(xAccessible, true, null); - if( ao != null ) { - ao.processFocusGained(); - } + return c; } - public void focusLost(XAccessible xAccessible) { - AccessibleObject ao = getAccessibleObject(xAccessible, false, null); - if( ao != null ) { - ao.processFocusLost(); +/* + protected java.? createTransientObject() +*/ + public java.awt.Window getTopWindow(XAccessible xAccessible) { + XAccessibleContext xAccessibleContext = xAccessible.getAccessibleContext(); + + if (xAccessibleContext != null) { + short role = xAccessibleContext.getAccessibleRole(); + XAccessibleStateSet xAccessibleStateSet = xAccessibleContext.getAccessibleStateSet(); + XAccessibleComponent xAccessibleComponent = (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class, xAccessibleContext); + + java.awt.Window w; + if (role == AccessibleRole.DIALOG) { + w = new Dialog(new Application(), + xAccessibleContext.getAccessibleName(), + xAccessibleStateSet.contains(AccessibleStateType.MODAL), + xAccessibleComponent); + } else if (role == AccessibleRole.FRAME) { + w = new Frame(xAccessibleContext.getAccessibleName(), + xAccessibleComponent); + } else if (role == AccessibleRole.WINDOW) { + w = new Window(new Application(), xAccessibleComponent); + } else { + if (Build.DEBUG) { + System.err.println("invalid role for toplevel window: " + role); + } + w = new Window(new Application(), xAccessibleComponent); +// return null; + } + populateContainer(w, xAccessibleContext, w); + w.setFocusTraversalPolicy(this); + w.setVisible(true); + // Post window gained focus event to let the frame/dialog become active + if (xAccessibleStateSet.contains(AccessibleStateType.ACTIVE)) { + getEventQueue().postEvent(new java.awt.event.WindowEvent(w, java.awt.event.WindowEvent.WINDOW_GAINED_FOCUS)); + } + return w; } + + return null; } } diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRelationAdapter.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRelationAdapter.java new file mode 100644 index 000000000000..be0611093156 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRelationAdapter.java @@ -0,0 +1,98 @@ +/************************************************************************* + * + * $RCSfile: AccessibleRelationAdapter.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import drafts.com.sun.star.accessibility.AccessibleRelation; +import drafts.com.sun.star.accessibility.XAccessible; + +/** + */ +public abstract class AccessibleRelationTypeMap { + + final static String[] data = { + null, + javax.accessibility.AccessibleRelation.CONTROLLED_BY, + javax.accessibility.AccessibleRelation.CONTROLLED_BY_PROPERTY, + javax.accessibility.AccessibleRelation.CONTROLLER_FOR, + javax.accessibility.AccessibleRelation.CONTROLLER_FOR_PROPERTY, + javax.accessibility.AccessibleRelation.LABEL_FOR, + javax.accessibility.AccessibleRelation.LABEL_FOR_PROPERTY, + javax.accessibility.AccessibleRelation.LABELED_BY, + javax.accessibility.AccessibleRelation.LABELED_BY_PROPERTY, + javax.accessibility.AccessibleRelation.MEMBER_OF, + javax.accessibility.AccessibleRelation.MEMBER_OF_PROPERTY + }; + + public static void fillAccessibleRelationSet(javax.accessibility.AccessibleRelationSet s, AccessibleRelation[] relations) { + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + for(int i=0; i<relations.length; i++) { + if( relations[i].RelationType < data.length && data[relations[i].RelationType] != null ) { + javax.accessibility.AccessibleRelation r = + new javax.accessibility.AccessibleRelation(data[relations[i].RelationType]); + + r.setTarget(factory.getAccessibleObjectSet(relations[i].TargetSet)); + s.add(r); + } + } + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRoleAdapter.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRoleAdapter.java new file mode 100644 index 000000000000..46e641ca8749 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleRoleAdapter.java @@ -0,0 +1,208 @@ +/************************************************************************* + * + * $RCSfile: AccessibleRoleAdapter.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:32 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.XAccessible; + +/** This class maps the AccessibleRole(s) of the UNO accessibility API + * to the corresponding javax.accessibility objects. + */ +public abstract class AccessibleRoleAdapter { + + /* This array is used as a mapping between the UNO AccessibleRole + * and the AccessibleRole objects of the Java accessibility API. + */ + public static final javax.accessibility.AccessibleRole[] data = { + javax.accessibility.AccessibleRole.UNKNOWN, + javax.accessibility.AccessibleRole.ALERT, + javax.accessibility.AccessibleRole.AWT_COMPONENT, + javax.accessibility.AccessibleRole.COLUMN_HEADER, + javax.accessibility.AccessibleRole.CANVAS, + javax.accessibility.AccessibleRole.CHECK_BOX, + javax.accessibility.AccessibleRole.COLOR_CHOOSER, + javax.accessibility.AccessibleRole.COMBO_BOX, + javax.accessibility.AccessibleRole.DATE_EDITOR, + javax.accessibility.AccessibleRole.DESKTOP_ICON, + javax.accessibility.AccessibleRole.DESKTOP_PANE, + javax.accessibility.AccessibleRole.DIRECTORY_PANE, + javax.accessibility.AccessibleRole.DIALOG, + javax.accessibility.AccessibleRole.FILE_CHOOSER, + javax.accessibility.AccessibleRole.FILLER, + javax.accessibility.AccessibleRole.FONT_CHOOSER, + javax.accessibility.AccessibleRole.FRAME, + javax.accessibility.AccessibleRole.GLASS_PANE, + javax.accessibility.AccessibleRole.GROUP_BOX, + javax.accessibility.AccessibleRole.HYPERLINK, + javax.accessibility.AccessibleRole.ICON, + javax.accessibility.AccessibleRole.INTERNAL_FRAME, + javax.accessibility.AccessibleRole.LABEL, + javax.accessibility.AccessibleRole.LAYERED_PANE, + javax.accessibility.AccessibleRole.LIST, + javax.accessibility.AccessibleRole.LIST_ITEM, + javax.accessibility.AccessibleRole.MENU, + javax.accessibility.AccessibleRole.MENU_BAR, + javax.accessibility.AccessibleRole.MENU_ITEM, + javax.accessibility.AccessibleRole.OPTION_PANE, + javax.accessibility.AccessibleRole.PAGE_TAB, + javax.accessibility.AccessibleRole.PAGE_TAB_LIST, + javax.accessibility.AccessibleRole.PANEL, + javax.accessibility.AccessibleRole.PASSWORD_TEXT, + javax.accessibility.AccessibleRole.POPUP_MENU, + javax.accessibility.AccessibleRole.PUSH_BUTTON, + javax.accessibility.AccessibleRole.PROGRESS_BAR, + javax.accessibility.AccessibleRole.RADIO_BUTTON, + javax.accessibility.AccessibleRole.ROW_HEADER, + javax.accessibility.AccessibleRole.ROOT_PANE, + javax.accessibility.AccessibleRole.SCROLL_BAR, + javax.accessibility.AccessibleRole.SCROLL_PANE, + javax.accessibility.AccessibleRole.SEPARATOR, + javax.accessibility.AccessibleRole.SLIDER, + javax.accessibility.AccessibleRole.SPIN_BOX, + javax.accessibility.AccessibleRole.SPLIT_PANE, + javax.accessibility.AccessibleRole.STATUS_BAR, + javax.accessibility.AccessibleRole.SWING_COMPONENT, + javax.accessibility.AccessibleRole.TABLE, + javax.accessibility.AccessibleRole.TEXT, + javax.accessibility.AccessibleRole.TOGGLE_BUTTON, + javax.accessibility.AccessibleRole.TOOL_BAR, + javax.accessibility.AccessibleRole.TOOL_TIP, + javax.accessibility.AccessibleRole.TREE, + javax.accessibility.AccessibleRole.VIEWPORT, + javax.accessibility.AccessibleRole.WINDOW, + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + null, // RESERVED + javax.accessibility.AccessibleRole.CANVAS, // DOCUMENT + javax.accessibility.AccessibleRole.PANEL, // HEADER + javax.accessibility.AccessibleRole.PANEL, // FOOTER + javax.accessibility.AccessibleRole.TEXT, // PARAGRAPH + javax.accessibility.AccessibleRole.TEXT, // HEADING + javax.accessibility.AccessibleRole.LABEL, // TABLE_CELL - required by ZoomText + javax.accessibility.AccessibleRole.PANEL, // TEXT_FRAME + javax.accessibility.AccessibleRole.PANEL, // GRAPHIC + javax.accessibility.AccessibleRole.PANEL, // EMBEDDED_OBJECT + javax.accessibility.AccessibleRole.PANEL, // ENDNOTE + javax.accessibility.AccessibleRole.PANEL, // FOOTNOTE + javax.accessibility.AccessibleRole.CANVAS // SHAPE + }; + + public static javax.accessibility.AccessibleRole getAccessibleRole(short role) { + if(role < data.length) { + if(data[role] == null) { + System.err.println("Unmapped role: " + role); + } + return data[role]; + } + // FIXME: remove debug out + System.err.println("Unmappable role: " + role); + return null; + } + + public static javax.accessibility.AccessibleRole getAccessibleRole(XAccessible unoAccessible) { + try { + return getAccessibleRole(unoAccessible.getAccessibleContext().getAccessibleRole()); + } catch (com.sun.star.uno.RuntimeException e) { + return javax.accessibility.AccessibleRole.UNKNOWN; + } + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java index 47ff94a607d9..174c1e5025be 100644 --- a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessibleTextImpl.java,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: obr $ $Date: 2002-10-08 06:48:02 $ + * last change: $Author: obr $ $Date: 2002-12-06 11:25:33 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,280 +61,367 @@ package org.openoffice.java.accessibility; -import java.text.BreakIterator; -import java.util.Locale; -import javax.accessibility.AccessibleContext; -import javax.accessibility.AccessibleComponent; +import com.sun.star.awt.*; +import com.sun.star.style.*; +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.*; + import javax.accessibility.AccessibleText; -import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; -import org.openoffice.accessibility.internal.*; - -import com.sun.star.awt.Point; -import com.sun.star.awt.Rectangle; -import com.sun.star.uno.UnoRuntime; - -import drafts.com.sun.star.accessibility.XAccessibleText; - -/** This class mapps the methods of a AccessibleText the corresponding UNO - XAccessibleText methods with two exceptions: because the gnome java - accessbridge relies on the behavior of the java word iterator that - handles punctuation characters as word (see java docu for details), - for objects not implementing AccessibleEditableText, the iteration - is done locally. Also the character attributes are calculated through - the AccessibleContext interface .. -*/ +/** The GenericAccessibleEditableText mapps the calls to the java AccessibleEditableText + * interface to the corresponding methods of the UNO XAccessibleEditableText interface. + */ public class AccessibleTextImpl implements javax.accessibility.AccessibleText { - XAccessibleText unoAccessibleText; + XAccessibleText unoObject; - AccessibleContext context; - String text; + final static double toPointFactor = 1 / (7/10 + 34.5); - public AccessibleTextImpl(XAccessibleText xText, AccessibleContext ac) { - unoAccessibleText = xText; - context = ac; - - if( unoAccessibleText != null ) { - text = unoAccessibleText.getText(); - } else { - text = ""; - } + /** Creates new GenericAccessibleEditableText object */ + public AccessibleTextImpl(XAccessibleText xAccessibleText) { + unoObject = xAccessibleText; } - public void update() { - if( unoAccessibleText != null ) { - text = unoAccessibleText.getText(); - } - } - - /* - * AccessibleText - */ - - /** Returns the string after a given index */ - public java.lang.String getAfterIndex(int part, int index) { - BreakIterator bi; - int start; - int end; - + protected static short toTextType(int part) { + short type = 0; switch (part) { case AccessibleText.CHARACTER: - start = index + 1; - end = index + 2; + type = AccessibleTextType.CHARACTER; break; case AccessibleText.WORD: - bi = BreakIterator.getWordInstance(context.getLocale()); - bi.setText(text); - start = bi.following(index); - end = bi.next(); + type = AccessibleTextType.WORD; break; case AccessibleText.SENTENCE: - bi = BreakIterator.getSentenceInstance(context.getLocale()); - bi.setText(text); - start = bi.following(index); - end = bi.next(); + type = AccessibleTextType.SENTENCE; break; default: - throw new IllegalArgumentException(); - } - - // Ensure start is in valid range - if( start < 0 ) { - start = 0; + break; } + return type; + } - // Ensure end is in valid range - if( end > text.length() ) { - end = text.length(); + /** Returns the string after a given index */ + public String getAfterIndex(int part, int index) { + short type = toTextType(part); + if (type > 0) { + try { + // FIXME: Workaround for a bug in the office that an empty string is returned + // when asking for the word at the position of a blank + String s = unoObject.getTextBehindIndex(index, type); + if ((part == AccessibleText.WORD) && (s.length() == 0)) { + s = " "; + } + return s; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } } - - return text.substring(start, end); + return null; } /** Returns the zero-based offset of the caret */ public int getCaretPosition() { - // A fixed text does not really have a caret - return -1; + try { +// if (Build.DEBUG) { +// System.err.println(this + "getCaretPosition() returns " + unoObject.getCaretPosition()); +// } + return unoObject.getCaretPosition(); + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } } /** Returns the start offset within the selected text */ public int getSelectionStart() { - // In fixed text nothing can be selected, so return the caret position as specified - // in AccessibleText docu. - return getCaretPosition(); + try { + int index = unoObject.getSelectionStart(); + if (index == -1) { + index = getCaretPosition(); + } + return index; + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } } - /** Returns the AttributSet for a given character at a given index */ - public javax.swing.text.AttributeSet getCharacterAttribute(int index) { - if( index > 0 && index < getCharCount() ) { - SimpleAttributeSet as = new SimpleAttributeSet(); - AccessibleComponent ac = context.getAccessibleComponent(); - - // Fixed text has always the default colors - StyleConstants.setBackground(as, ac.getBackground()); - StyleConstants.setForeground(as, ac.getForeground()); - - // Retrieve the information by querying the UI font - java.awt.Font f = ac.getFont(); - if(f != null) { - StyleConstants.setFontFamily(as, f.getFamily()); - StyleConstants.setFontSize(as, f.getSize()); - StyleConstants.setBold(as, f.isBold()); - StyleConstants.setItalic(as, f.isItalic()); + protected static void setAttribute(javax.swing.text.MutableAttributeSet as, com.sun.star.beans.PropertyValue property) { + try { + // Map alignment attribute + if (property.Name.equals("ParaAdjust")) { + ParagraphAdjust adjust = (ParagraphAdjust) + AnyConverter.toObject(new Type(ParagraphAdjust.class), property.Value); + + if (adjust.equals(ParagraphAdjust.LEFT)) { + StyleConstants.setAlignment(as, StyleConstants.ALIGN_LEFT); + } else if (adjust.equals(ParagraphAdjust.RIGHT)) { + StyleConstants.setAlignment(as, StyleConstants.ALIGN_RIGHT); + } else if (adjust.equals(ParagraphAdjust.CENTER)) { + StyleConstants.setAlignment(as, StyleConstants.ALIGN_CENTER); + } else if (adjust.equals(ParagraphAdjust.BLOCK) || adjust.equals(ParagraphAdjust.STRETCH)) { + StyleConstants.setAlignment(as, StyleConstants.ALIGN_JUSTIFIED); + } + + // Map background color + } else if (property.Name.equals("CharBackColor")) { + StyleConstants.setBackground(as, new java.awt.Color(AnyConverter.toInt(property.Value))); + + // FIXME: BidiLevel + + // Set bold attribute + } else if (property.Name.equals("CharWeight")) { + boolean isBold = AnyConverter.toFloat(property.Value) > 125; + StyleConstants.setBold(as, isBold); + + // FIXME: Java 1.4 ComponentAttribute, ComponentElementName, ComposedTextAttribute + + // Set FirstLineIndent attribute + } else if (property.Name.equals("ParaFirstLineIndent")) { + StyleConstants.setFirstLineIndent(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); + + // Set font family attribute + } else if (property.Name.equals("CharFontPitch")) { + if (AnyConverter.toShort (property.Value) == 2) { + StyleConstants.setFontFamily(as, "Proportional"); + } + + // Set font size attribute + } else if (property.Name.equals("CharHeight")) { + StyleConstants.setFontSize(as, (int) AnyConverter.toFloat(property.Value)); + + // Map foreground color + } else if (property.Name.equals("CharColor")) { + StyleConstants.setForeground(as, new java.awt.Color(AnyConverter.toInt(property.Value))); + + // FIXME: IconAttribute, IconElementName + + // Set italic attribute + } else if (property.Name.equals("CharPosture")) { + boolean isItalic = (FontSlant.ITALIC == (FontSlant) + AnyConverter.toObject(new Type(FontSlant.class), property.Value)); + + StyleConstants.setItalic(as, isItalic); + + // Set left indent attribute + } else if (property.Name.equals("ParaLeftMargin")) { + StyleConstants.setLeftIndent(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); + + // Set right indent attribute + } else if (property.Name.equals("ParaRightMargin")) { + StyleConstants.setRightIndent(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); } - // Retrieve the real character attributes from the live object - // StyleConstants.setUnderline(as, 0 != (attributes & CharacterAttributes.UNDERLINE)); - - return as; - } + // Set line spacing attribute + else if (property.Name.equals("ParaLineSpacing")) { + StyleConstants.setLineSpacing(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); + } - return null; - } + // FIXME: Java 1.4 NameAttribute, Orientation, ResolveAttribute - /** Given a point in local ccordinates, return the zero-based index of the character under that point */ - public int getIndexAtPoint(java.awt.Point point) { - int ret = -1; + // Set space above attribute + else if (property.Name.equals("ParaTopMargin")) { + StyleConstants.setSpaceAbove(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); + } - try { - if( unoAccessibleText != null ) { - ret = unoAccessibleText.getIndexAtPoint(new Point( point.x, point.y )); + // Set space below attribute + else if (property.Name.equals("ParaBottomMargin")) { + StyleConstants.setSpaceBelow(as, (float) (toPointFactor * AnyConverter.toInt(property.Value))); + + // Set strike through attribute + } else if (property.Name.equals("CharStrikeout")) { + boolean isStrikeThrough = (FontStrikeout.NONE != AnyConverter.toShort(property.Value)); + StyleConstants.setStrikeThrough(as, isStrikeThrough); + + // Set sub-/superscript attribute + } else if (property.Name.equals("CharEscapement")) { + short value = AnyConverter.toShort(property.Value); + if (value > 0) { + StyleConstants.setSuperscript(as, true); + } else if (value < 0) { + StyleConstants.setSubscript(as, true); + } + + // Set tabset attribute + } else if (property.Name.equals("ParaTabStops")) { + TabStop[] unoTabStops = (TabStop[]) AnyConverter.toArray(property.Value); + java.util.ArrayList tabStops = new java.util.ArrayList(unoTabStops.length); + + for (int index2 = 0; index2 < unoTabStops.length; index2++) { + float pos = (float) (toPointFactor * unoTabStops[index2].Position); + + if (unoTabStops[index2].Alignment.equals(TabAlign.LEFT)) { + tabStops.add(new javax.swing.text.TabStop(pos, + javax.swing.text.TabStop.ALIGN_LEFT, + javax.swing.text.TabStop.LEAD_NONE) + ); + } + else if (unoTabStops[index2].Alignment.equals(TabAlign.CENTER)) { + tabStops.add(new javax.swing.text.TabStop(pos, + javax.swing.text.TabStop.ALIGN_CENTER, + javax.swing.text.TabStop.LEAD_NONE) + ); + } + else if (unoTabStops[index2].Alignment.equals(TabAlign.RIGHT)) { + tabStops.add(new javax.swing.text.TabStop(pos, + javax.swing.text.TabStop.ALIGN_RIGHT, + javax.swing.text.TabStop.LEAD_NONE) + ); + } + else if (unoTabStops[index2].Alignment.equals(TabAlign.DECIMAL)) { + tabStops.add(new javax.swing.text.TabStop(pos, + javax.swing.text.TabStop.ALIGN_DECIMAL, + javax.swing.text.TabStop.LEAD_NONE) + ); + } + else { + tabStops.add(new javax.swing.text.TabStop(pos)); + } + } + + StyleConstants.setTabSet(as, new javax.swing.text.TabSet((javax.swing.text.TabStop[]) tabStops.toArray())); + + // Set underline attribute + } else if (property.Name.equals("CharUnderline")) { + boolean isUnderline = (FontUnderline.NONE != AnyConverter.toShort(property.Value)); + StyleConstants.setUnderline(as, isUnderline); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + if (Build.DEBUG) { + System.err.println(e.getMessage()); } } + } - catch(com.sun.star.uno.RuntimeException e) { - if( Build.DEBUG ) { - System.err.println("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); + /** Returns the AttributSet for a given character at a given index */ + public javax.swing.text.AttributeSet getCharacterAttribute(int param) { + try { + com.sun.star.beans.PropertyValue[] propertyValues = unoObject.getCharacterAttributes(param); + javax.swing.text.SimpleAttributeSet attributeSet = new javax.swing.text.SimpleAttributeSet(); + if (null != propertyValues) { + for (int index = 0; index < propertyValues.length; index++) { + setAttribute(attributeSet, propertyValues[index]); + } + } + return attributeSet; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + if (Build.DEBUG) { System.err.println(e.getMessage()); } + return null; } + } - catch(Exception e) { - if( Build.DEBUG ) { + /** Given a point in local coordinates, return the zero-based index of the character under that point */ + public int getIndexAtPoint(java.awt.Point point) { + try { +// if (Build.DEBUG) { +// System.err.println(this + "getIndexAtPoint(" + point.x + ", " + point.y + ") returns " + +// unoObject.getIndexAtPoint(new Point(point.x, point.y))); +// } + return unoObject.getIndexAtPoint(new Point(point.x, point.y)); + } catch (com.sun.star.uno.RuntimeException e) { + if (Build.DEBUG) { System.err.println("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); System.err.println(e.getMessage()); } + return -1; } - - return ret; } /** Returns the end offset within the selected text */ public int getSelectionEnd() { - // In fixed text nothing can be selected, so return the caret position as specified - // in AccessibleText docu. - return getCaretPosition(); + try { + int index = unoObject.getSelectionEnd(); + if (index == -1) { + index = getCaretPosition(); + } + return index; + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } } /** Returns the string before a given index */ public java.lang.String getBeforeIndex(int part, int index) { - BreakIterator bi; - int start; - int end; - - switch (part) { - case AccessibleText.CHARACTER: - start = index - 1; - end = index; - break; - case AccessibleText.WORD: - bi = BreakIterator.getWordInstance(context.getLocale()); - bi.setText(text); - end = bi.preceding(index); - start = bi.previous(); - break; - case AccessibleText.SENTENCE: - bi = BreakIterator.getSentenceInstance(context.getLocale()); - bi.setText(text); - end = bi.preceding(index); - start = bi.previous(); - break; - default: - throw new IllegalArgumentException(); - } - - // Ensure start is in valid range - if( start < 0 ) { - start = 0; - } - - // Ensure end is in valid range - if( end > text.length() ) { - end = text.length(); + short type = toTextType(part); + if (type > 0) { + try { + // FIXME: Workaround for a bug in the office that an empty string is returned + // when asking for the word at the position of a blank + String s = unoObject.getTextBeforeIndex(index, type); + if ((part == AccessibleText.WORD) && (s.length() == 0)) { + s = " "; + } + return s; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } } - - return text.substring(start, end); + return null; } /** Returns the string at a given index */ - public java.lang.String getAtIndex(int part, int index) { - BreakIterator bi; - int start; - int end; - - switch (part) { - case AccessibleText.CHARACTER: - start = index; - end = index + 1; - break; - case AccessibleText.WORD: - bi = BreakIterator.getWordInstance(context.getLocale()); - bi.setText(text); - end = bi.following(index); - start = bi.previous(); - break; - case AccessibleText.SENTENCE: - bi = BreakIterator.getSentenceInstance(context.getLocale()); - bi.setText(text); - end = bi.following(index); - start = bi.previous(); - break; - default: - throw new IllegalArgumentException(); - } - - // Ensure start is in valid range - if( start < 0 ) { - start = 0; - } - - // Ensure end is in valid range - if( end > text.length() ) { - end = text.length(); + public java.lang.String getAtIndex(int part, int index) { + short type = toTextType(part); + if (type > 0) { + try { +// if (Build.DEBUG) { +// System.err.println(this + "getAtIndex(" + part + "," + index + ") returns " + unoObject.getTextAtIndex(index, type)); +// } + // FIXME: Workaround for a bug in the office that an empty string is returned + // when asking for the word at the position of a blank + String s = unoObject.getTextAtIndex(index, type); + if ((part == AccessibleText.WORD) && (s.length() == 0)) { + s = " "; + } + return s; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } } - - return text.substring(start, end); + return null; } /** Returns the number of characters (valid indicies) */ public int getCharCount() { - return text.length(); + try { + return unoObject.getCharacterCount(); + } catch (com.sun.star.uno.RuntimeException e) { + } + return 0; } /** Returns the portion of the text that is selected */ public java.lang.String getSelectedText() { - // Nothing selected + try { + return unoObject.getSelectedText(); + } catch (com.sun.star.uno.RuntimeException e) { + } return null; } /** Determines the bounding box of the character at the given index into the string */ public java.awt.Rectangle getCharacterBounds(int index) { - if( index < text.length() ) { - try { - Rectangle unoRect = unoAccessibleText.getCharacterBounds(index); - return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height); - } - - catch ( com.sun.star.lang.IndexOutOfBoundsException exception ) { - // FIXME: The java AccessBridge currently does not handle such exceptions gracefully - // throw new IndexOutOfBoundsException( exception.getMessage() ); - } + try { + Rectangle unoRect = unoObject.getCharacterBounds(index); + return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } - catch ( NullPointerException e ) { + public String toString() { + try { + XAccessibleContext unoAccessibleContext = (XAccessibleContext) + UnoRuntime.queryInterface(XAccessibleContext.class, unoObject); + if (unoAccessibleContext != null) { + return "[" + AccessibleRoleAdapter.getAccessibleRole(unoAccessibleContext.getAccessibleRole()) + "] " + + unoAccessibleContext.getAccessibleName() + ": "; + } else { + return super.toString(); } + } catch (com.sun.star.uno.RuntimeException e) { + return super.toString(); } - - return new java.awt.Rectangle(); } } diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleValueImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleValueImpl.java new file mode 100644 index 000000000000..2f51de72da14 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleValueImpl.java @@ -0,0 +1,130 @@ +/************************************************************************* + * + * $RCSfile: AccessibleValueImpl.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:33 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.XAccessibleValue; +import com.sun.star.uno.AnyConverter; + +/** The AccessibleValueImpl mappes the calls to the java AccessibleValue + * interface to the corresponding methods of the UNO XAccessibleValue interface + */ +public class AccessibleValueImpl implements javax.accessibility.AccessibleValue { + protected XAccessibleValue unoObject; + + /** Creates new AccessibleValueImpl */ + public AccessibleValueImpl(XAccessibleValue xAccessibleValue) { + unoObject = xAccessibleValue; + } + + public static java.lang.Number toNumber(java.lang.Object any) { + try { + if(AnyConverter.isByte(any)) { + return new Byte(AnyConverter.toByte(any)); + } else if (AnyConverter.isShort(any)) { + return new Short(AnyConverter.toShort(any)); + } else if (AnyConverter.isInt(any)) { + return new Integer(AnyConverter.toInt(any)); + } else if (AnyConverter.isLong(any)) { + return new Long(AnyConverter.toLong(any)); + } else if (AnyConverter.isFloat(any)) { + return new Float(AnyConverter.toFloat(any)); + } else if (AnyConverter.isDouble(any)) { + return new Double(AnyConverter.toDouble(any)); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + + return null; + } + + public java.lang.Number getMinimumAccessibleValue() { + try { + return toNumber(unoObject.getMinimumValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public java.lang.Number getCurrentAccessibleValue() { + try { + return toNumber(unoObject.getCurrentValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public java.lang.Number getMaximumAccessibleValue() { + try { + return toNumber(unoObject.getMaximumValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + public boolean setCurrentAccessibleValue(java.lang.Number number) { + try { + return unoObject.setCurrentValue(number); + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } + } +} diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Application.java b/accessibility/bridge/org/openoffice/java/accessibility/Application.java new file mode 100644 index 000000000000..96f53c9b6d51 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Application.java @@ -0,0 +1,79 @@ +/************************************************************************* + * + * $RCSfile: Application.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:33 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; + +public class Application extends java.awt.Frame implements Accessible { + + protected AccessibleContext accessibleContext = null; + + protected Application() { + super(); + } + + public boolean isShowing() { + return true; + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Button.java b/accessibility/bridge/org/openoffice/java/accessibility/Button.java new file mode 100644 index 000000000000..a5cc63a3faf2 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Button.java @@ -0,0 +1,100 @@ +/************************************************************************* + * + * $RCSfile: Button.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:34 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +class Button extends AbstractButton implements Accessible { + + public Button(XAccessible accessible, XAccessibleComponent component) { + super(); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleButtonListener()); + } + + protected class AccessibleButtonListener extends AccessibleAbstractButtonListener { + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleButton(); + } + return accessibleContext; + } + + protected class AccessibleButton extends AccessibleAbstractButton { + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.PUSH_BUTTON; + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/CheckBox.java b/accessibility/bridge/org/openoffice/java/accessibility/CheckBox.java new file mode 100644 index 000000000000..bfc4fa521f00 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/CheckBox.java @@ -0,0 +1,92 @@ +/************************************************************************* + * + * $RCSfile: CheckBox.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:34 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +class CheckBox extends ToggleButton { + + public CheckBox(XAccessible accessible, XAccessibleComponent component) { + super(accessible, component); + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleCheckBox(); + } + return accessibleContext; + } + + protected class AccessibleCheckBox extends AccessibleToggleButton { + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.CHECK_BOX; + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/ComboBox.java b/accessibility/bridge/org/openoffice/java/accessibility/ComboBox.java new file mode 100644 index 000000000000..9f3ad9cac350 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/ComboBox.java @@ -0,0 +1,246 @@ +/************************************************************************* + * + * $RCSfile: ComboBox.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:34 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.swing.SwingConstants; + +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleAction; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +/** + */ +public class ComboBox extends Component implements javax.accessibility.Accessible { + + private XAccessibleAction unoAccessibleAction = null; + private boolean editable = false; + + public ComboBox(XAccessible accessible, XAccessibleComponent component, XAccessibleAction action) { + super(); + initialize(accessible, component, action); + } + + private AccessibleContext accessibleTextContext = null; + private AccessibleContext accessiblePopupMenuContext = null; + + protected void initialize(XAccessible accessible, XAccessibleComponent component, + XAccessibleAction action) { + unoAccessibleAction = action; + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleComboBoxListener()); +// accessiblePopupMenuContext = new AccessiblePopupMenu(); + } + + protected class AccessiblePopupMenu extends AccessibleContext implements javax.accessibility.Accessible { + + /** Gets the accessible context associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + return this; + } + + /* + * AccessibleContext + */ + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.POPUP_MENU; + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = new AccessibleStateSet(); + states.add(AccessibleState.ENABLED); + return states; + } + + /** Gets the locale of the component */ + public java.util.Locale getLocale() throws java.awt.IllegalComponentStateException { + return ComboBox.this.getLocale(); + } + + /** Returns the number of accessible children of the object. */ + public int getAccessibleChildrenCount() { + return 0; + } + + /** Returns the specified Accessible child of the object. */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + return null; + } + + /** Gets the 0-based index of this object in its accessible parent */ + public int getAccessibleIndexInParent() { + return 0; + } + + /** Gets the accessible parent of this object */ + public javax.accessibility.Accessible getAccessibleParent() { + return ComboBox.this; + } + } + + protected class AccessibleComboBoxListener extends AccessibleUNOComponentListener { + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleComboBox(); + } + return accessibleContext; + } + + protected class AccessibleComboBox extends AccessibleUNOComponent + implements javax.accessibility.AccessibleAction { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleComboBox() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.COMBO_BOX; + } + + /** Returns the number of accessible children of the object */ + public int getAccessibleChildrenCount() { + return editable ? 2 : 1; + } + + /** Returns the specified Accessible child of the object */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + switch (i) { + case 0: + return (javax.accessibility.Accessible) accessiblePopupMenuContext; + case 1: + if (editable) { + return (javax.accessibility.Accessible) accessibleTextContext; + } + default: + return null; + } + } + + /** Gets the AccessibleAction associated with this object that supports one or more actions */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + return this; + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ +/* + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + return states; + } +*/ + /* + * AccessibleAction + */ + + /** Performs the specified Action on the object */ + public boolean doAccessibleAction(int param) { + if (param == 0) { + try { + return unoAccessibleAction.doAccessibleAction(0); + } catch(com.sun.star.uno.Exception e) { + } + } + + return false; + } + + /** Returns a description of the specified action of the object */ + public java.lang.String getAccessibleActionDescription(int param) { + return javax.swing.UIManager.getString("ComboBox.togglePopupText"); + } + + /** Returns the number of accessible actions available in this object */ + public int getAccessibleActionCount() { + return 1; + } + } +} + + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Component.java b/accessibility/bridge/org/openoffice/java/accessibility/Component.java new file mode 100644 index 000000000000..cac63f231787 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Component.java @@ -0,0 +1,546 @@ +/************************************************************************* + * + * $RCSfile: Component.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:34 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.AccessibleEventId; +import drafts.com.sun.star.accessibility.AccessibleEventObject; +import drafts.com.sun.star.accessibility.AccessibleStateType; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleContext; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +import drafts.com.sun.star.accessibility.XAccessibleEventListener; +import drafts.com.sun.star.accessibility.XAccessibleEventBroadcaster; + +public abstract class Component extends java.awt.Component { + final static String monitorClassName = + "com.sun.java.accessibility.util.AccessibilityEventMonitor$AccessibilityEventListener"; + + public static final Type RectangleType = new Type(com.sun.star.awt.Rectangle.class); + + protected XAccessible unoAccessible = null; + protected XAccessibleComponent unoAccessibleComponent = null; + + protected Component() { + super(); +// enableEvents(java.awt.AWTEvent.FOCUS_EVENT_MASK); + } + + /** + * Determines whether this <code>Component</code> is showing on screen. + * This means that the component must be visible, and it must be in a + * <code>container</code> that is visible and showing. + * @see #addNotify + * @see #removeNotify + * @since JDK1.0 + */ + public boolean isShowing() { + if (isVisible()) { + java.awt.Container parent = getParent(); + return (parent == null) || parent.isShowing(); + } + return false; + } + + /** + * Makes this <code>Component</code> displayable by connecting it to a + * native screen resource. + * This method is called internally by the toolkit and should + * not be called directly by programs. + * @see #isDisplayable + * @see #removeNotify + * @since JDK1.0 + */ + public void addNotify() { + } + + /** + * Makes this <code>Component</code> undisplayable by destroying it native + * screen resource. + * This method is called by the toolkit internally and should + * not be called directly by programs. + * @see #isDisplayable + * @see #addNotify + * @since JDK1.0 + */ + public void removeNotify() { + } + + /** Requests focus for this object */ + public void requestFocus() { + if (isShowing()) { + try { + unoAccessibleComponent.grabFocus(); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + } + /** Requests focus for this object */ + protected boolean requestFocus(boolean temporary) { + // Must be a no-op to make focus handling work + return true; + } + + /** Returns the location of the object on the screen. */ + public java.awt.Point getLocationOnScreen() { + java.awt.Container parent = getParent(); + if (parent != null) { + // Retrieve location of the parent object + java.awt.Point p = parent.getLocationOnScreen(); + + // Add relative coordinates of the object + if (p != null) { + p.translate(getX(), getY()); + return p; + } + } + + return null; + } + + /** Returns the foreground color of the object */ + public java.awt.Color getForeground() { + if (isShowing()) { + try { + return new java.awt.Color(unoAccessibleComponent.getForeground()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } else { + return null; + } + } + + /** Returns the background color of the object */ + public java.awt.Color getBackground() { + if (isShowing()) { + try { + return new java.awt.Color(unoAccessibleComponent.getBackground()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } else { + return null; + } + } + + public Object[] getAccessibleComponents(Object[] targetSet) { + try { + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + java.util.ArrayList list = new java.util.ArrayList(targetSet.length); + for (int i=0; i < targetSet.length; i++) { + java.awt.Component c = factory.getAccessibleComponent( + (XAccessible) UnoRuntime.queryInterface(XAccessible.class, targetSet[i])); + if (c != null) { + list.add(c); + } + } + list.trimToSize(); + return list.toArray(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + protected void addAccessibleEventListener(XAccessibleEventListener listener) { + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, + unoAccessibleComponent); + if (broadcaster != null) { + broadcaster.addEventListener(listener); + } + } + + protected java.awt.EventQueue getEventQueue() { + return java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); + } + + protected class PropertyChangeBroadcaster implements Runnable { + String propertyName; + Object oldValue; + Object newValue; + + public PropertyChangeBroadcaster(String name, Object param1, Object param2) { + propertyName = name; + oldValue = param1; + newValue = param2; + } + + public void run() { + AccessibleContext ac = accessibleContext; + if (ac != null) { + ac.firePropertyChange(propertyName, oldValue, newValue); + } else if (Build.DEBUG) { + XAccessibleContext xac = unoAccessible.getAccessibleContext(); + System.err.println("Ignoring event: " + propertyName + " for " + + AccessibleRoleAdapter.getAccessibleRole(xac.getAccessibleRole()) + + " " + xac.getAccessibleName()); + } + } + } + + protected void firePropertyChange(String property, Object oldValue, Object newValue) { + getEventQueue().invokeLater(new PropertyChangeBroadcaster(property, oldValue, newValue)); + } + + protected void fireStatePropertyChange(AccessibleState state, boolean set) { + PropertyChangeBroadcaster broadcaster; + if (set) { + broadcaster = new PropertyChangeBroadcaster( + accessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, state); + } else { + broadcaster = new PropertyChangeBroadcaster( + accessibleContext.ACCESSIBLE_STATE_PROPERTY, + state, null); + } + getEventQueue().invokeLater(broadcaster); + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected abstract class AccessibleUNOComponentListener implements XAccessibleEventListener { + + protected AccessibleUNOComponentListener() { + } + + protected void setComponentState(short state, boolean enable) { + switch (state) { + case AccessibleStateType.ACTIVE: + // Only frames should be active + break; + case AccessibleStateType.ENABLED: + setEnabled(enable); + break; + case AccessibleStateType.FOCUSED: + getEventQueue().postEvent(new java.awt.event.FocusEvent( + Component.this, enable ? + java.awt.event.FocusEvent.FOCUS_GAINED : + java.awt.event.FocusEvent.FOCUS_LOST)); + break; + case AccessibleStateType.SELECTED: + fireStatePropertyChange(AccessibleState.SELECTED, enable); + break; + case AccessibleStateType.SHOWING: + if (enable) { + // Query bounding boxes if component becomes visible + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Component.this.setBounds(r.X, r.Y, r.Width, r.Height); + } +// fireStatePropertyChange(AccessibleState.SHOWING, enable); + break; + case AccessibleStateType.VISIBLE: + if (enable) { + // Query bounding boxes if component becomes visible + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Component.this.setBounds(r.X, r.Y, r.Width, r.Height); + } + Component.this.setVisible(enable); + break; + default: + if (Build.DEBUG) { + System.err.println("[component]: " + getName() + "unexpected state change " + state); + } + break; + } + } + + /** Updates the accessible name and fires the appropriate PropertyChangedEvent */ + protected void handleNameChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleName(AnyConverter.toString(any)); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the accessible description and fires the appropriate PropertyChangedEvent */ + protected void handleDescriptionChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleDescription(AnyConverter.toString(any)); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal states and fires the appropriate PropertyChangedEvent */ + protected void handleStateChangedEvent(Object any1, Object any2) { + try { + if (AnyConverter.isShort(any1)) { + setComponentState(AnyConverter.toShort(any1), false); + } + + if (AnyConverter.isShort(any2)) { + setComponentState(AnyConverter.toShort(any2), true); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Fires a visible data property change event */ + protected void handleVisibleDataEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Component.this.setBounds(r.X, r.Y, r.Width, r.Height); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Updates internal bounding box cache */ + protected void handleBoundRectEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Component.this.setBounds(r.X, r.Y, r.Width, r.Height); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_NAME_EVENT: + // Set the accessible name for the corresponding context, which will fire a property + // change event itself + handleNameChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT: + // Set the accessible description for the corresponding context, which will fire a property + // change event itself - so do not set propertyName ! + handleDescriptionChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_STATE_EVENT: + // Update the internal state set and fire the appropriate PropertyChangedEvent + handleStateChangedEvent(event.OldValue, event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT: + handleVisibleDataEvent(); + firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY, null, null); + break; + case AccessibleEventId.ACCESSIBLE_BOUNDRECT_EVENT: + handleBoundRectEvent(); + break; + case AccessibleEventId.ACCESSIBLE_TEXT_EVENT: + // FIXME: enhance text information .. + firePropertyChange(AccessibleContext.ACCESSIBLE_TEXT_PROPERTY, null, new Integer(0)); + break; + default: + // Warn about unhandled events + if(Build.DEBUG) { + System.out.println(this + ": unhandled accessibility event id=" + event.EventId); + } + } + } + + /** Called by OpenOffice process to notify that the UNO component is disposing */ + public void disposing(com.sun.star.lang.EventObject eventObject) { + } + } + + protected AccessibleContext accessibleContext = null; + + protected abstract class AccessibleUNOComponent extends java.awt.Component.AccessibleAWTComponent { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleUNOComponent() { + super(); + // Set accessible name and description here to avoid unnecessary property change + // events later .. + XAccessibleContext unoAccessibleContext = unoAccessible.getAccessibleContext(); + String s = unoAccessibleContext.getAccessibleName(); + if (s != null && s.length() > 0) { + setAccessibleName(s); + } + s = unoAccessibleContext.getAccessibleDescription(); + if (s != null && s.length() > 0) { + setAccessibleDescription(s); + } + } + + protected java.awt.event.ComponentListener accessibleComponentHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when shown/hidden.. + */ + protected class AccessibleComponentHandler implements java.awt.event.ComponentListener { + public void componentHidden(java.awt.event.ComponentEvent e) { + AccessibleUNOComponent.this.firePropertyChange( + AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + AccessibleState.VISIBLE, null); + } + + public void componentShown(java.awt.event.ComponentEvent e) { + AccessibleUNOComponent.this.firePropertyChange( + AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, AccessibleState.VISIBLE); + } + + public void componentMoved(java.awt.event.ComponentEvent e) { + } + + public void componentResized(java.awt.event.ComponentEvent e) { + } + } // inner class AccessibleComponentHandler + + protected java.awt.event.FocusListener accessibleFocusHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when focus events happen + */ + protected class AccessibleFocusHandler implements java.awt.event.FocusListener { + public void focusGained(java.awt.event.FocusEvent event) { + AccessibleUNOComponent.this.firePropertyChange( + AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, AccessibleState.FOCUSED); + if (Build.DEBUG) { + System.err.println("[" + getAccessibleRole() + "] " + getAccessibleName() + " is now focused"); + } + } + public void focusLost(java.awt.event.FocusEvent event) { + AccessibleUNOComponent.this.firePropertyChange( + AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + AccessibleState.FOCUSED, null); + if (Build.DEBUG) { + System.err.println("[" + getAccessibleRole() + "] " + getAccessibleName() + " is no longer focused"); + } + } + } // inner class AccessibleFocusHandler + + protected int propertyChangeListenerCount = 0; + + /** + * Add a PropertyChangeListener to the listener list. + * + * @param listener The PropertyChangeListener to be added + */ + public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (propertyChangeListenerCount++ == 0) { + accessibleComponentHandler = new AccessibleComponentHandler(); + Component.this.addComponentListener(accessibleComponentHandler); + + accessibleFocusHandler = new AccessibleFocusHandler(); + Component.this.addFocusListener(accessibleFocusHandler); + } + super.addPropertyChangeListener(listener); + } + + /** + * Remove a PropertyChangeListener from the listener list. + * This removes a PropertyChangeListener that was registered + * for all properties. + * + * @param listener The PropertyChangeListener to be removed + */ + public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (--propertyChangeListenerCount == 0) { + Component.this.removeComponentListener(accessibleComponentHandler); + accessibleComponentHandler = null; + + Component.this.removeFocusListener(accessibleFocusHandler); + accessibleFocusHandler = null; + } + super.removePropertyChangeListener(listener); + } + } + + // Extract a number from a UNO any + public static java.lang.Number toNumber(java.lang.Object any) { + try { + if (AnyConverter.isByte(any)) { + return new Byte(AnyConverter.toByte(any)); + } else if (AnyConverter.isShort(any)) { + return new Short(AnyConverter.toShort(any)); + } else if (AnyConverter.isInt(any)) { + return new Integer(AnyConverter.toInt(any)); + } else if (AnyConverter.isLong(any)) { + return new Long(AnyConverter.toLong(any)); + } else if (AnyConverter.isFloat(any)) { + return new Float(AnyConverter.toFloat(any)); + } else if (AnyConverter.isDouble(any)) { + return new Double(AnyConverter.toDouble(any)); + } + } catch (com.sun.star.lang.IllegalArgumentException e) { + throw new IllegalArgumentException(e.getMessage()); + } + return null; + } + + public String toString() { + return UnoRuntime.generateOid(unoAccessible); + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Container.java b/accessibility/bridge/org/openoffice/java/accessibility/Container.java new file mode 100644 index 000000000000..d267f46d7b65 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Container.java @@ -0,0 +1,130 @@ +/************************************************************************* + * + * $RCSfile: Container.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:35 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.AccessibleEventId; +import drafts.com.sun.star.accessibility.AccessibleEventObject; +import drafts.com.sun.star.accessibility.AccessibleStateType; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +import drafts.com.sun.star.accessibility.XAccessibleEventListener; +import drafts.com.sun.star.accessibility.XAccessibleEventBroadcaster; + +public class Container extends AbstractContainer implements javax.accessibility.Accessible { + + protected AccessibleRole accessibleRole; + + protected Container(AccessibleRole role, XAccessible accessible, XAccessibleComponent component) { + super(); + accessibleRole = role; + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, component); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleContainerListener()); + } + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleContainerListener extends AccessibleAbstractContainerListener { + protected AccessibleContainerListener() { + super(); + } + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleContainer(); + } + return accessibleContext; + } + + protected class AccessibleContainer extends AccessibleAbstractContainer { + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleContainer() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return accessibleRole; + } + } + + public String toString() { + return UnoRuntime.generateOid(unoAccessible); + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java b/accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java new file mode 100644 index 000000000000..4a7940b12856 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java @@ -0,0 +1,220 @@ +/************************************************************************* + * + * $RCSfile: DescendantManager.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:35 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.AccessibleEventId; +import drafts.com.sun.star.accessibility.AccessibleEventObject; +import drafts.com.sun.star.accessibility.AccessibleStateType; +import drafts.com.sun.star.accessibility.XAccessibleContext; +import drafts.com.sun.star.accessibility.XAccessibleEventBroadcaster; +import drafts.com.sun.star.accessibility.XAccessibleSelection; + +public abstract class DescendantManager extends Component { + final static String monitorClassName = + "com.sun.java.accessibility.util.AccessibilityEventMonitor$AccessibilityEventListener"; + + protected javax.accessibility.Accessible activeDescendant = null; + protected boolean multiselectable = false; + + protected DescendantManager() { + super(); + } + + protected DescendantManager(boolean multiselectable) { + super(); + this.multiselectable = multiselectable; + } + + protected boolean isEventMonitorCalling(Throwable t) { + StackTraceElement[] stack = t.getStackTrace(); + return (stack.length > 1) && (stack[1].getClassName().equals(monitorClassName)); + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleDescendantManagerListener extends AccessibleUNOComponentListener { + + protected AccessibleDescendantManagerListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_SELECTION_EVENT: + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY, null, null); + break; + default: + super.notifyEvent(event); + } + } + } + + protected XAccessibleContext unoAccessibleContext = null; + protected XAccessibleSelection unoAccessibleSelection = null; + + protected abstract class AccessibleDescendantManager extends AccessibleUNOComponent + implements javax.accessibility.AccessibleSelection { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleDescendantManager() { + super(); + } + + /** Returns the number of accessible children of the object */ + public int getAccessibleChildrenCount() { + // FIXME: Workaround for AccessibilityEventMonitor problem + // The AccessibilityEventMonitor traverses all children to check if they have transient state or not. + if (isEventMonitorCalling(new Throwable())) { + return 0; + } + + try { + return unoAccessibleContext.getAccessibleChildCount(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Returns the AccessibleSelection interface for this object */ + public javax.accessibility.AccessibleSelection getAccessibleSelection() { + return (unoAccessibleSelection != null) ? this : null; + } + + /** Returns the state set of this object */ + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + javax.accessibility.AccessibleStateSet stateSet = super.getAccessibleStateSet(); + stateSet.add(AccessibleExtendedState.MANAGES_DESCENDANTS); + if (multiselectable) { + stateSet.add(javax.accessibility.AccessibleState.MULTISELECTABLE); + } + return stateSet; + } + + /* + * AccessibleSelection + */ + + /** Adds the specified Accessible child of the object to the object's selection */ + public void addAccessibleSelection(int i) { + try { + unoAccessibleSelection.selectAccessibleChild(i); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** 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 (com.sun.star.lang.IndexOutOfBoundsException e) { + return false; + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } + } + + /** Removes the specified child of the object from the object's selection */ + public void removeAccessibleSelection(int i) { + try { + unoAccessibleSelection.deselectSelectedAccessibleChild(i); + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Causes every child of the object to be selected if the object supports multiple selection */ + public void selectAllAccessibleSelection() { + try { + unoAccessibleSelection.selectAllAccessible(); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Dialog.java b/accessibility/bridge/org/openoffice/java/accessibility/Dialog.java new file mode 100644 index 000000000000..9d1a5d318c9c --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Dialog.java @@ -0,0 +1,529 @@ +/************************************************************************* + * + * $RCSfile: Dialog.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:35 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import java.awt.event.WindowEvent; + +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.*; + +public class Dialog extends java.awt.Dialog implements javax.accessibility.Accessible, NativeFrame { + protected XAccessibleComponent unoAccessibleComponent; + + // The coordinates of this frame on screen + java.awt.Point location = null; + + boolean opened = false; + boolean visible = false; + + java.awt.EventQueue eventQueue = null; + + protected Dialog(java.awt.Frame owner, XAccessibleComponent xAccessibleComponent) { + super(owner); + initialize(xAccessibleComponent); + } + + protected Dialog(java.awt.Frame owner, String name, XAccessibleComponent xAccessibleComponent) { + super(owner, name); + initialize(xAccessibleComponent); + } + + protected Dialog(java.awt.Frame owner, String name, boolean modal, XAccessibleComponent xAccessibleComponent) { + super(owner, name, modal); + initialize(xAccessibleComponent); + } + + private void initialize(XAccessibleComponent xAccessibleComponent) { + unoAccessibleComponent = xAccessibleComponent; + eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, + xAccessibleComponent); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleDialogListener()); + } + } + + java.awt.Component initialComponent = null; + + public java.awt.Component getInitialComponent() { + return initialComponent; + } + + public void setInitialComponent(java.awt.Component c) { + if (Build.DEBUG) { + System.err.println("Initial component set to object of class: " + c.getClass().getName()); + } + initialComponent = c; + } + + public Integer getHWND() { + return null; + } + + /** + * Determines whether this <code>Component</code> is showing on screen. + * This means that the component must be visible, and it must be in a + * <code>container</code> that is visible and showing. + * @see #addNotify + * @see #removeNotify + * @since JDK1.0 + */ + public boolean isShowing() { + if (isVisible()) { + java.awt.Container parent = getParent(); + return (parent == null) || parent.isShowing(); + } + return false; + } + + /** + * Makes this <code>Component</code> displayable by connecting it to a + * native screen resource. + * This method is called internally by the toolkit and should + * not be called directly by programs. + * @see #isDisplayable + * @see #removeNotify + * @since JDK1.0 + */ + public void addNotify() { +// createHierarchyEvents(0, null, null, 0, false); + } + + /** + * Makes this <code>Component</code> undisplayable by destroying it native + * screen resource. + * This method is called by the toolkit internally and should + * not be called directly by programs. + * @see #isDisplayable + * @see #addNotify + * @since JDK1.0 + */ + public void removeNotify() { + } + + /** + * Determines if the object is visible. Note: this means that the + * object intends to be visible; however, it may not in fact be + * showing on the screen because one of the objects that this object + * is contained by is not visible. To determine if an object is + * showing on the screen, use <code>isShowing</code>. + * + * @return true if object is visible; otherwise, false + */ + public boolean isVisible(){ + return visible; + } + + /** + * Shows or hides this component depending on the value of parameter + * <code>b</code>. + * @param b if <code>true</code>, shows this component; + * otherwise, hides this component + * @see #isVisible + * @since JDK1.1 + */ + public void setVisible(boolean b) { + if (visible != b){ + visible = b; + if (b) { + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + + // If it is the first show, fire WINDOW_OPENED event + if (!opened) { + System.err.println("Posting Window opened"); + postWindowEvent(WindowEvent.WINDOW_OPENED); + opened = true; + } + } else { + location = null; + } + } + } + + protected void postWindowEvent(int i) { + eventQueue.postEvent(new WindowEvent(this, i)); + } + + /** Returns the location of the object on the screen. */ + public java.awt.Point getLocationOnScreen() { + if (visible) { + return new java.awt.Point(location); + } + return null; + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleDialogListener implements XAccessibleEventListener { + + protected AccessibleDialogListener() { + } + + protected void setComponentState(short state, boolean enable) { + switch (state) { + case AccessibleStateType.ACTIVE: + postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_GAINED_FOCUS : + java.awt.event.WindowEvent.WINDOW_LOST_FOCUS); + break; + case AccessibleStateType.ICONIFIED: + postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_ICONIFIED : + java.awt.event.WindowEvent.WINDOW_DEICONIFIED); + break; + case AccessibleStateType.VISIBLE: + Dialog.this.setVisible(enable); + break; + default: + if (Build.DEBUG) { + System.err.println("[dialog]: " + getTitle() + "unexpected state change " + state); + } + break; + } + } + + /** Updates the accessible name and fires the appropriate PropertyChangedEvent */ + protected void handleNameChangedEvent(Object any) { + try { + Dialog.this.setTitle(AnyConverter.toString(any)); + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the accessible description and fires the appropriate PropertyChangedEvent */ + protected void handleDescriptionChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleDescription(AnyConverter.toString(any)); + } + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal states and fires the appropriate PropertyChangedEvent */ + protected void handleStateChangedEvent(Object any1, Object any2) { + try { + if (AnyConverter.isShort(any1)) { + setComponentState(AnyConverter.toShort(any1), false); + } + + if (AnyConverter.isShort(any2)) { + setComponentState(AnyConverter.toShort(any2), true); + } + } + + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildRemovedEvent(Object any) { + try { + java.awt.Component c = AccessibleObjectFactory.getDefault().getAccessibleComponent( + (XAccessible) AnyConverter.toObject(Container.XAccessibleType, any)); + if (c != null) { + Dialog.this.remove(c); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildAddedEvent(Object any) { + System.err.println("AccessibleDialog children added: " + getComponentCount()); + try { + XAccessible xAccessible = (XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any); + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + java.awt.Component c = factory.getAccessibleComponent(xAccessible); + if (c != null) { + // Seems to be already in child list + if (c.getParent().equals(this)) + return; + } else { + c = factory.createAccessibleComponent(xAccessible); + } + if (c != null) { + Dialog.this.add(c, xAccessible.getAccessibleContext(). + getAccessibleIndexInParent()); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + + /** Fires a visible data property change event */ + protected void handleVisibleDataEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Dialog.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Updates internal bounding box cache */ + protected void handleBoundRectEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Dialog.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_NAME_EVENT: + // Set the accessible name for the corresponding context, which will fire a property + // change event itself + handleNameChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT: + // Set the accessible description for the corresponding context, which will fire a property + // change event itself - so do not set propertyName ! + handleDescriptionChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_STATE_EVENT: + // Update the internal state set and fire the appropriate PropertyChangedEvent + handleStateChangedEvent(event.OldValue, event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + handleChildRemovedEvent(event.OldValue); + } else if (AnyConverter.isObject(event.NewValue)) { + handleChildAddedEvent(event.NewValue); + } + break; + case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT: + handleVisibleDataEvent(); + break; + case AccessibleEventId.ACCESSIBLE_BOUNDRECT_EVENT: + handleBoundRectEvent(); + break; + default: + // Warn about unhandled events + if(Build.DEBUG) { + System.out.println(this + ": unhandled accessibility event id=" + event.EventId); + } + } + } + + /** Called by OpenOffice process to notify that the UNO component is disposing */ + public void disposing(com.sun.star.lang.EventObject eventObject) { + } + } + + javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleDialog(); + accessibleContext.setAccessibleName(getTitle()); + } + return accessibleContext; + } + + protected class AccessibleDialog extends java.awt.Dialog.AccessibleAWTDialog { + protected AccessibleDialog() { + super(); + } + + protected java.awt.event.ComponentListener accessibleComponentHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when shown/hidden.. + */ + protected class AccessibleComponentHandler implements java.awt.event.ComponentListener { + public void componentHidden(java.awt.event.ComponentEvent e) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.VISIBLE, null); + } + + public void componentShown(java.awt.event.ComponentEvent e) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.VISIBLE); + } + + public void componentMoved(java.awt.event.ComponentEvent e) { + } + + public void componentResized(java.awt.event.ComponentEvent e) { + } + } // inner class AccessibleComponentHandler + + protected java.awt.event.WindowFocusListener accessibleWindowFocusHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when focus events happen + */ + protected class AccessibleWindowFocusHandler implements java.awt.event.WindowFocusListener { + public void windowGainedFocus(java.awt.event.WindowEvent e) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.ACTIVE); + if (Build.DEBUG) { + System.err.println("[dialog] " + getTitle() + " is now active"); + } + } + public void windowLostFocus(java.awt.event.WindowEvent e) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.ACTIVE, null); + if (Build.DEBUG) { + System.err.println("[dialog] " + getTitle() + " is no longer active"); + } + } + } // inner class AccessibleFocusHandler + + protected java.awt.event.ContainerListener accessibleContainerHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when children added/removed. + */ + + protected class AccessibleContainerHandler implements java.awt.event.ContainerListener { + public void componentAdded(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, ((javax.accessibility.Accessible) c).getAccessibleContext()); + } + } + public void componentRemoved(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleDialog.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + ((javax.accessibility.Accessible) c).getAccessibleContext(), null); + } + } + } + + protected int propertyChangeListenerCount = 0; + + /** + * Add a PropertyChangeListener to the listener list. + * + * @param listener The PropertyChangeListener to be added + */ + public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (propertyChangeListenerCount++ == 0) { + accessibleWindowFocusHandler = new AccessibleWindowFocusHandler(); + Dialog.this.addWindowFocusListener(accessibleWindowFocusHandler); + + accessibleContainerHandler = new AccessibleContainerHandler(); + Dialog.this.addContainerListener(accessibleContainerHandler); + + accessibleComponentHandler = new AccessibleComponentHandler(); + Dialog.this.addComponentListener(accessibleComponentHandler); + } + super.addPropertyChangeListener(listener); + } + + /** + * Remove a PropertyChangeListener from the listener list. + * This removes a PropertyChangeListener that was registered + * for all properties. + * + * @param listener The PropertyChangeListener to be removed + */ + public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (--propertyChangeListenerCount == 0) { + Dialog.this.removeComponentListener(accessibleComponentHandler); + accessibleComponentHandler = null; + + Dialog.this.removeContainerListener(accessibleContainerHandler); + accessibleContainerHandler = null; + + Dialog.this.removeWindowFocusListener(accessibleWindowFocusHandler); + accessibleWindowFocusHandler = null; + } + super.removePropertyChangeListener(listener); + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Frame.java b/accessibility/bridge/org/openoffice/java/accessibility/Frame.java new file mode 100644 index 000000000000..7071b8e4a9d1 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Frame.java @@ -0,0 +1,534 @@ +/************************************************************************* + * + * $RCSfile: Frame.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:36 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.*; + +public class Frame extends java.awt.Frame implements javax.accessibility.Accessible, NativeFrame { + protected XAccessibleComponent unoAccessibleComponent; + + // The coordinates of this frame on screen + java.awt.Point location = null; + + boolean opened = false; + boolean visible = false; + + java.awt.EventQueue eventQueue = null; + + protected Frame(XAccessibleComponent xAccessibleComponent) { + super(); + initialize(xAccessibleComponent); + } + + protected Frame(String name, XAccessibleComponent xAccessibleComponent) { + super(name); + initialize(xAccessibleComponent); + } + + private void initialize(XAccessibleComponent xAccessibleComponent) { + unoAccessibleComponent = xAccessibleComponent; + eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, + unoAccessibleComponent); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleFrameListener()); + } + } + + java.awt.Component initialComponent = null; + + public java.awt.Component getInitialComponent() { + return initialComponent; + } + + public void setInitialComponent(java.awt.Component c) { + if (Build.DEBUG) { + System.err.println("Initial component set to object of class: " + c.getClass().getName()); + } + initialComponent = c; + } + + public Integer getHWND() { + return null; + } + + /** + * Determines whether this <code>Component</code> is showing on screen. + * This means that the component must be visible, and it must be in a + * <code>container</code> that is visible and showing. + * @see #addNotify + * @see #removeNotify + * @since JDK1.0 + */ + public boolean isShowing() { + if (isVisible()) { + java.awt.Container parent = getParent(); + return (parent == null) || parent.isShowing(); + } + return false; + } + + /** + * Makes this <code>Component</code> displayable by connecting it to a + * native screen resource. + * This method is called internally by the toolkit and should + * not be called directly by programs. + * @see #isDisplayable + * @see #removeNotify + * @since JDK1.0 + */ + public void addNotify() { +// createHierarchyEvents(0, null, null, 0, false); + } + + /** + * Makes this <code>Component</code> undisplayable by destroying it native + * screen resource. + * This method is called by the toolkit internally and should + * not be called directly by programs. + * @see #isDisplayable + * @see #addNotify + * @since JDK1.0 + */ + public void removeNotify() { + } + + /** + * Determines if the object is visible. Note: this means that the + * object intends to be visible; however, it may not in fact be + * showing on the screen because one of the objects that this object + * is contained by is not visible. To determine if an object is + * showing on the screen, use <code>isShowing</code>. + * + * @return true if object is visible; otherwise, false + */ + public boolean isVisible(){ + return visible; + } + + /** + * Shows or hides this component depending on the value of parameter + * <code>b</code>. + * @param b if <code>true</code>, shows this component; + * otherwise, hides this component + * @see #isVisible + * @since JDK1.1 + */ + public void setVisible(boolean b) { + if (visible != b){ + visible = b; + if (b) { + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + + // If it is the first show, fire WINDOW_OPENED event + if (!opened) { + postWindowEvent(java.awt.event.WindowEvent.WINDOW_OPENED); + opened = true; + } + } else { + location = null; + } + } + } + + protected void postWindowEvent(int i) { + eventQueue.postEvent(new java.awt.event.WindowEvent(this, i)); + } + + /** Returns the location of the object on the screen. */ + public java.awt.Point getLocationOnScreen() { + if (visible) { + return new java.awt.Point(location); + } + return null; + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleFrameListener implements XAccessibleEventListener { + + protected AccessibleFrameListener() { + } + + // The only expected state changes are ACTIVE and VISIBLE + protected void setComponentState(short state, boolean enable) { + switch (state) { + case AccessibleStateType.ACTIVE: + postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_GAINED_FOCUS : + java.awt.event.WindowEvent.WINDOW_LOST_FOCUS); + break; + case AccessibleStateType.ICONIFIED: + postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_ICONIFIED : + java.awt.event.WindowEvent.WINDOW_DEICONIFIED); + break; + case AccessibleStateType.VISIBLE: + Frame.this.setVisible(enable); + break; + default: + if (Build.DEBUG) { + System.err.println("[frame]: " + getTitle() + "unexpected state change " + state); + } + break; + } + } + + /** Updates the accessible name and fires the appropriate PropertyChangedEvent */ + protected void handleNameChangedEvent(Object any) { + try { + Frame.this.setTitle(AnyConverter.toString(any)); + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the accessible description and fires the appropriate PropertyChangedEvent */ + protected void handleDescriptionChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleDescription(AnyConverter.toString(any)); + } + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal states and fires the appropriate PropertyChangedEvent */ + protected void handleStateChangedEvent(Object any1, Object any2) { + try { + if (AnyConverter.isShort(any1)) { + setComponentState(AnyConverter.toShort(any1), false); + } + + if (AnyConverter.isShort(any2)) { + setComponentState(AnyConverter.toShort(any2), true); + } + } + + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildRemovedEvent(Object any) { + try { + java.awt.Component c = AccessibleObjectFactory.getDefault().getAccessibleComponent( + (XAccessible) AnyConverter.toObject(Container.XAccessibleType, any)); + if (c != null) { + Frame.this.remove(c); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildAddedEvent(Object any) { + try { + XAccessible xAccessible = (XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any); + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + java.awt.Component c = factory.getAccessibleComponent(xAccessible); + if (c != null) { + // Seems to be already in child list + if (c.getParent().equals(this)) + return; + } else { + c = factory.createAccessibleComponent(xAccessible); + } + if (c != null) { + Frame.this.add(c, xAccessible.getAccessibleContext(). + getAccessibleIndexInParent()); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + /** Fires a visible data property change event */ + protected void handleVisibleDataEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Frame.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Updates internal bounding box cache */ + protected void handleBoundRectEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Frame.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_NAME_EVENT: + // Set the accessible name for the corresponding context, which will fire a property + // change event itself + handleNameChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT: + // Set the accessible description for the corresponding context, which will fire a property + // change event itself - so do not set propertyName ! + handleDescriptionChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_STATE_EVENT: + // Update the internal state set and fire the appropriate PropertyChangedEvent + handleStateChangedEvent(event.OldValue, event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + handleChildRemovedEvent(event.OldValue); + } else if (AnyConverter.isObject(event.NewValue)) { + handleChildAddedEvent(event.NewValue); + } + break; + case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT: + handleVisibleDataEvent(); + break; + case AccessibleEventId.ACCESSIBLE_BOUNDRECT_EVENT: + handleBoundRectEvent(); + break; + default: + // Warn about unhandled events + if(Build.DEBUG) { + System.out.println(this + ": unhandled accessibility event id=" + event.EventId); + } + } + } + + /** Called by OpenOffice process to notify that the UNO component is disposing */ + public void disposing(com.sun.star.lang.EventObject eventObject) { + } + } + + protected javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleFrame(); + accessibleContext.setAccessibleName(getTitle()); + } + return accessibleContext; + } + + protected class AccessibleFrame extends java.awt.Frame.AccessibleAWTFrame { + protected AccessibleFrame() { + super(); + } + + protected java.awt.event.ComponentListener accessibleComponentHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when shown/hidden.. + */ + protected class AccessibleComponentHandler implements java.awt.event.ComponentListener { + public void componentHidden(java.awt.event.ComponentEvent e) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.VISIBLE, null); + } + + public void componentShown(java.awt.event.ComponentEvent e) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.VISIBLE); + } + + public void componentMoved(java.awt.event.ComponentEvent e) { + } + + public void componentResized(java.awt.event.ComponentEvent e) { + } + } // inner class AccessibleComponentHandler + + protected java.awt.event.WindowFocusListener accessibleWindowFocusHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when focus events happen + */ + protected class AccessibleWindowFocusHandler implements java.awt.event.WindowFocusListener { + public void windowGainedFocus(java.awt.event.WindowEvent e) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.ACTIVE); + if (Build.DEBUG) { + System.err.println("[frame] " + getTitle() + " is now active"); + } + } + public void windowLostFocus(java.awt.event.WindowEvent e) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.ACTIVE, null); + if (Build.DEBUG) { + System.err.println("[frame] " + getTitle() + " is no longer active"); + } + } + } // inner class AccessibleFocusHandler + + protected java.awt.event.ContainerListener accessibleContainerHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when children added/removed. + */ + + protected class AccessibleContainerHandler implements java.awt.event.ContainerListener { + public void componentAdded(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, ((javax.accessibility.Accessible) c).getAccessibleContext()); + } + } + public void componentRemoved(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleFrame.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + ((javax.accessibility.Accessible) c).getAccessibleContext(), null); + } + } + } + + protected int propertyChangeListenerCount = 0; + + /** + * Add a PropertyChangeListener to the listener list. + * + * @param listener The PropertyChangeListener to be added + */ + public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (propertyChangeListenerCount++ == 0) { + accessibleWindowFocusHandler = new AccessibleWindowFocusHandler(); + Frame.this.addWindowFocusListener(accessibleWindowFocusHandler); + + accessibleContainerHandler = new AccessibleContainerHandler(); + Frame.this.addContainerListener(accessibleContainerHandler); + + accessibleComponentHandler = new AccessibleComponentHandler(); + Frame.this.addComponentListener(accessibleComponentHandler); + } + super.addPropertyChangeListener(listener); + } + + /** + * Remove a PropertyChangeListener from the listener list. + * This removes a PropertyChangeListener that was registered + * for all properties. + * + * @param listener The PropertyChangeListener to be removed + */ + public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (--propertyChangeListenerCount == 0) { + Frame.this.removeComponentListener(accessibleComponentHandler); + accessibleComponentHandler = null; + + Frame.this.removeContainerListener(accessibleContainerHandler); + accessibleContainerHandler = null; + + Frame.this.removeWindowFocusListener(accessibleWindowFocusHandler); + accessibleWindowFocusHandler = null; + } + super.removePropertyChangeListener(listener); + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + javax.accessibility.AccessibleStateSet states = super.getAccessibleStateSet(); + if ((getExtendedState() & java.awt.Frame.ICONIFIED) > 0) { + states.add(javax.accessibility.AccessibleState.ICONIFIED); + } + return states; + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Icon.java b/accessibility/bridge/org/openoffice/java/accessibility/Icon.java new file mode 100644 index 000000000000..d6f3e73e3f54 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Icon.java @@ -0,0 +1,179 @@ +/************************************************************************* + * + * $RCSfile: Icon.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:36 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import java.text.BreakIterator; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Rectangle; +import com.sun.star.uno.UnoRuntime; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.AccessibleEventId; +import drafts.com.sun.star.accessibility.AccessibleEventObject; +import drafts.com.sun.star.accessibility.AccessibleStateType; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +import drafts.com.sun.star.accessibility.XAccessibleImage; + +/** + */ +public class Icon extends Component implements Accessible { + + protected Icon(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + super(); + initialize(accessible, xAccessibleComponent); + } + + protected void initialize(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + unoAccessible = accessible; + unoAccessibleComponent = xAccessibleComponent; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleIconListener()); + } + + protected class AccessibleIconListener extends AccessibleUNOComponentListener { + + protected AccessibleIconListener() { + super(); + } + + /** Updates the accessible name and fires the appropriate PropertyChangedEvent */ + protected void handleNameChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleName(AnyConverter.toString(any)); + } + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_TEXT_EVENT: + // text changes already handled along with ACCESSIBLE_NAME_EVENT + break; + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleIcon(); + } + return accessibleContext; + } + + protected class AccessibleIcon extends AccessibleUNOComponent + /* implements AccessibleExtendedComponent */ { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleIcon() { + super(); + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleIcon[] getAccessibleIcon() { + try { + XAccessibleImage unoAccessibleImage = (XAccessibleImage) + UnoRuntime.queryInterface(XAccessibleImage.class, unoAccessibleComponent); + if (unoAccessibleImage != null) { + javax.accessibility.AccessibleIcon[] icons = { new AccessibleIconImpl(unoAccessibleImage) }; + return icons; + } + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ +/* + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + return states; + } +*/ + } +} + + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Label.java b/accessibility/bridge/org/openoffice/java/accessibility/Label.java new file mode 100644 index 000000000000..2cd1abb0ec93 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Label.java @@ -0,0 +1,202 @@ +/************************************************************************* + * + * $RCSfile: Label.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:36 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import java.text.BreakIterator; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.accessibility.AccessibleText; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Rectangle; +import com.sun.star.uno.UnoRuntime; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.*; + +/** + */ +public class Label extends Component implements Accessible { + + protected Label(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + super(); + initialize(accessible, xAccessibleComponent); + } + + protected void initialize(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + unoAccessible = accessible; + unoAccessibleComponent = xAccessibleComponent; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleLabelListener()); + } + + protected class AccessibleLabelListener extends AccessibleUNOComponentListener { + + protected AccessibleLabelListener() { + super(); + } + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + unoAccessibleContext = unoAccessible.getAccessibleContext(); + if (unoAccessibleContext != null) { + accessibleContext = new AccessibleLabel(); + } + } + return accessibleContext; + } + + protected XAccessibleContext unoAccessibleContext = null; + + protected class AccessibleLabel extends AccessibleUNOComponent + /* implements AccessibleExtendedComponent */ { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleLabel() { + super(); + } + + /* + * AccessibleContext + */ + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.LABEL; + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class,unoAccessibleComponent); + if (unoAccessibleText != null) { + return new AccessibleTextImpl(unoAccessibleText); + } else { + return null; + } + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ +/* + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + return states; + } +*/ + /** Returns the relation set of this object */ + public javax.accessibility.AccessibleRelationSet getAccessibleRelationSet() { + try { + XAccessibleRelationSet unoAccessibleRelationSet = unoAccessibleContext.getAccessibleRelationSet(); + if (unoAccessibleRelationSet == null) { + return null; + } + + javax.accessibility.AccessibleRelationSet relationSet = new javax.accessibility.AccessibleRelationSet(); + int count = unoAccessibleRelationSet.getRelationCount(); + for (int i = 0; i < count; i++) { + AccessibleRelation unoAccessibleRelation = unoAccessibleRelationSet.getRelation(i); + switch (unoAccessibleRelation.RelationType) { + case AccessibleRelationType.LABEL_FOR: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.LABEL_FOR, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.MEMBER_OF: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.MEMBER_OF, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + default: + break; + } + } + return relationSet; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + return null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + } +} + + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/List.java b/accessibility/bridge/org/openoffice/java/accessibility/List.java new file mode 100644 index 000000000000..2c3022536eec --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/List.java @@ -0,0 +1,499 @@ +/************************************************************************* + * + * $RCSfile: List.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:37 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.*; + +public class List extends DescendantManager implements javax.accessibility.Accessible { + + protected List(XAccessible accessible, XAccessibleComponent component) { + super(); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, component); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleListListener()); + } + } + + protected void setActiveDescendant(javax.accessibility.Accessible descendant) { + javax.accessibility.Accessible oldAD = activeDescendant; + activeDescendant = descendant; + firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, + oldAD, descendant); + } + + protected void setActiveDescendant(Object any) { + javax.accessibility.Accessible descendant = null; + try { + if (AnyConverter.isObject(any)) { + XAccessible unoAccessible = (XAccessible) AnyConverter.toObject( + AbstractContainer.XAccessibleType, any); + if (unoAccessible != null) { + // FIXME: have to handle non transient objects here .. + descendant = new ListItem(unoAccessible); + } + } + setActiveDescendant(descendant); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void add(XAccessible unoAccessible) { + if (unoAccessible != null) { + ListItem item = new ListItem(unoAccessible); + // The AccessBridge for Windows expects an instance of AccessibleContext + // as parameters + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, item.getAccessibleContext()); + } + } + + protected void remove(XAccessible unoAccessible) { + if (unoAccessible != null) { + ListItem item = new ListItem(unoAccessible); + // The AccessBridge for Windows expects an instance of AccessibleContext + // as parameters + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + item.getAccessibleContext(), null); + } + } + + protected void add(Object any) { + try { + add((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void remove(Object any) { + try { + remove((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleListListener extends AccessibleDescendantManagerListener { + + protected AccessibleListListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_ACTIVE_DESCENDANT_EVENT: + setActiveDescendant(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + remove(event.OldValue); + } + if (AnyConverter.isObject(event.NewValue)) { + add(event.NewValue); + } + break; + case AccessibleEventId.ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT: + // Since List items a transient a child events are mostly used + // to attach/detach listeners, it is save to ignore it here + break; + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + unoAccessibleContext = unoAccessible.getAccessibleContext(); + unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface( + XAccessibleSelection.class, unoAccessibleContext); + if (unoAccessibleSelection != null) { + accessibleContext = new AccessibleList(); + } else if (Build.DEBUG) { + System.err.println("List does not support accessible selection"); + accessibleContext = new AccessibleList(); + } + } catch (java.lang.NullPointerException e) { + } catch (com.sun.star.uno.RuntimeException e) { + if (Build.DEBUG) { + System.err.println("RuntimeException caught: " + e.getMessage()); + } + } + } + return accessibleContext; + } + + protected class AccessibleList extends AccessibleDescendantManager { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleList() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.LIST; + } + + /** Returns the specified Accessible child of the object */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = List.this.activeDescendant; + if ((activeDescendant instanceof ListItem) && xAccessible.equals(((ListItem) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new ListItem(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /* + * AccessibleSelection + */ + + /** Returns an Accessible representing the specified selected child of the object */ + public javax.accessibility.Accessible getAccessibleSelection(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = List.this.activeDescendant; + if ((activeDescendant instanceof ListItem) && xAccessible.equals(((ListItem) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new ListItem(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + } + + class ListItem implements javax.accessibility.Accessible { + + protected XAccessible unoAccessible; + + public ListItem(XAccessible xAccessible) { + unoAccessible = xAccessible; + } + + public Object[] create(Object[] targetSet) { + try { + java.util.ArrayList list = new java.util.ArrayList(targetSet.length); + for (int i=0; i < targetSet.length; i++) { + XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface( + XAccessible.class, targetSet[i]); + if (xAccessible != null) { + list.add(new ListItem(xAccessible)); + } + } + list.trimToSize(); + return list.toArray(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + XAccessibleContext xAccessibleContext = unoAccessible.getAccessibleContext(); + if (xAccessibleContext != null) { + accessibleContext = new AccessibleListItem(xAccessibleContext); + } + } catch (com.sun.star.uno.RuntimeException e) { + } + } + return accessibleContext; + } + + protected class AccessibleListItem extends javax.accessibility.AccessibleContext { + + XAccessibleContext unoAccessibleContext; + + public AccessibleListItem(XAccessibleContext xAccessibleContext) { + unoAccessibleContext = xAccessibleContext; + } + + /** Returns the accessible name of this object */ + public String getAccessibleName() { + try { + return unoAccessibleContext.getAccessibleName(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleName(String name) { + // Not supported + } + + /** Returns the accessible name of this object */ + public String getAccessibleDescription() { + try { + return unoAccessibleContext.getAccessibleDescription(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleDescription(String name) { + // Not supported + } + + /** Returns the accessible role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + try { + javax.accessibility.AccessibleRole role = AccessibleRoleAdapter.getAccessibleRole( + unoAccessibleContext.getAccessibleRole()); + return (role != null) ? role : javax.accessibility.AccessibleRole.LABEL; + } catch(com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the locale of the component */ + public java.util.Locale getLocale() throws java.awt.IllegalComponentStateException { + try { + com.sun.star.lang.Locale unoLocale = unoAccessibleContext.getLocale(); + return new java.util.Locale(unoLocale.Language, unoLocale.Country); + } catch (IllegalAccessibleComponentStateException e) { + throw new java.awt.IllegalComponentStateException(e.getMessage()); + } catch (com.sun.star.uno.RuntimeException e) { + return List.this.getLocale(); + } + } + + /** Gets the 0-based index of this object in its accessible parent */ + public int getAccessibleIndexInParent() { + try { + return unoAccessibleContext.getAccessibleIndexInParent(); + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } + } + + /** Returns the number of accessible children of the object. */ + public int getAccessibleChildrenCount() { + try { + return unoAccessibleContext.getAccessibleChildCount(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Returns the specified Accessible child of the object. */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = List.this.activeDescendant; + if ((activeDescendant instanceof ListItem) && ((ListItem) activeDescendant).unoAccessible.equals(xAccessible)) { + child = activeDescendant; + } else if (xAccessible != null) { + child = new ListItem(xAccessible); + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /** Returns the state set of this object */ + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + try { + javax.accessibility.AccessibleStateSet stateSet = new javax.accessibility.AccessibleStateSet(); + // table cells are transient and so neither focusable nor focused + stateSet.add(javax.accessibility.AccessibleState.TRANSIENT); + + XAccessibleStateSet unoAccessibleStateSet = unoAccessibleContext.getAccessibleStateSet(); + if (unoAccessibleStateSet.contains(AccessibleStateType.ENABLED)) { + stateSet.add(javax.accessibility.AccessibleState.ENABLED); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.OPAQUE)) { + stateSet.add(javax.accessibility.AccessibleState.OPAQUE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.RESIZABLE)) { + stateSet.add(javax.accessibility.AccessibleState.RESIZABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SHOWING)) { + stateSet.add(javax.accessibility.AccessibleState.SHOWING); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.VISIBLE)) { + stateSet.add(javax.accessibility.AccessibleState.VISIBLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SINGLE_LINE)) { + stateSet.add(javax.accessibility.AccessibleState.SINGLE_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.MULTILINE)) { + stateSet.add(javax.accessibility.AccessibleState.MULTI_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTABLE)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTED)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTED); + } + return stateSet; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleComponent associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleComponent getAccessibleComponent() { + try { + XAccessibleComponent unoAccessibleComponent = (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class, unoAccessibleContext); + return (unoAccessibleComponent != null) ? + new AccessibleComponentImpl(unoAccessibleComponent) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleAction associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + try { + XAccessibleAction unoAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, unoAccessibleContext); + return (unoAccessibleAction != null) ? + new AccessibleActionImpl(unoAccessibleAction) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class, unoAccessibleContext); + return (unoAccessibleText != null) ? + new AccessibleTextImpl(unoAccessibleText) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleValue associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleValue getAccessibleValue() { + try { + XAccessibleValue unoAccessibleValue = (XAccessibleValue) + UnoRuntime.queryInterface(XAccessibleValue.class, unoAccessibleContext); + return (unoAccessibleValue != null) ? + new AccessibleValueImpl(unoAccessibleValue) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleIcon[] getAccessibleIcon() { + try { + XAccessibleImage unoAccessibleImage = (XAccessibleImage) + UnoRuntime.queryInterface(XAccessibleImage.class, unoAccessibleContext); + if (unoAccessibleImage != null) { + javax.accessibility.AccessibleIcon[] icons = { new AccessibleIconImpl(unoAccessibleImage) }; + return icons; + } + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Menu.java b/accessibility/bridge/org/openoffice/java/accessibility/Menu.java new file mode 100644 index 000000000000..dab01ba7c99a --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Menu.java @@ -0,0 +1,329 @@ +/************************************************************************* + * + * $RCSfile: Menu.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:37 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.*; + +public class Menu extends AbstractButton implements javax.accessibility.Accessible { + + private java.util.Vector children; + + protected Menu(XAccessible accessible, XAccessibleComponent component) { + super(); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleMenuListener()); + try { + XAccessibleContext unoAccessibleContext = unoAccessible.getAccessibleContext(); + // Create a vector with the correct initial capacity + int count = unoAccessibleContext.getAccessibleChildCount(); + children = new java.util.Vector(count); + // Fill the vector with objects + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + for (int i=0; i < children.size(); i++) { + java.awt.Component c = getComponent(unoAccessibleContext.getAccessibleChild(i)); + if (c != null) { + children.add(c); + } + } + } catch (com.sun.star.uno.RuntimeException e) { + 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(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(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(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void remove(Object any) { + try { + remove((XAccessible) AnyConverter.toObject(AbstractContainer.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) { + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + java.awt.Component c = factory.getAccessibleComponent(unoAccessible); + if (c == null) { + c = factory.createAccessibleComponent(unoAccessible); + if (c instanceof javax.accessibility.Accessible) { + ((javax.accessibility.Accessible) c).getAccessibleContext().setAccessibleParent(this); + } + } + return c; + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleMenuListener extends AccessibleAbstractButtonListener { + + protected AccessibleMenuListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + remove(event.OldValue); + } + if (AnyConverter.isObject(event.NewValue)) { + add(event.NewValue); + } + break; + case AccessibleEventId.ACCESSIBLE_SELECTION_EVENT: + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY,null, null); + break; + default: + super.notifyEvent(event); + } + } + + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface( + XAccessibleSelection.class, unoAccessibleComponent); + if (unoAccessibleSelection != null) { + accessibleContext = new AccessibleMenu(); + } + } catch (com.sun.star.uno.RuntimeException e) { + } + } + return accessibleContext; + } + + protected XAccessibleSelection unoAccessibleSelection = null; + + protected class AccessibleMenu extends AccessibleAbstractButton implements javax.accessibility.AccessibleSelection { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleMenu() { + super(); + } + + /** 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) { + return (javax.accessibility.Accessible) children.get(i); + } + + /** 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; + } + + /* + * 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 { + 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 + } + + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/MenuItem.java b/accessibility/bridge/org/openoffice/java/accessibility/MenuItem.java new file mode 100644 index 000000000000..93f5622f138c --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/MenuItem.java @@ -0,0 +1,102 @@ +/************************************************************************* + * + * $RCSfile: MenuItem.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:37 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleContext; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +class MenuItem extends ToggleButton { + + public MenuItem(XAccessible accessible, XAccessibleComponent component) { + super(accessible, component); + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleMenuItem(); + } + return accessibleContext; + } + + protected class AccessibleMenuItem extends AccessibleToggleButton { + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.MENU_ITEM; + } + + /** Gets the 0-based index of this object in its accessible parent */ + public int getAccessibleIndexInParent() { + if (getAccessibleParent() instanceof Menu) { + return ((Menu) getAccessibleParent()).indexOf(MenuItem.this); + } else { + return -1; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/NativeFrame.java b/accessibility/bridge/org/openoffice/java/accessibility/NativeFrame.java new file mode 100644 index 000000000000..e07ba12a2abc --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/NativeFrame.java @@ -0,0 +1,69 @@ +/************************************************************************* + * + * $RCSfile: NativeFrame.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:38 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +public interface NativeFrame { + public java.awt.Component getInitialComponent(); + public void setInitialComponent(java.awt.Component c); + public Integer getHWND(); +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/RadioButton.java b/accessibility/bridge/org/openoffice/java/accessibility/RadioButton.java new file mode 100644 index 000000000000..18ca352a8160 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/RadioButton.java @@ -0,0 +1,94 @@ +/************************************************************************* + * + * $RCSfile: RadioButton.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:39 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +class RadioButton extends ToggleButton { + + public RadioButton(XAccessible accessible, XAccessibleComponent component) { + super(accessible, component); + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleRadioButton(); + } + return accessibleContext; + } + + protected class AccessibleRadioButton extends AccessibleToggleButton { + +/* + protected AccessibleRadioButton() { + } +*/ + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.RADIO_BUTTON; + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/ScrollBar.java b/accessibility/bridge/org/openoffice/java/accessibility/ScrollBar.java new file mode 100644 index 000000000000..498783df0c2c --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/ScrollBar.java @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: ScrollBar.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:39 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.swing.SwingConstants; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.AccessibleEventId; +import drafts.com.sun.star.accessibility.AccessibleEventObject; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleAction; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +import drafts.com.sun.star.accessibility.XAccessibleValue; + +/** + */ +public class ScrollBar extends Component implements SwingConstants, Accessible { + + private int orientation = HORIZONTAL; + + public ScrollBar(XAccessible accessible, XAccessibleComponent component, int orientation) { + super(); + this.orientation = orientation; + initialize(accessible, component); + } + + public ScrollBar(XAccessible accessible, XAccessibleComponent component) { + super(); + initialize(accessible, component); + } + + protected void initialize(XAccessible accessible, XAccessibleComponent component) { + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleScrollBarListener()); + } + + protected void fireValuePropertyChanged(Number oldValue, Number newValue) { + java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().invokeLater( + new PropertyChangeBroadcaster(accessibleContext.ACCESSIBLE_VALUE_PROPERTY, + oldValue, newValue)); + } + + protected class AccessibleScrollBarListener extends AccessibleUNOComponentListener { + /** Passes the event to all registered listeners (if any) */ + protected void handleValueEvent(Number oldValue, Number newValue) { + // Notify property event listeners + ScrollBar.this.fireValuePropertyChanged(oldValue, newValue); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch(event.EventId) { + case AccessibleEventId.ACCESSIBLE_VALUE_EVENT: + // Fire the appropriate PropertyChangeEvent + handleValueEvent(toNumber(event.OldValue), toNumber(event.NewValue)); + break; + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleScrollBar(); + } + return accessibleContext; + } + + protected class AccessibleScrollBar extends AccessibleUNOComponent implements + javax.accessibility.AccessibleValue, javax.accessibility.AccessibleAction { + + protected XAccessibleValue unoAccessibleValue; + protected XAccessibleAction unoAccessibleAction; + protected int actionCount = 0; + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleScrollBar() { + super(); + unoAccessibleValue = (XAccessibleValue) UnoRuntime.queryInterface( + XAccessibleValue.class, unoAccessibleComponent); + unoAccessibleAction = (XAccessibleAction) UnoRuntime.queryInterface( + XAccessibleAction.class, ScrollBar.this.unoAccessibleComponent); + if (unoAccessibleAction != null) { + actionCount = unoAccessibleAction.getAccessibleActionCount(); + } + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.SCROLL_BAR; + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + switch (orientation) { + case HORIZONTAL: + states.add(AccessibleState.HORIZONTAL); + break; + case VERTICAL: + states.add(AccessibleState.VERTICAL); + break; + default: + break; + } + return states; + } + + /** Gets the AccessibleValue associated with this object that supports a Numerical value */ + public javax.accessibility.AccessibleValue getAccessibleValue() { + return this; + } + + /** Gets the AccessibleAction associated with this object that supports one or more actions */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + return this; + } + + /* + * AccessibleAction + */ + + /** Performs the specified Action on the object */ + public boolean doAccessibleAction(int param) { + if (param < actionCount) { + try { + return unoAccessibleAction.doAccessibleAction(param); + } catch(com.sun.star.lang.IndexOutOfBoundsException e) { + } + } + return false; + } + + /** Returns a description of the specified action of the object */ + public java.lang.String getAccessibleActionDescription(int param) { + if(param < actionCount) { + try { + return unoAccessibleAction.getAccessibleActionDescription(param); + } catch(com.sun.star.lang.IndexOutOfBoundsException e) { + } + } + return null; + } + + /** Returns the number of accessible actions available in this object */ + public int getAccessibleActionCount() { + return actionCount; + } + + /* + * AccessibleValue + */ + + /** Get the minimum value of this object as a Number */ + public java.lang.Number getMinimumAccessibleValue() { + try { + return toNumber(unoAccessibleValue.getMinimumValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Get the value of this object as a Number */ + public java.lang.Number getCurrentAccessibleValue() { + try { + return toNumber(unoAccessibleValue.getCurrentValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + /** Get the maximum value of this object as a Number */ + public java.lang.Number getMaximumAccessibleValue() { + try { + return toNumber(unoAccessibleValue.getMaximumValue()); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Set the value of this object as a Number */ + public boolean setCurrentAccessibleValue(java.lang.Number number) { + try { + return unoAccessibleValue.setCurrentValue(number); + } catch (com.sun.star.uno.RuntimeException e) { + return false; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Separator.java b/accessibility/bridge/org/openoffice/java/accessibility/Separator.java new file mode 100644 index 000000000000..d4a1486fa647 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Separator.java @@ -0,0 +1,150 @@ +/************************************************************************* + * + * $RCSfile: Separator.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:39 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.swing.SwingConstants; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; + +/** + */ +public class Separator extends Component implements SwingConstants, Accessible { + + private int orientation = HORIZONTAL; + + public Separator(XAccessible accessible, XAccessibleComponent component, int orientation) { + super(); + this.orientation = orientation; + initialize(accessible, component); + } + + public Separator(XAccessible accessible, XAccessibleComponent component) { + super(); + initialize(accessible, component); + } + + protected void initialize(XAccessible accessible, XAccessibleComponent component) { + setFocusable(false); + unoAccessible = accessible; + unoAccessibleComponent = component; + } +/* + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleSeparatorListener()); + } + + protected class AccessibleSeparatorListener extends AccessibleUNOComponentListener { + } +*/ + /** Returns the AccessibleContext associated with this object */ + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleSeparator(); + } + return accessibleContext; + } + + protected class AccessibleSeparator extends AccessibleUNOComponent { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleSeparator() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.SEPARATOR; + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + public AccessibleStateSet getAccessibleStateSet() { + AccessibleStateSet states = super.getAccessibleStateSet(); + switch (orientation) { + case HORIZONTAL: + states.add(AccessibleState.HORIZONTAL); + break; + case VERTICAL: + states.add(AccessibleState.VERTICAL); + break; + default: + break; + } + return states; + } + } +} + + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Table.java b/accessibility/bridge/org/openoffice/java/accessibility/Table.java new file mode 100644 index 000000000000..1b75a4ff79e3 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Table.java @@ -0,0 +1,546 @@ +/************************************************************************* + * + * $RCSfile: Table.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:40 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.*; + +public class Table extends DescendantManager implements javax.accessibility.Accessible { + + protected Table(XAccessible accessible, XAccessibleComponent component, boolean multiselectable) { + super(multiselectable); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, component); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleTableListener()); + } + } + + protected void setActiveDescendant(javax.accessibility.Accessible descendant) { + javax.accessibility.Accessible oldAD = activeDescendant; + activeDescendant = descendant; + if (Build.DEBUG) { + System.err.println("Firing ACTIVE_DESCENDANT property change"); + } + firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, + oldAD, descendant); + } + + protected void setActiveDescendant(Object any) { + javax.accessibility.Accessible descendant = null; + try { + if (AnyConverter.isObject(any)) { + XAccessible unoAccessible = (XAccessible) AnyConverter.toObject( + AbstractContainer.XAccessibleType, any); + if (unoAccessible != null) { + // FIXME: have to handle non transient objects here .. + descendant = new TableCell(unoAccessible); + } + } + setActiveDescendant(descendant); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void add(XAccessible unoAccessible) { + if (unoAccessible != null) { + TableCell cell = new TableCell(unoAccessible); + // The AccessBridge for Windows expects an instance of AccessibleContext + // as parameters + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, cell.getAccessibleContext()); + } + } + + protected void remove(XAccessible unoAccessible) { + if (unoAccessible != null) { + TableCell cell = new TableCell(unoAccessible); + // The AccessBridge for Windows expects an instance of AccessibleContext + // as parameters + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + cell.getAccessibleContext(), null); + } + } + + protected void add(Object any) { + try { + add((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void remove(Object any) { + try { + remove((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleTableListener extends AccessibleDescendantManagerListener { + + protected AccessibleTableListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_ACTIVE_DESCENDANT_EVENT: + setActiveDescendant(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + remove(event.OldValue); + } + if (AnyConverter.isObject(event.NewValue)) { + add(event.NewValue); + } + break; + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + unoAccessibleContext = unoAccessible.getAccessibleContext(); + unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface( + XAccessibleSelection.class, unoAccessibleContext); + accessibleContext = new AccessibleTable(); + } catch (java.lang.NullPointerException e) { + if (Build.DEBUG) { + System.err.println("NullPointerException caught: " + e.getMessage()); + } + } catch (com.sun.star.uno.RuntimeException e) { + if (Build.DEBUG) { + System.err.println("RuntimeException caught: " + e.getMessage()); + } + } + } + return accessibleContext; + } + + protected class AccessibleTable extends AccessibleDescendantManager { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleTable() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.TABLE; + } + + /** Returns the specified Accessible child of the object */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Table.this.activeDescendant; + if ((activeDescendant instanceof TableCell) && xAccessible.equals(((TableCell) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new TableCell(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /* + * AccessibleSelection + */ + + /** Returns an Accessible representing the specified selected child of the object */ + public javax.accessibility.Accessible getAccessibleSelection(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Table.this.activeDescendant; + if ((activeDescendant instanceof TableCell) && xAccessible.equals(((TableCell) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new TableCell(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + } + + class TableCell implements javax.accessibility.Accessible { + + protected XAccessible unoAccessible; + + public TableCell(XAccessible xAccessible) { + unoAccessible = xAccessible; + } + + public Object[] create(Object[] targetSet) { + try { + java.util.ArrayList list = new java.util.ArrayList(targetSet.length); + for (int i=0; i < targetSet.length; i++) { + XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface( + XAccessible.class, targetSet[i]); + if (xAccessible != null) { + list.add(new TableCell(xAccessible)); + } + } + list.trimToSize(); + return list.toArray(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + XAccessibleContext xAccessibleContext = unoAccessible.getAccessibleContext(); + if (xAccessibleContext != null) { + accessibleContext = new AccessibleTableCell(xAccessibleContext); + } + } catch (com.sun.star.uno.RuntimeException e) { + } + } + return accessibleContext; + } + + protected class AccessibleTableCell extends javax.accessibility.AccessibleContext { + + XAccessibleContext unoAccessibleContext; + + public AccessibleTableCell(XAccessibleContext xAccessibleContext) { + unoAccessibleContext = xAccessibleContext; + } + + /** Returns the accessible name of this object */ + public String getAccessibleName() { + try { + return unoAccessibleContext.getAccessibleName(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleName(String name) { + // Not supported + } + + /** Returns the accessible name of this object */ + public String getAccessibleDescription() { + try { + return unoAccessibleContext.getAccessibleDescription(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleDescription(String name) { + // Not supported + } + + /** Returns the accessible role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + try { + javax.accessibility.AccessibleRole role = AccessibleRoleAdapter.getAccessibleRole( + unoAccessibleContext.getAccessibleRole()); + return (role != null) ? role : javax.accessibility.AccessibleRole.LABEL; + } catch(com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the locale of the component */ + public java.util.Locale getLocale() throws java.awt.IllegalComponentStateException { + try { + com.sun.star.lang.Locale unoLocale = unoAccessibleContext.getLocale(); + return new java.util.Locale(unoLocale.Language, unoLocale.Country); + } catch (IllegalAccessibleComponentStateException e) { + throw new java.awt.IllegalComponentStateException(e.getMessage()); + } catch (com.sun.star.uno.RuntimeException e) { + return Table.this.getLocale(); + } + } + + /** Gets the 0-based index of this object in its accessible parent */ + public int getAccessibleIndexInParent() { + try { + return unoAccessibleContext.getAccessibleIndexInParent(); + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } + } + + /** Returns the number of accessible children of the object. */ + public int getAccessibleChildrenCount() { + try { + return unoAccessibleContext.getAccessibleChildCount(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Returns the specified Accessible child of the object. */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Table.this.activeDescendant; + if ((activeDescendant instanceof TableCell) && ((TableCell) activeDescendant).unoAccessible.equals(xAccessible)) { + child = activeDescendant; + } else if (xAccessible != null) { + child = new TableCell(xAccessible); + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /** Returns the state set of this object */ + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + try { + javax.accessibility.AccessibleStateSet stateSet = new javax.accessibility.AccessibleStateSet(); + // table cells are transient and so neither focusable nor focused + stateSet.add(javax.accessibility.AccessibleState.TRANSIENT); + + XAccessibleStateSet unoAccessibleStateSet = unoAccessibleContext.getAccessibleStateSet(); + if (unoAccessibleStateSet.contains(AccessibleStateType.ENABLED)) { + stateSet.add(javax.accessibility.AccessibleState.ENABLED); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.OPAQUE)) { + stateSet.add(javax.accessibility.AccessibleState.OPAQUE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.RESIZABLE)) { + stateSet.add(javax.accessibility.AccessibleState.RESIZABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SHOWING)) { + stateSet.add(javax.accessibility.AccessibleState.SHOWING); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.VISIBLE)) { + stateSet.add(javax.accessibility.AccessibleState.VISIBLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SINGLE_LINE)) { + stateSet.add(javax.accessibility.AccessibleState.SINGLE_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.MULTILINE)) { + stateSet.add(javax.accessibility.AccessibleState.MULTI_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTABLE)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTED)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTED); + } + return stateSet; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Returns the relation set of this object */ + public javax.accessibility.AccessibleRelationSet getAccessibleRelationSet() { + try { + XAccessibleRelationSet unoAccessibleRelationSet = unoAccessibleContext.getAccessibleRelationSet(); + if (unoAccessibleRelationSet == null) { + return null; + } + + javax.accessibility.AccessibleRelationSet relationSet = new javax.accessibility.AccessibleRelationSet(); + int count = unoAccessibleRelationSet.getRelationCount(); + for (int i = 0; i < count; i++) { + AccessibleRelation unoAccessibleRelation = unoAccessibleRelationSet.getRelation(i); + switch (unoAccessibleRelation.RelationType) { + case AccessibleRelationType.CONTROLLED_BY: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.CONTROLLED_BY, + create(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.CONTROLLER_FOR: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.CONTROLLER_FOR, + create(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.LABELED_BY: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.LABELED_BY, + create(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.LABEL_FOR: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.LABEL_FOR, + create(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.MEMBER_OF: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.MEMBER_OF, + create(unoAccessibleRelation.TargetSet))); + break; + default: + break; + } + } + return relationSet; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + return null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleComponent associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleComponent getAccessibleComponent() { + try { + XAccessibleComponent unoAccessibleComponent = (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class, unoAccessibleContext); + return (unoAccessibleComponent != null) ? + new AccessibleComponentImpl(unoAccessibleComponent) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleAction associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + try { + XAccessibleAction unoAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, unoAccessibleContext); + return (unoAccessibleAction != null) ? + new AccessibleActionImpl(unoAccessibleAction) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class, unoAccessibleContext); + return (unoAccessibleText != null) ? + new AccessibleTextImpl(unoAccessibleText) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleValue associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleValue getAccessibleValue() { + try { + XAccessibleValue unoAccessibleValue = (XAccessibleValue) + UnoRuntime.queryInterface(XAccessibleValue.class, unoAccessibleContext); + return (unoAccessibleValue != null) ? + new AccessibleValueImpl(unoAccessibleValue) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleIcon[] getAccessibleIcon() { + try { + XAccessibleImage unoAccessibleImage = (XAccessibleImage) + UnoRuntime.queryInterface(XAccessibleImage.class, unoAccessibleContext); + if (unoAccessibleImage != null) { + javax.accessibility.AccessibleIcon[] icons = { new AccessibleIconImpl(unoAccessibleImage) }; + return icons; + } + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/TextComponent.java b/accessibility/bridge/org/openoffice/java/accessibility/TextComponent.java new file mode 100644 index 000000000000..444bfe42e9f4 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/TextComponent.java @@ -0,0 +1,255 @@ +/************************************************************************* + * + * $RCSfile: TextComponent.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:40 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.*; + +/** + */ +public class TextComponent extends Component implements javax.accessibility.Accessible { + + protected TextComponent(XAccessible accessible, XAccessibleComponent xAccessibleComponent, boolean multiLine) { + super(); + initialize(accessible, xAccessibleComponent); + } + + protected TextComponent(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + super(); + initialize(accessible, xAccessibleComponent); + } + + protected void initialize(XAccessible accessible, XAccessibleComponent xAccessibleComponent) { + unoAccessible = accessible; + unoAccessibleComponent = xAccessibleComponent; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleTextComponentListener()); + } + + protected class AccessibleTextComponentListener extends AccessibleUNOComponentListener { + + protected AccessibleTextComponentListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_TEXT_EVENT: + firePropertyChange(accessibleContext.ACCESSIBLE_TEXT_PROPERTY, + null, new Integer(0)); + break; + case AccessibleEventId.ACCESSIBLE_CARET_EVENT: + firePropertyChange(accessibleContext.ACCESSIBLE_CARET_PROPERTY, + toNumber(event.OldValue), toNumber(event.NewValue)); + break; + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleTextComponent(); + } + return accessibleContext; + } + + protected class AccessibleTextComponent extends AccessibleUNOComponent { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleTextComponent() { + super(); + } + + /* + * AccessibleContext + */ + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.TEXT; + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class,unoAccessibleComponent); + if (unoAccessibleText != null) { + return new AccessibleTextImpl(unoAccessibleText); + } else { + return null; + } + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleEditableText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleEditableText getAccessibleEditableText() { + try { + XAccessibleEditableText unoAccessibleText = (XAccessibleEditableText) + UnoRuntime.queryInterface(XAccessibleEditableText.class,unoAccessibleComponent); + if (unoAccessibleText != null) { + return new AccessibleEditableTextImpl(unoAccessibleText); + } else { + return null; + } + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleAction associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + try { + XAccessibleAction unoAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, unoAccessibleComponent); + return (unoAccessibleAction != null) ? + new AccessibleActionImpl(unoAccessibleAction) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** + * Get the state set of this object. + * + * @return an instance of AccessibleState containing the current state + * of the object + * @see AccessibleState + */ + + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + javax.accessibility.AccessibleStateSet states = super.getAccessibleStateSet(); + try { + XAccessibleStateSet unoAccessibleStateSet = + unoAccessible.getAccessibleContext().getAccessibleStateSet(); + + if (unoAccessibleStateSet.contains(AccessibleStateType.EDITABLE)) { + states.add(javax.accessibility.AccessibleState.EDITABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.MULTILINE)) { + states.add(javax.accessibility.AccessibleState.MULTI_LINE); + } else { + states.add(javax.accessibility.AccessibleState.SINGLE_LINE); + } + } catch (NullPointerException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return states; + } + + /** Returns the relation set of this object */ + public javax.accessibility.AccessibleRelationSet getAccessibleRelationSet() { + try { + XAccessibleRelationSet unoAccessibleRelationSet = + unoAccessible.getAccessibleContext().getAccessibleRelationSet(); + if (unoAccessibleRelationSet == null) { + return null; + } + + javax.accessibility.AccessibleRelationSet relationSet = new javax.accessibility.AccessibleRelationSet(); + int count = unoAccessibleRelationSet.getRelationCount(); + for (int i = 0; i < count; i++) { + AccessibleRelation unoAccessibleRelation = unoAccessibleRelationSet.getRelation(i); + switch (unoAccessibleRelation.RelationType) { + case AccessibleRelationType.CONTROLLED_BY: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.CONTROLLED_BY, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.CONTROLLER_FOR: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.CONTROLLER_FOR, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.LABELED_BY: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.LABELED_BY, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + case AccessibleRelationType.MEMBER_OF: + relationSet.add(new javax.accessibility.AccessibleRelation( + javax.accessibility.AccessibleRelation.MEMBER_OF, + getAccessibleComponents(unoAccessibleRelation.TargetSet))); + break; + default: + break; + } + } + return relationSet; + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + return null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/ToggleButton.java b/accessibility/bridge/org/openoffice/java/accessibility/ToggleButton.java new file mode 100644 index 000000000000..85fd85d31a4e --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/ToggleButton.java @@ -0,0 +1,120 @@ +/************************************************************************* + * + * $RCSfile: ToggleButton.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:40 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.XAccessibleComponent; +import drafts.com.sun.star.accessibility.XAccessibleValue; + +class ToggleButton extends AbstractButton implements javax.accessibility.Accessible { + + public ToggleButton(XAccessible accessible, XAccessibleComponent component) { + super(); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + addAccessibleEventListener(new AccessibleToggleButtonListener()); + } + + protected class AccessibleToggleButtonListener extends AccessibleAbstractButtonListener { +/* + protected AccessibleButtonListener() { + super(); + } +*/ + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleToggleButton(); + } + return accessibleContext; + } + + protected class AccessibleToggleButton extends AccessibleAbstractButton { +/* + protected AccessibleToggleButton() { + super(); + } +*/ + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.TOGGLE_BUTTON; + } + + /** Gets the AccessibleValue associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleValue getAccessibleValue() { + try { + XAccessibleValue unoAccessibleValue = (XAccessibleValue) + UnoRuntime.queryInterface(XAccessibleValue.class, unoAccessibleComponent); + return (unoAccessibleValue != null) ? + new AccessibleValueImpl(unoAccessibleValue) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Tree.java b/accessibility/bridge/org/openoffice/java/accessibility/Tree.java new file mode 100644 index 000000000000..e3cd26d40070 --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Tree.java @@ -0,0 +1,484 @@ +/************************************************************************* + * + * $RCSfile: Tree.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:41 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleState; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import drafts.com.sun.star.accessibility.*; + +public class Tree extends DescendantManager implements javax.accessibility.Accessible { + + protected Tree(XAccessible accessible, XAccessibleComponent component) { + super(); + unoAccessible = accessible; + unoAccessibleComponent = component; + // To reflect focus and other component state changes, the accessibility + // event listener must already be added here + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, component); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleTreeListener()); + } + } + + protected void setActiveDescendant(javax.accessibility.Accessible descendant) { + javax.accessibility.Accessible oldAD = activeDescendant; + activeDescendant = descendant; + firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, + oldAD, descendant); + } + + protected void setActiveDescendant(Object any) { + javax.accessibility.Accessible descendant = null; + try { + if (AnyConverter.isObject(any)) { + XAccessible unoAccessible = (XAccessible) AnyConverter.toObject( + AbstractContainer.XAccessibleType, any); + if (unoAccessible != null) { + // FIXME: have to handle non transient objects here .. + descendant = new TreeItem(unoAccessible); + } + } + setActiveDescendant(descendant); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void add(XAccessible unoAccessible) { + if (unoAccessible != null) { + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, new TreeItem(unoAccessible)); + } + } + + protected void remove(XAccessible unoAccessible) { + if (unoAccessible != null) { + firePropertyChange(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + new TreeItem(unoAccessible), null); + } + } + + protected void add(Object any) { + try { + add((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + protected void remove(Object any) { + try { + remove((XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any)); + } catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleTreeListener extends AccessibleDescendantManagerListener { + + protected AccessibleTreeListener() { + super(); + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_ACTIVE_DESCENDANT_EVENT: + setActiveDescendant(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + remove(event.OldValue); + } + if (AnyConverter.isObject(event.NewValue)) { + add(event.NewValue); + } + break; + + default: + super.notifyEvent(event); + } + } + } + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + unoAccessibleContext = unoAccessible.getAccessibleContext(); + unoAccessibleSelection = (XAccessibleSelection) UnoRuntime.queryInterface( + XAccessibleSelection.class, unoAccessibleContext); + if (unoAccessibleSelection != null) { + accessibleContext = new AccessibleTree(); + } + } catch (java.lang.NullPointerException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + } + return accessibleContext; + } + + protected class AccessibleTree extends AccessibleDescendantManager { + + /** + * Though the class is abstract, this should be called by all sub-classes + */ + protected AccessibleTree() { + super(); + } + + /** Gets the role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + return javax.accessibility.AccessibleRole.TREE; + } + + /** Returns the specified Accessible child of the object */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Tree.this.activeDescendant; + if ((activeDescendant instanceof TreeItem) && xAccessible.equals(((TreeItem) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new TreeItem(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /* + * AccessibleSelection + */ + + /** Returns an Accessible representing the specified selected child of the object */ + public javax.accessibility.Accessible getAccessibleSelection(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + if (xAccessible != null) { + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Tree.this.activeDescendant; + if ((activeDescendant instanceof TreeItem) && xAccessible.equals(((TreeItem) activeDescendant).unoAccessible)) { + child = activeDescendant; + } else { + child = new TreeItem(xAccessible); + } + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + } + + class TreeItem implements javax.accessibility.Accessible { + + protected XAccessible unoAccessible; + + public TreeItem(XAccessible xAccessible) { + unoAccessible = xAccessible; + } + + public Object[] create(Object[] targetSet) { + try { + java.util.ArrayList list = new java.util.ArrayList(targetSet.length); + for (int i=0; i < targetSet.length; i++) { + XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface( + XAccessible.class, targetSet[i]); + if (xAccessible != null) { + list.add(new TreeItem(xAccessible)); + } + } + list.trimToSize(); + return list.toArray(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + try { + XAccessibleContext xAccessibleContext = unoAccessible.getAccessibleContext(); + if (xAccessibleContext != null) { + accessibleContext = new AccessibleTreeItem(xAccessibleContext); + } + } catch (com.sun.star.uno.RuntimeException e) { + } + } + return accessibleContext; + } + + protected class AccessibleTreeItem extends javax.accessibility.AccessibleContext { + + XAccessibleContext unoAccessibleContext; + + public AccessibleTreeItem(XAccessibleContext xAccessibleContext) { + unoAccessibleContext = xAccessibleContext; + } + + /** Returns the accessible name of this object */ + public String getAccessibleName() { + try { + return unoAccessibleContext.getAccessibleName(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleName(String name) { + // Not supported + } + + /** Returns the accessible name of this object */ + public String getAccessibleDescription() { + try { + return unoAccessibleContext.getAccessibleDescription(); + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Sets the accessible name of this object */ + public void setAccessibleDescription(String name) { + // Not supported + } + + /** Returns the accessible role of this object */ + public javax.accessibility.AccessibleRole getAccessibleRole() { + try { + javax.accessibility.AccessibleRole role = AccessibleRoleAdapter.getAccessibleRole( + unoAccessibleContext.getAccessibleRole()); + return (role != null) ? role : javax.accessibility.AccessibleRole.LABEL; + } catch(com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the locale of the component */ + public java.util.Locale getLocale() throws java.awt.IllegalComponentStateException { + try { + com.sun.star.lang.Locale unoLocale = unoAccessibleContext.getLocale(); + return new java.util.Locale(unoLocale.Language, unoLocale.Country); + } catch (IllegalAccessibleComponentStateException e) { + throw new java.awt.IllegalComponentStateException(e.getMessage()); + } catch (com.sun.star.uno.RuntimeException e) { + return Tree.this.getLocale(); + } + } + + /** Gets the 0-based index of this object in its accessible parent */ + public int getAccessibleIndexInParent() { + try { + return unoAccessibleContext.getAccessibleIndexInParent(); + } catch (com.sun.star.uno.RuntimeException e) { + return -1; + } + } + + /** Returns the number of accessible children of the object. */ + public int getAccessibleChildrenCount() { + try { + return unoAccessibleContext.getAccessibleChildCount(); + } catch (com.sun.star.uno.RuntimeException e) { + return 0; + } + } + + /** Returns the specified Accessible child of the object. */ + public javax.accessibility.Accessible getAccessibleChild(int i) { + javax.accessibility.Accessible child = null; + try { + XAccessible xAccessible = unoAccessibleContext.getAccessibleChild(i); + // Re-use the active descandant wrapper if possible + javax.accessibility.Accessible activeDescendant = Tree.this.activeDescendant; + if ((activeDescendant instanceof TreeItem) && ((TreeItem) activeDescendant).unoAccessible.equals(xAccessible)) { + child = activeDescendant; + } else if (xAccessible != null) { + child = new TreeItem(xAccessible); + } + } catch (com.sun.star.lang.IndexOutOfBoundsException e) { + } catch (com.sun.star.uno.RuntimeException e) { + } + return child; + } + + /** Returns the state set of this object */ + public javax.accessibility.AccessibleStateSet getAccessibleStateSet() { + try { + javax.accessibility.AccessibleStateSet stateSet = new javax.accessibility.AccessibleStateSet(); + // table cells are transient and so neither focusable nor focused + stateSet.add(javax.accessibility.AccessibleState.TRANSIENT); + + XAccessibleStateSet unoAccessibleStateSet = unoAccessibleContext.getAccessibleStateSet(); + if (unoAccessibleStateSet.contains(AccessibleStateType.ENABLED)) { + stateSet.add(javax.accessibility.AccessibleState.ENABLED); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.OPAQUE)) { + stateSet.add(javax.accessibility.AccessibleState.OPAQUE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.RESIZABLE)) { + stateSet.add(javax.accessibility.AccessibleState.RESIZABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SHOWING)) { + stateSet.add(javax.accessibility.AccessibleState.SHOWING); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.VISIBLE)) { + stateSet.add(javax.accessibility.AccessibleState.VISIBLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SINGLE_LINE)) { + stateSet.add(javax.accessibility.AccessibleState.SINGLE_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.MULTILINE)) { + stateSet.add(javax.accessibility.AccessibleState.MULTI_LINE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTABLE)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTABLE); + } + if (unoAccessibleStateSet.contains(AccessibleStateType.SELECTED)) { + stateSet.add(javax.accessibility.AccessibleState.SELECTED); + } + return stateSet; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleComponent associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleComponent getAccessibleComponent() { + try { + XAccessibleComponent unoAccessibleComponent = (XAccessibleComponent) + UnoRuntime.queryInterface(XAccessibleComponent.class, unoAccessibleContext); + return (unoAccessibleComponent != null) ? + new AccessibleComponentImpl(unoAccessibleComponent) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleAction associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleAction getAccessibleAction() { + try { + XAccessibleAction unoAccessibleAction = (XAccessibleAction) + UnoRuntime.queryInterface(XAccessibleAction.class, unoAccessibleContext); + return (unoAccessibleAction != null) ? + new AccessibleActionImpl(unoAccessibleAction) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleText getAccessibleText() { + try { + XAccessibleText unoAccessibleText = (XAccessibleText) + UnoRuntime.queryInterface(XAccessibleText.class, unoAccessibleContext); + return (unoAccessibleText != null) ? + new AccessibleTextImpl(unoAccessibleText) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleValue associated with this object that has a graphical representation */ + public javax.accessibility.AccessibleValue getAccessibleValue() { + try { + XAccessibleValue unoAccessibleValue = (XAccessibleValue) + UnoRuntime.queryInterface(XAccessibleValue.class, unoAccessibleContext); + return (unoAccessibleValue != null) ? + new AccessibleValueImpl(unoAccessibleValue) : null; + } catch (com.sun.star.uno.RuntimeException e) { + return null; + } + } + + /** Gets the AccessibleText associated with this object presenting text on the display */ + public javax.accessibility.AccessibleIcon[] getAccessibleIcon() { + try { + XAccessibleImage unoAccessibleImage = (XAccessibleImage) + UnoRuntime.queryInterface(XAccessibleImage.class, unoAccessibleContext); + if (unoAccessibleImage != null) { + javax.accessibility.AccessibleIcon[] icons = { new AccessibleIconImpl(unoAccessibleImage) }; + return icons; + } + } catch (com.sun.star.uno.RuntimeException e) { + } + return null; + } + } + } +} + diff --git a/accessibility/bridge/org/openoffice/java/accessibility/Window.java b/accessibility/bridge/org/openoffice/java/accessibility/Window.java new file mode 100644 index 000000000000..b8f6fb6258ec --- /dev/null +++ b/accessibility/bridge/org/openoffice/java/accessibility/Window.java @@ -0,0 +1,507 @@ +/************************************************************************* + * + * $RCSfile: Window.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-12-06 11:25:41 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +package org.openoffice.java.accessibility; + +import com.sun.star.uno.*; +import drafts.com.sun.star.accessibility.*; + +public class Window extends java.awt.Window implements javax.accessibility.Accessible, NativeFrame { + protected XAccessibleComponent unoAccessibleComponent; + + // The coordinates of this frame on screen + java.awt.Point location = null; + + boolean opened = false; + boolean visible = false; + + java.awt.EventQueue eventQueue = null; + + public Window(java.awt.Frame owner, XAccessibleComponent xAccessibleComponent) { + super(owner); + initialize(xAccessibleComponent); + } + + private void initialize(XAccessibleComponent xAccessibleComponent) { + unoAccessibleComponent = xAccessibleComponent; + eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue(); + XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster) + UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, + unoAccessibleComponent); + if (broadcaster != null) { + broadcaster.addEventListener(new AccessibleWindowListener()); + } + } + + java.awt.Component initialComponent = null; + + public java.awt.Component getInitialComponent() { + return initialComponent; + } + + public void setInitialComponent(java.awt.Component c) { + initialComponent = c; + } + + public Integer getHWND() { + return null; + } + + /** + * Determines whether this <code>Component</code> is showing on screen. + * This means that the component must be visible, and it must be in a + * <code>container</code> that is visible and showing. + * @see #addNotify + * @see #removeNotify + * @since JDK1.0 + */ + public boolean isShowing() { + if (isVisible()) { + java.awt.Container parent = getParent(); + return (parent == null) || parent.isShowing(); + } + return false; + } + + /** + * Makes this <code>Component</code> displayable by connecting it to a + * native screen resource. + * This method is called internally by the toolkit and should + * not be called directly by programs. + * @see #isDisplayable + * @see #removeNotify + * @since JDK1.0 + */ + public void addNotify() { +// createHierarchyEvents(0, null, null, 0, false); + } + + /** + * Makes this <code>Component</code> undisplayable by destroying it native + * screen resource. + * This method is called by the toolkit internally and should + * not be called directly by programs. + * @see #isDisplayable + * @see #addNotify + * @since JDK1.0 + */ + public void removeNotify() { + } + + /** + * Determines if the object is visible. Note: this means that the + * object intends to be visible; however, it may not in fact be + * showing on the screen because one of the objects that this object + * is contained by is not visible. To determine if an object is + * showing on the screen, use <code>isShowing</code>. + * + * @return true if object is visible; otherwise, false + */ + public boolean isVisible(){ + return visible; + } + + /** + * Shows or hides this component depending on the value of parameter + * <code>b</code>. + * @param b if <code>true</code>, shows this component; + * otherwise, hides this component + * @see #isVisible + * @since JDK1.1 + */ + public void setVisible(boolean b) { + if (visible != b){ + visible = b; + if (b) { + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + + // If it is the first show, fire WINDOW_OPENED event + if (!opened) { + postWindowEvent(java.awt.event.WindowEvent.WINDOW_OPENED); + opened = true; + } + } else { + location = null; + } + } + } + + protected void postWindowEvent(int i) { + eventQueue.postEvent(new java.awt.event.WindowEvent(this, i)); + } + + /** Returns the location of the object on the screen. */ + public java.awt.Point getLocationOnScreen() { + if (visible) { + return new java.awt.Point(location); + } + return null; + } + + /** + * Update the proxy objects appropriatly on property change events + */ + protected class AccessibleWindowListener implements XAccessibleEventListener { + + protected AccessibleWindowListener() { + } + + // The only expected state changes are ACTIVE and VISIBLE + protected void setComponentState(short state, boolean enable) { + switch (state) { + case AccessibleStateType.ACTIVE: + postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_GAINED_FOCUS : + java.awt.event.WindowEvent.WINDOW_LOST_FOCUS); + break; + case AccessibleStateType.ICONIFIED: + Window.this.postWindowEvent(enable ? + java.awt.event.WindowEvent.WINDOW_ICONIFIED : + java.awt.event.WindowEvent.WINDOW_DEICONIFIED); + break; + case AccessibleStateType.SHOWING: + case AccessibleStateType.VISIBLE: + Window.this.setVisible(enable); + break; + default: + if (Build.DEBUG) { +// System.err.println("[frame]: " + getTitle() + "unexpected state change " + state); + } + break; + } + } + + /** Updates the accessible name and fires the appropriate PropertyChangedEvent */ + protected void handleNameChangedEvent(Object any) { + try { +// Window.this.setTitle(AnyConverter.toString(any)); + AnyConverter.toString(any); + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the accessible description and fires the appropriate PropertyChangedEvent */ + protected void handleDescriptionChangedEvent(Object any) { + try { + // This causes the property change event to be fired in the VCL thread + // context. If this causes problems, it has to be deligated to the java + // dispatch thread .. + if (accessibleContext != null) { + accessibleContext.setAccessibleDescription(AnyConverter.toString(any)); + } + } + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal states and fires the appropriate PropertyChangedEvent */ + protected void handleStateChangedEvent(Object any1, Object any2) { + try { + if (AnyConverter.isShort(any1)) { + setComponentState(AnyConverter.toShort(any1), false); + } + + if (AnyConverter.isShort(any2)) { + setComponentState(AnyConverter.toShort(any2), true); + } + } + + catch (com.sun.star.lang.IllegalArgumentException e) { + } + } + + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildRemovedEvent(Object any) { + try { + java.awt.Component c = AccessibleObjectFactory.getDefault().getAccessibleComponent( + (XAccessible) AnyConverter.toObject(Container.XAccessibleType, any)); + if (c != null) { + Window.this.remove(c); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + /** Updates the internal child list and fires the appropriate PropertyChangeEvent */ + protected void handleChildAddedEvent(Object any) { + try { + XAccessible xAccessible = (XAccessible) AnyConverter.toObject(AbstractContainer.XAccessibleType, any); + AccessibleObjectFactory factory = AccessibleObjectFactory.getDefault(); + java.awt.Component c = factory.getAccessibleComponent(xAccessible); + if (c != null) { + // Seems to be already in child list + if (c.getParent().equals(this)) + return; + } else { + c = factory.createAccessibleComponent(xAccessible); + } + if (c != null) { + Window.this.add(c, xAccessible.getAccessibleContext(). + getAccessibleIndexInParent()); + } + } + + catch (com.sun.star.uno.Exception e) { + // FIXME: output + } + } + + /** Fires a visible data property change event */ + protected void handleVisibleDataEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Window.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Updates internal bounding box cache */ + protected void handleBoundRectEvent() { + try { + com.sun.star.awt.Rectangle r = unoAccessibleComponent.getBounds(); + Window.this.setBounds(r.X, r.Y, r.Width, r.Height); + com.sun.star.awt.Point p = unoAccessibleComponent.getLocationOnScreen(); + location = new java.awt.Point(p.X, p.Y); + } catch (com.sun.star.uno.RuntimeException e) { + } + } + + /** Called by OpenOffice process to notify property changes */ + public void notifyEvent(AccessibleEventObject event) { + switch (event.EventId) { + case AccessibleEventId.ACCESSIBLE_NAME_EVENT: + // Set the accessible name for the corresponding context, which will fire a property + // change event itself + handleNameChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT: + // Set the accessible description for the corresponding context, which will fire a property + // change event itself - so do not set propertyName ! + handleDescriptionChangedEvent(event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_STATE_EVENT: + // Update the internal state set and fire the appropriate PropertyChangedEvent + handleStateChangedEvent(event.OldValue, event.NewValue); + break; + case AccessibleEventId.ACCESSIBLE_CHILD_EVENT: + if (AnyConverter.isObject(event.OldValue)) { + handleChildRemovedEvent(event.OldValue); + } else if (AnyConverter.isObject(event.NewValue)) { + handleChildAddedEvent(event.NewValue); + } + break; + case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT: + handleVisibleDataEvent(); + break; + case AccessibleEventId.ACCESSIBLE_BOUNDRECT_EVENT: + handleBoundRectEvent(); + break; + default: + // Warn about unhandled events + if(Build.DEBUG) { + System.out.println(this + ": unhandled accessibility event id=" + event.EventId); + } + } + } + + /** Called by OpenOffice process to notify that the UNO component is disposing */ + public void disposing(com.sun.star.lang.EventObject eventObject) { + } + } + + protected javax.accessibility.AccessibleContext accessibleContext = null; + + /** Returns the AccessibleContext associated with this object */ + public javax.accessibility.AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleWindow(); +// accessibleContext.setAccessibleName(getTitle()); + } + return accessibleContext; + } + + protected class AccessibleWindow extends java.awt.Window.AccessibleAWTWindow { + protected AccessibleWindow() { + super(); + } + + protected java.awt.event.ComponentListener accessibleComponentHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when shown/hidden.. + */ + protected class AccessibleComponentHandler implements java.awt.event.ComponentListener { + public void componentHidden(java.awt.event.ComponentEvent e) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.VISIBLE, null); + } + + public void componentShown(java.awt.event.ComponentEvent e) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.VISIBLE); + } + + public void componentMoved(java.awt.event.ComponentEvent e) { + } + + public void componentResized(java.awt.event.ComponentEvent e) { + } + } // inner class AccessibleComponentHandler + + protected java.awt.event.WindowFocusListener accessibleWindowFocusHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when focus events happen + */ + protected class AccessibleWindowFocusHandler implements java.awt.event.WindowFocusListener { + public void windowGainedFocus(java.awt.event.WindowEvent e) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + null, javax.accessibility.AccessibleState.ACTIVE); + } + public void windowLostFocus(java.awt.event.WindowEvent e) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + javax.accessibility.AccessibleState.ACTIVE, null); + } + } // inner class AccessibleFocusHandler + + protected java.awt.event.ContainerListener accessibleContainerHandler = null; + + /** + * Fire PropertyChange listener, if one is registered, + * when children added/removed. + */ + + protected class AccessibleContainerHandler implements java.awt.event.ContainerListener { + public void componentAdded(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + null, ((javax.accessibility.Accessible) c).getAccessibleContext()); + } + } + public void componentRemoved(java.awt.event.ContainerEvent e) { + java.awt.Component c = e.getChild(); + if (c != null && c instanceof javax.accessibility.Accessible) { + AccessibleWindow.this.firePropertyChange( + javax.accessibility.AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, + ((javax.accessibility.Accessible) c).getAccessibleContext(), null); + } + } + } + + protected int propertyChangeListenerCount = 0; + + /** + * Add a PropertyChangeListener to the listener list. + * + * @param listener The PropertyChangeListener to be added + */ + public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (propertyChangeListenerCount++ == 0) { + accessibleWindowFocusHandler = new AccessibleWindowFocusHandler(); + Window.this.addWindowFocusListener(accessibleWindowFocusHandler); + + accessibleContainerHandler = new AccessibleContainerHandler(); + Window.this.addContainerListener(accessibleContainerHandler); + + accessibleComponentHandler = new AccessibleComponentHandler(); + Window.this.addComponentListener(accessibleComponentHandler); + } + super.addPropertyChangeListener(listener); + } + + /** + * Remove a PropertyChangeListener from the listener list. + * This removes a PropertyChangeListener that was registered + * for all properties. + * + * @param listener The PropertyChangeListener to be removed + */ + public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) { + if (--propertyChangeListenerCount == 0) { + Window.this.removeComponentListener(accessibleComponentHandler); + accessibleComponentHandler = null; + + Window.this.removeContainerListener(accessibleContainerHandler); + accessibleContainerHandler = null; + + Window.this.removeWindowFocusListener(accessibleWindowFocusHandler); + accessibleWindowFocusHandler = null; + } + super.removePropertyChangeListener(listener); + } + } +} + |