/*******************************************************************************
 * 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.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.details.IValue;
import org.eclipse.bpel.common.ui.details.TextIValue;
import org.eclipse.bpel.common.ui.details.widgets.DecoratedLabel;
import org.eclipse.bpel.common.ui.details.widgets.StatusLabel2;
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
import org.eclipse.bpel.common.ui.flatui.FlatFormData;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.adapters.INamedElement;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;


/**
 * Details section for the "name" property (which is common to most BPEL elements).
 */

@SuppressWarnings("boxing")
public class NameSection extends BPELPropertySection {
	
	protected Text fNameText;
	
	protected StatusLabel2 statusLabel;

	protected EditController fNameEditController;

	INamedElement fNamedElement;
		
	
	@Override
	protected MultiObjectAdapter[] createAdapters() {
		return new MultiObjectAdapter[] {
			/* model object */
			new MultiObjectAdapter() {
				
				@Override
				public void notify (Notification n) {
					if (markersHaveChanged(n)) {
						updateMarkers();
						return ;
					}
				}
			},
		};
	}

	@Override
	protected void basicSetInput (EObject input) {
		super.basicSetInput(input);

		fNamedElement = BPELUtil.adapt(input,INamedElement.class);
		
		fNameEditController.setInput(input);
	}
	

	protected void createNameWidgets(Composite composite) {
		FlatFormData data;

		DecoratedLabel nameLabel = new DecoratedLabel(composite,SWT.LEFT);
		fWidgetFactory.adapt(nameLabel);		
		nameLabel.setText(Messages.NameDetails_BPEL_Name__3); 
		statusLabel = new StatusLabel2( nameLabel );		
		
		fNameText = 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(0, IDetailsAreaConstants.VSPACE );
		fNameText.setLayoutData(data);

		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(fNameText, -IDetailsAreaConstants.HSPACE);
		data.top = new FlatFormAttachment(fNameText, 0, SWT.CENTER);
		nameLabel.setLayoutData(data);
				
		
		
	}
	
	protected void createChangeTrackers() {
			
		
//		fChangeHelper = new ChangeHelper ( getCommandFramework() ) {
//			public String getLabel() {
//				return IBPELUIConstants.CMD_EDIT_NAME;
//			}
//			public Command createApplyCommand() {
//									
//				final String newName = fNameText.getText().trim();
//				
//				if (newName.length() == 0 || newName.equals(namedElement.getName(getModel()))) {
//					return null; // there is nothing to be done
//				}
//				
//				return wrapInShowContextCommand(
//						new UpdateModelCommand(getInput(), getLabel() ) {							
//							@Override
//							public void doExecute() {
//								namedElement.setName(fTarget, newName);
//							}													
//						});						
//			}
//			
//			public void restoreOldState() {
//				updateNameWidgets();
//			}			
//		};
//		
//		fChangeHelper.startListeningTo(fNameText);
//		
		
		/** TODO: Empty Name should never be set */
		
		fNameEditController = new EditController(getCommandFramework()) {
			@Override
			public boolean checkNotification (Notification notification) {
				return fNamedElement != null && fNamedElement.isNameAffected(fNameEditController.getInput(), notification);				
			}
			@Override
			public Command createApplyCommand() {
				return wrapInShowContextCommand( super.createApplyCommand() );
			}
			
		};		
		fNameEditController.setLabel( BPELPackage.eINSTANCE.getActivity_Name().getName() );
		
		fNameEditController.setViewIValue(new TextIValue ( fNameText )) ;
		fNameEditController.setModeIValue(new IValue () {
			public Object get() {			
				return fNamedElement != null ? fNamedElement.getName( fNameEditController.getInput() ) : null;
			}
			public void set (Object object) {				
				if (fNamedElement != null) {
					fNamedElement.setName(fNameEditController.getInput(),object.toString() );								
				}
			}			
		});
		
		fNameEditController.startListeningTo(fNameText);
	
	}
	
	@Override
	protected void createClient(Composite parent) {
		Composite composite = createFlatFormComposite(parent);
		createNameWidgets(composite);
		createChangeTrackers();
		PlatformUI.getWorkbench().getHelpSystem().setHelp(
			composite, IHelpContextIds.PROPERTY_PAGE_NAME);
	}

	
	
	@Override
	protected void updateMarkers () {				
		statusLabel.clear();		
		for(IMarker m : getMarkers(getInput())) {
			statusLabel.addStatus( BPELUtil.adapt(m, IStatus.class) );
		}		
	}
	
	
	protected IStatus validate() {
		// IStatus status = ValidationHelper.validateXML_NCName(nameText.getText());
		//if (status.isOK())
			return validate(getInput());
		//else
		//   return status;
	}

	protected IStatus validate (Object currentElement ) {
		
		if (currentElement instanceof EObject) { // i.e. PartnerLink,Variable, Correlation Set, etc.
			
			EObject elm = (EObject) currentElement;
			
			EObject elmContainer = elm.eContainer();
			
			if (elmContainer != null) {				
				EList el = elmContainer.eContents();
				for(int i=0, j=el.size() ; i < j; i++) {
					Object next = el.get(i);
					if ((next instanceof EObject) == false) {
						continue;
					}
					EObject loopElement = (EObject) next;

                    EAttribute eAttribute = getNAMEAttribute(loopElement.eClass().getEAllAttributes() );
            
                    if (eAttribute != null) {
                        Object name = loopElement.eGet(eAttribute);
                        if (name != null) {
                            // is there another element with the same name?
                            if (name.equals(fNameText.getText()) && !loopElement.equals(currentElement)) {   
                                String message = NLS.bind(Messages.NameDetails_RenameErrorMessage, (new Object[] {fNameText.getText()})); 
                                return new Status( IStatus.ERROR, BPELUIPlugin.PLUGIN_ID, IStatus.ERROR, message, null);
                            } 
                        }
                    }					
				}
			}
		}
        return new Status( IStatus.OK, BPELUIPlugin.PLUGIN_ID, IStatus.OK, "Hi There", null); //$NON-NLS-1$
	} 
    
	
	
	protected EAttribute getNAMEAttribute(EList list) {
		
		if (list != null) {
			for (int i = 0; i < list.size();i++) {
				EObject eo = (EObject)list.get(i);
				
				if (eo instanceof EAttribute) {
					EAttribute ea = (EAttribute)eo;
					
					if (ea.getName().equalsIgnoreCase("name")) { //$NON-NLS-1$
						return (EAttribute)eo;
					}
				}
			}
		}
		return null;					
	}
	
	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext()
	 */
	@Override
	public Object getUserContext() {
		return null;
	}
	
	
	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object)
	 */
	@Override
	public void restoreUserContext(Object userContext) {
		fNameText.setFocus();
	}

	/**
	 * Goto the specific marker. This is only called when isValidMarker
	 * returns true.
	 * 
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#gotoMarker(org.eclipse.core.resources.IMarker)
	 */
	
	@Override
	public void gotoMarker (IMarker marker) {
		fNameText.setFocus() ;		
	}

	/**
	 * 
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#isValidMarker(org.eclipse.core.resources.IMarker)
	 */
	
	@Override
	public boolean isValidMarker (IMarker marker) {
		String context = null;
		try {
			context = (String) marker.getAttribute("href.context");
		} catch (Exception ex) {
			return false;
		}
		return "name".equals (context);
	}	
}
