/*******************************************************************************
 * Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
 *
 * 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
 *******************************************************************************/
package org.eclipse.example.calc.internal.ui.swt;

import org.eclipse.example.calc.Operations;
import org.eclipse.example.calc.internal.Calculator;
import org.eclipse.example.calc.internal.TextProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/*
 * A simple calculator featuring a SWT
 *  UI.
 */
public class CalculatorUI implements TextProvider, SelectionListener {

	private static final long serialVersionUID = 1L;

	private Calculator calculator;

	private Shell shell;

	private Text display;

	private Button[] numberButtons;

	private Button[] cmdButtons;

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new CalculatorUI().open(display);
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	private Shell open(Display display) {
		shell = new Shell(display);
		setupGUI();

		shell.pack();
		shell.open();
		return shell;
	}

	public CalculatorUI() {
		calculator = new Calculator(this);
	}

	private void setupGUI() {
		shell.setText(Calculator.NAME);
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 1;
		gridLayout.marginHeight = gridLayout.marginWidth = 0;
		shell.setLayout(gridLayout);

		setupDisplay();
		setupNumberButtons();
		setupCommandButtons();

	}

	private void setupDisplay() {
		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		display = new Text(shell, SWT.BORDER_SOLID | SWT.RIGHT);
		display.setLayoutData(gridData);
		display.setText("0");
		calculator.setClearText(true);
	}

	private void setupNumberButtons() {
		Composite numberButtonsPanel = new Composite(shell, SWT.NONE);
		numberButtonsPanel.setLayout(new GridLayout(4, true));
		numberButtons = new Button[11];

		for (int i = 0; i < numberButtons.length - 1; i++) {
			addNumberButton(numberButtonsPanel, i, Integer.valueOf(i)
					.toString());
		}
		addNumberButton(numberButtonsPanel, 10, ".");
	}

	private void addNumberButton(Composite parent, int i, String name) {
		numberButtons[i] = new Button(parent, SWT.PUSH);
		numberButtons[i].setText(name);
		numberButtons[i].addSelectionListener(this);
	}

	private void setupCommandButtons() {
		// command buttons
		Group cmdButtonsPanel = new Group(shell, SWT.NONE);
		cmdButtonsPanel.setText("Operations");
		cmdButtonsPanel.setLayout(new GridLayout(4, true));

		cmdButtons = new Button[Operations.INSTANCE.size()];

		// make the buttons, set ActionListener and add to panel
		for (int i = 0; i < cmdButtons.length; i++) {
			addCommandButton(cmdButtonsPanel, i);
		}
	}

	private void addCommandButton(Composite parent, int i) {
		cmdButtons[i] = new Button(parent, SWT.NONE);
		cmdButtons[i].setText(Operations.INSTANCE.getOperationName(i));
		cmdButtons[i].addSelectionListener(this);
	}

	@Override
	public void widgetDefaultSelected(SelectionEvent arg0) {
		// empty
	}

	@Override
	public void widgetSelected(SelectionEvent event) {
		String str = ((Button) event.getSource()).getText();
		calculator.handleButtonClick(str);
	}

	@Override
	public void setDisplayText(String text) {
		display.setText(text);
	}

	@Override
	public String getDisplayText() {
		return display.getText();
	}

}
