13 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	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);
  }
 }
}