// ========================================================================
// Copyright 2007 - Volian Enterprises, Inc. All rights reserved.          
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
// ------------------------------------------------------------------------
// $Workfile: $     $Revision: $                                           
// $Author: $   $Date: $                                                   
//                                                                         
// $History: $                                                             
// ========================================================================
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using System.Configuration;
using System.IO;
using System.ComponentModel;
using System.Collections.Generic;
namespace VEPROMS.CSLA.Library
{
    /// 
    ///	ItemInfoList Generated by MyGeneration using the CSLA Object Mapping template
    /// 
    [Serializable()]
    [TypeConverter(typeof(ItemInfoListConverter))]
    public partial class ItemInfoList : ReadOnlyListBase, ICustomTypeDescriptor, IDisposable
    {
        #region Log4Net
        private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        #endregion
        #region Business Methods
        internal new IList Items
        { get { return base.Items; } }
        public void AddEvents()
        {
            foreach (ItemInfo tmp in this)
            {
                tmp.Changed += new ItemInfoEvent(tmp_Changed);
                tmp.Deleted += new ItemInfoEvent(tmp_Deleted);
            }
        }
        private bool _RefreshingList = false;
        public bool RefreshingList
        {
            get { return _RefreshingList; }
            set { _RefreshingList = value; }
        }
        void tmp_Deleted(object sender)
        {
            ItemInfo ii = sender as ItemInfo;
            if (ii != null)
            {
                RefreshingList = true;
                IsReadOnly = false;
                Remove(ii);
                IsReadOnly = true;
                this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, 0));
                RefreshingList = false;
            }
        }
        // sender can be either the current item changed, or the current item with one added before it (when an item is inserted)
        void tmp_Changed(object sender)
        {
            for (int i = 0; i < Count; i++)
            {
                if (base[i] == sender)
                {
                    // Added insert to fix when item is replaced and a 'delete' is done, the item needs inserted.  Note
                    // that when text is modified, i.e. 'Changed', this code is not executed.   Fixed B2016-130.
                    RefreshingList = true;
                    IsReadOnly = false;
                    // the following checks to see if the previous is this one, and if so, it is not an insert it is a change
                    // On an insert, inserting from 'sender', MyPrevious is set as the new item.
                    if (SourceOfList != "Search" && (sender as ItemInfo).MyPrevious != null && i > 0 && base[i - 1].ItemID != (sender as ItemInfo).MyPrevious.ItemID)
                        Items.Insert(i, (sender as ItemInfo).MyPrevious);
                    IsReadOnly = true;
                    this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, i));
                    RefreshingList = false;
                    break;
                }
            }
        }
        private string _SourceOfList;
        public string SourceOfList
        {
            get { return _SourceOfList; }
            set { _SourceOfList = value; }
        }
        //private void ShowList(string txt)
        //{
        //	Console.WriteLine("\r\n{0} - {1} - {2}: i, base[i].Ordinal, base[i].ItemID, base[i].DisplayText", txt, Count, SourceOfList);
        //	for (int i = 0; i < Count; i++)
        //	{
        //		Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}", i, base[i].Ordinal, base[i].ItemID, base[i].DisplayText, base[i].MyItemInfoUnique, base[i].Disposed);
        //	}
        //}
        private bool _Disposed = false;
        private static int _CountCreated = 0;
        private static int _CountDisposed = 0;
        private static int _CountFinalized = 0;
        private static int IncrementCountCreated
        { get { return ++_CountCreated; } }
        private int _CountWhenCreated = IncrementCountCreated;
        public static int CountCreated
        { get { return _CountCreated; } }
        public static int CountNotDisposed
        { get { return _CountCreated - _CountDisposed; } }
        public static int CountNotFinalized
        { get { return _CountCreated - _CountFinalized; } }
        ~ItemInfoList()
        {
            _CountFinalized++;
        }
        public void Dispose()
        {
            if (_Disposed) return;
            _Disposed = true;
            _CountDisposed++;
            foreach (ItemInfo tmp in this)
            {
                tmp.Changed -= tmp_Changed;
                tmp.Deleted -= tmp_Deleted;
            }
        }
        #endregion
        #region Factory Methods
        public static ItemInfoList _ItemInfoList = null;
        /// 
        /// Return a list of all ItemInfo.
        /// 
        public static ItemInfoList Get()
        {
            try
            {
                if (_ItemInfoList != null)
                    return _ItemInfoList;
                ItemInfoList tmp = DataPortal.Fetch();
                ItemInfo.AddList(tmp);
                tmp.AddEvents();
                _ItemInfoList = tmp;
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on ItemInfoList.Get", ex);
            }
        }
        /// 
        /// Reset the list of all ItemInfo.
        /// 
        public static void Reset()
        {
            _ItemInfoList = null;
        }
        // CSLATODO: Add alternative gets - 
        //public static ItemInfoList Get()
        //{
        //	try
        //	{
        //  	return DataPortal.Fetch(new FilteredCriteria());
        //	}
        //	catch (Exception ex)
        //	{
        //		throw new DbCslaException("Error on ItemInfoList.Get", ex);
        //	}
        //}
        public static ItemInfoList GetNext(int? previousID)
        {
            try
            {
                ItemInfoList tmp = DataPortal.Fetch(new PreviousIDCriteria(previousID));
                ItemInfo.AddList(tmp);
                tmp.AddEvents();
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on ItemInfoList.GetNext", ex);
            }
        }
        public static ItemInfoList GetByContentID(int contentID)
        {
            try
            {
                ItemInfoList tmp = DataPortal.Fetch(new ContentIDCriteria(contentID));
                ItemInfo.AddList(tmp);
                tmp.AddEvents();
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on ItemInfoList.GetByContentID", ex);
            }
        }
        private ItemInfoList()
        { /* require use of factory methods */ }
        #endregion
        #region Data Access Portal
        private void DataPortal_Fetch()
        {
            this.RaiseListChangedEvents = false;
            if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_Fetch", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getItems";
                        cm.CommandTimeout = Database.DefaultTimeout;
                        using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                        {
                            IsReadOnly = false;
                            while (dr.Read()) this.Add(new ItemInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_Fetch", ex);
                throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
            }
            this.RaiseListChangedEvents = true;
        }
        [Serializable()]
        private class PreviousIDCriteria
        {
            public PreviousIDCriteria(int? previousID)
            {
                _PreviousID = previousID;
            }
            private int? _PreviousID;
            public int? PreviousID
            {
                get { return _PreviousID; }
                set { _PreviousID = value; }
            }
        }
        private void DataPortal_Fetch(PreviousIDCriteria criteria)
        {
            this.RaiseListChangedEvents = false;
            if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_FetchPreviousID", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getNextItems";
                        cm.Parameters.AddWithValue("@PreviousID", criteria.PreviousID);
                        cm.CommandTimeout = Database.DefaultTimeout;
                        using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                        {
                            IsReadOnly = false;
                            while (dr.Read()) this.Add(new ItemInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_FetchPreviousID", ex);
                throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
            }
            this.RaiseListChangedEvents = true;
        }
        [Serializable()]
        private class ContentIDCriteria
        {
            public ContentIDCriteria(int contentID)
            {
                _ContentID = contentID;
            }
            private int _ContentID;
            public int ContentID
            {
                get { return _ContentID; }
                set { _ContentID = value; }
            }
        }
        private void DataPortal_Fetch(ContentIDCriteria criteria)
        {
            this.RaiseListChangedEvents = false;
            if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfoList.DataPortal_FetchContentID", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getItemsByContentID";
                        cm.Parameters.AddWithValue("@ContentID", criteria.ContentID);
                        cm.CommandTimeout = Database.DefaultTimeout;
                        using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                        {
                            IsReadOnly = false;
                            while (dr.Read()) this.Add(new ItemInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfoList.DataPortal_FetchContentID", ex);
                throw new DbCslaException("ItemInfoList.DataPortal_Fetch", ex);
            }
            this.RaiseListChangedEvents = true;
        }
        #endregion
        #region ICustomTypeDescriptor impl
        public String GetClassName()
        { return TypeDescriptor.GetClassName(this, true); }
        public AttributeCollection GetAttributes()
        { return TypeDescriptor.GetAttributes(this, true); }
        public String GetComponentName()
        { return TypeDescriptor.GetComponentName(this, true); }
        public TypeConverter GetConverter()
        { return TypeDescriptor.GetConverter(this, true); }
        public EventDescriptor GetDefaultEvent()
        { return TypeDescriptor.GetDefaultEvent(this, true); }
        public PropertyDescriptor GetDefaultProperty()
        { return TypeDescriptor.GetDefaultProperty(this, true); }
        public object GetEditor(Type editorBaseType)
        { return TypeDescriptor.GetEditor(this, editorBaseType, true); }
        public EventDescriptorCollection GetEvents(Attribute[] attributes)
        { return TypeDescriptor.GetEvents(this, attributes, true); }
        public EventDescriptorCollection GetEvents()
        { return TypeDescriptor.GetEvents(this, true); }
        public object GetPropertyOwner(PropertyDescriptor pd)
        { return this; }
        /// 
        /// Called to get the properties of this type. Returns properties with certain
        /// attributes. this restriction is not implemented here.
        /// 
        /// 
        /// 
        public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        { return GetProperties(); }
        /// 
        /// Called to get the properties of this type.
        /// 
        /// 
        public PropertyDescriptorCollection GetProperties()
        {
            // Create a collection object to hold property descriptors
            PropertyDescriptorCollection pds = new PropertyDescriptorCollection(null);
            // Iterate the list 
            for (int i = 0; i < this.Items.Count; i++)
            {
                // Create a property descriptor for the item and add to the property descriptor collection
                ItemInfoListPropertyDescriptor pd = new ItemInfoListPropertyDescriptor(this, i);
                pds.Add(pd);
            }
            // return the property descriptor collection
            return pds;
        }
        #endregion
    } // Class
    #region Property Descriptor
    /// 
    /// Summary description for CollectionPropertyDescriptor.
    /// 
    public partial class ItemInfoListPropertyDescriptor : vlnListPropertyDescriptor
    {
        private ItemInfo Item { get { return (ItemInfo)_Item; } }
        public ItemInfoListPropertyDescriptor(ItemInfoList collection, int index) : base(collection, index) {; }
    }
    #endregion
    #region Converter
    internal class ItemInfoListConverter : ExpandableObjectConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
        {
            if (destType == typeof(string) && value is ItemInfoList)
            {
                // Return department and department role separated by comma.
                return ((ItemInfoList)value).Items.Count.ToString() + " Items";
            }
            return base.ConvertTo(context, culture, value, destType);
        }
    }
    #endregion
} // Namespace