//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Objects.DataClasses;
using System.Data.Objects.Internal;
using System.Diagnostics;
using System.Data.Common;
namespace System.Data.Objects
{
///
/// Manages a binding list constructed from an EntityCollection.
///
///
/// Type of the elements in the binding list.
///
///
/// Type of element in the underlying EntityCollection.
///
///
/// The binding list is initialized from the EntityCollection,
/// and is synchronized with changes made to the EntityCollection membership.
/// This class always allows additions and removals from the binding list.
///
internal sealed class ObjectViewEntityCollectionData : IObjectViewData
where TItemElement : class
where TViewElement : TItemElement
{
private List _bindingList;
private EntityCollection _entityCollection;
private readonly bool _canEditItems;
///
/// True if item that was added to binding list but not underlying entity collection
/// is now being committed to the collection.
/// Otherwise false.
/// Used by CommitItemAt and OnCollectionChanged methods to coordinate addition
/// of new item to underlying entity collection.
///
private bool _itemCommitPending;
///
/// Construct a new instance of the ObjectViewEntityCollectionData class using the supplied entityCollection.
///
///
/// EntityCollection used to populate the binding list.
///
internal ObjectViewEntityCollectionData(EntityCollection entityCollection)
{
_entityCollection = entityCollection;
_canEditItems = true;
// Allow deferred loading to occur when initially populating the collection
_bindingList = new List(entityCollection.Count);
foreach (TViewElement entity in entityCollection)
{
_bindingList.Add(entity);
}
}
#region IObjectViewData Members
public IList List
{
get { return _bindingList; }
}
public bool AllowNew
{
get { return !_entityCollection.IsReadOnly; }
}
public bool AllowEdit
{
get { return _canEditItems; }
}
public bool AllowRemove
{
get { return !_entityCollection.IsReadOnly; }
}
public bool FiresEventOnAdd
{
get { return true; }
}
public bool FiresEventOnRemove
{
get { return true; }
}
public bool FiresEventOnClear
{
get { return true; }
}
public void EnsureCanAddNew()
{
// nop
}
public int Add(TViewElement item, bool isAddNew)
{
if (isAddNew)
{
// Item is added to bindingList, but pending addition to entity collection.
_bindingList.Add(item);
}
else
{
_entityCollection.Add(item);
// OnCollectionChanged will be fired, where the binding list will be updated.
}
return _bindingList.Count - 1;
}
public void CommitItemAt(int index)
{
TViewElement item = _bindingList[index];
try
{
_itemCommitPending = true;
_entityCollection.Add(item);
// OnCollectionChanged will be fired, where the binding list will be updated.
}
finally
{
_itemCommitPending = false;
}
}
public void Clear()
{
if (0 < _bindingList.Count)
{
List