/*******************************************************************************
 * Copyright (c) 2008, 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.extensionssample.ui.properties;

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.extensionsample.model.SampleStructuredActivity;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.ui.adapters.INamedElement;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.util.AutoUndoCommand;
import org.eclipse.bpel.ui.properties.BPELPropertySection;
import org.eclipse.bpel.ui.properties.EditController;
import org.eclipse.bpel.ui.properties.VariableTypeSelector;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDTypeDefinition;

/*
 * Bug 120110
 * This class implements the detail property tab for the "structured" extension activity
 * This property detail tab allows definition of a variable name and type, which (presumably)
 * will be in-scope for the children of this container activity.
 * 
 * This class demonstrates the use of a change tracker to update the model and keep the XML
 * source in sync with the property page widgets.
 * 
 * Note that validation of this activity is not yet implemented.
 */
public class SampleStructuredActivityPropertySection extends BPELPropertySection {
	
	protected VariableTypeSelector variableTypeSelector;
	protected Composite parentComposite;
	protected Text variableName;
	protected EditController variableNameEditController;
	INamedElement variableNamedElement;
	
	public class VariableTypeCallback implements VariableTypeSelector.Callback {

		/**
		 * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectRadioButton(int)
		 */
		
		/* (non-Javadoc)
		 * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectRadioButton(int)
		 */
		public void selectRadioButton(final int index) {
			throw new IllegalArgumentException("oops!");
		}

		/* (non-Javadoc)
		 * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDType(org.eclipse.xsd.XSDTypeDefinition)
		 */
		public void selectXSDType(XSDTypeDefinition xsdType) {
			applyChanges(xsdType);
		}
		
		/* (non-Javadoc)
		 * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDElement(org.eclipse.xsd.XSDElementDeclaration)
		 */
		public void selectXSDElement(XSDElementDeclaration xsdElement) {
			applyChanges(xsdElement);
		}
		
		/* (non-Javadoc)
		 * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectMessageType(org.eclipse.wst.wsdl.Message)
		 */
		public void selectMessageType(Message message) {
			applyChanges(message); 
		}
	}

	private SampleStructuredActivity getActivity() {
		SampleStructuredActivity activity = (SampleStructuredActivity)getInput();
		// make sure this has a Variable
		if (activity.getVariable() == null)
			activity.setVariable(BPELFactory.eINSTANCE.createVariable());
		return activity;
	}

	@Override
	protected MultiObjectAdapter[] createAdapters() {
		return new MultiObjectAdapter[] {
			/* model object */
			new BatchedMultiObjectAdapter() {
				
				@Override
				public void notify (Notification n) {
				}
				
				@Override
				public void finish() {
					updateVariableTypeSelector();
				}
			}
		};
	}

	@Override
	protected void createClient(Composite parent) {
		FlatFormData data;

		Composite composite = parentComposite = createFlatFormComposite(parent);
		Label description = getWidgetFactory().createLabel(composite, "Declare a variable that is in scope only for this structured activity");
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE );
		description.setLayoutData(data);
		
		Label nameLabel = getWidgetFactory().createLabel(composite, "Variable Name:");
		
		variableName = fWidgetFactory.createText(composite, EMPTY_STRING);
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG));
		data.right = new FlatFormAttachment(100, (-2) * IDetailsAreaConstants.HSPACE );
		data.top = new FlatFormAttachment(description, 10, SWT.LEFT);
		variableName.setLayoutData(data);
		
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(variableName, -IDetailsAreaConstants.HSPACE);
		data.top = new FlatFormAttachment(variableName, 0, SWT.CENTER);
		nameLabel.setLayoutData(data);
		
		variableTypeSelector = new VariableTypeSelector(composite, SWT.NONE, getBPELEditor(),
			fWidgetFactory, new VariableTypeCallback());
		data = new FlatFormData();
		data.top = new FlatFormAttachment(nameLabel,0, SWT.LEFT);
		data.left = new FlatFormAttachment(0,0);
		data.right = new FlatFormAttachment(100,0);
		data.bottom = new FlatFormAttachment(100,0);
		variableTypeSelector.setLayoutData(data);

		createChangeTrackers();
	}
	
	protected void createChangeTrackers() {
		variableNameEditController = new EditController(getCommandFramework()) {
			@Override
			public boolean checkNotification (Notification notification) {
				return variableNamedElement != null && variableNamedElement.isNameAffected(variableNameEditController.getInput(), notification);				
			}
			@Override
			public Command createApplyCommand() {
				return wrapInShowContextCommand( createCommand(null) );
			}
			
		};		
		variableNameEditController.setLabel( BPELPackage.eINSTANCE.getActivity_Name().getName() );
		
		variableNameEditController.setViewIValue(new TextIValue ( variableName )) ;
		variableNameEditController.setModeIValue(new IValue () {
			public Object get() {			
				return variableNamedElement != null ? variableNamedElement.getName( variableNameEditController.getInput() ) : null;
			}
			public void set (Object object) {				
				if (variableNamedElement != null) {
					variableNamedElement.setName(variableNameEditController.getInput(),object.toString() );								
				}
			}			
		});
		
		variableNameEditController.startListeningTo(variableName);
	}
	
	protected Command createCommand(final EObject type) {
		CompoundCommand command = new CompoundCommand();
		command.add(new AutoUndoCommand(getProcess()) {
			@Override
			public void doExecute() {
				SampleStructuredActivity activity = getActivity();
				Variable variable = activity.getVariable();
				variable.setName(variableName.getText());
				// https://issues.jboss.org/browse/JBIDE-8045
				// Data caught by fault handler can be either a Message Type
				// or an XSD Element.
				if (type instanceof Message) {
				    variable.setMessageType((Message)type);
					variable.setXSDElement(null);
					variable.setType(null);
				}
				else if (type instanceof XSDElementDeclaration) {
				    variable.setMessageType(null);
					variable.setXSDElement((XSDElementDeclaration)type);
					variable.setType(null);
				}
				else if (type instanceof XSDTypeDefinition) {
				    variable.setMessageType(null);
					variable.setXSDElement(null);
					variable.setType((XSDTypeDefinition)type);
				}
				
				if (variable==activity.getVariable())
					// force update of variable
					activity.setVariable(null);
				activity.setVariable(variable);
			}
		});
		return command;
	}
	
	protected void applyChanges(final EObject type) {
		Command command = createCommand(type);
		getCommandFramework().execute(wrapInShowContextCommand(command));
	}

	public void updateVariableName() {
		if (getActivity() != null ) {
			Variable variable = getActivity().getVariable();
			variableName.setText(variable==null || variable.getName()==null ? "" : variable.getName());
		}
	}
	
	public void updateVariableTypeSelector() {
		if (getActivity() != null ) {
			Variable variable = getActivity().getVariable();
			variableTypeSelector.setVariable(variable);
		}
	}
	
	@Override
	protected void basicSetInput(EObject newInput) {
		if ( newInput instanceof SampleStructuredActivity) {
			super.basicSetInput(newInput);
			updateVariableTypeSelector();
			updateVariableName();
			variableNamedElement = BPELUtil.adapt(getActivity().getVariable(),INamedElement.class);
			variableNameEditController.setInput(getActivity().getVariable());
		}
	}
}
