package org.eclipse.bpel.ui.properties.xtext;

import org.eclipse.bpel.ui.properties.AbstractExpressionAssignCategory;
import org.eclipse.bpel.ui.properties.IAssignCategory;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.xtext.ui.editor.XtextSourceViewer;
import org.eclipse.xtext.ui.editor.embedded.EmbeddedEditor;

import com.google.inject.Injector;

/**
 * An {@link IAssignCategory} specialized to provide a StyledText configured for
 * an Xtext DSL, relying on {@link EmbeddedEditor} which is NOT an editor, but
 * provides a {@link XtextSourceViewer}.
 * 
 * @author Lorenzo Bettini
 * 
 */
@SuppressWarnings("restriction")
public abstract class AbstractXtextExpressionAssignCategory extends
		AbstractExpressionAssignCategory implements IAssignCategory {

	/**
	 * @param styledTextComposite
	 *            the Composite for the StyledText
	 * @return the created and configured StyledText based on an
	 *         {@link EmbeddedEditor}
	 */
	protected StyledText createStyledText(Composite styledTextComposite) {
		Composite editor = getWidgetFactory().createComposite(this.fEditorArea,
				SWT.BORDER);
		editor.setLayout(new GridLayout());

		GridData layoutData = new GridData(GridData.FILL_BOTH);
		editor.setLayoutData(layoutData);

		EmbeddedEditor embeddedEditor = getInjector().getInstance(
				XtextEmbeddedEditorProvider.class).getXtextEmbeddedEditor(
				editor);
		final ISourceViewer viewer = embeddedEditor.getViewer();
		StyledText textWidget = viewer.getTextWidget();
		// textWidget.setLayoutData(new GridData(GridData.FILL_BOTH));

		return textWidget;
	}

	/**
	 * This must redefined so to return the {@link Injector} for your own Xtext
	 * DSL.
	 * 
	 * You can get the injector from the Activator generated by Xtext for your
	 * DSL in the ui plugin, for instance
	 * 
	 * <pre>
	 * org.xtext.example.mydsl.ui.internal.MyDslActivator.getInstance().getInjector(
	 * 		MyDslActivator.ORG_XTEXT_EXAMPLE_MYDSL_MYDSL);
	 * </pre>
	 * 
	 * @return
	 */
	public abstract Injector getInjector();

	/**
	 * A string to identify your DSL.
	 * 
	 * @see org.eclipse.bpel.ui.properties.AbstractExpressionAssignCategory#getExpressionLanguage()
	 */
	public abstract String getExpressionLanguage();
}
