402 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
	
	
			
		
		
	
	
			402 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Org Mode
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.Data;
 | 
						|
using System.Data.SqlClient;
 | 
						|
using System.Text.RegularExpressions;
 | 
						|
using Csla;
 | 
						|
using Csla.Data;
 | 
						|
 | 
						|
namespace VEPROMS.CSLA.Library
 | 
						|
{
 | 
						|
	public partial class ItemInfo
 | 
						|
	{
 | 
						|
		#region Old Insert
 | 
						|
		//public ItemInfo InsertSiblingBeforeOld(string text)
 | 
						|
		//{
 | 
						|
		//  return InsertSiblingBefore(text, null);
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertSiblingBeforeOld(string text, string number)
 | 
						|
		//{
 | 
						|
		//  ItemInfo prevItemInfo = MyPrevious;
 | 
						|
		//  ItemInfo newItemInfo = null;
 | 
						|
		//  PartInfoList partInfoList = null;
 | 
						|
		//  if (MyParent != null && MyParent.MyContent != null)
 | 
						|
		//  {
 | 
						|
		//    MyParent.MyContent.RefreshContentParts();
 | 
						|
		//    partInfoList = MyParent.MyContent.ContentParts;
 | 
						|
		//  }
 | 
						|
		//  using (Item prevItem = prevItemInfo == null ? null : prevItemInfo.Get()) // Get the previous Item
 | 
						|
		//  {
 | 
						|
		//    using (Item newItem = Item.MakeItem(prevItem, Content.MakeContent(number, text, MyContent.Type, null, null))) // Create the new Item
 | 
						|
		//    {
 | 
						|
		//      using (Item thisItem = Get()) // Get the next item in the list
 | 
						|
		//      {
 | 
						|
		//        thisItem.MyPrevious = newItem; // Point to the new item
 | 
						|
		//        thisItem.Save(); // Save Changes
 | 
						|
		//        if (prevItem == null)
 | 
						|
		//        {
 | 
						|
		//          PartInfo partInfo = partInfoList.Find(this);
 | 
						|
		//          using (Part part = partInfo.Get())
 | 
						|
		//          {
 | 
						|
		//            part.MyItem = newItem;
 | 
						|
		//            part.Save();
 | 
						|
		//          }
 | 
						|
		//        }
 | 
						|
		//      }
 | 
						|
		//      // ToDo:  Need change PartInfo in PartInfoList 
 | 
						|
		//      newItemInfo = ItemInfo.Get(newItem.ItemID);
 | 
						|
		//      newItemInfo.ResetOrdinal();
 | 
						|
		//    }
 | 
						|
		//  }
 | 
						|
		//  return newItemInfo;
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertSiblingAfterOld(string text)
 | 
						|
		//{
 | 
						|
		//  return InsertSiblingAfter(text, null);
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertSiblingAfterOld(string text, string number)
 | 
						|
		//{
 | 
						|
		//  return InsertSiblingAfter(text, number, MyContent.Type);
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertSiblingAfterOld(string text, string number, int? type)
 | 
						|
		//{
 | 
						|
		//  ItemInfo nextItemInfo = NextItem;
 | 
						|
		//  ItemInfo newItemInfo = null;
 | 
						|
		//  using (Item thisItem = Get()) // Get the Current Item
 | 
						|
		//  {
 | 
						|
		//    using (Item newItem = Item.MakeItem(thisItem, Content.MakeContent(number, text, type, null, null))) // Create the new Item
 | 
						|
		//    {
 | 
						|
		//      if (nextItemInfo != null) // Simple case, adding to end of list:
 | 
						|
		//        using (Item nextItem = nextItemInfo.Get()) // Get the next item in the list
 | 
						|
		//        {
 | 
						|
		//          nextItem.MyPrevious = newItem; // Point to the new item
 | 
						|
		//          nextItem.Save(); // Save Changes
 | 
						|
		//        }
 | 
						|
		//      // ToDo:  Need change PartInfo in PartInfoList 
 | 
						|
		//      newItemInfo = ItemInfo.Get(newItem.ItemID);
 | 
						|
		//      newItemInfo.ResetOrdinal();
 | 
						|
		//    }
 | 
						|
		//  }
 | 
						|
		//  return newItemInfo;
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertChildOld(E_FromType fromType, int type, string text)
 | 
						|
		//{
 | 
						|
		//  return InsertChild(fromType, type, text, null);
 | 
						|
		//}
 | 
						|
		//public ItemInfo InsertChildOld(E_FromType fromType, int type, string text, string number)
 | 
						|
		//{
 | 
						|
		//  ItemInfo newItemInfo = null;
 | 
						|
		//  using (Item thisItem = Get()) // Get the Current Item
 | 
						|
		//  {
 | 
						|
		//    using (Item newItem = Item.MakeItem(null, Content.MakeContent(number, text, type, null, null))) // Create the new Item
 | 
						|
		//    {
 | 
						|
		//      PartInfo partInfo = MyContent.ContentParts == null ? null : MyContent.ContentParts.Find(fromType);
 | 
						|
		//      if (partInfo != null)
 | 
						|
		//      {
 | 
						|
		//        //this could be equivalent to adding a sibling with a specific type
 | 
						|
		//        using (Part part = partInfo.Get())
 | 
						|
		//        {
 | 
						|
		//          part.MyItem.MyPrevious = newItem;
 | 
						|
		//          part.MyItem.Save();
 | 
						|
		//          part.MyItem = newItem;
 | 
						|
		//          part.Save();
 | 
						|
		//        }
 | 
						|
		//      }
 | 
						|
		//      else
 | 
						|
		//      {
 | 
						|
		//        // This means that a part needs to be added to point to the new item
 | 
						|
		//        //using (Part part = Part.MakePart(thisItem.MyContent, ))
 | 
						|
		//        //{ ;}
 | 
						|
		//        thisItem.MyContent.ContentParts.Add((int)fromType, newItem);
 | 
						|
		//        thisItem.Save();
 | 
						|
		//      }
 | 
						|
		//      newItemInfo = ItemInfo.Get(newItem.ItemID);
 | 
						|
		//    }
 | 
						|
		//  }
 | 
						|
		//  ResetParts();
 | 
						|
		//  return newItemInfo;
 | 
						|
		//}
 | 
						|
		#endregion
 | 
						|
		#region Insert Before
 | 
						|
		public ItemInfo InsertSiblingBefore(string text)
 | 
						|
		{
 | 
						|
			return InsertSiblingBefore(text, null);
 | 
						|
		}
 | 
						|
		public ItemInfo InsertSiblingBefore(string text, string number)
 | 
						|
		{
 | 
						|
			ItemInfo tmp = NewItemInfoFetch(ItemID, EAddpingPart.Before, number, text, null, null, null, null, DateTime.Now, Environment.UserName);
 | 
						|
			// this item is updated in SQL so we have to manually force the iteminfo updates
 | 
						|
			// Refresh ItemInfo to update Previous
 | 
						|
			using (Item item = Get()) ItemInfo.Refresh(item);
 | 
						|
			// Update all of the content records that have transitions that point to the Siblings or Sibling Children of the new item 
 | 
						|
			tmp.UpdateTransitionText();
 | 
						|
			return tmp;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
		#region Insert After
 | 
						|
		public ItemInfo InsertSiblingAfter(string text)
 | 
						|
		{
 | 
						|
			return InsertSiblingAfter(text, null);
 | 
						|
		}
 | 
						|
		public ItemInfo InsertSiblingAfter(string text, string number)
 | 
						|
		{
 | 
						|
			return InsertSiblingAfter(text, number, MyContent.Type);
 | 
						|
		}
 | 
						|
		public ItemInfo InsertSiblingAfter(string text, string number, int? type)
 | 
						|
		{
 | 
						|
			ItemInfo tmp = NewItemInfoFetch(ItemID, EAddpingPart.After, number, text, type, null, null, null, DateTime.Now, Environment.UserName);
 | 
						|
			//tmp = DataPortal.Fetch<StepInfo>(new AddingPartCriteria(ItemID, EAddpingPart.After, number, text, type, null, null, null, DateTime.Now, Environment.UserName));
 | 
						|
			// if next exists, it is updated in SQL so we have to manually force the iteminfo updates
 | 
						|
			// Refresh ItemInfo to update PreviousID field
 | 
						|
			if (tmp.NextItem != null) using (Item item = tmp.NextItem.Get()) ItemInfo.Refresh(item);
 | 
						|
			// Update all of the content records that have transitions that point to the Siblings or Sibling Children of the new item 
 | 
						|
			tmp.UpdateTransitionText();
 | 
						|
			return tmp;
 | 
						|
		}
 | 
						|
		private ItemInfo NewItemInfoFetch(int itemID, EAddpingPart addType, string number, string text, int? type, int? fromType, int? formatID, string config, DateTime dts, string userID)
 | 
						|
		{
 | 
						|
			ItemInfo tmp;
 | 
						|
			if (addType == EAddpingPart.Child)
 | 
						|
			{
 | 
						|
				// adding children.  Type is based on 'fromType'
 | 
						|
				switch ((E_FromType)fromType)
 | 
						|
				{
 | 
						|
					case E_FromType.Procedure:
 | 
						|
						tmp = DataPortal.Fetch<ProcedureInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
						break;
 | 
						|
					case E_FromType.Section:
 | 
						|
						tmp = DataPortal.Fetch<SectionInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
						break;
 | 
						|
					default:
 | 
						|
						tmp = DataPortal.Fetch<StepInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
						break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if (GetType() == typeof(ProcedureInfo))
 | 
						|
					tmp = DataPortal.Fetch<ProcedureInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
				else if (GetType() == typeof(SectionInfo))
 | 
						|
					tmp = DataPortal.Fetch<SectionInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
				else
 | 
						|
					tmp = DataPortal.Fetch<StepInfo>(new AddingPartCriteria(itemID, addType, number, text, type, fromType, formatID, config, dts, userID));
 | 
						|
			}
 | 
						|
			return tmp;
 | 
						|
		}
 | 
						|
		public void UpdateTransitionText()
 | 
						|
		{
 | 
						|
			// Update Ordinals from here down
 | 
						|
			ResetOrdinal();
 | 
						|
			// This returns a list of all of the transitions that may have been affected
 | 
						|
			using(TransitionInfoList trans = TransitionInfoList.GetAffected(this.ItemID))
 | 
						|
			{
 | 
						|
				foreach (TransitionInfo tran in trans)
 | 
						|
				{
 | 
						|
					using (Content content = tran.MyContent.Get())
 | 
						|
					{
 | 
						|
						content.FixTransitionText(tran);
 | 
						|
						if (content.IsDirty)
 | 
						|
							content.Save();
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
		#region Insert Child
 | 
						|
		public ItemInfo InsertChild(E_FromType fromType, int type, string text)
 | 
						|
		{
 | 
						|
			return InsertChild(fromType, type, text, null);
 | 
						|
		}
 | 
						|
		public ItemInfo InsertChild(E_FromType fromType, int type, string text, string number)
 | 
						|
		{
 | 
						|
			ItemInfo tmp = NewItemInfoFetch(ItemID, EAddpingPart.Child, number, text, type, (int?) fromType, null, null, DateTime.Now, Environment.UserName);
 | 
						|
			// if next exists, it is updated in SQL so we have to manually force the iteminfo updates
 | 
						|
			// Refresh ItemInfo to update PreviousID field
 | 
						|
			if (tmp.NextItem != null) using (Item item = tmp.NextItem.Get()) ItemInfo.Refresh(item);
 | 
						|
			// Update all of the content records that have transitions that point to the Siblings or Sibling Children of the new item 
 | 
						|
			tmp.UpdateTransitionText();
 | 
						|
			return tmp;
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
		#region DataPortal
 | 
						|
		private void DataPortal_Fetch(AddingPartCriteria criteria)
 | 
						|
		{
 | 
						|
			if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] ItemInfo.DataPortal_Fetch", GetHashCode());
 | 
						|
			try
 | 
						|
			{
 | 
						|
				using (SqlConnection cn = Database.VEPROMS_SqlConnection)
 | 
						|
				{
 | 
						|
					ApplicationContext.LocalContext["cn"] = cn;
 | 
						|
					using (SqlCommand cm = cn.CreateCommand())
 | 
						|
					{
 | 
						|
						cm.CommandType = CommandType.StoredProcedure;
 | 
						|
						cm.Parameters.AddWithValue("@ItemID", criteria.ItemID);			//ABC After Before Child
 | 
						|
						cm.Parameters.AddWithValue("@Number", criteria.Number);			//ABC
 | 
						|
						cm.Parameters.AddWithValue("@Text", criteria.Text);					//ABC
 | 
						|
						cm.Parameters.AddWithValue("@FormatID", criteria.FormatID);	//ABC
 | 
						|
						cm.Parameters.AddWithValue("@Config", criteria.Config);			//ABC
 | 
						|
						cm.Parameters.AddWithValue("@Type", criteria.Type);					//ABC
 | 
						|
						cm.Parameters.AddWithValue("@DTS", criteria.DTS);						//ABC
 | 
						|
						cm.Parameters.AddWithValue("@UserID", criteria.UserID);			//ABC
 | 
						|
						SqlParameter param_ContentID = new SqlParameter("@newItemID", SqlDbType.Int);
 | 
						|
						param_ContentID.Direction = ParameterDirection.Output;
 | 
						|
						cm.Parameters.Add(param_ContentID);
 | 
						|
						switch (criteria.AddType)
 | 
						|
						{
 | 
						|
							case EAddpingPart.Child:
 | 
						|
								cm.CommandText = "addItemChild";
 | 
						|
								cm.Parameters.AddWithValue("@FromType", criteria.FromType);	//--C
 | 
						|
								break;
 | 
						|
							case EAddpingPart.Before:
 | 
						|
								cm.CommandText = "addItemSiblingBefore";
 | 
						|
								break;
 | 
						|
							case EAddpingPart.After:
 | 
						|
								cm.CommandText = "addItemSiblingAfter";
 | 
						|
								break;
 | 
						|
						}
 | 
						|
						using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
 | 
						|
						{
 | 
						|
							//newItemID = (int)cm.Parameters["@newContentID"].Value;
 | 
						|
							if (!dr.Read())
 | 
						|
							{
 | 
						|
								_ErrorMessage = "No Record Found";
 | 
						|
								return;
 | 
						|
							}
 | 
						|
							ReadData(dr);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					// removing of item only needed for local data portal
 | 
						|
					if (ApplicationContext.ExecutionLocation == ApplicationContext.ExecutionLocations.Client)
 | 
						|
						ApplicationContext.LocalContext.Remove("cn");
 | 
						|
				}
 | 
						|
			}
 | 
						|
			catch (Exception ex)
 | 
						|
			{
 | 
						|
				if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfo.DataPortal_Fetch", ex);
 | 
						|
				_ErrorMessage = ex.Message;
 | 
						|
				throw new DbCslaException("ItemInfo.DataPortal_Fetch", ex);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
		[Serializable()]
 | 
						|
		protected class AddingPartCriteria
 | 
						|
		{
 | 
						|
			#region Properties
 | 
						|
			private int _ItemID;
 | 
						|
			public int ItemID
 | 
						|
			{
 | 
						|
				get { return _ItemID; }
 | 
						|
				set { _ItemID = value; }
 | 
						|
			}
 | 
						|
			private EAddpingPart _AddType;
 | 
						|
			public EAddpingPart AddType
 | 
						|
			{
 | 
						|
				get { return _AddType; }
 | 
						|
				set { _AddType = value; }
 | 
						|
			}
 | 
						|
			private string _Number=null;
 | 
						|
			public string Number
 | 
						|
			{
 | 
						|
				get { return _Number; }
 | 
						|
				set { _Number = value; }
 | 
						|
			}
 | 
						|
			private string _Text=null;
 | 
						|
			public string Text
 | 
						|
			{
 | 
						|
				get { return _Text; }
 | 
						|
				set { _Text = value; }
 | 
						|
			}
 | 
						|
			private int? _FromType = null;
 | 
						|
			public int? FromType
 | 
						|
			{
 | 
						|
				get { return _FromType; }
 | 
						|
				set { _FromType = value; }
 | 
						|
			}
 | 
						|
			private int? _Type=null;
 | 
						|
			public int? Type
 | 
						|
			{
 | 
						|
				get { return _Type; }
 | 
						|
				set { _Type = value; }
 | 
						|
			}
 | 
						|
			private int? _FormatID=null;
 | 
						|
			public int? FormatID
 | 
						|
			{
 | 
						|
				get { return _FormatID; }
 | 
						|
				set { _FormatID = value; }
 | 
						|
			}
 | 
						|
			private string _Config=null;
 | 
						|
			public string Config
 | 
						|
			{
 | 
						|
				get { return _Config; }
 | 
						|
				set { _Config = value; }
 | 
						|
			}
 | 
						|
			private DateTime _DTS;
 | 
						|
			public DateTime DTS
 | 
						|
			{
 | 
						|
				get { return _DTS; }
 | 
						|
				set { _DTS = value; }
 | 
						|
			}
 | 
						|
			private string _UserID;
 | 
						|
			public string UserID
 | 
						|
			{
 | 
						|
				get { return _UserID; }
 | 
						|
				set { _UserID = value; }
 | 
						|
			}
 | 
						|
			#endregion
 | 
						|
			#region Constructor
 | 
						|
			public AddingPartCriteria(int itemID, EAddpingPart addType, string number, string text, int? type, int? fromType, int? formatID, string config, DateTime dts, string userID)
 | 
						|
			{
 | 
						|
				_ItemID = itemID;
 | 
						|
				_AddType = addType;
 | 
						|
				_Number = number;
 | 
						|
				_Text = text;
 | 
						|
				_Type = type;
 | 
						|
				_FromType = fromType;
 | 
						|
				_FormatID = formatID;
 | 
						|
				_Config = config;
 | 
						|
				_DTS = dts;
 | 
						|
				_UserID = userID;
 | 
						|
			}
 | 
						|
			#endregion
 | 
						|
		}
 | 
						|
		public enum EAddpingPart
 | 
						|
		{
 | 
						|
			Child=0,
 | 
						|
			Before=1,
 | 
						|
			After=2
 | 
						|
		}
 | 
						|
		public ItemInfo NextItem
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				if (NextItemCount > 0 && NextItems.Count > 0)
 | 
						|
					return NextItems[0];
 | 
						|
				return null;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private static void ResetOrdinal(int itemID)
 | 
						|
		{
 | 
						|
			ConvertListToDictionary();
 | 
						|
			string key = itemID.ToString();
 | 
						|
			while (key != null && _CacheByPrimaryKey.ContainsKey(key))
 | 
						|
			{
 | 
						|
				ItemInfo[] items = _CacheByPrimaryKey[key].ToArray();
 | 
						|
				key = null;
 | 
						|
				foreach (ItemInfo item in items)
 | 
						|
				{
 | 
						|
					//Console.WriteLine("item = {0}, ordinal = {1}",item,item.Ordinal);
 | 
						|
					item._Ordinal = null;
 | 
						|
					item._TagsSetup = false;
 | 
						|
					if (key == null && item.NextItem != null)
 | 
						|
						key = item.NextItem.ItemID.ToString();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		private void ResetOrdinal()
 | 
						|
		{
 | 
						|
			ResetOrdinal(ItemID);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |