/**
* Initialize accessibility.
*/
private void initAccessible()
{
final Accessible accessible = getAccessible();
accessible.addAccessibleListener(new AccessibleAdapter()
{
public void getDescription(AccessibleEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
String descrption = "";
for (int i = 0; i < columns.size(); i++)
{
if (i != 0)
{
descrption += ((GridColumn)columns.get(i)).getText() + " : ";
descrption += ((GridItem)items.get(childID)).getText(i) + " ";
}
}
e.result = descrption;
}
}
public void getName(AccessibleEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
// Name of the items
e.result = ((GridItem)items.get(childID)).getText();
}
else if (childID >= items.size() && childID < items.size() + columns.size())
{
// Name of the column headers
e.result = ((GridColumn)columns.get(childID - items.size())).getText();
}
else if (childID >= items.size() + columns.size()
&& childID < items.size() + columns.size() + columnGroups.length)
{
// Name of the column group headers
e.result = ((GridColumnGroup)columnGroups[childID - items.size()
- columns.size()]).getText();
}
else if (childID >= items.size() + columns.size() + columnGroups.length
&& childID < items.size() + columns.size() + columnGroups.length
+ columnGroups.length)
{
// Name of the toggle button for column group headers
e.result = ACC_TOGGLE_BUTTON_NAME;
}
}
});
accessible.addAccessibleControlListener(new AccessibleControlAdapter()
{
public void getChildAtPoint(AccessibleControlEvent e)
{
Point location = toControl(e.x, e.y);
e.childID = ACC.CHILDID_SELF;
// Grid Items
GridItem item = getItem(location);
if (item != null)
{
for (int i = 0; i < getItems().length; i++)
{
if (item.equals(getItem(i)))
{
e.childID = i;
return;
}
}
}
else
{
// Column Headers
GridColumn column = overColumnHeader(location.x, location.y);
if (column != null)
{
for (int i = 0; i < getColumns().length; i++)
{
if (column.equals(getColumn(i)))
{
e.childID = getItems().length + i;
return;
}
}
}
else
{
// Column Group headers
GridColumnGroup columnGroup = overColumnGroupHeader(location.x, location.y);
if (columnGroup != null)
{
for (int i = 0; i < getColumnGroups().length; i++)
{
if (columnGroup.equals(getColumnGroup(i)))
{
Rectangle toggle = ((DefaultColumnGroupHeaderRenderer)columnGroup
.getHeaderRenderer()).getToggleBounds();
if (toggle.contains(location.x, location.y))
{
// Toggle button for column group
// header
e.childID = getItems().length + getColumns().length
+ getColumnGroups().length + i;
}
else
{
// Column Group header
e.childID = getItems().length + getColumns().length + i;
}
return;
}
}
}
}
}
}
public void getChildCount(AccessibleControlEvent e)
{
if (e.childID == ACC.CHILDID_SELF)
{
int length = items.size();
if (isTree)
{
// Child count for parent. Here if the item parent
// is not an other item,
// it is consider as children of Grid
for (int i = 0; i < items.size(); i++)
{
if (((GridItem)items.get(i)).getParentItem() != null)
{
length--;
}
}
}
e.detail = length;
}
}
public void getChildren(AccessibleControlEvent e)
{
if (e.childID == ACC.CHILDID_SELF)
{
int length = items.size();
if (isTree)
{
for (int i = 0; i < items.size(); i++)
{
if (((GridItem)items.get(i)).getParentItem() != null)
{
length--;
}
}
Object[] children = new Object[length];
int j = 0;
for (int i = 0; i < items.size(); i++)
{
if (((GridItem)items.get(i)).getParentItem() == null)
{
children[j] = new Integer(i);
j++;
}
}
e.children = children;
}
else
{
Object[] children = new Object[length];
for (int i = 0; i < items.size(); i++)
{
children[i] = new Integer(i);
}
e.children = children;
}
}
}
public void getDefaultAction(AccessibleControlEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
if (getItem(childID).hasChildren())
{
// Action of tree items
if (getItem(childID).isExpanded())
{
e.result = ACC_ITEM_ACTION_COLLAPSE;
}
else
{
e.result = ACC_ITEM_ACTION_EXPAND;
}
}
else
{
// action of default items
e.result = ACC_ITEM_DEFAULT_ACTION;
}
}
else if (childID >= items.size()
&& childID < items.size() + columns.size() + columnGroups.length)
{
// action of column and column group header
e.result = ACC_COLUMN_DEFAULT_ACTION;
}
else if (childID >= items.size() + columns.size() + columnGroups.length
&& childID < items.size() + columns.size() + columnGroups.length
+ columnGroups.length)
{
// action of toggle button of column group header
e.result = SWT.getMessage("SWT_Press");
}
}
public void getLocation(AccessibleControlEvent e)
{
// location of parent
Rectangle location = getBounds();
location.x = 0;
location.y = 0;
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
// location of items
GridItem item = getItem(childID);
if (item != null)
{
Point p = getOrigin((GridColumn)columns.get(0), item);
location.y = p.y;
location.height = item.getHeight();
}
}
else if (childID >= items.size() && childID < items.size() + columns.size())
{
// location of columns headers
GridColumn column = getColumn(childID - items.size());
if (column != null)
{
location.x = getColumnHeaderXPosition(column);
if (column.getColumnGroup() == null)
{
location.y = 0;
}
else
{
location.y = groupHeaderHeight;
}
location.height = headerHeight;
location.width = column.getWidth();
}
}
else if (childID >= items.size() + columns.size()
&& childID < items.size() + columns.size() + columnGroups.length)
{
// location of column group header
GridColumnGroup columnGroup = getColumnGroup(childID - items.size()
- columns.size());
if (columnGroup != null)
{
location.y = 0;
location.height = groupHeaderHeight;
location.x = getColumnHeaderXPosition(columnGroup.getFirstVisibleColumn());
int width = 0;
for (int i = 0; i < columnGroup.getColumns().length; i++)
{
if (columnGroup.getColumns()[i].isVisible())
{
width += columnGroup.getColumns()[i].getWidth();
}
}
location.width = width;
}
}
else if (childID >= items.size() + columns.size() + columnGroups.length
&& childID < items.size() + columns.size() + columnGroups.length
+ columnGroups.length)
{
// location of toggle button of column group header
GridColumnGroup columnGroup = getColumnGroup(childID - items.size()
- columns.size()
- columnGroups.length);
location = ((DefaultColumnGroupHeaderRenderer)columnGroup.getHeaderRenderer())
.getToggleBounds();
}
if (location != null)
{
Point pt = toDisplay(location.x, location.y);
e.x = pt.x;
e.y = pt.y;
e.width = location.width;
e.height = location.height;
}
}
public void getRole(AccessibleControlEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
// role of items
if (isTree)
{
e.detail = ACC.ROLE_TREEITEM;
}
else
{
e.detail = ACC.ROLE_LISTITEM;
}
}
else if (childID >= items.size()
&& childID < items.size() + columns.size() + columnGroups.length)
{
// role of columns headers and column group headers
e.detail = ACC.ROLE_TABLECOLUMNHEADER;
}
else if (childID >= items.size() + columns.size() + columnGroups.length
&& childID < items.size() + columns.size() + columnGroups.length
+ columnGroups.length)
{
// role of toggle button of column group headers
e.detail = ACC.ROLE_PUSHBUTTON;
}
else if (childID == ACC.CHILDID_SELF)
{
// role of parent
if (isTree)
{
e.detail = ACC.ROLE_TREE;
}
else
{
e.detail = ACC.ROLE_TABLE;
}
}
}
public void getSelection(AccessibleControlEvent e)
{
e.childID = ACC.CHILDID_NONE;
if (selectedItems.size() == 1)
{
// Single selection
e.childID = indexOf(((GridItem)selectedItems.get(0)));
}
else if (selectedItems.size() > 1)
{
// multiple selection
e.childID = ACC.CHILDID_MULTIPLE;
int length = selectedItems.size();
Object[] children = new Object[length];
for (int i = 0; i < length; i++)
{
GridItem item = (GridItem)selectedItems.get(i);
children[i] = new Integer(indexOf(item));
}
e.children = children;
}
}
public void getState(AccessibleControlEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
// state of items
e.detail = ACC.STATE_SELECTABLE;
if (getDisplay().getActiveShell() == getParent().getShell())
{
e.detail |= ACC.STATE_FOCUSABLE;
}
if (selectedItems.contains(getItem(childID)))
{
e.detail |= ACC.STATE_SELECTED;
if (getDisplay().getActiveShell() == getParent().getShell())
{
e.detail |= ACC.STATE_FOCUSED;
}
}
if (getItem(childID).getChecked())
{
e.detail |= ACC.STATE_CHECKED;
}
// only for tree type items
if (getItem(childID).hasChildren())
{
if (getItem(childID).isExpanded())
{
e.detail |= ACC.STATE_EXPANDED;
}
else
{
e.detail |= ACC.STATE_COLLAPSED;
}
}
if (!getItem(childID).isVisible())
{
e.detail |= ACC.STATE_INVISIBLE;
}
}
else if (childID >= items.size()
&& childID < items.size() + columns.size() + columnGroups.length)
{
// state of column headers and column group headers
e.detail = ACC.STATE_READONLY;
}
else if (childID >= items.size() + columns.size() + columnGroups.length
&& childID < items.size() + columns.size() + columnGroups.length
+ columnGroups.length)
{
// state of toggle button of column group headers
if (getColumnGroup(
childID - items.size() - columns.size()
- columnGroups.length).getExpanded())
{
e.detail = ACC.STATE_EXPANDED;
}
else
{
e.detail = ACC.STATE_COLLAPSED;
}
}
}
public void getValue(AccessibleControlEvent e)
{
int childID = e.childID;
if (childID >= 0 && childID < items.size())
{
// value for tree items
if (isTree)
{
e.result = "" + getItem(childID).getLevel();
}
}
}
});
addListener(SWT.Selection, new Listener()
{
public void handleEvent(Event event)
{
if (selectedItems.size() > 0)
{
accessible.setFocus(items.indexOf(selectedItems.get(selectedItems.size() - 1)));
}
}
});
addTreeListener(new TreeListener()
{
public void treeCollapsed(TreeEvent e)
{
if (getFocusItem() != null)
{
accessible.setFocus(items.indexOf(getFocusItem()));
}
}
public void treeExpanded(TreeEvent e)
{
if (getFocusItem() != null)
{
accessible.setFocus(items.indexOf(getFocusItem()));
}
}
});
}