#103705#, #103789# removal of unnecessary synchronizing and reorganization of AccessibleComponent info

This commit is contained in:
Oliver Braun
2002-10-02 06:05:28 +00:00
parent 5bce9ba31d
commit 8bc42b16f1
2 changed files with 198 additions and 170 deletions

View File

@@ -2,9 +2,9 @@
*
* $RCSfile: AccessibleObjectFactory.java,v $
*
* $Revision: 1.6 $
* $Revision: 1.7 $
*
* last change: $Author: obr $ $Date: 2002-09-18 11:20:15 $
* last change: $Author: obr $ $Date: 2002-10-02 07:05:27 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -69,8 +69,10 @@ 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;
/**
*/
@@ -158,165 +160,171 @@ public class AccessibleObjectFactory {
}
if( o == null && create ) {
AccessibleContextInfo info = infoProvider.getAccessibleContextInfo(xAccessibleContext);
try {
short role = xAccessibleContext.getAccessibleRole();
XAccessibleStateSet xStateSet = null;
switch(info.Role) {
case AccessibleRole.CHECKBOX:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.CHECK_BOX,
javax.accessibility.AccessibleState.CHECKED,
xAccessibleContext
switch(role) {
case AccessibleRole.CHECKBOX:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.CHECK_BOX,
javax.accessibility.AccessibleState.CHECKED,
xAccessibleContext
);
break;
case AccessibleRole.COMBOBOX:
o = new AccessibleComboBox(xAccessibleContext);
break;
case AccessibleRole.LIST:
o = new AccessibleList(xAccessibleContext);
break;
case AccessibleRole.MENUBAR:
case AccessibleRole.POPUPMENU:
o = new AccessibleContainer(
AccessibleRoleMap.toAccessibleRole(role),
xAccessibleContext
);
break;
case AccessibleRole.COMBOBOX:
o = new AccessibleComboBox(xAccessibleContext);
break;
case AccessibleRole.LIST:
o = new AccessibleList(xAccessibleContext);
break;
case AccessibleRole.MENUBAR:
case AccessibleRole.POPUPMENU:
o = new AccessibleContainer(
AccessibleRoleMap.toAccessibleRole(info.Role),
xAccessibleContext
);
break;
case AccessibleRole.LABEL:
case AccessibleRole.TABLE_CELL:
if((info.States & AccessibleState.TRANSIENT) != 0) {
o = new AccessibleFixedText(info.IndexInParent, xAccessibleContext);
} else {
o = new AccessibleLabel(xAccessibleContext);
}
break;
case AccessibleRole.DIALOG:
case AccessibleRole.FRAME:
o = new AccessibleFrame(
AccessibleRoleMap.toAccessibleRole(info.Role),
xAccessibleContext
);
break;
case AccessibleRole.ICON:
case AccessibleRole.GRAPHIC:
case AccessibleRole.SHAPE:
case AccessibleRole.EMBEDDED_OBJECT:
o = new AccessibleImage(xAccessibleContext);
break;
case AccessibleRole.LISTITEM:
o = new AccessibleListItem(xAccessibleContext);
break;
case AccessibleRole.MENU:
o = new AccessibleMenu(xAccessibleContext);
break;
case AccessibleRole.MENUITEM:
o = new AccessibleMenuItem(xAccessibleContext);
break;
case AccessibleRole.PARAGRAPH:
o = new AccessibleParagraph(xAccessibleContext);
break;
case AccessibleRole.PUSHBUTTON:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.PUSH_BUTTON,
javax.accessibility.AccessibleState.SELECTED,
xAccessibleContext
break;
case AccessibleRole.LABEL:
case AccessibleRole.TABLE_CELL:
xStateSet = xAccessibleContext.getAccessibleStateSet();
if( xStateSet != null && ! xStateSet.contains(AccessibleStateType.TRANSIENT)) {
o = new AccessibleLabel(xAccessibleContext);
} else {
o = new AccessibleFixedText(xAccessibleContext);
}
break;
case AccessibleRole.DIALOG:
case AccessibleRole.FRAME:
o = new AccessibleFrame(
AccessibleRoleMap.toAccessibleRole(role),
xAccessibleContext
);
break;
case AccessibleRole.RADIOBUTTON:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.RADIO_BUTTON,
javax.accessibility.AccessibleState.CHECKED,
xAccessibleContext
break;
case AccessibleRole.ICON:
case AccessibleRole.GRAPHIC:
case AccessibleRole.SHAPE:
case AccessibleRole.EMBEDDED_OBJECT:
o = new AccessibleImage(xAccessibleContext);
break;
case AccessibleRole.LISTITEM:
o = new AccessibleListItem(xAccessibleContext);
break;
case AccessibleRole.MENU:
o = new AccessibleMenu(xAccessibleContext);
break;
case AccessibleRole.MENUITEM:
o = new AccessibleMenuItem(xAccessibleContext);
break;
case AccessibleRole.PARAGRAPH:
o = new AccessibleParagraph(xAccessibleContext);
break;
case AccessibleRole.PUSHBUTTON:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.PUSH_BUTTON,
javax.accessibility.AccessibleState.SELECTED,
xAccessibleContext
);
break;
case AccessibleRole.RADIOBUTTON:
o = new AccessibleButton(
javax.accessibility.AccessibleRole.RADIO_BUTTON,
javax.accessibility.AccessibleState.CHECKED,
xAccessibleContext
);
break;
case AccessibleRole.SCROLLBAR:
o = new AccessibleScrollBar(xAccessibleContext);
break;
case AccessibleRole.SEPARATOR:
o = new AccessibleSeparator(xAccessibleContext);
break;
case AccessibleRole.TABLE:
xStateSet = xAccessibleContext.getAccessibleStateSet();
if(xStateSet != null && ! xStateSet.contains(AccessibleStateType.CHILDREN_TRANSIENT)) {
o = new AccessibleTextTable(xAccessibleContext);
} else {
o = new AccessibleSpreadsheet(xAccessibleContext);
}
break;
case AccessibleRole.TEXT:
o = new AccessibleEditLine(xAccessibleContext);
break;
case AccessibleRole.TREE:
o = new AccessibleTreeList(xAccessibleContext);
break;
case AccessibleRole.CANVAS:
case AccessibleRole.DOCUMENT:
case AccessibleRole.ENDNOTE:
case AccessibleRole.FILLER:
case AccessibleRole.FOOTER:
case AccessibleRole.FOOTNOTE:
case AccessibleRole.HEADER:
case AccessibleRole.LAYEREDPANE:
case AccessibleRole.OPTIONPANE:
case AccessibleRole.PAGETAB:
case AccessibleRole.PANEL:
case AccessibleRole.ROOTPANE:
case AccessibleRole.SCROLLPANE:
case AccessibleRole.SPLITPANE:
case AccessibleRole.STATUSBAR:
case AccessibleRole.TOOLBAR:
case AccessibleRole.WINDOW:
o = new AccessibleWindow(
AccessibleRoleMap.toAccessibleRole(role),
xAccessibleContext
);
break;
case AccessibleRole.SCROLLBAR:
o = new AccessibleScrollBar(xAccessibleContext);
break;
case AccessibleRole.SEPARATOR:
o = new AccessibleSeparator(xAccessibleContext);
break;
case AccessibleRole.TABLE:
if((info.States & AccessibleState.CHILDREN_TRANSIENT) != 0) {
o = new AccessibleSpreadsheet(xAccessibleContext);
} else {
o = new AccessibleTextTable(xAccessibleContext);
}
break;
case AccessibleRole.TEXT:
o = new AccessibleEditLine(xAccessibleContext);
break;
case AccessibleRole.TREE:
o = new AccessibleTreeList(xAccessibleContext);
break;
case AccessibleRole.CANVAS:
case AccessibleRole.DOCUMENT:
case AccessibleRole.ENDNOTE:
case AccessibleRole.FILLER:
case AccessibleRole.FOOTER:
case AccessibleRole.FOOTNOTE:
case AccessibleRole.HEADER:
case AccessibleRole.LAYEREDPANE:
case AccessibleRole.OPTIONPANE:
case AccessibleRole.PAGETAB:
case AccessibleRole.PANEL:
case AccessibleRole.ROOTPANE:
case AccessibleRole.SCROLLPANE:
case AccessibleRole.SPLITPANE:
case AccessibleRole.STATUSBAR:
case AccessibleRole.TOOLBAR:
case AccessibleRole.WINDOW:
o = new AccessibleWindow(
AccessibleRoleMap.toAccessibleRole(info.Role),
xAccessibleContext
);
break;
default:
if( Build.DEBUG) {
System.out.println("Unmapped role: " + AccessibleRoleMap.toAccessibleRole(info.Role)
+ " (id = " + info.Role + ")");
}
o = new AccessibleWindow(
AccessibleRoleMap.toAccessibleRole(info.Role),
xAccessibleContext
);
break;
}
break;
default:
if( Build.DEBUG) {
System.out.println("Unmapped role: " + AccessibleRoleMap.toAccessibleRole(role)
+ " (id = " + role + ")");
}
o = new AccessibleWindow(
AccessibleRoleMap.toAccessibleRole(role),
xAccessibleContext
);
break;
}
// 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.");
// 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.");
}
}
// Register as event listener if possible
AccessibleEventListener listener = null;
if( o instanceof AccessibleEventListener ) {
listener = (AccessibleEventListener) o;
}
/* The accessible event broadcaster will never be removed by a removeEventListener
* call. This requires that the UNO accessibility objects get activly destructed
* using dispose().
*/
o.initialize(infoProvider.getAccessibleContextInfo(xAccessibleContext, listener));
// Create generic parent if parent is null
if( parent == null && o.getAccessibleIndexInParent() != -1 ) {
parent = new GenericAccessibleParent(o, xAccessibleContext);
}
// Finaly set accessible parent object
if( parent != null ) {
o.setAccessibleParent(parent);
}
// Add the child to the internal list if parent is AccessibleWindow
if( parent instanceof AccessibleWindow ) {
AccessibleWindow w = (AccessibleWindow) parent;
w.addAccessibleChild(o);
}
}
// Register as event listener if possible
AccessibleEventListener listener = null;
if(o instanceof AccessibleEventListener && (info.States & AccessibleState.TRANSIENT) == 0) {
listener = (AccessibleEventListener) o;
}
/* The accessible event broadcaster will never be removed by a removeEventListener
* call. This requires that the UNO accessibility objects get activly destructed
* using dispose().
*/
synchronized (o) {
o.initialize(infoProvider.getAccessibleComponentInfo(xAccessibleContext, listener));
}
// Create generic parent if parent is null
if( parent == null && info.IndexInParent != -1 ) {
parent = new GenericAccessibleParent(o, xAccessibleContext);
}
// Finaly set accessible parent object
if( parent != null ) {
o.setAccessibleParent(parent);
}
// Add the child to the internal list if parent is AccessibleWindow
if( ((info.States & AccessibleState.CHILDREN_TRANSIENT) == 0) && (parent instanceof AccessibleWindow) ) {
AccessibleWindow w = (AccessibleWindow) parent;
w.addAccessibleChild(o);
catch(com.sun.star.uno.RuntimeException e) {
}
}

View File

@@ -2,9 +2,9 @@
*
* $RCSfile: AccessibleTextImpl.java,v $
*
* $Revision: 1.1 $
* $Revision: 1.2 $
*
* last change: $Author: obr $ $Date: 2002-10-01 07:16:39 $
* last change: $Author: obr $ $Date: 2002-10-02 07:05:28 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -97,6 +97,8 @@ public class AccessibleTextImpl implements javax.accessibility.AccessibleText {
if( unoAccessibleText != null ) {
text = unoAccessibleText.getText();
} else {
text = "";
}
}
@@ -118,7 +120,7 @@ public class AccessibleTextImpl implements javax.accessibility.AccessibleText {
switch (part) {
case AccessibleText.CHARACTER:
start = index = 1;
start = index + 1;
end = index + 2;
break;
case AccessibleText.WORD:
@@ -195,8 +197,24 @@ public class AccessibleTextImpl implements javax.accessibility.AccessibleText {
public int getIndexAtPoint(java.awt.Point point) {
int ret = -1;
if( unoAccessibleText != null ) {
ret = unoAccessibleText.getIndexAtPoint(new Point( point.x, point.y ));
try {
if( unoAccessibleText != null ) {
ret = unoAccessibleText.getIndexAtPoint(new Point( point.x, point.y ));
}
}
catch(com.sun.star.uno.RuntimeException e) {
if( Build.DEBUG ) {
AccessibleObject.printDebugString("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")");
AccessibleObject.printDebugString(e.getMessage());
}
}
catch(Exception e) {
if( Build.DEBUG ) {
AccessibleObject.printDebugString("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")");
AccessibleObject.printDebugString(e.getMessage());
}
}
return ret;
@@ -302,19 +320,21 @@ public class AccessibleTextImpl implements javax.accessibility.AccessibleText {
/** Determines the bounding box of the character at the given index into the string */
public java.awt.Rectangle getCharacterBounds(int index) {
try {
Rectangle unoRect = unoAccessibleText.getCharacterBounds(index);
return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height);
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() );
}
catch ( NullPointerException e ) {
}
}
catch ( com.sun.star.lang.IndexOutOfBoundsException exception ) {
// FIXME: The java AccessBridge currently does not handle such exceptions gracefully
// throw new IndexOutOfBoundsException( exception.getMessage() );
return null;
}
catch ( NullPointerException e ) {
return null;
}
return new java.awt.Rectangle();
}
}