/*******************************************************************************
 * Copyright (c) 2008, 2016 IBM Corporation and others.
 *
 * 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.swt.examples.accessibility;

import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.Accessible;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Caret;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;

public class ControlsWithAccessibleNamesExample {
	static Display display;
	static Shell shell;
	static Button button, overrideButton, imageButton, overrideImageButton;
	static Label label, overrideLabel, imageLabel, overrideImageLabel;
	static Combo combo, overrideCombo;
	static Spinner spinner, overrideSpinner;
	static Text text, overrideText;
	static Text multiLineText, overrideMultiLineText;
	static List list, overrideList;
	static Table table, overrideTable;
	static Tree tree, overrideTree;
	static Tree treeTable, overrideTreeTable;
	static ToolBar toolBar, overrideToolBar;
	static ToolBar imageToolBar, overrideImageToolBar;
	static CoolBar coolBar, overrideCoolBar;
	static Canvas canvas, overrideCanvas;
	static Composite composite, overrideComposite;
	static Group group, overrideGroup;
	static TabFolder tabFolder, overrideTabFolder;
	static CLabel cLabel, overrideCLabel;
	static CCombo cCombo, overrideCCombo;
	static CTabFolder cTabFolder, overrideCTabFolder;
	static StyledText styledText, overrideStyledText;
	static StyledText multiLineStyledText, overrideMultiLineStyledText;
	static ProgressBar progressBar, overrideProgressBar;
	static Sash sash, overrideSash;
	static Scale scale, overrideScale;
	static Slider slider, overrideSlider;
	static Link link, overrideLink;
	static Image smallImage, largeImage, transparentImage;

	public static void main(String[] args) {
		display = new Display();
		shell = new Shell(display);
		shell.setLayout(new GridLayout(4, true));
		shell.setText("Override Accessibility Test");

		largeImage = new Image(display, ControlsWithAccessibleNamesExample.class.getResourceAsStream("run_wiz.gif"));
		smallImage = new Image(display, ControlsWithAccessibleNamesExample.class.getResourceAsStream("run.gif"));
		ImageData source = smallImage.getImageData();
		ImageData mask = source.getTransparencyMask();
		transparentImage = new Image(display, source, mask);

		new Label(shell, SWT.NONE).setText("Use Platform Name");
		new Label(shell, SWT.NONE).setText("Override Platform Name");
		new Label(shell, SWT.NONE).setText("Use Platform Name");
		new Label(shell, SWT.NONE).setText("Override Platform Name");

		AccessibleAdapter overrideAccessibleAdapter = new AccessibleAdapter() {
			@Override
			public void getName(AccessibleEvent e) {
				Control control = ((Accessible) e.getSource()).getControl();
				if (e.childID == ACC.CHILDID_SELF) {
					e.result = "Overriding Platform Name For " + control.getData("name") + " (was " + e.result + ")";
				} else {
					e.result = "Overriding Platform Name For " + control.getData("child") + ": " + e.childID + " (was " + e.result + ")";
				}
			}
			@Override
			public void getHelp(AccessibleEvent e) {
				Control control = ((Accessible) e.getSource()).getControl();
				if (e.childID == ACC.CHILDID_SELF) {
					e.result = "Overriding Platform Help For " + control.getData("name") + " (was " + e.result + ")";
				} else {
					e.result = "Overriding Platform Help For " + control.getData("child") + ": " + e.childID + " (was " + e.result + ")";
				}
			}
		};

//		Shell shell;
		shell.setData("name", "Shell");
		shell.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Label label, overrideLabel;
		label = new Label(shell, SWT.BORDER);
		label.setText("Label");
		label.setToolTipText("Label ToolTip");

		overrideLabel = new Label(shell, SWT.BORDER);
		overrideLabel.setText("Label");
		overrideLabel.setToolTipText("Label ToolTip");
		overrideLabel.setData("name", "Label");
		overrideLabel.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Label imageLabel, overrideImageLabel;
		imageLabel = new Label(shell, SWT.BORDER);
		imageLabel.setImage(largeImage);
		imageLabel.setToolTipText("Image Label ToolTip");

		overrideImageLabel = new Label(shell, SWT.BORDER);
		overrideImageLabel.setImage(largeImage);
		overrideImageLabel.setToolTipText("Image Label ToolTip");
		overrideImageLabel.setData("name", "Image Label");
		overrideImageLabel.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Button button, overrideButton;
		button = new Button(shell, SWT.PUSH);
		button.setText("Button");
		button.setToolTipText("Button ToolTip");

		overrideButton = new Button(shell, SWT.PUSH);
		overrideButton.setText("Button");
		overrideButton.setToolTipText("Button ToolTip");
		overrideButton.setData("name", "Button");
		overrideButton.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Button imageButton, overrideImageButton;
		imageButton = new Button(shell, SWT.PUSH);
		imageButton.setImage(smallImage);
		imageButton.setToolTipText("Image Button ToolTip");

		overrideImageButton = new Button(shell, SWT.PUSH);
		overrideImageButton.setImage(smallImage);
		overrideImageButton.setToolTipText("Image Button ToolTip");
		overrideImageButton.setData("name", "Image Button");
		overrideImageButton.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Combo combo, overrideCombo;
		combo = new Combo(shell, SWT.BORDER);
		for (int i = 0; i < 5; i++) {
			combo.add("item" + i);
		}
		combo.setText("Combo");
		combo.setToolTipText("Combo ToolTip");

		overrideCombo = new Combo(shell, SWT.BORDER);
		for (int i = 0; i < 5; i++) {
			overrideCombo.add("item" + i);
		}
		overrideCombo.setText("Combo");
		overrideCombo.setToolTipText("Combo ToolTip");
		overrideCombo.setData("name", "Combo");
		overrideCombo.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Spinner spinner, overrideSpinner;
		spinner = new Spinner(shell, SWT.BORDER);
		spinner.setSelection(5);
		spinner.setToolTipText("Spinner ToolTip");

		overrideSpinner = new Spinner(shell, SWT.BORDER);
		overrideSpinner.setSelection(5);
		overrideSpinner.setToolTipText("Spinner ToolTip");
		overrideSpinner.setData("name", "Spinner");
		overrideSpinner.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Text text, overrideText;
		text = new Text(shell, SWT.SINGLE | SWT.BORDER);
		text.setText("Contents of single-line Text");

		overrideText = new Text(shell, SWT.SINGLE | SWT.BORDER);
		overrideText.setText("Contents of single-line Text");
		overrideText.setData("name", "Text");
		overrideText.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Text multiLineText, overrideMultiLineText;
		multiLineText = new Text(shell, SWT.MULTI | SWT.BORDER);
		multiLineText.setText("Contents of multi-line Text\nLine 2\nLine 3\nLine 4");

		overrideMultiLineText = new Text(shell, SWT.MULTI | SWT.BORDER);
		overrideMultiLineText.setText("Contents of multi-line Text\nLine 2\nLine 3\nLine 4");
		overrideMultiLineText.setData("name", "MultiLineText");
		overrideMultiLineText.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		List list, overrideList;
		list = new List(shell, SWT.SINGLE | SWT.BORDER);
		list.setItems("Item0", "Item1", "Item2");

		overrideList = new List(shell, SWT.SINGLE | SWT.BORDER);
		overrideList.setItems("Item0", "Item1", "Item2");
		overrideList.setData("name", "List");
		overrideList.setData("child", "List Item");
		overrideList.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Table table, overrideTable;
		table = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		for (int col = 0; col < 3; col++) {
			TableColumn column = new TableColumn(table, SWT.NONE);
			column.setText("Col " + col);
			column.pack();
		}
		for (int row = 0; row < 3; row++) {
			TableItem item = new TableItem(table, SWT.NONE);
			item.setText(new String [] {"C0R" + row, "C1R" + row, "C2R" + row});
		}

		overrideTable = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
		overrideTable.setHeaderVisible(true);
		overrideTable.setLinesVisible(true);
		for (int col = 0; col < 3; col++) {
			TableColumn column = new TableColumn(overrideTable, SWT.NONE);
			column.setText("Col " + col);
			column.pack();
		}
		for (int row = 0; row < 3; row++) {
			TableItem item = new TableItem(overrideTable, SWT.NONE);
			item.setText(new String [] {"C0R" + row, "C1R" + row, "C2R" + row});
		}
		overrideTable.setData("name", "Table");
		overrideTable.setData("child", "Table Item");
		overrideTable.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Tree tree, overrideTree;
		tree = new Tree(shell, SWT.BORDER | SWT.MULTI);
		for (int i = 0; i < 3; i++) {
			TreeItem item = new TreeItem(tree, SWT.NONE);
			item.setText("Item" + i);
			for (int j = 0; j < 4; j++) {
				new TreeItem(item, SWT.NONE).setText("Item" + i + j);
			}
		}

		overrideTree = new Tree(shell, SWT.BORDER | SWT.MULTI);
		for (int i = 0; i < 3; i++) {
			TreeItem item = new TreeItem(overrideTree, SWT.NONE);
			item.setText("Item" + i);
			for (int j = 0; j < 4; j++) {
				new TreeItem(item, SWT.NONE).setText("Item" + i + j);
			}
		}
		overrideTree.setData("name", "Tree");
		overrideTree.setData("child", "Tree Item");
		overrideTree.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Tree treeTable, overrideTreeTable;
		treeTable = new Tree(shell, SWT.BORDER | SWT.MULTI);
		treeTable.setHeaderVisible(true);
		treeTable.setLinesVisible(true);
		for (int col = 0; col < 3; col++) {
			TreeColumn column = new TreeColumn(treeTable, SWT.NONE);
			column.setText("Col " + col);
			column.pack();
		}
		for (int i = 0; i < 3; i++) {
			TreeItem item = new TreeItem(treeTable, SWT.NONE);
			item.setText(new String [] {"I" + i + "C0", "I" + i + "C1", "I" + i + "C2"});
			for (int j = 0; j < 4; j++) {
				new TreeItem(item, SWT.NONE).setText(new String [] {"I" + i + j + "C0", "I" + i + j + "C1", "I" + i + j + "C2"});
			}
		}

		overrideTreeTable = new Tree(shell, SWT.BORDER | SWT.MULTI);
		overrideTreeTable.setHeaderVisible(true);
		overrideTreeTable.setLinesVisible(true);
		for (int col = 0; col < 3; col++) {
			TreeColumn column = new TreeColumn(overrideTreeTable, SWT.NONE);
			column.setText("Col " + col);
			column.pack();
		}
		for (int i = 0; i < 3; i++) {
			TreeItem item = new TreeItem(overrideTreeTable, SWT.NONE);
			item.setText(new String [] {"I" + i + "C0", "I" + i + "C1", "I" + i + "C2"});
			for (int j = 0; j < 4; j++) {
				new TreeItem(item, SWT.NONE).setText(new String [] {"I" + i + j + "C0", "I" + i + j + "C1", "I" + i + j + "C2"});
			}
		}
		overrideTreeTable.setData("name", "Tree Table");
		overrideTreeTable.setData("child", "Tree Table Item");
		overrideTreeTable.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		ToolBar toolBar, overrideToolBar;
		toolBar = new ToolBar(shell, SWT.FLAT);
		for (int i = 0; i < 3; i++) {
			ToolItem item = new ToolItem(toolBar, SWT.PUSH);
			item.setText("Item" + i);
			item.setToolTipText("ToolItem ToolTip" + i);
		}

		overrideToolBar = new ToolBar(shell, SWT.FLAT);
		for (int i = 0; i < 3; i++) {
			ToolItem item = new ToolItem(overrideToolBar, SWT.PUSH);
			item.setText("Item" + i);
			item.setToolTipText("ToolItem ToolTip" + i);
		}
		overrideToolBar.setData("name", "ToolBar");
		overrideToolBar.setData("child", "ToolBar Item");
		overrideToolBar.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		ToolBar imageToolBar, overrideImageToolBar;
		imageToolBar = new ToolBar(shell, SWT.FLAT);
		for (int i = 0; i < 3; i++) {
			ToolItem item = new ToolItem(imageToolBar, SWT.PUSH);
			item.setImage(transparentImage);
			item.setToolTipText("Image ToolItem ToolTip" + i);
		}

		overrideImageToolBar = new ToolBar(shell, SWT.FLAT);
		for (int i = 0; i < 3; i++) {
			ToolItem item = new ToolItem(overrideImageToolBar, SWT.PUSH);
			item.setImage(transparentImage);
			item.setToolTipText("Image ToolItem ToolTip" + i);
		}
		overrideImageToolBar.setData("name", "Image ToolBar");
		overrideImageToolBar.setData("child", "Image ToolBar Item");
		overrideImageToolBar.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		CoolBar coolBar, overrideCoolBar;
		coolBar = new CoolBar(shell, SWT.FLAT);
		for (int i = 0; i < 2; i++) {
			CoolItem coolItem = new CoolItem(coolBar, SWT.PUSH);
			ToolBar coolItemToolBar = new ToolBar(coolBar, SWT.FLAT);
			int toolItemWidth = 0;
			for (int j = 0; j < 2; j++) {
				ToolItem item = new ToolItem(coolItemToolBar, SWT.PUSH);
				item.setText("I" + i + j);
				item.setToolTipText("ToolItem ToolTip" + i + j);
				if (item.getWidth() > toolItemWidth) toolItemWidth = item.getWidth();
			}
			coolItem.setControl(coolItemToolBar);
			Point size = coolItemToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
			Point coolSize = coolItem.computeSize (size.x, size.y);
			coolItem.setMinimumSize(toolItemWidth, coolSize.y);
			coolItem.setPreferredSize(coolSize);
			coolItem.setSize(coolSize);
		}

		overrideCoolBar = new CoolBar(shell, SWT.FLAT);
		for (int i = 0; i < 2; i++) {
			CoolItem coolItem = new CoolItem(overrideCoolBar, SWT.PUSH);
			ToolBar coolItemToolBar = new ToolBar(overrideCoolBar, SWT.FLAT);
			int toolItemWidth = 0;
			for (int j = 0; j < 2; j++) {
				ToolItem item = new ToolItem(coolItemToolBar, SWT.PUSH);
				item.setText("I" + i + j);
				item.setToolTipText("ToolItem ToolTip" + i + j);
				if (item.getWidth() > toolItemWidth) toolItemWidth = item.getWidth();
			}
			coolItem.setControl(coolItemToolBar);
			Point size = coolItemToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
			Point coolSize = coolItem.computeSize (size.x, size.y);
			coolItem.setMinimumSize(toolItemWidth, coolSize.y);
			coolItem.setPreferredSize(coolSize);
			coolItem.setSize(coolSize);
		}
		overrideCoolBar.setData("name", "CoolBar");
		overrideCoolBar.setData("child", "CoolBar Item");
		overrideCoolBar.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Canvas canvas, overrideCanvas;
		canvas = new Canvas(shell, SWT.BORDER);
		canvas.addPaintListener(e -> e.gc.drawString("Canvas", 15, 25));
		/* Set a caret into the canvas so that it will take focus. */
		Caret caret = new Caret(canvas, SWT.NONE);
		caret.setBounds(15, 25, 2, 20);
		canvas.setCaret (caret);
		/* Hook key listener so canvas will take focus during traversal in. */
		canvas.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				e.doit = true;
			}
			@Override
			public void keyReleased(KeyEvent e) {
				e.doit = true;
			}
		});
		/* Hook traverse listener to make canvas give up focus during traversal out. */
		canvas.addTraverseListener(e -> e.doit = true);

		overrideCanvas = new Canvas(shell, SWT.BORDER);
		overrideCanvas.addPaintListener(e -> e.gc.drawString("Canvas", 15, 25));
		/* Set a caret into the canvas so that it will take focus. */
		caret = new Caret(overrideCanvas, SWT.NONE);
		caret.setBounds(15, 25, 2, 20);
		overrideCanvas.setCaret (caret);
		/* Hook key listener so canvas will take focus during traversal in. */
		overrideCanvas.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				e.doit = true;
			}
			@Override
			public void keyReleased(KeyEvent e) {
				e.doit = true;
			}
		});
		/* Hook traverse listener to make canvas give up focus during traversal out. */
		overrideCanvas.addTraverseListener(e -> e.doit = true);
		overrideCanvas.setData("name", "Canvas");
		overrideCanvas.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Composite composite, overrideComposite;
		composite = new Composite(shell, SWT.BORDER);
		composite.setLayout(new GridLayout());
		new Button(composite, SWT.RADIO).setText("Child 1");
		new Button(composite, SWT.RADIO).setText("Child 2");

		overrideComposite = new Composite(shell, SWT.BORDER);
		overrideComposite.setLayout(new GridLayout());
		new Button(overrideComposite, SWT.RADIO).setText("Child 1");
		new Button(overrideComposite, SWT.RADIO).setText("Child 2");
		overrideComposite.setData("name", "Composite");
		overrideComposite.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Group group, overrideGroup;
		group = new Group(shell, SWT.NONE);
		group.setText("Group");
		group.setLayout(new FillLayout());
		new Text(group, SWT.SINGLE).setText("Text in Group");

		overrideGroup = new Group(shell, SWT.NONE);
		overrideGroup.setText("Group");
		overrideGroup.setLayout(new FillLayout());
		new Text(overrideGroup, SWT.SINGLE).setText("Text in Group");
		overrideGroup.setData("name", "Group");
		overrideGroup.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		TabFolder tabFolder, overrideTabFolder;
		tabFolder = new TabFolder(shell, SWT.NONE);
		for (int i = 0; i < 3; i++) {
			TabItem item = new TabItem(tabFolder, SWT.NONE);
			item.setText("TabItem &" + i);
			item.setToolTipText("TabItem ToolTip" + i);
			Text itemText = new Text(tabFolder, SWT.MULTI | SWT.BORDER);
			itemText.setText("\nText for TabItem " + i + "\n\n");
			item.setControl(itemText);
		}

		overrideTabFolder = new TabFolder(shell, SWT.NONE);
		for (int i = 0; i < 3; i++) {
			TabItem item = new TabItem(overrideTabFolder, SWT.NONE);
			item.setText("TabItem &" + i);
			item.setToolTipText("TabItem ToolTip" + i);
			Text itemText = new Text(overrideTabFolder, SWT.MULTI | SWT.BORDER);
			itemText.setText("\nText for TabItem " + i + "\n\n");
			item.setControl(itemText);
		}
		overrideTabFolder.setData("name", "TabFolder");
		overrideTabFolder.setData("child", "TabItem");
		overrideTabFolder.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		CLabel cLabel, overrideCLabel;
		cLabel = new CLabel(shell, SWT.BORDER);
		cLabel.setText("CLabel");
		cLabel.setToolTipText("CLabel ToolTip");
		cLabel.setLayoutData(new GridData(100, SWT.DEFAULT));

		overrideCLabel = new CLabel(shell, SWT.BORDER);
		overrideCLabel.setText("CLabel");
		overrideCLabel.setToolTipText("CLabel ToolTip");
		overrideCLabel.setLayoutData(new GridData(100, SWT.DEFAULT));
		overrideCLabel.setData("name", "CLabel");
		overrideCLabel.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		CCombo cCombo, overrideCCombo;
		cCombo = new CCombo(shell, SWT.BORDER);
		for (int i = 0; i < 5; i++) {
			cCombo.add("item" + i);
		}
		cCombo.setText("CCombo");
		cCombo.setToolTipText("CCombo ToolTip");

		// Note: This doesn't work well because CCombo has Control children
		overrideCCombo = new CCombo(shell, SWT.BORDER);
		for (int i = 0; i < 5; i++) {
			overrideCCombo.add("item" + i);
		}
		overrideCCombo.setText("CCombo");
		overrideCCombo.setToolTipText("CCombo ToolTip");
		overrideCCombo.setData("name", "CCombo");
		overrideCCombo.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		CTabFolder cTabFolder, overrideCTabFolder;
		cTabFolder = new CTabFolder(shell, SWT.NONE);
		for (int i = 0; i < 3; i++) {
			CTabItem item = new CTabItem(cTabFolder, SWT.NONE);
			item.setText("CTabItem &" + i);
			item.setToolTipText("TabItem ToolTip" + i);
			Text itemText = new Text(cTabFolder, SWT.MULTI | SWT.BORDER);
			itemText.setText("\nText for CTabItem " + i + "\n\n");
			item.setControl(itemText);
		}
		cTabFolder.setSelection(cTabFolder.getItem(0));

		overrideCTabFolder = new CTabFolder(shell, SWT.NONE);
		for (int i = 0; i < 3; i++) {
			CTabItem item = new CTabItem(overrideCTabFolder, SWT.NONE);
			item.setText("CTabItem &" + i);
			item.setToolTipText("TabItem ToolTip" + i);
			Text itemText = new Text(overrideCTabFolder, SWT.MULTI | SWT.BORDER);
			itemText.setText("\nText for CTabItem " + i + "\n\n");
			item.setControl(itemText);
		}
		overrideCTabFolder.setSelection(overrideCTabFolder.getItem(0));
		overrideCTabFolder.setData("name", "CTabFolder");
		overrideCTabFolder.setData("child", "CTabItem");
		overrideCTabFolder.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		StyledText styledText, overrideStyledText;
		styledText = new StyledText(shell, SWT.SINGLE | SWT.BORDER);
		styledText.setText("Contents of single-line StyledText");

		overrideStyledText = new StyledText(shell, SWT.SINGLE | SWT.BORDER);
		overrideStyledText.setText("Contents of single-line StyledText");
		overrideStyledText.setData("name", "StyledText");
		overrideStyledText.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		StyledText multiLineStyledText, overrideMultiLineStyledText;
		multiLineStyledText = new StyledText(shell, SWT.MULTI | SWT.BORDER);
		multiLineStyledText.setText("Contents of multi-line StyledText\nLine 2\nLine 3\nLine 4");

		overrideMultiLineStyledText = new StyledText(shell, SWT.MULTI | SWT.BORDER);
		overrideMultiLineStyledText.setText("Contents of multi-line StyledText\nLine 2\nLine 3\nLine 4");
		overrideMultiLineStyledText.setData("name", "MultiLineStyledText");
		overrideMultiLineStyledText.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Scale scale, overrideScale;
		scale = new Scale(shell, SWT.NONE);
		scale.setToolTipText("Scale ToolTip");

		overrideScale = new Scale(shell, SWT.NONE);
		overrideScale.setToolTipText("Scale ToolTip");
		overrideScale.setData("name", "Scale");
		overrideScale.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Slider slider, overrideSlider;
		slider = new Slider(shell, SWT.NONE);
		slider.setToolTipText("Slider ToolTip");

		overrideSlider = new Slider(shell, SWT.NONE);
		overrideSlider.setToolTipText("Slider ToolTip");
		overrideSlider.setData("name", "Slider");
		overrideSlider.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		ProgressBar progressBar, overrideProgressBar;
		if (!SWT.getPlatform().equals("cocoa")) {
			progressBar = new ProgressBar(shell, SWT.NONE);
			progressBar.setSelection(50);
			progressBar.setToolTipText("ProgressBar ToolTip");

			overrideProgressBar = new ProgressBar(shell, SWT.NONE);
			overrideProgressBar.setSelection(50);
			overrideProgressBar.setToolTipText("ProgressBar ToolTip");
			overrideProgressBar.setData("name", "ProgressBar");
			overrideProgressBar.getAccessible().addAccessibleListener(overrideAccessibleAdapter);
		}

//		Sash sash, overrideSash;
		sash = new Sash(shell, SWT.BORDER);
		sash.setToolTipText("Sash ToolTip");

		overrideSash = new Sash(shell, SWT.BORDER);
		overrideSash.setToolTipText("Sash ToolTip");
		overrideSash.setData("name", "Sash");
		overrideSash.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

//		Link link, overrideLink;
		link = new Link(shell, SWT.NONE);
		link.setText("<a>This is a link</a>");
		link.setToolTipText("Link ToolTip");

		overrideLink = new Link(shell, SWT.NONE);
		overrideLink.setText("<a>This is a link</a>");
		overrideLink.setToolTipText("Link ToolTip");
		overrideLink.setData("name", "Link");
		overrideLink.getAccessible().addAccessibleListener(overrideAccessibleAdapter);

		shell.pack();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) display.sleep();
		}
		largeImage.dispose();
		smallImage.dispose();
		transparentImage.dispose();
		display.dispose();
	}
}