/*******************************************************************************
 * Copyright (c) 2015 Red Hat Inc.
 * 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:
 *     Red Hat Inc - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.snippets;

import java.util.concurrent.atomic.*;

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * Buttons with various arrows and methods that affect arrow directions.
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
public class Snippet366 {
	  static Display display = new Display();
	  static Shell shell = new Shell(display);

	public static void main (String [] args) {
		shell.setLayout (new RowLayout ());
		
		makeArrowGroup ();
		makeAlignGroup ();
		makeOrientationGroup ();

		shell.pack ();
		shell.open ();
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ())
				display.sleep ();
		}
		display.dispose ();
	}

	private static void makeOrientationGroup () {
		Group orientationGroup = new Group (shell, SWT.None);
		orientationGroup.setLayout (new RowLayout ());
		orientationGroup.setText ("Orientation group");

		final AtomicInteger prevDir = new AtomicInteger (0);
		final Button alignmentButton = new Button (orientationGroup, SWT.ARROW | SWT.RIGHT);
		alignmentButton.addListener (SWT.MouseDown, new Listener() {

			@Override
			public void handleEvent (Event event) {
				switch (prevDir.get ()) {
					case 0:
						alignmentButton.setOrientation (SWT.LEFT_TO_RIGHT);
						prevDir.set (1);
						break;
					case 1:
						alignmentButton.setOrientation (SWT.RIGHT_TO_LEFT);
						prevDir.set (0);
						break;
					default:
						break;
				}
			}
		});
	}

	private static void makeAlignGroup () {
		Group alignGroup = new Group (shell, SWT.None);
		alignGroup.setLayout (new RowLayout ());
		alignGroup.setText ("Alignment group");

		final AtomicInteger prevDir = new AtomicInteger (0);
		final Button alignmentButton = new Button (alignGroup, SWT.ARROW | SWT.UP);
		alignmentButton.addListener (SWT.MouseDown, new Listener() {

			@Override
			public void handleEvent (Event event) {
				switch (prevDir.get ()) {
					case 0:
						alignmentButton.setAlignment (SWT.RIGHT);
						prevDir.set (1);
						break;
					case 1:
						alignmentButton.setAlignment (SWT.DOWN);
						prevDir.set (2);
						break;
					case 2:
						alignmentButton.setAlignment (SWT.LEFT);
						prevDir.set (3);
						break;
					case 3:
						alignmentButton.setAlignment (SWT.UP);
						prevDir.set (0);
					default:
						break;
				}
			}
		});
	}

	private static void makeArrowGroup () {
		Group arrowGroup = new Group(shell, SWT.None);
		arrowGroup.setText ("Arrow group");
		arrowGroup.setLayout (new RowLayout ());

		new Button (arrowGroup,  SWT.ARROW | SWT.LEFT);
		new Button (arrowGroup,  SWT.ARROW | SWT.RIGHT);
		new Button (arrowGroup,  SWT.ARROW | SWT.UP);
		new Button (arrowGroup,  SWT.ARROW | SWT.DOWN);
	}
}
