/*******************************************************************************
 * Copyright (c) 2005, 2012 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.bpel.ui.properties;

import org.eclipse.bpel.common.ui.details.ButtonIValue;
import org.eclipse.bpel.common.ui.details.DelegateIValue;
import org.eclipse.bpel.common.ui.details.FocusContext;
import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.details.IValue;
import org.eclipse.bpel.common.ui.details.TextIValue;
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
import org.eclipse.bpel.common.ui.flatui.FlatFormData;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.factories.BPELUIObjectFactory;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.XSDUtils;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

/**
 * Details section for the ForEach activity
 */
public class ForEachSection extends BPELPropertySection {

	Text				fCounterNameText;
	Composite			counterNameVariableComposite;
	Button				fIsParallelCheckbox;
	Composite			isParallelComposite;
	
	EditController fParallelExecutionController ;
	EditController fVariableNameController;
	
	IValue fContext;
	
	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext()
	 */
	@Override
	public Object getUserContext() {
		return fContext.get();
	}

	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object)
	 */
	@Override
	public void restoreUserContext (Object userContext) {
		fContext.set(userContext);
	}

	
	@Override
	protected void basicSetInput(EObject newInput) {		
		super.basicSetInput(newInput);
		
		fParallelExecutionController.setInput(newInput);
		fVariableNameController.setInput(newInput);
	}

	void createChangeTrackers() {
		
		/** Parallel execution setting/un-setting */
		fParallelExecutionController = createEditController();
		fParallelExecutionController.setFeature( BPELPackage.eINSTANCE.getForEach_Parallel() );
		fParallelExecutionController.setViewIValue( new ButtonIValue( fIsParallelCheckbox ));
		fParallelExecutionController.startListeningTo( fIsParallelCheckbox );
		
	
		/** Variable name setting/un-setting */
		fVariableNameController = createEditController();				
		
		fVariableNameController.setFeature( BPELPackage.eINSTANCE.getForEach_CounterName() );
		fVariableNameController.setViewIValue( new DelegateIValue( new TextIValue ( fCounterNameText ) ) {
			@Override
			public Object get() {
				String name = (String) fDelegate.get();
				if (name.length() == 0) {
					return null;
				}
				/** Convert text to variable for insertion into for each */
				Variable variable =  BPELFactory.eINSTANCE.createVariable(); 
				variable.setName(name);
				variable.setType( XSDUtils.getPrimitive(BPELUIObjectFactory.FOR_EACH_COUNTER_VARIABLE_TYPE) );
				return variable;
			}

			@Override
			public void set( Object object ) {
				if( object == null )
					fDelegate.set( null );
				else
					fDelegate.set(((Variable) object).getName());
			}
			
		});
		fVariableNameController.startListeningTo(fCounterNameText);
		
		
	}

	private void createCounterNameWidgets(Composite parentComposite) {
		FlatFormData data;

		counterNameVariableComposite = createFlatFormComposite(parentComposite);
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.top = new FlatFormAttachment(isParallelComposite,
				IDetailsAreaConstants.VSPACE);
		data.right = new FlatFormAttachment(100, 0);
		counterNameVariableComposite.setLayoutData(data);

		Label variableLabel = fWidgetFactory
				.createLabel(
						counterNameVariableComposite,
						Messages.ForEachSection_COUNTER_NAME);

		fCounterNameText = fWidgetFactory.createText(counterNameVariableComposite,EMPTY_STRING);
		data = new FlatFormData();
		data.top = new FlatFormAttachment(0, 0);
		data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
				variableLabel, STANDARD_LABEL_WIDTH_AVG));
		data.right = new FlatFormAttachment(100, 0);
		fCounterNameText.setLayoutData(data);

		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(fCounterNameText,
				-IDetailsAreaConstants.HSPACE);
		data.top = new FlatFormAttachment(fCounterNameText, 0, SWT.CENTER);
		variableLabel.setLayoutData(data);

	}

	private void createIsParallelWidgets(Composite parentComposite) {
		FlatFormData data;

		isParallelComposite = createFlatFormComposite(parentComposite);
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.top = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(100, 0);
		isParallelComposite.setLayoutData(data);

		fIsParallelCheckbox = fWidgetFactory
				.createButton(
						isParallelComposite,
						Messages.ForEachSection_IS_PARALLEL,
						SWT.CHECK);
		
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.top = new FlatFormAttachment(0, 0);
		fIsParallelCheckbox.setLayoutData(data);
	}

	
	@Override
	protected void createClient(Composite parent) {
		Composite parentComposite = createFlatFormComposite(parent);
		createIsParallelWidgets(parentComposite);
		createCounterNameWidgets(parentComposite);
		fContext = new FocusContext ( fIsParallelCheckbox, fCounterNameText );
		
		createChangeTrackers();
		
    PlatformUI.getWorkbench().getHelpSystem().setHelp(
      parentComposite, IHelpContextIds.PROPERTY_PAGE_FOR_EACH);
	}
}
