/**
 *  * 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.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.PrintRule;
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.PrintRule} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class PrintRuleItemProvider
  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 PrintRuleItemProvider(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(SimpleRulesPackage.Literals.PRINT_RULE__OUT);
      childrenFeatures.add(SimpleRulesPackage.Literals.PRINT_RULE__BUFFER);
    }
    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 PrintRule.gif.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public Object getImage(Object object)
  {
    return overlayImage(object, getResourceLocator().getImage("full/obj16/PrintRule"));
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    newChildDescriptors.add
      (createChildParameter
        (SimpleRulesPackage.Literals.PRINT_RULE__BUFFER,
         QueryFunctionsFactory.eINSTANCE.createAggregate()));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * 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 == SimpleRulesPackage.Literals.PRINT_RULE__OUT ||
      childFeature == SimpleRulesPackage.Literals.PRINT_RULE__BUFFER;

    if (qualify)
    {
      return getString
        ("_UI_CreateChild_text2",
         new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });
    }
    return super.getCreateChildText(owner, feature, child, selection);
  }

}
