/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.common.ui.tray;

import java.util.List;
import java.util.Vector;

import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;


public class TrayAccessibleEditPart extends AccessibleEditPart {

	protected TrayEditPart part;
	
	public TrayAccessibleEditPart(TrayEditPart part) {
		super();
		this.part = part; 
	}

	@Override
	public void getChildCount(AccessibleControlEvent e) {
		getChildren(e);
		e.detail = e.children.length;
	}

	@Override
	public void getChildren(AccessibleControlEvent e) {
		List<EditPart> list = part.getChildren();
		Vector<Integer> childList = new Vector<Integer>();
		for (int i = 0; i < list.size(); i++) {
			EditPart child = list.get(i);
			AccessibleEditPart access = (AccessibleEditPart)child.getAdapter(AccessibleEditPart.class);
			if (access == null)
				continue;
			childList.add( Integer.valueOf( access.getAccessibleID()));
		}
		e.children = childList.toArray();
	}

	@Override
	public void getName(AccessibleEvent e) {
		Label label = part.getDirectEditLabel();
		if (label != null) {
			e.result = label.getText();
		} else {
			e.result = null;
		}
	}

	@Override
	public void getLocation(AccessibleControlEvent e) {
		Rectangle bounds = part.getFigure().getBounds().getCopy();
		part.getFigure().translateToAbsolute(bounds);
		org.eclipse.swt.graphics.Point p = new org.eclipse.swt.graphics.Point(0, 0);
		p = part.getViewer().getControl().toDisplay(p);
		e.x = bounds.x + p.x;
		e.y = bounds.y + p.y;
		e.width = bounds.width;
		e.height = bounds.height;
	}

	@Override
	public void getState(AccessibleControlEvent e) {
		e.detail = ACC.STATE_SELECTABLE | ACC.STATE_FOCUSABLE;
		if (part.getSelected() != EditPart.SELECTED_NONE)
			e.detail |= ACC.STATE_SELECTED;
		if (part.getViewer().getFocusEditPart() == part)
			e.detail = ACC.STATE_FOCUSED;
	}

}
