/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package comrel.provider;


import comrel.ComrelFactory;
import comrel.ComrelPackage;
import comrel.ConditionalUnit;

import java.util.Collection;
import java.util.List;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.ecore.EStructuralFeature;

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;

/**
 * This is the item provider adapter for a {@link comrel.ConditionalUnit} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class ConditionalUnitItemProvider
	extends CompositeUnitItemProvider
	implements
		IEditingDomainItemProvider,
		IStructuredItemContentProvider,
		ITreeItemContentProvider,
		IItemLabelProvider,
		IItemPropertySource {
	/**
	 * This constructs an instance from a factory and a notifier.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ConditionalUnitItemProvider(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);

			addTypePropertyDescriptor(object);
		}
		return itemPropertyDescriptors;
	}

	/**
	 * This adds a property descriptor for the Type feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addTypePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_ConditionalUnit_type_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_ConditionalUnit_type_feature", "_UI_ConditionalUnit_type"),
				 ComrelPackage.Literals.CONDITIONAL_UNIT__TYPE,
				 false,
				 false,
				 false,
				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
		if (childrenFeatures == null) {
			super.getChildrenFeatures(object);
			childrenFeatures.add(ComrelPackage.Literals.CONDITIONAL_UNIT__IF);
			childrenFeatures.add(ComrelPackage.Literals.CONDITIONAL_UNIT__HELPER_UNITS);
			childrenFeatures.add(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN);
			childrenFeatures.add(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE);
			childrenFeatures.add(ComrelPackage.Literals.CONDITIONAL_UNIT__INPUT_PORTS);
		}
		return childrenFeatures;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EStructuralFeature getChildFeature(Object object, Object child) {
		// Check the type of the specified child object and return the proper feature to use for
		// adding (see {@link AddCommand}) it as a child.

		return super.getChildFeature(object, child);
	}

	/**
	 * This returns ConditionalUnit.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object getImage(Object object) {
		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConditionalUnit"));
	}

	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getText(Object object) {
		String label = ((ConditionalUnit)object).getName();
		return label == null || label.length() == 0 ?
			getString("_UI_ConditionalUnit_type") :
			getString("_UI_ConditionalUnit_type") + " " + label;
	}

	/**
	 * 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(ConditionalUnit.class)) {
			case ComrelPackage.CONDITIONAL_UNIT__TYPE:
				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
				return;
			case ComrelPackage.CONDITIONAL_UNIT__IF:
			case ComrelPackage.CONDITIONAL_UNIT__HELPER_UNITS:
			case ComrelPackage.CONDITIONAL_UNIT__THEN:
			case ComrelPackage.CONDITIONAL_UNIT__ELSE:
			case ComrelPackage.CONDITIONAL_UNIT__INPUT_PORTS:
				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
				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);

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__IF,
				 ComrelFactory.eINSTANCE.createConditionCheck()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__HELPER_UNITS,
				 ComrelFactory.eINSTANCE.createSingleFeatureUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__HELPER_UNITS,
				 ComrelFactory.eINSTANCE.createMultiFeatureUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__HELPER_UNITS,
				 ComrelFactory.eINSTANCE.createSingleFilterUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__HELPER_UNITS,
				 ComrelFactory.eINSTANCE.createMultiFilterUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createAtomicUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createSequentialUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createConditionalUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createSingleQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createCartesianQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__THEN,
				 ComrelFactory.eINSTANCE.createParallelQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createAtomicUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createSequentialUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createConditionalUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createSingleQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createCartesianQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE,
				 ComrelFactory.eINSTANCE.createParallelQueuedUnit()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__INPUT_PORTS,
				 ComrelFactory.eINSTANCE.createSingleInputPort()));

		newChildDescriptors.add
			(createChildParameter
				(ComrelPackage.Literals.CONDITIONAL_UNIT__INPUT_PORTS,
				 ComrelFactory.eINSTANCE.createMultiInputPort()));
	}

	/**
	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getCreateChildText(Object owner, Object feature, Object child, Collection<?> selection) {
		Object childFeature = feature;
		Object childObject = child;

		boolean qualify =
			childFeature == ComrelPackage.Literals.CONDITIONAL_UNIT__THEN ||
			childFeature == ComrelPackage.Literals.CONDITIONAL_UNIT__ELSE;

		if (qualify) {
			return getString
				("_UI_CreateChild_text2",
				 new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });
		}
		return super.getCreateChildText(owner, feature, child, selection);
	}

}
