/*******************************************************************************
 * Copyright (c) 2000, 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.snippets;
 
/*
 * Accessibility example snippet: tell a screen reader about updates
 * to a non-focused descriptive area
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.6
 */
import org.eclipse.swt.*;
import org.eclipse.swt.accessibility.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet340 {
	
public static void main(String[] args) {
	Display display = new Display();
	Shell shell = new Shell(display);
	shell.setLayout(new GridLayout());
	shell.setText("Description Relation Example");
	
	// (works with either a Label or a READ_ONLY Text)
	final Label liveLabel = new Label(shell, SWT.BORDER | SWT.READ_ONLY);
//	final Text liveLabel = new Text(shell, SWT.BORDER | SWT.READ_ONLY);
	liveLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
	liveLabel.setText("Live region messages go here");
	
	new Label(shell, SWT.NONE).setText("Type an integer from 1 to 4:");
	
	final Text textField = new Text(shell, SWT.SINGLE | SWT.BORDER);
	textField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
	textField.addModifyListener(new ModifyListener() {
		@Override
		public void modifyText(ModifyEvent e) {
			String textValue = textField.getText();
			String message = textValue + " is not valid input.";
			try {
				int value = Integer.parseInt(textValue);
				switch (value) {
					case 1: message = "One for the money,"; break;
					case 2: message = "Two for the show,"; break;
					case 3: message = "Three to get ready,"; break;
					case 4: message = "And four to go!"; break;
				}
			} catch (NumberFormatException ex) {}
			liveLabel.setText(message);
			textField.getAccessible().sendEvent(ACC.EVENT_DESCRIPTION_CHANGED, null);
			textField.setSelection(0, textField.getCharCount());
		}
	});
	textField.getAccessible().addRelation(ACC.RELATION_DESCRIBED_BY, liveLabel.getAccessible());
	liveLabel.getAccessible().addRelation(ACC.RELATION_DESCRIPTION_FOR, textField.getAccessible());
	textField.getAccessible().addAccessibleListener(new AccessibleAdapter() {
		@Override
		public void getDescription(AccessibleEvent event) {
			event.result = liveLabel.getText();
		}
	});

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