/*******************************************************************************
 * Copyright (c) 2007, 2010 BMW Car IT, Technische Universitaet Muenchen, 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:
 * BMW Car IT - Initial API and implementation
 * Technische Universitaet Muenchen - Major refactoring and extension
 *******************************************************************************/
package org.eclipse.emf.edapt.history.instantiation.ui;

import org.eclipse.emf.edapt.common.ui.ResizeableDialogBase;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

/**
 * Dialog to enter a Groovy script
 *
 * @author herrmama
 * @author $Author$
 * @version $Rev$
 * @levd.rating RED Rev:
 */
public class ScriptDialog extends ResizeableDialogBase {

	/**
	 * Last script
	 */
	private static String lastScript = ""; //$NON-NLS-1$

	/**
	 * Text widget
	 */
	private Text scriptText;

	/**
	 * Script
	 */
	private String script;

	/**
	 * Constructor
	 */
	public ScriptDialog() {
		super(new Point(640, 480), "Run script", //$NON-NLS-1$
			"This dialog allows to enter a script to be executed."); //$NON-NLS-1$
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Control createDialogArea(Composite parent) {
		parent = (Composite) super.createDialogArea(parent);

		final Composite composite = new Composite(parent, SWT.None);
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		final GridLayout layout = new GridLayout(1, false);
		composite.setLayout(layout);

		scriptText = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
		scriptText.setLayoutData(new GridData(GridData.FILL_BOTH));
		scriptText.setText(lastScript);

		return parent;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void okPressed() {
		script = scriptText.getText();
		lastScript = script;
		super.okPressed();
	}

	/**
	 * Get the script
	 *
	 * @return Groovy script
	 */
	public String getScript() {
		return script;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void setShellStyle(int newShellStyle) {
		super.setShellStyle(newShellStyle | SWT.RESIZE);
	}
}
