/*******************************************************************************
 * Copyright (c) 2013 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;

/*
 * BIDI example snippet: Set the text direction independent of the widget orientation.
 *
 * Note: This snippet currently only works on Windows.
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet364 {

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new GridLayout(1, false));

		Image i = new Image(display, Snippet364.class.getResourceAsStream("eclipse.png"));
		Button b = new Button(shell, SWT.PUSH | SWT.LEFT_TO_RIGHT);
		b.setText("Button LEFT_TO_RIGHT...");
		b.setImage(i);

		Button b2 = new Button(shell, SWT.PUSH | SWT.RIGHT_TO_LEFT);
		b2.setText("Button RIGHT_TO_LEFT...");
		b2.setImage(i);

		new Label(shell, SWT.NONE).setText("with FLIP_TEXT_DIRECTION:");

		Button b3 = new Button(shell, SWT.PUSH | SWT.LEFT_TO_RIGHT | SWT.FLIP_TEXT_DIRECTION);
		b3.setText("Button LEFT_TO_RIGHT...");
		b3.setImage(i);

		Button b4 = new Button(shell, SWT.PUSH | SWT.RIGHT_TO_LEFT | SWT.FLIP_TEXT_DIRECTION);
		b4.setText("Button RIGHT_TO_LEFT...");
		b4.setImage(i);

		shell.pack();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
		i.dispose();
	}

}
