/*******************************************************************************
 * 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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);
	}
}
