8171808: Performance problems in dialogs with large tables when JAB activated
Reviewed-by: serb, alexsch
This commit is contained in:
parent
0be96270ea
commit
1555532920
@ -4527,6 +4527,10 @@ final public class AccessBridge {
|
|||||||
private void _getVisibleChildrenCount(final AccessibleContext ac) {
|
private void _getVisibleChildrenCount(final AccessibleContext ac) {
|
||||||
if (ac == null)
|
if (ac == null)
|
||||||
return;
|
return;
|
||||||
|
if(ac instanceof AccessibleExtendedTable) {
|
||||||
|
_getVisibleChildrenCount((AccessibleExtendedTable)ac);
|
||||||
|
return;
|
||||||
|
}
|
||||||
int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
@Override
|
@Override
|
||||||
public Integer call() throws Exception {
|
public Integer call() throws Exception {
|
||||||
@ -4568,6 +4572,83 @@ final public class AccessBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recursively descends AccessibleContext and gets the number
|
||||||
|
* of visible children. Stops search if get to invisible part of table.
|
||||||
|
*/
|
||||||
|
private void _getVisibleChildrenCount(final AccessibleExtendedTable acTable) {
|
||||||
|
if (acTable == null)
|
||||||
|
return;
|
||||||
|
int lastVisibleRow = -1;
|
||||||
|
int lastVisibleColumn = -1;
|
||||||
|
boolean foundVisible = false;
|
||||||
|
int rowCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return acTable.getAccessibleRowCount();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
int columnCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return acTable.getAccessibleColumnCount();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) {
|
||||||
|
for (int columnIdx = 0; columnIdx < columnCount; columnIdx++) {
|
||||||
|
if (lastVisibleRow != -1 && rowIdx > lastVisibleRow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (lastVisibleColumn != -1 && columnIdx > lastVisibleColumn) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int finalRowIdx = rowIdx;
|
||||||
|
int finalColumnIdx = columnIdx;
|
||||||
|
final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
|
||||||
|
@Override
|
||||||
|
public AccessibleContext call() throws Exception {
|
||||||
|
Accessible a = acTable.getAccessibleAt(finalRowIdx, finalColumnIdx);
|
||||||
|
if (a == null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return a.getAccessibleContext();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
if (ac2 == null ||
|
||||||
|
(!InvocationUtils.invokeAndWait(new Callable<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public Boolean call() throws Exception {
|
||||||
|
return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING);
|
||||||
|
}
|
||||||
|
}, acTable))
|
||||||
|
) {
|
||||||
|
if (foundVisible) {
|
||||||
|
if (columnIdx != 0 && lastVisibleColumn == -1) {
|
||||||
|
//the same row, so we found the last visible column
|
||||||
|
lastVisibleColumn = columnIdx - 1;
|
||||||
|
} else if (columnIdx == 0 && lastVisibleRow == -1) {
|
||||||
|
lastVisibleRow = rowIdx - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foundVisible = true;
|
||||||
|
|
||||||
|
_visibleChildrenCount++;
|
||||||
|
|
||||||
|
if (InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return ac2.getAccessibleChildrenCount();
|
||||||
|
}
|
||||||
|
}, acTable) > 0) {
|
||||||
|
_getVisibleChildrenCount(ac2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the visible child of an AccessibleContext at the
|
* Gets the visible child of an AccessibleContext at the
|
||||||
* specified index
|
* specified index
|
||||||
@ -4604,7 +4685,10 @@ final public class AccessBridge {
|
|||||||
if (_visibleChild != null) {
|
if (_visibleChild != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(ac instanceof AccessibleExtendedTable) {
|
||||||
|
_getVisibleChild((AccessibleExtendedTable)ac, index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
@Override
|
@Override
|
||||||
public Integer call() throws Exception {
|
public Integer call() throws Exception {
|
||||||
@ -4613,7 +4697,7 @@ final public class AccessBridge {
|
|||||||
}, ac);
|
}, ac);
|
||||||
for (int i = 0; i < numChildren; i++) {
|
for (int i = 0; i < numChildren; i++) {
|
||||||
final int idx=i;
|
final int idx=i;
|
||||||
final AccessibleContext ac2=InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
|
final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
|
||||||
@Override
|
@Override
|
||||||
public AccessibleContext call() throws Exception {
|
public AccessibleContext call() throws Exception {
|
||||||
Accessible a = ac.getAccessibleChild(idx);
|
Accessible a = ac.getAccessibleChild(idx);
|
||||||
@ -4650,6 +4734,82 @@ final public class AccessBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void _getVisibleChild(final AccessibleExtendedTable acTable, final int index) {
|
||||||
|
if (_visibleChild != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int lastVisibleRow = -1;
|
||||||
|
int lastVisibleColumn = -1;
|
||||||
|
boolean foundVisible = false;
|
||||||
|
int rowCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return acTable.getAccessibleRowCount();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
int columnCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return acTable.getAccessibleColumnCount();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) {
|
||||||
|
for (int columnIdx = 0; columnIdx < columnCount; columnIdx++) {
|
||||||
|
if (lastVisibleRow != -1 && rowIdx > lastVisibleRow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (lastVisibleColumn != -1 && columnIdx > lastVisibleColumn) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int finalRowIdx = rowIdx;
|
||||||
|
int finalColumnIdx = columnIdx;
|
||||||
|
final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
|
||||||
|
@Override
|
||||||
|
public AccessibleContext call() throws Exception {
|
||||||
|
Accessible a = acTable.getAccessibleAt(finalRowIdx, finalColumnIdx);
|
||||||
|
if (a == null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return a.getAccessibleContext();
|
||||||
|
}
|
||||||
|
}, acTable);
|
||||||
|
if (ac2 == null ||
|
||||||
|
(!InvocationUtils.invokeAndWait(new Callable<Boolean>() {
|
||||||
|
@Override
|
||||||
|
public Boolean call() throws Exception {
|
||||||
|
return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING);
|
||||||
|
}
|
||||||
|
}, acTable))) {
|
||||||
|
if (foundVisible) {
|
||||||
|
if (columnIdx != 0 && lastVisibleColumn == -1) {
|
||||||
|
//the same row, so we found the last visible column
|
||||||
|
lastVisibleColumn = columnIdx - 1;
|
||||||
|
} else if (columnIdx == 0 && lastVisibleRow == -1) {
|
||||||
|
lastVisibleRow = rowIdx - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foundVisible = true;
|
||||||
|
|
||||||
|
if (!_foundVisibleChild && _currentVisibleIndex == index) {
|
||||||
|
_visibleChild = ac2;
|
||||||
|
_foundVisibleChild = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_currentVisibleIndex++;
|
||||||
|
|
||||||
|
if (InvocationUtils.invokeAndWait(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
return ac2.getAccessibleChildrenCount();
|
||||||
|
}
|
||||||
|
}, acTable) > 0) {
|
||||||
|
_getVisibleChild(ac2, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ===== Java object memory management code ===== */
|
/* ===== Java object memory management code ===== */
|
||||||
|
|
||||||
@ -7014,6 +7174,25 @@ final public class AccessBridge {
|
|||||||
*/
|
*/
|
||||||
private static class InvocationUtils {
|
private static class InvocationUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes a {@code Callable} in the {@code AppContext} of the given {@code Accessible}
|
||||||
|
* and waits for it to finish blocking the caller thread.
|
||||||
|
*
|
||||||
|
* @param callable the {@code Callable} to invoke
|
||||||
|
* @param accessibleTable the {@code AccessibleExtendedTable} which would be used to find the right context
|
||||||
|
* for the task execution
|
||||||
|
* @param <T> type parameter for the result value
|
||||||
|
*
|
||||||
|
* @return the result of the {@code Callable} execution
|
||||||
|
*/
|
||||||
|
public static <T> T invokeAndWait(final Callable<T> callable,
|
||||||
|
final AccessibleExtendedTable accessibleTable) {
|
||||||
|
if (accessibleTable instanceof AccessibleContext) {
|
||||||
|
return invokeAndWait(callable, (AccessibleContext)accessibleTable);
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Unmapped AccessibleContext used to dispatch event: " + accessibleTable);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invokes a {@code Callable} in the {@code AppContext} of the given {@code Accessible}
|
* Invokes a {@code Callable} in the {@code AppContext} of the given {@code Accessible}
|
||||||
* and waits for it to finish blocking the caller thread.
|
* and waits for it to finish blocking the caller thread.
|
||||||
|
Loading…
Reference in New Issue
Block a user