/*******************************************************************************
 * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
 * 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:
 *     Michael Jastram - initial API and implementation
 *     Kay M??nch       - vertical alignment of the spec objects id
 ******************************************************************************/

package org.eclipse.rmf.reqif10.pror.presentation.id.provider;


import java.util.Collection;
import java.util.List;

import org.agilemore.agilegrid.AgileGrid;
import org.agilemore.agilegrid.CellEditor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.rmf.reqif10.AttributeDefinition;
import org.eclipse.rmf.reqif10.AttributeDefinitionString;
import org.eclipse.rmf.reqif10.AttributeValue;
import org.eclipse.rmf.reqif10.AttributeValueString;
import org.eclipse.rmf.reqif10.DatatypeDefinition;
import org.eclipse.rmf.reqif10.ReqIF10Package;
import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
import org.eclipse.rmf.reqif10.SpecType;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.provider.ProrPresentationConfigurationItemProvider;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.IProrCellRenderer;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationEditorInterface;
import org.eclipse.rmf.reqif10.pror.presentation.id.IdConfiguration;
import org.eclipse.rmf.reqif10.pror.presentation.id.IdPackage;
import org.eclipse.rmf.reqif10.pror.presentation.ui.IdLabelCellRenderer;

/**
 * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.pror.presentation.id.IdConfiguration} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated NOT
 */
public class IdConfigurationItemProvider
	extends ProrPresentationConfigurationItemProvider
	implements
		IEditingDomainItemProvider, IStructuredItemContentProvider,
		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
		PresentationEditorInterface {
	/**
	 * This constructs an instance from a factory and a notifier.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IdConfigurationItemProvider(AdapterFactory adapterFactory) {
		super(adapterFactory);
	}

	/**
	 * This returns the property descriptors for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
		if (itemPropertyDescriptors == null) {
			super.getPropertyDescriptors(object);

			addPrefixPropertyDescriptor(object);
			addCountPropertyDescriptor(object);
			addVerticalAlignPropertyDescriptor(object);
		}
		return itemPropertyDescriptors;
	}

	/**
	 * This adds a property descriptor for the Prefix feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addPrefixPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_IdConfiguration_prefix_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_prefix_feature", "_UI_IdConfiguration_type"),
				 IdPackage.Literals.ID_CONFIGURATION__PREFIX,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Count feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addCountPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_IdConfiguration_count_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_count_feature", "_UI_IdConfiguration_type"),
				 IdPackage.Literals.ID_CONFIGURATION__COUNT,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Vertical Align feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addVerticalAlignPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_IdConfiguration_verticalAlign_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_IdConfiguration_verticalAlign_feature", "_UI_IdConfiguration_type"),
				 IdPackage.Literals.ID_CONFIGURATION__VERTICAL_ALIGN,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This returns IdConfiguration.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	@Override
	public Object getImage(Object object) {
		return super.getImage(object);
	}

	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	@Override
	public String getText(Object object) {
		IdConfiguration idConfiguration = (IdConfiguration)object;
		if (idConfiguration.getDatatype() == null) 
			return getString("_UI_IdConfiguration_type_not_set");
		return getString("_UI_IdConfiguration_type", new Object[] {
				idConfiguration.getDatatype().getLongName(),
				idConfiguration.getCount() });
	}

	/**
	 * This handles model notifications by calling {@link #updateChildren} to update any cached
	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void notifyChanged(Notification notification) {
		updateChildren(notification);

		switch (notification.getFeatureID(IdConfiguration.class)) {
			case IdPackage.ID_CONFIGURATION__PREFIX:
			case IdPackage.ID_CONFIGURATION__COUNT:
			case IdPackage.ID_CONFIGURATION__VERTICAL_ALIGN:
				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
				return;
		}
		super.notifyChanged(notification);
	}

	/**
	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
	 * that can be created under this object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
		super.collectNewChildDescriptors(newChildDescriptors, object);
	}

	/**
	 * Return the resource locator for this item provider's resources.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public ResourceLocator getResourceLocator() {
		return IDEditPlugin.INSTANCE;
	}

	// Listener to be attached to the ReqIF
	private EContentAdapter contentAdapter;

	/**
	 * We do two things:
	 * <ul>
	 * <li>Register an adapter with the model to set IDs as needed
	 * <li>Register an adapter with the config element to react to config value
	 * changes.
	 * <ul>
	 */
	public void registerPresentationConfiguration(
			final ProrPresentationConfiguration config,
			final EditingDomain editingDomain) {
		registerModelListener((IdConfiguration) config, editingDomain);

		config.eAdapters().add(new AdapterImpl() {
			public void notifyChanged(Notification notification) {
				if (notification.getFeature() == ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATION__DATATYPE) {
					unregisterModelListener(config);
					registerModelListener((IdConfiguration) config,
							editingDomain);
				}
			}
		});
	}

	public void unregisterPresentationConfiguration(
			ProrPresentationConfiguration config) {
		unregisterModelListener(config);
	}

	private void registerModelListener(final IdConfiguration config,
			final EditingDomain editingDomain) {
		if (contentAdapter != null) {
			throw new IllegalStateException(
					"Cannot register IDConfigAdapter without unregistering first!");
		}
		contentAdapter = new EContentAdapter() {

			/**
			 * Action has to be taken when the SpecType changes
			 */
			@Override
			public void notifyChanged(Notification notification) {
				super.notifyChanged(notification);
				if (notification.getNotifier() instanceof SpecElementWithAttributes) {
					updateSpecElementIfNecessary(config,
							(SpecElementWithAttributes) notification
									.getNotifier(), editingDomain);
				}
			}

			@Override
			public void setTarget(final Notifier target) {
				super.setTarget(target);
				if (target instanceof SpecElementWithAttributes) {
					updateSpecElementIfNecessary(config,
							(SpecElementWithAttributes) target, editingDomain);
				}
			}
		};
		ReqIF10Util.getReqIF(config).getCoreContent().eAdapters()
				.add(contentAdapter);
	}

	protected void updateSpecElementIfNecessary(IdConfiguration config,
			SpecElementWithAttributes target, EditingDomain editingDomain) {
		
		if (config.getDatatype() == null) {
			return;
		}

		SpecElementWithAttributes specElement = (SpecElementWithAttributes) target;

		// 1. Find out whether there is a matching AttributeDefinition
		SpecType type = ReqIF10Util.getSpecType(specElement);
		if (type == null)
			return;

		AttributeDefinitionString attrDef = null;
		for (AttributeDefinition ad : type.getSpecAttributes()) {
			DatatypeDefinition dd = ReqIF10Util.getDatatypeDefinition(ad);
			if (config.getDatatype().equals(dd)) {
				attrDef = (AttributeDefinitionString) ad;
				break;
			}
		}

		// 2. No: Nothing to do, otherwise find Find out whether
		// there is already a value
		if (attrDef == null)
			return;
		AttributeValueString value = (AttributeValueString) ReqIF10Util
				.getAttributeValue(specElement, attrDef);

		// 3. Yes: Nothing to do, otherwise proceed
		if (value != null)
			return;
		value = (AttributeValueString) ReqIF10Util
				.createAttributeValue(attrDef);
		int newCount = config.getCount() + 1;
		value.setTheValue(config.getPrefix() + newCount);

		String label = "Assigning ID " + config.getPrefix() + newCount;
		CompoundCommand cmd = new CompoundCommand(label);
		cmd.append(SetCommand.create(editingDomain, config,
				IdPackage.Literals.ID_CONFIGURATION__COUNT, newCount));
		cmd.append(AddCommand.create(editingDomain, specElement,
				ReqIF10Package.Literals.SPEC_ELEMENT_WITH_ATTRIBUTES__VALUES,
				value));
		editingDomain.getCommandStack().execute(cmd);
	}

	private void unregisterModelListener(ProrPresentationConfiguration config) {
		if (contentAdapter != null) {
			ReqIF10Util.getReqIF(config).getCoreContent().eAdapters()
					.remove(contentAdapter);
			contentAdapter = null;
		}
	}

	public Command handleDragAndDrop(Collection<?> source, Object target,
			EditingDomain editingDomain, int operation) {
		// No drag and drop support
		return null;
	}

	public String getLabel(AttributeValue av) {
		// No custom label
		return null;
	}

	/**
	 * Don't allow editing.
	 */
	public boolean canEdit() {
		return false;
	}
	
	IProrCellRenderer renderer = null;

	/**
	 * Use special renderer.
	 */
	public IProrCellRenderer getCellRenderer(AttributeValue av) {
		if (renderer == null) {
			renderer = new IdLabelCellRenderer();
		}
		return renderer;
	}

	/**
	 * No special {@link CellEditor}.
	 */
	public CellEditor getCellEditor(AgileGrid agileGrid,
			EditingDomain editingDomain, AttributeValue av,
			SpecElementWithAttributes parent, Object affectedObject) {
		return null;
	}

	/**
	 * Not suggested as default.
	 */
	public Class<? extends DatatypeDefinition> suggestAsDefault() {
		return null;
	}

}
