/**
 *  * Copyright (c) 2006-2010 Istvan Rath and Daniel Varro
 *  * 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:
 *  *    Istvan Rath, Daniel Varro - initial API and implementation
 * 
 */
package org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.simpleRules.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.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.ViewerNotification;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.simpleRules.GTRuleInvocation;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.simpleRules.SimpleRulesPackage;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.terms.TermsFactory;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.terms.builtInFunctions.BuiltInFunctionsFactory;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.modelmanagement.queryFunctions.QueryFunctionsFactory;

/**
 * This is the item provider adapter for a {@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.simpleRules.GTRuleInvocation} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class GTRuleInvocationItemProvider
  extends ASMRuleInvocationItemProvider
  implements
    IEditingDomainItemProvider,
    IStructuredItemContentProvider,
    ITreeItemContentProvider,
    IItemLabelProvider,
    IItemPropertySource
{
  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public static final String copyright = " * Copyright (c) 2006-2010 Istvan Rath and Daniel Varro\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors:\r\n *    Istvan Rath, Daniel Varro - initial API and implementation\r\n";

  /**
   * This constructs an instance from a factory and a notifier.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public GTRuleInvocationItemProvider(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);

      addRulePropertyDescriptor(object);
    }
    return itemPropertyDescriptors;
  }

  /**
   * This adds a property descriptor for the Rule feature.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  protected void addRulePropertyDescriptor(Object object)
  {
    itemPropertyDescriptors.add
      (createItemPropertyDescriptor
        (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
         getResourceLocator(),
         getString("_UI_GTRuleInvocation_rule_feature"),
         getString("_UI_PropertyDescriptor_description", "_UI_GTRuleInvocation_rule_feature", "_UI_GTRuleInvocation_type"),
         SimpleRulesPackage.Literals.GT_RULE_INVOCATION__RULE,
         true,
         false,
         true,
         null,
         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(SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS);
    }
    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 GTRuleInvocation.gif.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public Object getImage(Object object)
  {
    return overlayImage(object, getResourceLocator().getImage("full/obj16/GTRuleInvocation"));
  }

  /**
   * This returns the label text for the adapted class.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public String getText(Object object)
  {
    String label = ((GTRuleInvocation)object).getName();
    return label == null || label.length() == 0 ?
      getString("_UI_GTRuleInvocation_type") :
      getString("_UI_GTRuleInvocation_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(GTRuleInvocation.class))
    {
      case SimpleRulesPackage.GT_RULE_INVOCATION__ACTUAL_PARAMETERS:
        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
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createAggregate()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createSource()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createTarget()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createElementReference()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createFullyQualifiedName()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createName()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createValue()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createInverse()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         QueryFunctionsFactory.eINSTANCE.createMultiplicity()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createVariableReference()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createGTPatternCall()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createASMFunctionInvocation()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createConstant()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createNativeFunctionInvocation()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         TermsFactory.eINSTANCE.createModelElementQuery()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createRemainder()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createMultiply()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createPlus()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createMinus()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createDivision()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createAnd()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createEquals()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createGreaterThan()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createGreaterThanOrEqualTo()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createLessThan()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createLessThanOrEqualTo()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createNot()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createNotEquals()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createOr()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createXOr()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToString()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToInt()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToBoolean()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToDouble()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToModelElement()));

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.GT_RULE_INVOCATION__ACTUAL_PARAMETERS,
         BuiltInFunctionsFactory.eINSTANCE.createToMultiplicity()));
  }

}
