/**
 */
package org.eclipse.osbp.ecview.semantic.uimodel.provider;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;

import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

import org.eclipse.osbp.ecview.semantic.uimodel.util.UiModelAdapterFactory;

/**
 * This is the factory that is used to provide the interfaces needed to support Viewers.
 * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
 * The adapters also support Eclipse property sheets.
 * Note that most of the adapters are shared among multiple instances.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class UiModelItemProviderAdapterFactory extends UiModelAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
	/**
	 * This keeps track of the root adapter factory that delegates to this adapter factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ComposedAdapterFactory parentAdapterFactory;

	/**
	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IChangeNotifier changeNotifier = new ChangeNotifier();

	/**
	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Collection<Object> supportedTypes = new ArrayList<Object>();

	/**
	 * This constructs an instance.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UiModelItemProviderAdapterFactory() {
		supportedTypes.add(IEditingDomainItemProvider.class);
		supportedTypes.add(IStructuredItemContentProvider.class);
		supportedTypes.add(ITreeItemContentProvider.class);
		supportedTypes.add(IItemLabelProvider.class);
		supportedTypes.add(IItemPropertySource.class);
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiModelItemProvider uiModelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiModel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiModelAdapter() {
		if (uiModelItemProvider == null) {
			uiModelItemProvider = new UiModelItemProvider(this);
		}

		return uiModelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiContextItemProvider uiContextItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiContext}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiContextAdapter() {
		if (uiContextItemProvider == null) {
			uiContextItemProvider = new UiContextItemProvider(this);
		}

		return uiContextItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiExposedActionItemProvider uiExposedActionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiExposedActionAdapter() {
		if (uiExposedActionItemProvider == null) {
			uiExposedActionItemProvider = new UiExposedActionItemProvider(this);
		}

		return uiExposedActionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiViewSet} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiViewSetItemProvider uiViewSetItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiViewSet}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiViewSetAdapter() {
		if (uiViewSetItemProvider == null) {
			uiViewSetItemProvider = new UiViewSetItemProvider(this);
		}

		return uiViewSetItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiView} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiViewItemProvider uiViewItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiView}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiViewAdapter() {
		if (uiViewItemProvider == null) {
			uiViewItemProvider = new UiViewItemProvider(this);
		}

		return uiViewItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialog} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDialogItemProvider uiDialogItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialog}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDialogAdapter() {
		if (uiDialogItemProvider == null) {
			uiDialogItemProvider = new UiDialogItemProvider(this);
		}

		return uiDialogItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDialogAssignmentItemProvider uiDialogAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDialogAssignmentAdapter() {
		if (uiDialogAssignmentItemProvider == null) {
			uiDialogAssignmentItemProvider = new UiDialogAssignmentItemProvider(this);
		}

		return uiDialogAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiIDEViewItemProvider uiIDEViewItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiIDEViewAdapter() {
		if (uiIDEViewItemProvider == null) {
			uiIDEViewItemProvider = new UiIDEViewItemProvider(this);
		}

		return uiIDEViewItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDisplayViewItemProvider uiDisplayViewItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDisplayViewAdapter() {
		if (uiDisplayViewItemProvider == null) {
			uiDisplayViewItemProvider = new UiDisplayViewItemProvider(this);
		}

		return uiDisplayViewItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileViewItemProvider uiMobileViewItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileViewAdapter() {
		if (uiMobileViewItemProvider == null) {
			uiMobileViewItemProvider = new UiMobileViewItemProvider(this);
		}

		return uiMobileViewItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPoint} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPointItemProvider uiPointItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPoint}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPointAdapter() {
		if (uiPointItemProvider == null) {
			uiPointItemProvider = new UiPointItemProvider(this);
		}

		return uiPointItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBeanSlotItemProvider uiBeanSlotItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBeanSlotAdapter() {
		if (uiBeanSlotItemProvider == null) {
			uiBeanSlotItemProvider = new UiBeanSlotItemProvider(this);
		}

		return uiBeanSlotItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBindingEndpointAliasItemProvider uiBindingEndpointAliasItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBindingEndpointAliasAdapter() {
		if (uiBindingEndpointAliasItemProvider == null) {
			uiBindingEndpointAliasItemProvider = new UiBindingEndpointAliasItemProvider(this);
		}

		return uiBindingEndpointAliasItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBindingEndpointAssignmentItemProvider uiBindingEndpointAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBindingEndpointAssignmentAdapter() {
		if (uiBindingEndpointAssignmentItemProvider == null) {
			uiBindingEndpointAssignmentItemProvider = new UiBindingEndpointAssignmentItemProvider(this);
		}

		return uiBindingEndpointAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBindingItemProvider uiBindingItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBinding}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBindingAdapter() {
		if (uiBindingItemProvider == null) {
			uiBindingItemProvider = new UiBindingItemProvider(this);
		}

		return uiBindingItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPathSegmentItemProvider uiPathSegmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPathSegmentAdapter() {
		if (uiPathSegmentItemProvider == null) {
			uiPathSegmentItemProvider = new UiPathSegmentItemProvider(this);
		}

		return uiPathSegmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiNestedFieldItemProvider uiNestedFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiNestedFieldAdapter() {
		if (uiNestedFieldItemProvider == null) {
			uiNestedFieldItemProvider = new UiNestedFieldItemProvider(this);
		}

		return uiNestedFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiNestedPropertyItemProvider uiNestedPropertyItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiNestedPropertyAdapter() {
		if (uiNestedPropertyItemProvider == null) {
			uiNestedPropertyItemProvider = new UiNestedPropertyItemProvider(this);
		}

		return uiNestedPropertyItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiRawBindablePathSegmentItemProvider uiRawBindablePathSegmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiRawBindablePathSegmentAdapter() {
		if (uiRawBindablePathSegmentItemProvider == null) {
			uiRawBindablePathSegmentItemProvider = new UiRawBindablePathSegmentItemProvider(this);
		}

		return uiRawBindablePathSegmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTypedBindableDefItemProvider uiTypedBindableDefItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTypedBindableDefAdapter() {
		if (uiTypedBindableDefItemProvider == null) {
			uiTypedBindableDefItemProvider = new UiTypedBindableDefItemProvider(this);
		}

		return uiTypedBindableDefItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawType} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTypedBindableRawTypeItemProvider uiTypedBindableRawTypeItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawType}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTypedBindableRawTypeAdapter() {
		if (uiTypedBindableRawTypeItemProvider == null) {
			uiTypedBindableRawTypeItemProvider = new UiTypedBindableRawTypeItemProvider(this);
		}

		return uiTypedBindableRawTypeItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawTypeAlias} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTypedBindableRawTypeAliasItemProvider uiTypedBindableRawTypeAliasItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawTypeAlias}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTypedBindableRawTypeAliasAdapter() {
		if (uiTypedBindableRawTypeAliasItemProvider == null) {
			uiTypedBindableRawTypeAliasItemProvider = new UiTypedBindableRawTypeAliasItemProvider(this);
		}

		return uiTypedBindableRawTypeAliasItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiCommandBindableDef} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiCommandBindableDefItemProvider uiCommandBindableDefItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiCommandBindableDef}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiCommandBindableDefAdapter() {
		if (uiCommandBindableDefItemProvider == null) {
			uiCommandBindableDefItemProvider = new UiCommandBindableDefItemProvider(this);
		}

		return uiCommandBindableDefItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiAction} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiActionItemProvider uiActionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiAction}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiActionAdapter() {
		if (uiActionItemProvider == null) {
			uiActionItemProvider = new UiActionItemProvider(this);
		}

		return uiActionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileAction} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileActionItemProvider uiMobileActionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileAction}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileActionAdapter() {
		if (uiMobileActionItemProvider == null) {
			uiMobileActionItemProvider = new UiMobileActionItemProvider(this);
		}

		return uiMobileActionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiGridLayoutAssigmentItemProvider uiGridLayoutAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiGridLayoutAssigmentAdapter() {
		if (uiGridLayoutAssigmentItemProvider == null) {
			uiGridLayoutAssigmentItemProvider = new UiGridLayoutAssigmentItemProvider(this);
		}

		return uiGridLayoutAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiGridLayoutItemProvider uiGridLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiGridLayoutAdapter() {
		if (uiGridLayoutItemProvider == null) {
			uiGridLayoutItemProvider = new UiGridLayoutItemProvider(this);
		}

		return uiGridLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiHorizontalLayoutAssigmentItemProvider uiHorizontalLayoutAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiHorizontalLayoutAssigmentAdapter() {
		if (uiHorizontalLayoutAssigmentItemProvider == null) {
			uiHorizontalLayoutAssigmentItemProvider = new UiHorizontalLayoutAssigmentItemProvider(this);
		}

		return uiHorizontalLayoutAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiHorizontalLayoutItemProvider uiHorizontalLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiHorizontalLayoutAdapter() {
		if (uiHorizontalLayoutItemProvider == null) {
			uiHorizontalLayoutItemProvider = new UiHorizontalLayoutItemProvider(this);
		}

		return uiHorizontalLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVerticalLayoutAssigmentItemProvider uiVerticalLayoutAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVerticalLayoutAssigmentAdapter() {
		if (uiVerticalLayoutAssigmentItemProvider == null) {
			uiVerticalLayoutAssigmentItemProvider = new UiVerticalLayoutAssigmentItemProvider(this);
		}

		return uiVerticalLayoutAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVerticalLayoutItemProvider uiVerticalLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVerticalLayoutAdapter() {
		if (uiVerticalLayoutItemProvider == null) {
			uiVerticalLayoutItemProvider = new UiVerticalLayoutItemProvider(this);
		}

		return uiVerticalLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiFormLayoutAssigmentItemProvider uiFormLayoutAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiFormLayoutAssigmentAdapter() {
		if (uiFormLayoutAssigmentItemProvider == null) {
			uiFormLayoutAssigmentItemProvider = new UiFormLayoutAssigmentItemProvider(this);
		}

		return uiFormLayoutAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiFormLayoutItemProvider uiFormLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiFormLayoutAdapter() {
		if (uiFormLayoutItemProvider == null) {
			uiFormLayoutItemProvider = new UiFormLayoutItemProvider(this);
		}

		return uiFormLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchPanel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSearchPanelItemProvider uiSearchPanelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchPanel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSearchPanelAdapter() {
		if (uiSearchPanelItemProvider == null) {
			uiSearchPanelItemProvider = new UiSearchPanelItemProvider(this);
		}

		return uiSearchPanelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBeanReferenceFieldItemProvider uiBeanReferenceFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBeanReferenceFieldAdapter() {
		if (uiBeanReferenceFieldItemProvider == null) {
			uiBeanReferenceFieldItemProvider = new UiBeanReferenceFieldItemProvider(this);
		}

		return uiBeanReferenceFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTextFieldItemProvider uiTextFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTextFieldAdapter() {
		if (uiTextFieldItemProvider == null) {
			uiTextFieldItemProvider = new UiTextFieldItemProvider(this);
		}

		return uiTextFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSuggestTextFieldItemProvider uiSuggestTextFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSuggestTextFieldAdapter() {
		if (uiSuggestTextFieldItemProvider == null) {
			uiSuggestTextFieldItemProvider = new UiSuggestTextFieldItemProvider(this);
		}

		return uiSuggestTextFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImage} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiImageItemProvider uiImageItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiImage}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiImageAdapter() {
		if (uiImageItemProvider == null) {
			uiImageItemProvider = new UiImageItemProvider(this);
		}

		return uiImageItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiList} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiListItemProvider uiListItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiList}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiListAdapter() {
		if (uiListItemProvider == null) {
			uiListItemProvider = new UiListItemProvider(this);
		}

		return uiListItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTableItemProvider uiTableItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTable}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTableAdapter() {
		if (uiTableItemProvider == null) {
			uiTableItemProvider = new UiTableItemProvider(this);
		}

		return uiTableItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiComboBoxItemProvider uiComboBoxItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiComboBoxAdapter() {
		if (uiComboBoxItemProvider == null) {
			uiComboBoxItemProvider = new UiComboBoxItemProvider(this);
		}

		return uiComboBoxItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiColumnItemProvider uiColumnItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumn}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiColumnAdapter() {
		if (uiColumnItemProvider == null) {
			uiColumnItemProvider = new UiColumnItemProvider(this);
		}

		return uiColumnItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSortOrderAssignmentItemProvider uiSortOrderAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSortOrderAssignmentAdapter() {
		if (uiSortOrderAssignmentItemProvider == null) {
			uiSortOrderAssignmentItemProvider = new UiSortOrderAssignmentItemProvider(this);
		}

		return uiSortOrderAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSortOrderItemProvider uiSortOrderItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSortOrderAdapter() {
		if (uiSortOrderItemProvider == null) {
			uiSortOrderItemProvider = new UiSortOrderItemProvider(this);
		}

		return uiSortOrderItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiColumnsAssignmentItemProvider uiColumnsAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiColumnsAssignmentAdapter() {
		if (uiColumnsAssignmentItemProvider == null) {
			uiColumnsAssignmentItemProvider = new UiColumnsAssignmentItemProvider(this);
		}

		return uiColumnsAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiNumericFieldItemProvider uiNumericFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiNumericFieldAdapter() {
		if (uiNumericFieldItemProvider == null) {
			uiNumericFieldItemProvider = new UiNumericFieldItemProvider(this);
		}

		return uiNumericFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiCheckBox} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiCheckBoxItemProvider uiCheckBoxItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiCheckBox}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiCheckBoxAdapter() {
		if (uiCheckBoxItemProvider == null) {
			uiCheckBoxItemProvider = new UiCheckBoxItemProvider(this);
		}

		return uiCheckBoxItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVisibilityProcessorAssignmentItemProvider uiVisibilityProcessorAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVisibilityProcessorAssignmentAdapter() {
		if (uiVisibilityProcessorAssignmentItemProvider == null) {
			uiVisibilityProcessorAssignmentItemProvider = new UiVisibilityProcessorAssignmentItemProvider(this);
		}

		return uiVisibilityProcessorAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVisibilityProcessorItemProvider uiVisibilityProcessorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVisibilityProcessorAdapter() {
		if (uiVisibilityProcessorItemProvider == null) {
			uiVisibilityProcessorItemProvider = new UiVisibilityProcessorItemProvider(this);
		}

		return uiVisibilityProcessorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorDef} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVisibilityProcessorDefItemProvider uiVisibilityProcessorDefItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorDef}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVisibilityProcessorDefAdapter() {
		if (uiVisibilityProcessorDefItemProvider == null) {
			uiVisibilityProcessorDefItemProvider = new UiVisibilityProcessorDefItemProvider(this);
		}

		return uiVisibilityProcessorDefItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiChangeTriggerItemProvider uiChangeTriggerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiChangeTriggerAdapter() {
		if (uiChangeTriggerItemProvider == null) {
			uiChangeTriggerItemProvider = new UiChangeTriggerItemProvider(this);
		}

		return uiChangeTriggerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiXbaseVisibilityRuleItemProvider uiXbaseVisibilityRuleItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiXbaseVisibilityRuleAdapter() {
		if (uiXbaseVisibilityRuleItemProvider == null) {
			uiXbaseVisibilityRuleItemProvider = new UiXbaseVisibilityRuleItemProvider(this);
		}

		return uiXbaseVisibilityRuleItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityPropertiesAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVisibilityPropertiesAssignmentItemProvider uiVisibilityPropertiesAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityPropertiesAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVisibilityPropertiesAssignmentAdapter() {
		if (uiVisibilityPropertiesAssignmentItemProvider == null) {
			uiVisibilityPropertiesAssignmentItemProvider = new UiVisibilityPropertiesAssignmentItemProvider(this);
		}

		return uiVisibilityPropertiesAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVisibilityPropertyItemProvider uiVisibilityPropertyItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProperty}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVisibilityPropertyAdapter() {
		if (uiVisibilityPropertyItemProvider == null) {
			uiVisibilityPropertyItemProvider = new UiVisibilityPropertyItemProvider(this);
		}

		return uiVisibilityPropertyItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMaxLengthValidatorItemProvider uiMaxLengthValidatorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMaxLengthValidatorAdapter() {
		if (uiMaxLengthValidatorItemProvider == null) {
			uiMaxLengthValidatorItemProvider = new UiMaxLengthValidatorItemProvider(this);
		}

		return uiMaxLengthValidatorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMinLengthValidatorItemProvider uiMinLengthValidatorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMinLengthValidatorAdapter() {
		if (uiMinLengthValidatorItemProvider == null) {
			uiMinLengthValidatorItemProvider = new UiMinLengthValidatorItemProvider(this);
		}

		return uiMinLengthValidatorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiRegexpValidatorItemProvider uiRegexpValidatorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiRegexpValidatorAdapter() {
		if (uiRegexpValidatorItemProvider == null) {
			uiRegexpValidatorItemProvider = new UiRegexpValidatorItemProvider(this);
		}

		return uiRegexpValidatorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanValidationValidator} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBeanValidationValidatorItemProvider uiBeanValidationValidatorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBeanValidationValidator}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBeanValidationValidatorAdapter() {
		if (uiBeanValidationValidatorItemProvider == null) {
			uiBeanValidationValidatorItemProvider = new UiBeanValidationValidatorItemProvider(this);
		}

		return uiBeanValidationValidatorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiXbaseValidatorItemProvider uiXbaseValidatorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiXbaseValidatorAdapter() {
		if (uiXbaseValidatorItemProvider == null) {
			uiXbaseValidatorItemProvider = new UiXbaseValidatorItemProvider(this);
		}

		return uiXbaseValidatorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiValidatorAliasItemProvider uiValidatorAliasItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiValidatorAliasAdapter() {
		if (uiValidatorAliasItemProvider == null) {
			uiValidatorAliasItemProvider = new UiValidatorAliasItemProvider(this);
		}

		return uiValidatorAliasItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiValidatorAssignmentItemProvider uiValidatorAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiValidatorAssignmentAdapter() {
		if (uiValidatorAssignmentItemProvider == null) {
			uiValidatorAssignmentItemProvider = new UiValidatorAssignmentItemProvider(this);
		}

		return uiValidatorAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiValidatorDefItemProvider uiValidatorDefItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiValidatorDefAdapter() {
		if (uiValidatorDefItemProvider == null) {
			uiValidatorDefItemProvider = new UiValidatorDefItemProvider(this);
		}

		return uiValidatorDefItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiHorizontalButtonGroupAssigmentItemProvider uiHorizontalButtonGroupAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiHorizontalButtonGroupAssigmentAdapter() {
		if (uiHorizontalButtonGroupAssigmentItemProvider == null) {
			uiHorizontalButtonGroupAssigmentItemProvider = new UiHorizontalButtonGroupAssigmentItemProvider(this);
		}

		return uiHorizontalButtonGroupAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiHorizontalButtonGroupItemProvider uiHorizontalButtonGroupItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiHorizontalButtonGroupAdapter() {
		if (uiHorizontalButtonGroupItemProvider == null) {
			uiHorizontalButtonGroupItemProvider = new UiHorizontalButtonGroupItemProvider(this);
		}

		return uiHorizontalButtonGroupItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiButton} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiButtonItemProvider uiButtonItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiButton}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiButtonAdapter() {
		if (uiButtonItemProvider == null) {
			uiButtonItemProvider = new UiButtonItemProvider(this);
		}

		return uiButtonItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSwitch} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSwitchItemProvider uiSwitchItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSwitch}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSwitchAdapter() {
		if (uiSwitchItemProvider == null) {
			uiSwitchItemProvider = new UiSwitchItemProvider(this);
		}

		return uiSwitchItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVerticalComponentGroupAssigmentItemProvider uiVerticalComponentGroupAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVerticalComponentGroupAssigmentAdapter() {
		if (uiVerticalComponentGroupAssigmentItemProvider == null) {
			uiVerticalComponentGroupAssigmentItemProvider = new UiVerticalComponentGroupAssigmentItemProvider(this);
		}

		return uiVerticalComponentGroupAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiVerticalComponentGroupItemProvider uiVerticalComponentGroupItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiVerticalComponentGroupAdapter() {
		if (uiVerticalComponentGroupItemProvider == null) {
			uiVerticalComponentGroupItemProvider = new UiVerticalComponentGroupItemProvider(this);
		}

		return uiVerticalComponentGroupItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileTabSheetItemProvider uiMobileTabSheetItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileTabSheetAdapter() {
		if (uiMobileTabSheetItemProvider == null) {
			uiMobileTabSheetItemProvider = new UiMobileTabSheetItemProvider(this);
		}

		return uiMobileTabSheetItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileTabAssignmentItemProvider uiMobileTabAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileTabAssignmentAdapter() {
		if (uiMobileTabAssignmentItemProvider == null) {
			uiMobileTabAssignmentItemProvider = new UiMobileTabAssignmentItemProvider(this);
		}

		return uiMobileTabAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTabSheetItemProvider uiTabSheetItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTabSheetAdapter() {
		if (uiTabSheetItemProvider == null) {
			uiTabSheetItemProvider = new UiTabSheetItemProvider(this);
		}

		return uiTabSheetItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTabAssignmentItemProvider uiTabAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTabAssignmentAdapter() {
		if (uiTabAssignmentItemProvider == null) {
			uiTabAssignmentItemProvider = new UiTabAssignmentItemProvider(this);
		}

		return uiTabAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationPageItemProvider uiMobileNavigationPageItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationPageAdapter() {
		if (uiMobileNavigationPageItemProvider == null) {
			uiMobileNavigationPageItemProvider = new UiMobileNavigationPageItemProvider(this);
		}

		return uiMobileNavigationPageItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationPageAssignmentItemProvider uiMobileNavigationPageAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationPageAssignmentAdapter() {
		if (uiMobileNavigationPageAssignmentItemProvider == null) {
			uiMobileNavigationPageAssignmentItemProvider = new UiMobileNavigationPageAssignmentItemProvider(this);
		}

		return uiMobileNavigationPageAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationButtonItemProvider uiMobileNavigationButtonItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationButtonAdapter() {
		if (uiMobileNavigationButtonItemProvider == null) {
			uiMobileNavigationButtonItemProvider = new UiMobileNavigationButtonItemProvider(this);
		}

		return uiMobileNavigationButtonItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationCommandItemProvider uiMobileNavigationCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationCommandAdapter() {
		if (uiMobileNavigationCommandItemProvider == null) {
			uiMobileNavigationCommandItemProvider = new UiMobileNavigationCommandItemProvider(this);
		}

		return uiMobileNavigationCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiOpenDialogCommandItemProvider uiOpenDialogCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiOpenDialogCommandAdapter() {
		if (uiOpenDialogCommandItemProvider == null) {
			uiOpenDialogCommandItemProvider = new UiOpenDialogCommandItemProvider(this);
		}

		return uiOpenDialogCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSearchFieldItemProvider uiSearchFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSearchFieldAdapter() {
		if (uiSearchFieldItemProvider == null) {
			uiSearchFieldItemProvider = new UiSearchFieldItemProvider(this);
		}

		return uiSearchFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSearchDialogItemProvider uiSearchDialogItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSearchDialogAdapter() {
		if (uiSearchDialogItemProvider == null) {
			uiSearchDialogItemProvider = new UiSearchDialogItemProvider(this);
		}

		return uiSearchDialogItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDialogSearchFieldAssignmentItemProvider uiDialogSearchFieldAssignmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDialogSearchFieldAssignmentAdapter() {
		if (uiDialogSearchFieldAssignmentItemProvider == null) {
			uiDialogSearchFieldAssignmentItemProvider = new UiDialogSearchFieldAssignmentItemProvider(this);
		}

		return uiDialogSearchFieldAssignmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSearchWithDialogCommandItemProvider uiSearchWithDialogCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSearchWithDialogCommandAdapter() {
		if (uiSearchWithDialogCommandItemProvider == null) {
			uiSearchWithDialogCommandItemProvider = new UiSearchWithDialogCommandItemProvider(this);
		}

		return uiSearchWithDialogCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiLabel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiLabelItemProvider uiLabelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiLabel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiLabelAdapter() {
		if (uiLabelItemProvider == null) {
			uiLabelItemProvider = new UiLabelItemProvider(this);
		}

		return uiLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDecimalFieldItemProvider uiDecimalFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDecimalFieldAdapter() {
		if (uiDecimalFieldItemProvider == null) {
			uiDecimalFieldItemProvider = new UiDecimalFieldItemProvider(this);
		}

		return uiDecimalFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextArea} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiTextAreaItemProvider uiTextAreaItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiTextArea}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiTextAreaAdapter() {
		if (uiTextAreaItemProvider == null) {
			uiTextAreaItemProvider = new UiTextAreaItemProvider(this);
		}

		return uiTextAreaItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiOptionsGroupItemProvider uiOptionsGroupItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiOptionsGroupAdapter() {
		if (uiOptionsGroupItemProvider == null) {
			uiOptionsGroupItemProvider = new UiOptionsGroupItemProvider(this);
		}

		return uiOptionsGroupItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDateField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiDateFieldItemProvider uiDateFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiDateField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiDateFieldAdapter() {
		if (uiDateFieldItemProvider == null) {
			uiDateFieldItemProvider = new UiDateFieldItemProvider(this);
		}

		return uiDateFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBrowser} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiBrowserItemProvider uiBrowserItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiBrowser}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiBrowserAdapter() {
		if (uiBrowserItemProvider == null) {
			uiBrowserItemProvider = new UiBrowserItemProvider(this);
		}

		return uiBrowserItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiProgressBar} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiProgressBarItemProvider uiProgressBarItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiProgressBar}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiProgressBarAdapter() {
		if (uiProgressBarItemProvider == null) {
			uiProgressBarItemProvider = new UiProgressBarItemProvider(this);
		}

		return uiProgressBarItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiI18nInfoItemProvider uiI18nInfoItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiI18nInfoAdapter() {
		if (uiI18nInfoItemProvider == null) {
			uiI18nInfoItemProvider = new UiI18nInfoItemProvider(this);
		}

		return uiI18nInfoItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSplitpanelAssigmentItemProvider uiSplitpanelAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSplitpanelAssigmentAdapter() {
		if (uiSplitpanelAssigmentItemProvider == null) {
			uiSplitpanelAssigmentItemProvider = new UiSplitpanelAssigmentItemProvider(this);
		}

		return uiSplitpanelAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSplitpanelItemProvider uiSplitpanelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSplitpanelAdapter() {
		if (uiSplitpanelItemProvider == null) {
			uiSplitpanelItemProvider = new UiSplitpanelItemProvider(this);
		}

		return uiSplitpanelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPanel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPanelItemProvider uiPanelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPanel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPanelAdapter() {
		if (uiPanelItemProvider == null) {
			uiPanelItemProvider = new UiPanelItemProvider(this);
		}

		return uiPanelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiErrorCodeItemProvider uiErrorCodeItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiErrorCodeAdapter() {
		if (uiErrorCodeItemProvider == null) {
			uiErrorCodeItemProvider = new UiErrorCodeItemProvider(this);
		}

		return uiErrorCodeItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileSearchPanel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileSearchPanelItemProvider uiMobileSearchPanelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileSearchPanel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileSearchPanelAdapter() {
		if (uiMobileSearchPanelItemProvider == null) {
			uiMobileSearchPanelItemProvider = new UiMobileSearchPanelItemProvider(this);
		}

		return uiMobileSearchPanelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationRootItemProvider uiMobileNavigationRootItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationRootAdapter() {
		if (uiMobileNavigationRootItemProvider == null) {
			uiMobileNavigationRootItemProvider = new UiMobileNavigationRootItemProvider(this);
		}

		return uiMobileNavigationRootItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRootAssigment} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavigationRootAssigmentItemProvider uiMobileNavigationRootAssigmentItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRootAssigment}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavigationRootAssigmentAdapter() {
		if (uiMobileNavigationRootAssigmentItemProvider == null) {
			uiMobileNavigationRootAssigmentItemProvider = new UiMobileNavigationRootAssigmentItemProvider(this);
		}

		return uiMobileNavigationRootAssigmentItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMobileNavBarActionItemProvider uiMobileNavBarActionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMobileNavBarActionAdapter() {
		if (uiMobileNavBarActionItemProvider == null) {
			uiMobileNavBarActionItemProvider = new UiMobileNavBarActionItemProvider(this);
		}

		return uiMobileNavBarActionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiAddToTableCommandItemProvider uiAddToTableCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiAddToTableCommandAdapter() {
		if (uiAddToTableCommandItemProvider == null) {
			uiAddToTableCommandItemProvider = new UiAddToTableCommandItemProvider(this);
		}

		return uiAddToTableCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRemoveFromTableCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiRemoveFromTableCommandItemProvider uiRemoveFromTableCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRemoveFromTableCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiRemoveFromTableCommandAdapter() {
		if (uiRemoveFromTableCommandItemProvider == null) {
			uiRemoveFromTableCommandItemProvider = new UiRemoveFromTableCommandItemProvider(this);
		}

		return uiRemoveFromTableCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSendEventCommandItemProvider uiSendEventCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSendEventCommandAdapter() {
		if (uiSendEventCommandItemProvider == null) {
			uiSendEventCommandItemProvider = new UiSendEventCommandItemProvider(this);
		}

		return uiSendEventCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiSetNewInstanceCommandItemProvider uiSetNewInstanceCommandItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiSetNewInstanceCommandAdapter() {
		if (uiSetNewInstanceCommandItemProvider == null) {
			uiSetNewInstanceCommandItemProvider = new UiSetNewInstanceCommandItemProvider(this);
		}

		return uiSetNewInstanceCommandItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPasswordField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPasswordFieldItemProvider uiPasswordFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPasswordField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPasswordFieldAdapter() {
		if (uiPasswordFieldItemProvider == null) {
			uiPasswordFieldItemProvider = new UiPasswordFieldItemProvider(this);
		}

		return uiPasswordFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMaskedTextFieldItemProvider uiMaskedTextFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMaskedTextFieldAdapter() {
		if (uiMaskedTextFieldItemProvider == null) {
			uiMaskedTextFieldItemProvider = new UiMaskedTextFieldItemProvider(this);
		}

		return uiMaskedTextFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPrefixedMaskedTextFieldItemProvider uiPrefixedMaskedTextFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPrefixedMaskedTextFieldAdapter() {
		if (uiPrefixedMaskedTextFieldItemProvider == null) {
			uiPrefixedMaskedTextFieldItemProvider = new UiPrefixedMaskedTextFieldItemProvider(this);
		}

		return uiPrefixedMaskedTextFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedNumericField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMaskedNumericFieldItemProvider uiMaskedNumericFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedNumericField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMaskedNumericFieldAdapter() {
		if (uiMaskedNumericFieldItemProvider == null) {
			uiMaskedNumericFieldItemProvider = new UiMaskedNumericFieldItemProvider(this);
		}

		return uiMaskedNumericFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiMaskedDecimalFieldItemProvider uiMaskedDecimalFieldItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiMaskedDecimalFieldAdapter() {
		if (uiMaskedDecimalFieldItemProvider == null) {
			uiMaskedDecimalFieldItemProvider = new UiMaskedDecimalFieldItemProvider(this);
		}

		return uiMaskedDecimalFieldItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiStringToStringMapEntryItemProvider uiStringToStringMapEntryItemProvider;

	/**
	 * This creates an adapter for a {@link java.util.Map.Entry}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiStringToStringMapEntryAdapter() {
		if (uiStringToStringMapEntryItemProvider == null) {
			uiStringToStringMapEntryItemProvider = new UiStringToStringMapEntryItemProvider(this);
		}

		return uiStringToStringMapEntryItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiRichTextAreaItemProvider uiRichTextAreaItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiRichTextAreaAdapter() {
		if (uiRichTextAreaItemProvider == null) {
			uiRichTextAreaItemProvider = new UiRichTextAreaItemProvider(this);
		}

		return uiRichTextAreaItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UiPrefixToMaskMapEntryItemProvider uiPrefixToMaskMapEntryItemProvider;

	/**
	 * This creates an adapter for a {@link java.util.Map.Entry}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUiPrefixToMaskMapEntryAdapter() {
		if (uiPrefixToMaskMapEntryItemProvider == null) {
			uiPrefixToMaskMapEntryItemProvider = new UiPrefixToMaskMapEntryItemProvider(this);
		}

		return uiPrefixToMaskMapEntryItemProvider;
	}

	/**
	 * This returns the root adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ComposeableAdapterFactory getRootAdapterFactory() {
		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
	}

	/**
	 * This sets the composed adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isFactoryForType(Object type) {
		return supportedTypes.contains(type) || super.isFactoryForType(type);
	}

	/**
	 * This implementation substitutes the factory itself as the key for the adapter.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object adapt(Object object, Object type) {
		if (isFactoryForType(type)) {
			Object adapter = super.adapt(object, type);
			if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter))) {
				return adapter;
			}
		}

		return null;
	}

	/**
	 * This adds a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void addListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.addListener(notifyChangedListener);
	}

	/**
	 * This removes a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void removeListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.removeListener(notifyChangedListener);
	}

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void fireNotifyChanged(Notification notification) {
		changeNotifier.fireNotifyChanged(notification);

		if (parentAdapterFactory != null) {
			parentAdapterFactory.fireNotifyChanged(notification);
		}
	}

	/**
	 * This disposes all of the item providers created by this factory. 
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void dispose() {
		if (uiModelItemProvider != null) uiModelItemProvider.dispose();
		if (uiContextItemProvider != null) uiContextItemProvider.dispose();
		if (uiExposedActionItemProvider != null) uiExposedActionItemProvider.dispose();
		if (uiViewSetItemProvider != null) uiViewSetItemProvider.dispose();
		if (uiViewItemProvider != null) uiViewItemProvider.dispose();
		if (uiDialogItemProvider != null) uiDialogItemProvider.dispose();
		if (uiDialogAssignmentItemProvider != null) uiDialogAssignmentItemProvider.dispose();
		if (uiIDEViewItemProvider != null) uiIDEViewItemProvider.dispose();
		if (uiDisplayViewItemProvider != null) uiDisplayViewItemProvider.dispose();
		if (uiMobileViewItemProvider != null) uiMobileViewItemProvider.dispose();
		if (uiPointItemProvider != null) uiPointItemProvider.dispose();
		if (uiBeanSlotItemProvider != null) uiBeanSlotItemProvider.dispose();
		if (uiBindingEndpointAliasItemProvider != null) uiBindingEndpointAliasItemProvider.dispose();
		if (uiBindingEndpointAssignmentItemProvider != null) uiBindingEndpointAssignmentItemProvider.dispose();
		if (uiBindingItemProvider != null) uiBindingItemProvider.dispose();
		if (uiPathSegmentItemProvider != null) uiPathSegmentItemProvider.dispose();
		if (uiNestedFieldItemProvider != null) uiNestedFieldItemProvider.dispose();
		if (uiNestedPropertyItemProvider != null) uiNestedPropertyItemProvider.dispose();
		if (uiRawBindablePathSegmentItemProvider != null) uiRawBindablePathSegmentItemProvider.dispose();
		if (uiTypedBindableDefItemProvider != null) uiTypedBindableDefItemProvider.dispose();
		if (uiTypedBindableRawTypeItemProvider != null) uiTypedBindableRawTypeItemProvider.dispose();
		if (uiTypedBindableRawTypeAliasItemProvider != null) uiTypedBindableRawTypeAliasItemProvider.dispose();
		if (uiCommandBindableDefItemProvider != null) uiCommandBindableDefItemProvider.dispose();
		if (uiActionItemProvider != null) uiActionItemProvider.dispose();
		if (uiMobileActionItemProvider != null) uiMobileActionItemProvider.dispose();
		if (uiGridLayoutAssigmentItemProvider != null) uiGridLayoutAssigmentItemProvider.dispose();
		if (uiGridLayoutItemProvider != null) uiGridLayoutItemProvider.dispose();
		if (uiHorizontalLayoutAssigmentItemProvider != null) uiHorizontalLayoutAssigmentItemProvider.dispose();
		if (uiHorizontalLayoutItemProvider != null) uiHorizontalLayoutItemProvider.dispose();
		if (uiVerticalLayoutAssigmentItemProvider != null) uiVerticalLayoutAssigmentItemProvider.dispose();
		if (uiVerticalLayoutItemProvider != null) uiVerticalLayoutItemProvider.dispose();
		if (uiFormLayoutAssigmentItemProvider != null) uiFormLayoutAssigmentItemProvider.dispose();
		if (uiFormLayoutItemProvider != null) uiFormLayoutItemProvider.dispose();
		if (uiSearchPanelItemProvider != null) uiSearchPanelItemProvider.dispose();
		if (uiBeanReferenceFieldItemProvider != null) uiBeanReferenceFieldItemProvider.dispose();
		if (uiTextFieldItemProvider != null) uiTextFieldItemProvider.dispose();
		if (uiSuggestTextFieldItemProvider != null) uiSuggestTextFieldItemProvider.dispose();
		if (uiImageItemProvider != null) uiImageItemProvider.dispose();
		if (uiListItemProvider != null) uiListItemProvider.dispose();
		if (uiTableItemProvider != null) uiTableItemProvider.dispose();
		if (uiComboBoxItemProvider != null) uiComboBoxItemProvider.dispose();
		if (uiColumnItemProvider != null) uiColumnItemProvider.dispose();
		if (uiSortOrderAssignmentItemProvider != null) uiSortOrderAssignmentItemProvider.dispose();
		if (uiSortOrderItemProvider != null) uiSortOrderItemProvider.dispose();
		if (uiColumnsAssignmentItemProvider != null) uiColumnsAssignmentItemProvider.dispose();
		if (uiNumericFieldItemProvider != null) uiNumericFieldItemProvider.dispose();
		if (uiCheckBoxItemProvider != null) uiCheckBoxItemProvider.dispose();
		if (uiVisibilityProcessorAssignmentItemProvider != null) uiVisibilityProcessorAssignmentItemProvider.dispose();
		if (uiVisibilityProcessorItemProvider != null) uiVisibilityProcessorItemProvider.dispose();
		if (uiVisibilityProcessorDefItemProvider != null) uiVisibilityProcessorDefItemProvider.dispose();
		if (uiChangeTriggerItemProvider != null) uiChangeTriggerItemProvider.dispose();
		if (uiXbaseVisibilityRuleItemProvider != null) uiXbaseVisibilityRuleItemProvider.dispose();
		if (uiVisibilityPropertiesAssignmentItemProvider != null) uiVisibilityPropertiesAssignmentItemProvider.dispose();
		if (uiVisibilityPropertyItemProvider != null) uiVisibilityPropertyItemProvider.dispose();
		if (uiMaxLengthValidatorItemProvider != null) uiMaxLengthValidatorItemProvider.dispose();
		if (uiMinLengthValidatorItemProvider != null) uiMinLengthValidatorItemProvider.dispose();
		if (uiRegexpValidatorItemProvider != null) uiRegexpValidatorItemProvider.dispose();
		if (uiBeanValidationValidatorItemProvider != null) uiBeanValidationValidatorItemProvider.dispose();
		if (uiXbaseValidatorItemProvider != null) uiXbaseValidatorItemProvider.dispose();
		if (uiValidatorAliasItemProvider != null) uiValidatorAliasItemProvider.dispose();
		if (uiValidatorAssignmentItemProvider != null) uiValidatorAssignmentItemProvider.dispose();
		if (uiValidatorDefItemProvider != null) uiValidatorDefItemProvider.dispose();
		if (uiHorizontalButtonGroupAssigmentItemProvider != null) uiHorizontalButtonGroupAssigmentItemProvider.dispose();
		if (uiHorizontalButtonGroupItemProvider != null) uiHorizontalButtonGroupItemProvider.dispose();
		if (uiButtonItemProvider != null) uiButtonItemProvider.dispose();
		if (uiSwitchItemProvider != null) uiSwitchItemProvider.dispose();
		if (uiVerticalComponentGroupAssigmentItemProvider != null) uiVerticalComponentGroupAssigmentItemProvider.dispose();
		if (uiVerticalComponentGroupItemProvider != null) uiVerticalComponentGroupItemProvider.dispose();
		if (uiMobileTabSheetItemProvider != null) uiMobileTabSheetItemProvider.dispose();
		if (uiMobileTabAssignmentItemProvider != null) uiMobileTabAssignmentItemProvider.dispose();
		if (uiTabSheetItemProvider != null) uiTabSheetItemProvider.dispose();
		if (uiTabAssignmentItemProvider != null) uiTabAssignmentItemProvider.dispose();
		if (uiMobileNavigationPageItemProvider != null) uiMobileNavigationPageItemProvider.dispose();
		if (uiMobileNavigationPageAssignmentItemProvider != null) uiMobileNavigationPageAssignmentItemProvider.dispose();
		if (uiMobileNavigationButtonItemProvider != null) uiMobileNavigationButtonItemProvider.dispose();
		if (uiMobileNavigationCommandItemProvider != null) uiMobileNavigationCommandItemProvider.dispose();
		if (uiOpenDialogCommandItemProvider != null) uiOpenDialogCommandItemProvider.dispose();
		if (uiSearchFieldItemProvider != null) uiSearchFieldItemProvider.dispose();
		if (uiSearchDialogItemProvider != null) uiSearchDialogItemProvider.dispose();
		if (uiDialogSearchFieldAssignmentItemProvider != null) uiDialogSearchFieldAssignmentItemProvider.dispose();
		if (uiSearchWithDialogCommandItemProvider != null) uiSearchWithDialogCommandItemProvider.dispose();
		if (uiLabelItemProvider != null) uiLabelItemProvider.dispose();
		if (uiDecimalFieldItemProvider != null) uiDecimalFieldItemProvider.dispose();
		if (uiTextAreaItemProvider != null) uiTextAreaItemProvider.dispose();
		if (uiOptionsGroupItemProvider != null) uiOptionsGroupItemProvider.dispose();
		if (uiDateFieldItemProvider != null) uiDateFieldItemProvider.dispose();
		if (uiBrowserItemProvider != null) uiBrowserItemProvider.dispose();
		if (uiProgressBarItemProvider != null) uiProgressBarItemProvider.dispose();
		if (uiI18nInfoItemProvider != null) uiI18nInfoItemProvider.dispose();
		if (uiSplitpanelAssigmentItemProvider != null) uiSplitpanelAssigmentItemProvider.dispose();
		if (uiSplitpanelItemProvider != null) uiSplitpanelItemProvider.dispose();
		if (uiPanelItemProvider != null) uiPanelItemProvider.dispose();
		if (uiErrorCodeItemProvider != null) uiErrorCodeItemProvider.dispose();
		if (uiMobileSearchPanelItemProvider != null) uiMobileSearchPanelItemProvider.dispose();
		if (uiMobileNavigationRootItemProvider != null) uiMobileNavigationRootItemProvider.dispose();
		if (uiMobileNavigationRootAssigmentItemProvider != null) uiMobileNavigationRootAssigmentItemProvider.dispose();
		if (uiMobileNavBarActionItemProvider != null) uiMobileNavBarActionItemProvider.dispose();
		if (uiAddToTableCommandItemProvider != null) uiAddToTableCommandItemProvider.dispose();
		if (uiRemoveFromTableCommandItemProvider != null) uiRemoveFromTableCommandItemProvider.dispose();
		if (uiSendEventCommandItemProvider != null) uiSendEventCommandItemProvider.dispose();
		if (uiSetNewInstanceCommandItemProvider != null) uiSetNewInstanceCommandItemProvider.dispose();
		if (uiPasswordFieldItemProvider != null) uiPasswordFieldItemProvider.dispose();
		if (uiMaskedTextFieldItemProvider != null) uiMaskedTextFieldItemProvider.dispose();
		if (uiPrefixedMaskedTextFieldItemProvider != null) uiPrefixedMaskedTextFieldItemProvider.dispose();
		if (uiMaskedNumericFieldItemProvider != null) uiMaskedNumericFieldItemProvider.dispose();
		if (uiMaskedDecimalFieldItemProvider != null) uiMaskedDecimalFieldItemProvider.dispose();
		if (uiStringToStringMapEntryItemProvider != null) uiStringToStringMapEntryItemProvider.dispose();
		if (uiRichTextAreaItemProvider != null) uiRichTextAreaItemProvider.dispose();
		if (uiPrefixToMaskMapEntryItemProvider != null) uiPrefixToMaskMapEntryItemProvider.dispose();
	}

}
