< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m
Print this page
@@ -136,11 +136,14 @@
fParent = [parent retain];
fView = [view retain];
fJavaRole = [javaRole retain];
fAccessible = JNFNewGlobalRef(env, accessible);
- fComponent = JNFNewGlobalRef(env, [(AWTView *)fView awtComponent:env]);
+
+ jobject jcomponent = [(AWTView *)fView awtComponent:env];
+ fComponent = JNFNewGlobalRef(env, jcomponent);
+ (*env)->DeleteLocalRef(env, jcomponent);
fIndex = index;
fActions = nil;
fActionsLOCK = [[NSObject alloc] init];
@@ -285,10 +288,11 @@
jsize arrayLen = (*env)->GetArrayLength(env, jchildrenAndRoles);
NSMutableArray *children = [NSMutableArray arrayWithCapacity:arrayLen/2]; //childrenAndRoles array contains two elements (child, role) for each child
NSInteger i;
NSUInteger childIndex = (whichChildren >= 0) ? whichChildren : 0; // if we're getting one particular child, make sure to set its index correctly
+
for(i = 0; i < arrayLen; i+=2)
{
jobject /* Accessible */ jchild = (*env)->GetObjectArrayElement(env, jchildrenAndRoles, i);
jobject /* String */ jchildJavaRole = (*env)->GetObjectArrayElement(env, jchildrenAndRoles, i+1);
@@ -296,22 +300,28 @@
if (jchildJavaRole != NULL) {
childJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jchildJavaRole, sjf_key));
}
JavaComponentAccessibility *child = [self createWithParent:parent accessible:jchild role:childJavaRole index:childIndex withEnv:env withView:parent->fView];
+
+ (*env)->DeleteLocalRef(env, jchild);
+ (*env)->DeleteLocalRef(env, jchildJavaRole);
+
[children addObject:child];
childIndex++;
}
+ (*env)->DeleteLocalRef(env, jchildrenAndRoles);
return children;
}
+ (JavaComponentAccessibility *)createWithAccessible:(jobject)jaccessible withEnv:(JNIEnv *)env withView:(NSView *)view
{
jobject jcomponent = [(AWTView *)view awtComponent:env];
jint index = JNFCallStaticIntMethod(env, sjm_getAccessibleIndexInParent, jaccessible, jcomponent);
NSString *javaRole = getJavaRole(env, jaccessible, jcomponent);
+ (*env)->DeleteLocalRef(env, jcomponent);
return [self createWithAccessible:jaccessible role:javaRole index:index withEnv:env withView:view];
}
+ (JavaComponentAccessibility *) createWithAccessible:(jobject)jaccessible role:(NSString *)javaRole index:(jint)index withEnv:(JNIEnv *)env withView:(NSView *)view
@@ -323,11 +333,14 @@
{
// try to fetch the jCAX from Java, and return autoreleased
jobject jCAX = [JavaComponentAccessibility getCAccessible:jaccessible withEnv:env];
if (jCAX == NULL) return nil;
JavaComponentAccessibility *value = (JavaComponentAccessibility *) jlong_to_ptr(JNFGetLongField(env, jCAX, jf_ptr));
- if (value != nil) return [[value retain] autorelease];
+ if (value != nil) {
+ (*env)->DeleteLocalRef(env, jCAX);
+ return [[value retain] autorelease];
+ }
// otherwise, create a new instance
JavaComponentAccessibility *newChild = nil;
if ([javaRole isEqualToString:@"pagetablist"]) {
newChild = [TabGroupAccessibility alloc];
@@ -346,10 +359,11 @@
[newChild initWithParent:parent withEnv:env withAccessible:jCAX withIndex:index withView:view withJavaRole:javaRole]; // must init new instance
// must hard retain pointer poked into Java object
[newChild retain];
JNFSetLongField(env, jCAX, jf_ptr, ptr_to_jlong(newChild));
+ (*env)->DeleteLocalRef(env, jCAX);
// return autoreleased instance
return [newChild autorelease];
}
@@ -494,10 +508,11 @@
if (jparent == NULL) {
fParent = fView;
} else {
fParent = [JavaComponentAccessibility createWithAccessible:jparent withEnv:env withView:fView];
+ (*env)->DeleteLocalRef(env, jparent);
if (fParent == nil) {
fParent = fView;
}
}
[fParent retain];
@@ -544,11 +559,14 @@
{
if (fIndex == -1) {
return NO;
}
- return isShowing(env, [self axContextWithEnv:env], fComponent);
+ jobject axContext = [self axContextWithEnv:env];
+ BOOL showing = isShowing(env, axContext, fComponent);
+ (*env)->DeleteLocalRef(env, axContext);
+ return showing;
}
// the array of names for each role is cached in the sAttributeNamesForRoleCache
- (NSArray *)accessibilityAttributeNames
{
@@ -768,17 +786,20 @@
JNIEnv* env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
// cmcnote - should batch these two calls into one that returns an array of two bools, one for vertical and one for horiz
if (isVertical(env, axContext, fComponent)) {
+ (*env)->DeleteLocalRef(env, axContext);
return NSAccessibilityVerticalOrientationValue;
}
if (isHorizontal(env, axContext, fComponent)) {
+ (*env)->DeleteLocalRef(env, axContext);
return NSAccessibilityHorizontalOrientationValue;
}
+ (*env)->DeleteLocalRef(env, axContext);
return nil;
}
- (BOOL)accessibilityIsOrientationAttributeSettable
{
@@ -806,10 +827,11 @@
// bottom left based screen coords
// Get the java screen coords, and make a NSPoint of the bottom left of the AxComponent.
NSSize size = getAxComponentSize(env, axComponent, fComponent);
NSPoint point = getAxComponentLocationOnScreen(env, axComponent, fComponent);
+ (*env)->DeleteLocalRef(env, axComponent);
point.y += size.height;
// Now make it into Cocoa screen coords.
point.y = [[[[self view] window] screen] frame].size.height - point.y;
@@ -891,11 +913,13 @@
// Element size (NSValue)
- (NSValue *)accessibilitySizeAttribute {
JNIEnv* env = [ThreadUtilities getJNIEnv];
jobject axComponent = JNFCallStaticObjectMethod(env, sjm_getAccessibleComponent, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
- return [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)];
+ NSValue* size = [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)];
+ (*env)->DeleteLocalRef(env, axComponent);
+ return size;
}
- (BOOL)accessibilityIsSizeAttributeSettable
{
// SIZE is settable in windows if [self styleMask] & NSResizableWindowMask - but windows are heavyweight so we're ok here
@@ -1083,10 +1107,11 @@
id value = nil;
if (JNFIsInstanceOf(env, jparent, &jc_Container)) {
jobject jaccessible = JNFCallStaticObjectMethod(env, jm_accessibilityHitTest, jparent, (jfloat)point.x, (jfloat)point.y); // AWT_THREADING Safe (AWTRunLoop)
value = [JavaComponentAccessibility createWithAccessible:jaccessible withEnv:env withView:fView];
+ (*env)->DeleteLocalRef(env, jaccessible);
}
if (value == nil) {
value = self;
}
@@ -1114,10 +1139,11 @@
if (focused != NULL) {
if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) {
value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView];
}
+ (*env)->DeleteLocalRef(env, focused);
}
if (value == nil) {
value = self;
}
@@ -1233,29 +1259,33 @@
{
jobjectArray jtabsAndRoles = JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, fAccessible, fComponent, whichTabs, allowIgnored); // AWT_THREADING Safe (AWTRunLoop)
if(jtabsAndRoles == NULL) return nil;
jsize arrayLen = (*env)->GetArrayLength(env, jtabsAndRoles);
- if (arrayLen == 0) return nil;
-
+ if (arrayLen == 0) {
+ (*env)->DeleteLocalRef(env, jtabsAndRoles);
+ return nil;
+ }
NSMutableArray *tabs = [NSMutableArray arrayWithCapacity:(arrayLen/2)];
// all of the tabs have the same role, so we can just find out what that is here and use it for all the tabs
jobject jtabJavaRole = (*env)->GetObjectArrayElement(env, jtabsAndRoles, 1); // the array entries alternate between tab/role, starting with tab. so the first role is entry 1.
- if (jtabJavaRole == NULL) return nil;
-
+ if (jtabJavaRole == NULL) {
+ (*env)->DeleteLocalRef(env, jtabsAndRoles);
+ return nil;
+ }
NSString *tabJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jtabJavaRole, sjf_key));
NSInteger i;
NSUInteger tabIndex = (whichTabs >= 0) ? whichTabs : 0; // if we're getting one particular child, make sure to set its index correctly
for(i = 0; i < arrayLen; i+=2) {
jobject jtab = (*env)->GetObjectArrayElement(env, jtabsAndRoles, i);
JavaComponentAccessibility *tab = [[[TabGroupControlAccessibility alloc] initWithParent:self withEnv:env withAccessible:jtab withIndex:tabIndex withTabGroup:axContext withView:[self view] withJavaRole:tabJavaRole] autorelease];
[tabs addObject:tab];
tabIndex++;
}
-
+ (*env)->DeleteLocalRef(env, jtabsAndRoles);
return tabs;
}
- (NSArray *)contentsWithEnv:(JNIEnv *)env withTabGroupAxContext:(jobject)axContext withTabCode:(NSInteger)whichTabs allowIgnored:(BOOL)allowIgnored
{
@@ -1270,11 +1300,13 @@
- (id) accessibilityTabsAttribute
{
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
- return [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+ id tabs = [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+ (*env)->DeleteLocalRef(env, axContext);
+ return tabs;
}
- (BOOL)accessibilityIsTabsAttributeSettable
{
return NO; //cmcnote: not sure.
@@ -1290,11 +1322,13 @@
- (NSArray *) accessibilityContentsAttribute
{
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
- return [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+ NSArray* cont = [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+ (*env)->DeleteLocalRef(env, axContext);
+ return cont;
}
- (BOOL)accessibilityIsContentsAttributeSettable
{
return NO;
@@ -1303,11 +1337,13 @@
// axValue is the currently selected tab
-(id) accessibilityValueAttribute
{
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
- return [self currentTabWithEnv:env withAxContext:axContext];
+ id val = [self currentTabWithEnv:env withAxContext:axContext];
+ (*env)->DeleteLocalRef(env, axContext);
+ return val;
}
- (BOOL)accessibilityIsValueAttributeSettable
{
return YES;
@@ -1320,10 +1356,11 @@
if (![number boolValue]) return;
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
setAxContextSelection(env, axContext, fIndex, fComponent);
+ (*env)->DeleteLocalRef(env, axContext);
}
- (NSArray *)accessibilityChildrenAttribute
{
//children = AXTabs + AXContents
@@ -1355,10 +1392,11 @@
children= [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:(index-[self numTabs]) allowIgnored:NO];
if ([children count] > 0) {
result = children;
}
}
+ (*env)->DeleteLocalRef(env, axContext);
} else {
result = [super accessibilityArrayAttributeValues:attribute index:index maxCount:maxCount];
}
return result;
}
@@ -1399,11 +1437,13 @@
{
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject axContext = [self axContextWithEnv:env];
// Returns the current selection of the page tab list
- return [NSNumber numberWithBool:ObjectEquals(env, axContext, getAxContextSelection(env, [self tabGroup], fIndex, fComponent), fComponent)];
+ id val = [NSNumber numberWithBool:ObjectEquals(env, axContext, getAxContextSelection(env, [self tabGroup], fIndex, fComponent), fComponent)];
+ (*env)->DeleteLocalRef(env, axContext);
+ return val;
}
- (void)getActionsWithEnv:(JNIEnv *)env
{
TabGroupAction *action = [[TabGroupAction alloc] initWithEnv:env withTabGroup:[self tabGroup] withIndex:fIndex withComponent:fComponent];
@@ -1415,10 +1455,11 @@
{
if (fTabGroupAxContext == NULL) {
JNIEnv* env = [ThreadUtilities getJNIEnv];
jobject tabGroupAxContext = [(JavaComponentAccessibility *)[self parent] axContextWithEnv:env];
fTabGroupAxContext = JNFNewGlobalRef(env, tabGroupAxContext);
+ (*env)->DeleteLocalRef(env, tabGroupAxContext);
}
return fTabGroupAxContext;
}
@end
@@ -1449,12 +1490,14 @@
NSEnumerator *enumerator = [children objectEnumerator];
while ((aElement = (JavaComponentAccessibility *)[enumerator nextObject])) {
if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) {
jobject elementAxContext = [aElement axContextWithEnv:env];
if (isHorizontal(env, elementAxContext, fComponent)) {
+ (*env)->DeleteLocalRef(env, elementAxContext);
return aElement;
}
+ (*env)->DeleteLocalRef(env, elementAxContext);
}
}
return nil;
}
@@ -1476,12 +1519,14 @@
JavaComponentAccessibility *aElement;
while ((aElement = (JavaComponentAccessibility *)[enumerator nextObject])) {
if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) {
jobject elementAxContext = [aElement axContextWithEnv:env];
if (isVertical(env, elementAxContext, fComponent)) {
+ (*env)->DeleteLocalRef(env, elementAxContext);
return aElement;
}
+ (*env)->DeleteLocalRef(env, elementAxContext);
}
}
return nil;
}
< prev index next >