//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------

namespace System.Collections.ObjectModel
{
    using System;
    using System.Collections.Generic;
    using System.ServiceModel;

    class FreezableCollection<T> : Collection<T>, ICollection<T>
    {
        bool frozen;

        public FreezableCollection()
            : base()
        {
        }

        public FreezableCollection(IList<T> list)
            : base(list)
        {
        }

        public bool IsFrozen
        {
            get
            {
                return this.frozen;
            }
        }

        bool ICollection<T>.IsReadOnly
        {
            get
            {
                return this.frozen;
            }
        }

        public void Freeze()
        {
            this.frozen = true;
        }

        protected override void ClearItems()
        {
            ThrowIfFrozen();
            base.ClearItems();
        }

        protected override void InsertItem(int index, T item)
        {
            ThrowIfFrozen();
            base.InsertItem(index, item);
        }

        protected override void RemoveItem(int index)
        {
            ThrowIfFrozen();
            base.RemoveItem(index);
        }

        protected override void SetItem(int index, T item)
        {
            ThrowIfFrozen();
            base.SetItem(index, item);
        }

        void ThrowIfFrozen()
        {
            if (this.frozen)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.ObjectIsReadOnly));
            }
        }
    }
}