blob: 0464794cf39443b9ef4274c7ec0f3cd7ea0a62d9 [file] [log] [blame]
/*******************************************************************************
* 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 column in a table. Cocoa accessibility expects
* columns to report their location, number of rows, and elements in those rows.
*
* @see TableAccessibleDelegate
*/
class AccessibleTableColumn extends Accessible {
public AccessibleTableColumn(Accessible accessible, int childID) {
super(accessible);
index = childID;
addAccessibleControlListener(new AccessibleControlAdapter() {
@Override
public void getLocation(AccessibleControlEvent e) {
Accessible[] cells = AccessibleTableColumn.this.getColumnCells();
// Ask first row for position.
AccessibleControlEvent event = new AccessibleControlEvent(this);
event.childID = ACC.CHILDID_SELF;
event.width = -1;
Accessible child = cells[0];
for (int i = 0; i < child.accessibleControlListeners.size(); i++) {
AccessibleControlListener listener = child.accessibleControlListeners.get(i);
listener.getLocation(event);
}
// Ask all children for size.
int height = 0;
int width = 0;
for (int j = 0; j < cells.length; j++) {
NSValue sizeObj = (NSValue)cells[j].getSizeAttribute(ACC.CHILDID_SELF);
NSSize size = sizeObj.sizeValue();
if (size.width > width) width = (int) size.width;
height += size.height;
}
e.x = event.x;
e.y = event.y;
e.width = width;
e.height = height;
}
@Override
public void getRole(AccessibleControlEvent e) {
e.detail = ACC.ROLE_COLUMN;
}
});
addAccessibleTableListener(new AccessibleTableAdapter() {
@Override
public void getRowCount(AccessibleTableEvent e) {
e.count = getColumnCells().length;
}
@Override
public void getRow(AccessibleTableEvent e) {
int index = e.row;
Accessible[] children = getColumnCells();
int count = children.length;
if (0 <= index && index < count) {
e.accessible = children[index];
}
}
@Override
public void getRows(AccessibleTableEvent e) {
e.accessibles = getColumnCells();
}
});
}
private Accessible[] getColumnCells() {
int validRowCount = Math.max (1, parent.getRowCount());
Accessible[] cells = new Accessible[validRowCount];
AccessibleTableEvent event = new AccessibleTableEvent(this);
for (int i = 0; i < validRowCount; i++) {
event.column = index;
event.row = i;
for (int j = 0; j < parent.accessibleTableListeners.size(); j++) {
AccessibleTableListener listener = parent.accessibleTableListeners.get(j);
listener.getCell(event);
}
cells[i] = event.accessible;
}
return cells;
}
}