/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.accessibility;
import org.eclipse.swt.internal.cocoa.*;
/**
* This class is used to describe a table column for objects that have an accessible
* role of ACC.ROLE_TABLE, but aren't implemented like NSTableViews.
*
* Instances of this class represent one row in a table. Cocoa accessibility expects
* rows to report their location, and assumes the cells of the table are children of the rows.
*
* @see TableAccessibleDelegate
*/
class AccessibleTableRow extends Accessible {
public AccessibleTableRow(Accessible accessible, int childID) {
super(accessible);
index = childID;
addAccessibleControlListener(new AccessibleControlAdapter() {
public void getChildCount(AccessibleControlEvent e) {
e.detail = Math.max (1, parent.getColumnCount());
}
public void getChildren(AccessibleControlEvent e) {
int validColumnCount = Math.max (1, parent.getColumnCount());
Object[] children = new Object[validColumnCount];
AccessibleTableEvent event = new AccessibleTableEvent(this);
for (int i = 0; i < validColumnCount; i++) {
event.column = i;
event.row = index;
for (int j = 0; j < parent.accessibleTableListeners.size(); j++) {
AccessibleTableListener listener = (AccessibleTableListener)parent.accessibleTableListeners.elementAt(j);
listener.getCell(event);
}
if (event.accessible != null) {
event.accessible.parent = AccessibleTableRow.this;
}
children[i] = event.accessible;
}
e.children = children;
}
public void getLocation(AccessibleControlEvent e) {
int validColumnCount = Math.max (1, parent.getColumnCount());
Accessible[] children = new Accessible[validColumnCount];
AccessibleTableEvent event = new AccessibleTableEvent(this);
for (int i = 0; i < validColumnCount; i++) {
event.column = i;
event.row = index;
for (int j = 0; j < parent.accessibleTableListeners.size(); j++) {
AccessibleTableListener listener = (AccessibleTableListener)parent.accessibleTableListeners.elementAt(j);
listener.getCell(event);
}
children[i] = event.accessible;
}
// Ask first child for position.
NSValue positionObj = (NSValue)children[0].getPositionAttribute(ACC.CHILDID_SELF);
NSPoint position = positionObj.pointValue();
// Ask all children for size.
int height = 0;
int width = 0;
for (int j = 0; j < children.length; j++) {
NSValue sizeObj = (NSValue)children[j].getSizeAttribute(ACC.CHILDID_SELF);
NSSize size = sizeObj.sizeValue();
if (size.height > height) height = (int) size.height;
width += size.width;
}
e.x = (int) position.x;
// Flip y coordinate for Cocoa.
NSArray screens = NSScreen.screens();
NSScreen screen = new NSScreen(screens.objectAtIndex(0));
NSRect frame = screen.frame();
e.y = (int) (frame.height - position.y - height);
e.width = width;
e.height = height;
}
public void getRole(AccessibleControlEvent e) {
int childID = e.childID;
if (childID == ACC.CHILDID_SELF) {
e.detail = ACC.ROLE_ROW;
} else {
e.detail = ACC.ROLE_TABLECELL;
}
}
public void getFocus(AccessibleControlEvent e) {
AccessibleTableEvent event = new AccessibleTableEvent(this);
event.column = 0;
event.row = index;
for (int j = 0; j < parent.accessibleTableListeners.size(); j++) {
AccessibleTableListener listener = (AccessibleTableListener)parent.accessibleTableListeners.elementAt(j);
listener.getCell(event);
}
if (event.accessible != null) {
NSNumber focusedObj = (NSNumber) event.accessible.getFocusedAttribute(ACC.CHILDID_SELF);
e.childID = focusedObj.boolValue() ? ACC.CHILDID_SELF : ACC.CHILDID_NONE;
} else {
e.childID = ACC.CHILDID_NONE;
}
}
});
addAccessibleTableListener(new AccessibleTableAdapter() {
public void isColumnSelected(AccessibleTableEvent e) {
e.isSelected = false;
}
public void isRowSelected(AccessibleTableEvent e) {
// Delegate to the parent table.
AccessibleTableEvent event = new AccessibleTableEvent(this);
event.row = e.row;
for (int i = 0; i < parent.accessibleTableListeners.size(); i++) {
AccessibleTableListener listener = (AccessibleTableListener)parent.accessibleTableListeners.elementAt(i);
listener.isRowSelected(event);
}
e.isSelected = event.isSelected;
}
});
}
void getChildAtPoint(AccessibleControlEvent e) {
int validColumnCount = Math.max (1, parent.getColumnCount());
Accessible[] children = new Accessible[validColumnCount];
AccessibleTableEvent event = new AccessibleTableEvent(this);
for (int i = 0; i < validColumnCount; i++) {
event.column = i;
event.row = index;
for (int j = 0; j < parent.accessibleTableListeners.size(); j++) {
AccessibleTableListener listener = (AccessibleTableListener)parent.accessibleTableListeners.elementAt(j);
listener.getCell(event);
}
children[i] = event.accessible;
}
for (int j = 0; j < children.length; j++) {
NSValue positionObj = (NSValue)children[j].getPositionAttribute(index);
NSPoint position = positionObj.pointValue();
NSValue sizeObj = (NSValue)children[j].getSizeAttribute(index);
NSSize size = sizeObj.sizeValue();
if (position.x <= e.x && e.x <= position.x + size.width) {
children[j].parent = this;
e.accessible = children[j];
break;
}
}
}
}