package org.eclipse.stem.core.predicate.provider;

/*******************************************************************************
 * Copyright (c) 2008 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
 *******************************************************************************/

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.common.util.URI;
import org.eclipse.emf.ecore.EStructuralFeature;
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.ViewerNotification;
import org.eclipse.stem.core.common.Identifiable;
import org.eclipse.stem.core.common.provider.IdentifiableItemProvider;
import org.eclipse.stem.core.predicate.IdentifiablePredicateExpression;
import org.eclipse.stem.core.predicate.PredicateFactory;
import org.eclipse.stem.core.predicate.PredicatePackage;

/**
 * This is the item provider adapter for a {@link org.eclipse.stem.core.predicate.IdentifiablePredicateExpression} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class IdentifiablePredicateExpressionItemProvider
	extends IdentifiablePredicateItemProvider
	implements
		IEditingDomainItemProvider,
		IStructuredItemContentProvider,
		ITreeItemContentProvider,
		IItemLabelProvider,
		IItemPropertySource {
	/**
	 * This constructs an instance from a factory and a notifier.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IdentifiablePredicateExpressionItemProvider(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);

		}
		return itemPropertyDescriptors;
	}

	/**
	 * 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(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE);
		}
		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 Predicate.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	@Override
	public Object getImage(Object object) {
		return overlayImage(object, getResourceLocator().getImage("full/customobj16/Predicate"));
	}
	
	/**
	 * This returns IdentifiablePredicateExpression.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Object getImageGen(Object object) {
		return overlayImage(object, getResourceLocator().getImage("full/obj16/IdentifiablePredicateExpression")); //$NON-NLS-1$
	}

	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see IdentifiableItemProvider#getText(Object)
	 * @generated NOT
	 */
	@Override
	public String getText(Object object) {
		return ((Identifiable)object).getURI().lastSegment();
	}
	
	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getTextGen(Object object) {
		URI labelValue = ((IdentifiablePredicateExpression)object).getURI();
		String label = labelValue == null ? null : labelValue.toString();
		return label == null || label.length() == 0 ?
			getString("_UI_IdentifiablePredicateExpression_type") : //$NON-NLS-1$
			getString("_UI_IdentifiablePredicateExpression_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
	}

	/**
	 * 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(IdentifiablePredicateExpression.class)) {
			case PredicatePackage.IDENTIFIABLE_PREDICATE_EXPRESSION__PREDICATE:
				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 NOT
	 */
	@Override
	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
		super.collectNewChildDescriptors(newChildDescriptors, object);

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createAnd()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createFalse()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createNot()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createOr()));

//		newChildDescriptors.add
//			(createChildParameter
//				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
//				 PredicateFactory.eINSTANCE.createPredicateReference()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createTrue()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createPredicateExpression()));

//		newChildDescriptors.add
//			(createChildParameter
//				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
//				 PredicateFactory.eINSTANCE.createIdentifiablePredicateExpression()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createAbsoluteTimeTest()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createElapsedTimeTest()));
	}

	/**
	 * 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 collectNewChildDescriptorsGen(Collection<Object> newChildDescriptors, Object object) {
		super.collectNewChildDescriptors(newChildDescriptors, object);

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createAnd()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createFalse()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createNot()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createOr()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createPredicateReference()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createTrue()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createPredicateExpression()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createIdentifiablePredicateExpression()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createAbsoluteTimeTest()));

		newChildDescriptors.add
			(createChildParameter
				(PredicatePackage.Literals.PREDICATE_EXPRESSION__PREDICATE,
				 PredicateFactory.eINSTANCE.createElapsedTimeTest()));
	}

}
