| /******************************************************************************* |
| * 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() { |
| 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; |
| } |
| public void getRole(AccessibleControlEvent e) { |
| e.detail = ACC.ROLE_COLUMN; |
| } |
| }); |
| addAccessibleTableListener(new AccessibleTableAdapter() { |
| public void getRowCount(AccessibleTableEvent e) { |
| e.count = getColumnCells().length; |
| } |
| 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]; |
| } |
| } |
| 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; |
| } |
| |
| } |