/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.diseasemodels.vector.provider;


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.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.stem.diseasemodels.vector.VectorPackage;
import org.eclipse.stem.diseasemodels.vector.VerySimpleDengueModel;

/**
 * This is the item provider adapter for a {@link org.eclipse.stem.diseasemodels.vector.VerySimpleDengueModel} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class VerySimpleDengueModelItemProvider
	extends VectorDiseaseModelItemProvider
	implements
		IEditingDomainItemProvider,
		IStructuredItemContentProvider,
		ITreeItemContentProvider,
		IItemLabelProvider,
		IItemPropertySource {
	/**
	 * This constructs an instance from a factory and a notifier.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public VerySimpleDengueModelItemProvider(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);

			addHostTransmissionRatePropertyDescriptor(object);
			addHostIncubationRatePropertyDescriptor(object);
			addHostRecoveryRatePropertyDescriptor(object);
			addHostImmunityLossRatePropertyDescriptor(object);
			addVectorTransmissionRatePropertyDescriptor(object);
			addVectorIncubationRatePropertyDescriptor(object);
			addADEPropertyDescriptor(object);
			addCrossImmunityPropertyDescriptor(object);
		}
		return itemPropertyDescriptors;
	}

	/**
	 * This adds a property descriptor for the Host Transmission Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addHostTransmissionRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_hostTransmissionRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_hostTransmissionRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__HOST_TRANSMISSION_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the ADE feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addADEPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_ADE_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_ADE_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__ADE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Cross Immunity feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addCrossImmunityPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_crossImmunity_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_crossImmunity_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__CROSS_IMMUNITY,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Host Incubation Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addHostIncubationRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_hostIncubationRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_hostIncubationRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__HOST_INCUBATION_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Host Recovery Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addHostRecoveryRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_hostRecoveryRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_hostRecoveryRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__HOST_RECOVERY_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Host Immunity Loss Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addHostImmunityLossRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_hostImmunityLossRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_hostImmunityLossRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__HOST_IMMUNITY_LOSS_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Vector Transmission Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addVectorTransmissionRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_vectorTransmissionRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_vectorTransmissionRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__VECTOR_TRANSMISSION_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Vector Incubation Rate feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addVectorIncubationRatePropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_VerySimpleDengueModel_vectorIncubationRate_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_VerySimpleDengueModel_vectorIncubationRate_feature", "_UI_VerySimpleDengueModel_type"),
				 VectorPackage.Literals.VERY_SIMPLE_DENGUE_MODEL__VECTOR_INCUBATION_RATE,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This returns VerySimpleDengueModel.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object getImage(Object object) {
		return overlayImage(object, getResourceLocator().getImage("full/obj16/VerySimpleDengueModel"));
	}

	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getText(Object object) {
		String label = ((VerySimpleDengueModel)object).getDiseaseName();
		return label == null || label.length() == 0 ?
			getString("_UI_VerySimpleDengueModel_type") :
			getString("_UI_VerySimpleDengueModel_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(VerySimpleDengueModel.class)) {
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__HOST_TRANSMISSION_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__HOST_INCUBATION_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__HOST_RECOVERY_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__HOST_IMMUNITY_LOSS_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__VECTOR_TRANSMISSION_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__VECTOR_INCUBATION_RATE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__ADE:
			case VectorPackage.VERY_SIMPLE_DENGUE_MODEL__CROSS_IMMUNITY:
				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);
	}

}
