// ========================================================================
// 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
{
    /// 
    ///	PartInfoList Generated by MyGeneration using the CSLA Object Mapping template
    /// 
    [Serializable()]
    [TypeConverter(typeof(PartInfoListConverter))]
    public partial class PartInfoList : 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 (PartInfo tmp in this)
            {
                tmp.Changed += new PartInfoEvent(tmp_Changed);
            }
        }
        void tmp_Changed(object sender)
        {
            for (int i = 0; i < Count; i++)
            {
                if (base[i] == sender)
                    this.OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, i));
            }
        }
        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; } }
        ~PartInfoList()
        {
            _CountFinalized++;
        }
        public void Dispose()
        {
            if (_Disposed) return;
            _CountDisposed++;
            _Disposed = true;
            foreach (PartInfo tmp in this)
            {
                tmp.Changed -= tmp_Changed;
            }
        }
        #endregion
        #region Factory Methods
        public static PartInfoList _PartInfoList = null;
        /// 
        /// Return a list of all PartInfo.
        /// 
        public static PartInfoList Get()
        {
            try
            {
                if (_PartInfoList != null)
                    return _PartInfoList;
                PartInfoList tmp = DataPortal.Fetch();
                PartInfo.AddList(tmp);
                tmp.AddEvents();
                _PartInfoList = tmp;
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on PartInfoList.Get", ex);
            }
        }
        /// 
        /// Reset the list of all PartInfo.
        /// 
        public static void Reset()
        {
            _PartInfoList = null;
        }
        // CSLATODO: Add alternative gets - 
        //public static PartInfoList Get()
        //{
        //	try
        //	{
        //  	return DataPortal.Fetch(new FilteredCriteria());
        //	}
        //	catch (Exception ex)
        //	{
        //		throw new DbCslaException("Error on PartInfoList.Get", ex);
        //	}
        //}
        public static PartInfoList GetByContentID(int contentID)
        {
            try
            {
                PartInfoList tmp = DataPortal.Fetch(new ContentIDCriteria(contentID));
                PartInfo.AddList(tmp);
                tmp.AddEvents();
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on PartInfoList.GetByContentID", ex);
            }
        }
        public static PartInfoList GetByItemID(int itemID)
        {
            try
            {
                PartInfoList tmp = DataPortal.Fetch(new ItemIDCriteria(itemID));
                PartInfo.AddList(tmp);
                tmp.AddEvents();
                return tmp;
            }
            catch (Exception ex)
            {
                throw new DbCslaException("Error on PartInfoList.GetByItemID", ex);
            }
        }
        private PartInfoList()
        { /* require use of factory methods */ }
        #endregion
        #region Data Access Portal
        private void DataPortal_Fetch()
        {
            this.RaiseListChangedEvents = false;
            if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] PartInfoList.DataPortal_Fetch", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getParts";
                        cm.CommandTimeout = Database.DefaultTimeout;
                        using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                        {
                            IsReadOnly = false;
                            while (dr.Read()) this.Add(new PartInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("PartInfoList.DataPortal_Fetch", ex);
                throw new DbCslaException("PartInfoList.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}] PartInfoList.DataPortal_FetchContentID", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getPartsByContentID";
                        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 PartInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("PartInfoList.DataPortal_FetchContentID", ex);
                throw new DbCslaException("PartInfoList.DataPortal_Fetch", ex);
            }
            this.RaiseListChangedEvents = true;
        }
        [Serializable()]
        private class ItemIDCriteria
        {
            public ItemIDCriteria(int itemID)
            {
                _ItemID = itemID;
            }
            private int _ItemID;
            public int ItemID
            {
                get { return _ItemID; }
                set { _ItemID = value; }
            }
        }
        private void DataPortal_Fetch(ItemIDCriteria criteria)
        {
            this.RaiseListChangedEvents = false;
            if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] PartInfoList.DataPortal_FetchItemID", GetHashCode());
            try
            {
                using (SqlConnection cn = Database.VEPROMS_SqlConnection)
                {
                    using (SqlCommand cm = cn.CreateCommand())
                    {
                        cm.CommandType = CommandType.StoredProcedure;
                        cm.CommandText = "getPartsByItemID";
                        cm.Parameters.AddWithValue("@ItemID", criteria.ItemID);
                        cm.CommandTimeout = Database.DefaultTimeout;
                        using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
                        {
                            IsReadOnly = false;
                            while (dr.Read()) this.Add(new PartInfo(dr));
                            IsReadOnly = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (_MyLog.IsErrorEnabled) _MyLog.Error("PartInfoList.DataPortal_FetchItemID", ex);
                throw new DbCslaException("PartInfoList.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
                PartInfoListPropertyDescriptor pd = new PartInfoListPropertyDescriptor(this, i);
                pds.Add(pd);
            }
            // return the property descriptor collection
            return pds;
        }
        #endregion
    } // Class
    #region Property Descriptor
    /// 
    /// Summary description for CollectionPropertyDescriptor.
    /// 
    public partial class PartInfoListPropertyDescriptor : vlnListPropertyDescriptor
    {
        private PartInfo Item { get { return (PartInfo)_Item; } }
        public PartInfoListPropertyDescriptor(PartInfoList collection, int index) : base(collection, index) {; }
    }
    #endregion
    #region Converter
    internal class PartInfoListConverter : ExpandableObjectConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
        {
            if (destType == typeof(string) && value is PartInfoList)
            {
                // Return department and department role separated by comma.
                return ((PartInfoList)value).Items.Count.ToString() + " Parts";
            }
            return base.ConvertTo(context, culture, value, destType);
        }
    }
    #endregion
} // Namespace