1400 lines
50 KiB
C#
1400 lines
50 KiB
C#
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 delegate void ItemInfoInsertEvent(object sender, ItemInfoInsertEventArgs args);
|
|
public class ItemInfoInsertEventArgs
|
|
{
|
|
private ItemInfo _ItemInserted;
|
|
public ItemInfo ItemInserted
|
|
{
|
|
get { return _ItemInserted; }
|
|
set { _ItemInserted = value; }
|
|
}
|
|
private ItemInfo.EAddpingPart _AddingPart;
|
|
public ItemInfo.EAddpingPart AddingPart
|
|
{
|
|
get { return _AddingPart; }
|
|
set { _AddingPart = value; }
|
|
}
|
|
public ItemInfoInsertEventArgs(ItemInfo itemInserted,ItemInfo.EAddpingPart addingPart)
|
|
{
|
|
_ItemInserted = itemInserted;
|
|
_AddingPart = addingPart;
|
|
}
|
|
}
|
|
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 Events
|
|
public event ItemInfoEvent BeforeDelete;
|
|
public void OnBeforeDelete()
|
|
{
|
|
OnBeforeDelete(ItemID);
|
|
|
|
if (MyContent.ContentPartCount > 0)
|
|
{
|
|
foreach (PartInfo pi in MyContent.ContentParts)
|
|
{
|
|
foreach (ItemInfo ii in pi.MyItems)
|
|
{
|
|
ii.OnBeforeDelete();
|
|
}
|
|
}
|
|
}
|
|
//if (ItemPartCount > 0)
|
|
//{
|
|
// foreach (PartInfo pi in ItemParts)
|
|
// {
|
|
// foreach (ItemInfo ii in pi.MyItems)
|
|
// {
|
|
// ii.OnBeforeDelete();
|
|
// }
|
|
// }
|
|
//}
|
|
}
|
|
|
|
private void OnBeforeDelete(int ItemID)
|
|
{
|
|
if (_CacheByPrimaryKey.ContainsKey(ItemID.ToString()))
|
|
{
|
|
List<ItemInfo> itmlst = _CacheByPrimaryKey[ItemID.ToString()];
|
|
foreach (ItemInfo itm in itmlst)
|
|
if (itm.BeforeDelete != null)
|
|
{
|
|
itm.BeforeDelete(itm);
|
|
}
|
|
}
|
|
}
|
|
public static event ItemInfoEvent ItemDeleted;
|
|
|
|
public event ItemInfoEvent Deleted;
|
|
internal void OnDeleted(object sender)
|
|
{
|
|
if (Deleted != null) Deleted(sender);
|
|
if (ItemDeleted != null) ItemDeleted(sender);
|
|
if (MyParent != null)
|
|
{
|
|
MyParent.OnChildrenDeleted(sender);
|
|
MyParent.MyContent.RefreshContentParts();
|
|
}
|
|
}
|
|
//internal void OnDeleted(object sender, Volian.Base.Library.VlnTimer tmr)
|
|
//{
|
|
//tmr.ActiveProcess = "Deleted";
|
|
//if (Deleted != null) Deleted(sender);
|
|
//tmr.ActiveProcess = "ItemDeleted";
|
|
//if (ItemDeleted != null) ItemDeleted(sender);
|
|
//if (MyParent != null)
|
|
//{
|
|
//tmr.ActiveProcess = "OnChildrenDeleted";
|
|
//MyParent.OnChildrenDeleted(sender);
|
|
//tmr.ActiveProcess = "RefreshContentParts";
|
|
//MyParent.MyContent.RefreshContentParts();
|
|
//}
|
|
//}
|
|
public event ItemInfoEvent ChildrenDeleted;
|
|
internal void OnChildrenDeleted(object sender)
|
|
{
|
|
if (_CacheByPrimaryKey.ContainsKey(ItemID.ToString()))
|
|
{
|
|
List<ItemInfo> itmlst = _CacheByPrimaryKey[ItemID.ToString()];
|
|
foreach (ItemInfo itm in itmlst)
|
|
if (itm.ChildrenDeleted != null)
|
|
{
|
|
itm.ChildrenDeleted(itm);
|
|
}
|
|
}
|
|
}
|
|
public event ItemInfoInsertEvent NewSiblingAfter;
|
|
internal void OnNewSiblingAfter(object sender, ItemInfoInsertEventArgs args)
|
|
{
|
|
if (NewSiblingAfter != null) NewSiblingAfter(sender,args);
|
|
if (MyParent != null)
|
|
MyParent.MyContent.RefreshContentParts();
|
|
}
|
|
internal void OnNewSiblingAfter(ItemInfoInsertEventArgs args)
|
|
{
|
|
string key = ItemID.ToString();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
{
|
|
ItemInfo[] items = _CacheByPrimaryKey[key].ToArray();
|
|
foreach (ItemInfo item in items)
|
|
{
|
|
item.OnNewSiblingAfter(item,args);
|
|
}
|
|
}
|
|
}
|
|
public event ItemInfoInsertEvent NewSiblingBefore;
|
|
internal void OnNewSiblingBefore(object sender, ItemInfoInsertEventArgs args)
|
|
{
|
|
if (NewSiblingBefore != null) NewSiblingBefore(sender,args);
|
|
if (MyParent != null)
|
|
MyParent.MyContent.RefreshContentParts();
|
|
}
|
|
internal void OnNewSiblingBefore(ItemInfoInsertEventArgs args)
|
|
{
|
|
string key = ItemID.ToString();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
{
|
|
ItemInfo[] items = _CacheByPrimaryKey[key].ToArray();
|
|
foreach (ItemInfo item in items)
|
|
{
|
|
item.OnNewSiblingBefore(item,args);
|
|
}
|
|
}
|
|
}
|
|
public event ItemInfoInsertEvent NewChild;
|
|
internal void OnNewChild(object sender, ItemInfoInsertEventArgs args)
|
|
{
|
|
if (NewChild != null) NewChild(sender, args);
|
|
MyContent.RefreshContentParts();
|
|
}
|
|
internal void OnNewChild(ItemInfoInsertEventArgs args)
|
|
{
|
|
string key = ItemID.ToString();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
{
|
|
ItemInfo[] items = _CacheByPrimaryKey[key].ToArray();
|
|
foreach (ItemInfo item in items)
|
|
{
|
|
item.OnNewChild(item, args);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
#region Insert Before
|
|
public ItemInfo InsertSiblingBefore(string text)
|
|
{
|
|
return InsertSiblingBefore(text, null);
|
|
}
|
|
public ItemInfo InsertSiblingBefore(string text, string number)
|
|
{
|
|
return InsertSiblingBefore(text, number, null);
|
|
}
|
|
public ItemInfo InsertSiblingBefore(string text, string number,int? type)
|
|
{
|
|
ItemInfo tmp = null;
|
|
if (!IsSection && (FormatStepData.UseSmartTemplate || (MyHLS!=null && MyHLS.FormatStepData.UseSmartTemplate) || FormatStepData.UseOldTemplate))
|
|
tmp = InsertSmartTemplateSteps(text, number, tmp, EAddpingPart.Before, (int)MyContent.Type);
|
|
if (tmp == null)
|
|
tmp = NewItemInfoFetch(ItemID, EAddpingPart.Before, number, text, type, null, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
|
|
// 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();
|
|
tmp.UpdateROText();
|
|
OnNewSiblingBefore(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Before));
|
|
((ItemInfo)ActiveParent).MyContent.RefreshContentParts();
|
|
return tmp;
|
|
}
|
|
private ItemInfo InsertSmartTemplateSubStep(string text, string number, ItemInfo tmp, EAddpingPart adPart, int type, E_FromType fromTypeTop)
|
|
{
|
|
int newItemID = 0;
|
|
int topType = GetSmartTemplateTopLevelIndxOfThisType(type);
|
|
if (topType == -1) return null;
|
|
int tpIndx = GetSmartTemplateIndex(topType, type);
|
|
if (tpIndx != -1)
|
|
{
|
|
ItemInfo siblingSmart = null;
|
|
ItemInfo firstSmart = null;
|
|
int level = ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].level;
|
|
string tmptext = ActiveFormat.PlantFormat.FormatData.NewTemplateFormat ? text : ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].text;
|
|
int prevlevel = level;
|
|
while (level > 0)
|
|
{
|
|
if (firstSmart == null)
|
|
{
|
|
firstSmart = NewItemInfoFetch(ItemID, adPart, number, tmptext, type, (int ?)fromTypeTop, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
//firstSmart = NewItemInfoFetch(ItemID, adPart, number, tmptext, type, null, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
siblingSmart = firstSmart;
|
|
newItemID = firstSmart.ItemID;
|
|
}
|
|
else
|
|
{
|
|
E_FromType fromType = E_FromType.Step;
|
|
EAddpingPart addPart = EAddpingPart.Child; // level > previous, add a child.
|
|
if (level == prevlevel) addPart = EAddpingPart.After;
|
|
if (level < prevlevel)
|
|
{
|
|
if (ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type == 39)
|
|
{
|
|
fromType = E_FromType.RNO;
|
|
addPart = EAddpingPart.Child;
|
|
}
|
|
else
|
|
{
|
|
addPart = EAddpingPart.After;
|
|
}
|
|
newItemID = siblingSmart.ItemID;
|
|
}
|
|
|
|
tmptext = /*ActiveFormat.PlantFormat.FormatData.NewTemplateFormat ? " ": */ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].text;
|
|
tmp = NewItemInfoFetch(newItemID, addPart, null, tmptext, ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type + 20001, (int?)fromType, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
newItemID = tmp.ItemID;
|
|
if (level < prevlevel) siblingSmart = tmp;
|
|
}
|
|
tpIndx++;
|
|
prevlevel = level;
|
|
level = tpIndx < ActiveFormat.PlantFormat.FormatData.Templates.Count ?
|
|
ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].level : -1;
|
|
}
|
|
tmp = firstSmart;
|
|
}
|
|
return tmp;
|
|
}
|
|
|
|
private ItemInfo InsertSmartTemplateSteps(string text, string number, ItemInfo tmp, EAddpingPart adPart, int type)
|
|
{
|
|
int newItemID = 0;
|
|
int topType = GetSmartTemplateTopLevelIndx();
|
|
if (topType == -1) return null;
|
|
int tpIndx = GetSmartTemplateIndex(topType, (int)MyContent.Type);
|
|
if (tpIndx != -1)
|
|
{
|
|
ItemInfo siblingSmart = null;
|
|
ItemInfo firstSmart = null;
|
|
int level = ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].level;
|
|
string tmptext = ActiveFormat.PlantFormat.FormatData.NewTemplateFormat ? text : ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].text;
|
|
int prevlevel = level;
|
|
while (level > 0)
|
|
{
|
|
if (firstSmart == null)
|
|
{
|
|
firstSmart = NewItemInfoFetch(ItemID, adPart, number, tmptext, type, null, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
siblingSmart = firstSmart;
|
|
newItemID = firstSmart.ItemID;
|
|
}
|
|
else
|
|
{
|
|
E_FromType fromType = E_FromType.Step;
|
|
EAddpingPart addPart = EAddpingPart.Child; // level > previous, add a child.
|
|
if (level == prevlevel) addPart = EAddpingPart.After;
|
|
if (level < prevlevel)
|
|
{
|
|
if (ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type == 39)
|
|
{
|
|
fromType = E_FromType.RNO;
|
|
addPart = EAddpingPart.Child;
|
|
}
|
|
else
|
|
{
|
|
addPart = EAddpingPart.After;
|
|
}
|
|
newItemID = siblingSmart.ItemID;
|
|
}
|
|
|
|
tmptext = /*ActiveFormat.PlantFormat.FormatData.NewTemplateFormat ? " ": */ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].text;
|
|
tmp = NewItemInfoFetch(newItemID, addPart, null, tmptext, ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type + 20001, (int?)fromType, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
newItemID = tmp.ItemID;
|
|
if (level < prevlevel) siblingSmart = tmp;
|
|
}
|
|
tpIndx++;
|
|
prevlevel = level;
|
|
level = tpIndx < ActiveFormat.PlantFormat.FormatData.Templates.Count ?
|
|
ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].level : -1;
|
|
}
|
|
tmp = firstSmart;
|
|
}
|
|
return tmp;
|
|
}
|
|
#endregion
|
|
#region PasteChangeId
|
|
public static void PasteSetChangeId(ItemInfo ii, string chgid)
|
|
{
|
|
if (!ii.ActiveFormat.PlantFormat.FormatData.ProcData.ChangeBarData.ChangeIds) return;
|
|
if (ii.IsProcedure)
|
|
{
|
|
return; // copy over change bars & change ids as they exist.
|
|
}
|
|
else if (ii.IsSection)
|
|
{
|
|
// don't save change id for section. DON'T return though because code below sets
|
|
// change ids for steps within section.
|
|
}
|
|
else if (ii.IsStep)
|
|
{
|
|
StepConfig sc = ii.MyConfig as StepConfig;
|
|
if (chgid != null && sc.Step_ChangeID != chgid)
|
|
{
|
|
sc.Step_ChangeID = chgid;
|
|
using (Item itm = ii.Get())
|
|
{
|
|
itm.MyContent.Config = sc.ToString();
|
|
itm.MyContent.DTS = DateTime.Now;
|
|
itm.MyContent.UserID = Volian.Base.Library.VlnSettings.UserID;
|
|
itm.Save();
|
|
}
|
|
}
|
|
}
|
|
// handle all of the children
|
|
if (ii.Cautions != null) foreach (ItemInfo chldc in ii.Cautions) PasteSetChangeId(chldc, chgid);
|
|
if (ii.Notes != null) foreach (ItemInfo chldn in ii.Notes) PasteSetChangeId(chldn, chgid);
|
|
if (ii.RNOs != null) foreach (ItemInfo chldr in ii.RNOs) PasteSetChangeId(chldr, chgid);
|
|
if (ii.Tables != null) foreach (ItemInfo chldt in ii.Tables) PasteSetChangeId(chldt, chgid);
|
|
if (ii.Sections != null) foreach (ItemInfo chldsc in ii.Sections) PasteSetChangeId(chldsc, chgid);
|
|
if (ii.Steps != null) foreach (ItemInfo chlds in ii.Steps) PasteSetChangeId(chlds, chgid);
|
|
}
|
|
#endregion
|
|
#region Paste
|
|
public ItemInfo PasteChild(int copyStartID, string chgid)
|
|
{
|
|
// To determine 'type' of pasted item, if it's a step (type >=20000), use the originating
|
|
// item, i.e. item inserting after. If it's a section or procedure, use the copied item's type.
|
|
ItemInfo cpItem = ItemInfo.Get(copyStartID);
|
|
int? type = MyContent.Type >= 20000 ? MyContent.Type : cpItem.MyContent.Type;
|
|
int? fromtype = MyContent.Type >= 20000 ? MyContent.Type
|
|
: ((int?)(IsProcedure ? E_FromType.Section
|
|
: (cpItem.IsSection ? E_FromType.Section : E_FromType.Step)));
|
|
try
|
|
{
|
|
ItemInfo tmp = CopyPasteItemInfoFetch(copyStartID, this.ItemID, type, fromtype, EAddpingPart.Child);
|
|
using (Item item = Get()) ItemInfo.Refresh(item);
|
|
if (tmp.NextItem != null) using (Item item = tmp.NextItem.Get()) ItemInfo.Refresh(item);
|
|
RefreshNextItems();
|
|
tmp.UpdateTransitionText();
|
|
tmp.UpdatePastedStepTransitionText();
|
|
PasteSetChangeId(tmp, chgid);
|
|
OnNewChild(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Child));
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (!HandleSqlExceptionOnCopy(ex))
|
|
System.Windows.Forms.MessageBox.Show("Details were written to the Error Log.", "Paste Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
|
|
return this;
|
|
}
|
|
}
|
|
public ItemInfo PasteSiblingBefore(int copyStartID, string chgid)
|
|
{
|
|
// To determine 'type' of pasted item, if it's a step (type >=20000), use the originating
|
|
// item, i.e. item inserting after. If it's a section or procedure, use the copied item's type.
|
|
ItemInfo cpItem = ItemInfo.Get(copyStartID);
|
|
int? type = MyContent.Type >= 20000 ? MyContent.Type : cpItem.MyContent.Type;
|
|
try
|
|
{
|
|
ItemInfo tmp = CopyPasteItemInfoFetch(copyStartID, this.ItemID, type, type, EAddpingPart.Before);
|
|
using (Item item = Get()) ItemInfo.Refresh(item);
|
|
tmp.UpdateTransitionText();
|
|
tmp.UpdateROText();
|
|
tmp.UpdatePastedStepTransitionText();
|
|
PasteSetChangeId(tmp, chgid);
|
|
OnNewSiblingBefore(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Before));
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (!HandleSqlExceptionOnCopy(ex))
|
|
System.Windows.Forms.MessageBox.Show("Details were written to the Error Log.","Paste Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
|
|
return this;
|
|
}
|
|
}
|
|
public ItemInfo PasteSiblingAfter(int copyStartID, string chgid)
|
|
{
|
|
// To determine 'type' of pasted item, if it's a step (type >=20000), use the originating
|
|
// item, i.e. item inserting after. If it's a section or procedure, use the copied item's type.
|
|
ItemInfo cpItem = ItemInfo.Get(copyStartID);
|
|
int? type = MyContent.Type >= 20000 ? MyContent.Type : cpItem.MyContent.Type;
|
|
try
|
|
{
|
|
ItemInfo tmp = CopyPasteItemInfoFetch(copyStartID, this.ItemID, type, type, EAddpingPart.After);
|
|
using (Item item = Get()) ItemInfo.Refresh(item);
|
|
if (tmp.NextItem != null) using (Item item = tmp.NextItem.Get()) ItemInfo.Refresh(item);
|
|
RefreshNextItems();
|
|
// if inserting after a caution or note, refreshes tabs. This will adjust bullets
|
|
// of any previous cautions or notes.
|
|
if (tmp.IsCaution || tmp.IsNote) ResetOrdinal();
|
|
tmp.UpdateTransitionText();
|
|
tmp.UpdateROText();
|
|
tmp.UpdatePastedStepTransitionText();
|
|
PasteSetChangeId(tmp, chgid);
|
|
OnNewSiblingAfter(new ItemInfoInsertEventArgs(tmp, EAddpingPart.After));
|
|
return tmp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if(!HandleSqlExceptionOnCopy(ex))
|
|
System.Windows.Forms.MessageBox.Show("Details were written to the Error Log.", "Paste Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
|
|
return this;
|
|
}
|
|
}
|
|
private bool HandleSqlExceptionOnCopy(Exception ex)
|
|
{
|
|
if (ex.Message.Contains("Collection was modified;"))
|
|
{
|
|
_MyLog.WarnFormat(ex.Message);
|
|
return true;
|
|
}
|
|
if (ex.Message.Contains("This step has been deleted"))
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("The step being pasted has been deleted!", "Cannot Paste Deleted Step"
|
|
, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand);
|
|
return true;
|
|
}
|
|
if(ex.Message.Contains("This current step has been deleted in another session"))
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("The highlighted step has been deleted by another user!", "Cannot Paste Step"
|
|
, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
private ItemInfo CopyPasteItemInfoFetch(int copyStartID, int itemID, int? type, int? fromType, EAddpingPart addType)
|
|
{
|
|
ItemInfo tmp=null;
|
|
if (addType == EAddpingPart.Child) // has to add in child relationship - uses 'fromtype'
|
|
{
|
|
// adding children. Type is based on 'fromType'
|
|
switch ((E_FromType)fromType)
|
|
{
|
|
case E_FromType.Procedure:
|
|
tmp = DataPortal.Fetch<ProcedureInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
break;
|
|
case E_FromType.Section:
|
|
tmp = DataPortal.Fetch<SectionInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
break;
|
|
default:
|
|
tmp = DataPortal.Fetch<StepInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (GetType() == typeof(ProcedureInfo))
|
|
tmp = DataPortal.Fetch<ProcedureInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
else if (GetType() == typeof(SectionInfo))
|
|
tmp = DataPortal.Fetch<SectionInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
else
|
|
tmp = DataPortal.Fetch<StepInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
}
|
|
AddToCache(tmp);
|
|
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 = null;
|
|
if (!IsSection && (FormatStepData.UseSmartTemplate || (MyHLS != null && MyHLS.FormatStepData.UseSmartTemplate) || FormatStepData.UseOldTemplate))
|
|
tmp = InsertSmartTemplateSteps(text, number, tmp, EAddpingPart.After, (int)MyContent.Type);
|
|
if(tmp == null)
|
|
tmp = NewItemInfoFetch(ItemID, EAddpingPart.After, number, text, type, null, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
// 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);
|
|
RefreshNextItems();
|
|
// if inserting after a caution or note, refreshes tabs. This will adjust bullets
|
|
// of any previous cautions or notes.
|
|
if (tmp.IsCaution || tmp.IsNote) ResetOrdinal();
|
|
// Update all of the content records that have transitions that point to the Siblings or Sibling Children of the new item
|
|
tmp.UpdateTransitionText();
|
|
tmp.UpdateROText();
|
|
OnNewSiblingAfter(new ItemInfoInsertEventArgs(tmp, EAddpingPart.After));
|
|
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));
|
|
}
|
|
AddToCache(tmp);
|
|
return tmp;
|
|
}
|
|
public void UpdateTransitionText()
|
|
{
|
|
// Update Ordinals from here down for Steps
|
|
//if (!IsStep) return;
|
|
ResetOrdinal();
|
|
// This returns a list of all of the transitions that may have been affected
|
|
using(TransitionInfoList trans = TransitionInfoList.GetAffected(this.ItemID))
|
|
{
|
|
#region B2012-071 fix JCB
|
|
foreach (TransitionInfo tran in trans)
|
|
{
|
|
using (Transition trn = tran.Get())
|
|
TransitionInfo.Refresh(trn);
|
|
Content oldContent = null;
|
|
using (Content content = tran.MyContent.Get())
|
|
{
|
|
if (oldContent != null && content.ContentID != oldContent.ContentID)
|
|
{
|
|
if (oldContent.IsDirty)
|
|
{
|
|
oldContent.DTS = DateTime.Now;
|
|
#region B2012-079 fix JCB
|
|
oldContent.UserID = Volian.Base.Library.VlnSettings.UserID + " - Renumber";
|
|
#endregion B2012-079 fix JCB
|
|
oldContent.Save();
|
|
}
|
|
else // Update ContentInfo objects to reflect the change in the transition
|
|
ContentInfo.Refresh(oldContent);
|
|
oldContent = content;
|
|
}
|
|
if (oldContent == null) oldContent = content;
|
|
//check to see if noneditable
|
|
bool forceConvertToText = false;
|
|
if (tran.MyItemToID.ActiveSection != null)
|
|
{
|
|
SectionConfig sc = tran.MyItemToID.ActiveSection.MyConfig as SectionConfig;
|
|
//SectionConfig sc = new SectionConfig(tran.MyItemToID.ActiveSection.MyConfig.ToString());
|
|
forceConvertToText = (sc.SubSection_Edit == "N");
|
|
}
|
|
if (!forceConvertToText) //check to see if external with internal format
|
|
{
|
|
if (tran.MyContent.ContentItems[0].MyProcedure.ItemID != tran.MyItemToID.MyProcedure.ItemID)
|
|
if (!tran.MyContent.ContentItems[0].ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList[tran.TranType].TransMenu.Contains("Proc"))
|
|
forceConvertToText = true;
|
|
}
|
|
oldContent.FixTransitionText(tran, forceConvertToText);
|
|
//if (content.IsDirty)
|
|
//{
|
|
// content.DTS = DateTime.Now;
|
|
// content.Save();
|
|
//}
|
|
if (oldContent != null)
|
|
{
|
|
if (oldContent.IsDirty)
|
|
{
|
|
oldContent.DTS = DateTime.Now;
|
|
#region B2012-079 fix JCB
|
|
oldContent.UserID = Volian.Base.Library.VlnSettings.UserID + " - Renumber";
|
|
#endregion B2012-079 fix JCB
|
|
oldContent.Save();
|
|
}
|
|
else // Update ContentInfo objects to reflect the change in the transition
|
|
ContentInfo.Refresh(oldContent);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion B2012-071 fix JCB
|
|
}
|
|
}
|
|
public void UpdatePastedStepTransitionText()
|
|
{
|
|
// Get a list of all of the transitions included in this step & its children.
|
|
// Their transition text may have been affected, i.e. depending on the format, etc
|
|
using (TransitionInfoList trans = TransitionInfoList.GetPastedAffected(this.ItemID))
|
|
{
|
|
foreach (TransitionInfo tran in trans)
|
|
{
|
|
using (Content content = tran.MyContent.Get())
|
|
{
|
|
//check to see if noneditable
|
|
bool forceConvertToText = false;
|
|
if (tran.MyItemToID.ActiveSection != null)
|
|
{
|
|
SectionConfig sc = tran.MyItemToID.ActiveSection.MyConfig as SectionConfig;
|
|
//SectionConfig sc = new SectionConfig(tran.MyItemToID.ActiveSection.MyConfig.ToString());
|
|
forceConvertToText = (sc.SubSection_Edit == "N");
|
|
}
|
|
if (!forceConvertToText) //check to see if external with internal format
|
|
{
|
|
if (tran.MyContent.ContentItems[0].MyProcedure.ItemID != tran.MyItemToID.MyProcedure.ItemID)
|
|
if (!tran.MyContent.ContentItems[0].ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList[tran.TranType].TransMenu.Contains("Proc"))
|
|
forceConvertToText = true;
|
|
}
|
|
if (!forceConvertToText)
|
|
{
|
|
if (tran.MyContent.ContentItems[0].MyDocVersion.VersionID != tran.MyItemToID.MyDocVersion.VersionID)
|
|
forceConvertToText = true;
|
|
}
|
|
content.FixTransitionText(tran, forceConvertToText);
|
|
if (content.IsDirty)
|
|
content.Save();
|
|
else // Update ContentInfo objects to reflect the change in the transition
|
|
ContentInfo.Refresh(content);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#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 = null;
|
|
tmp = InsertSmartTemplateSubStep(text, number, tmp, EAddpingPart.Child, type, fromType);
|
|
//tmp = InsertSmartTemplateSubStep(text, number, tmp, EAddpingPart.After, type);
|
|
if (tmp == null)
|
|
tmp = NewItemInfoFetch(ItemID, EAddpingPart.Child, number, text, type, (int?)fromType, null, null, DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
|
|
// 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();
|
|
tmp.UpdateROText();
|
|
MyContent.RefreshContentParts();
|
|
OnNewChild(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Child));
|
|
return tmp;
|
|
}
|
|
#endregion
|
|
#region DataPortal
|
|
private void DataPortal_Fetch(PastingPartCriteria 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("@StartItemID", criteria.StartItemID);
|
|
cm.Parameters.AddWithValue("@ItemID", criteria.ItemID); //ABC After Before Child
|
|
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 = "PasteItemChild";
|
|
cm.Parameters.AddWithValue("@FromType", criteria.FromType); //--C
|
|
break;
|
|
case EAddpingPart.Before:
|
|
cm.CommandText = "PasteItemSiblingBefore";
|
|
break;
|
|
case EAddpingPart.After:
|
|
cm.CommandText = "PasteItemSiblingAfter";
|
|
break;
|
|
case EAddpingPart.Replace:
|
|
cm.CommandText = "PasteItemReplace";
|
|
break;
|
|
}
|
|
cm.CommandTimeout = Database.DefaultTimeout;
|
|
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 (!ex.Message.Contains("This step has been deleted") && !ex.Message.Contains("This current step has been deleted in another session"))
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("ItemInfo.DataPortal_Fetch", ex);
|
|
}
|
|
_ErrorMessage = ex.Message;
|
|
throw new DbCslaException("ItemInfo.DataPortal_Fetch", ex);
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
cm.CommandTimeout = Database.DefaultTimeout;
|
|
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
|
|
#region PastingPartCriteria
|
|
[Serializable()]
|
|
public class PastingPartCriteria
|
|
{
|
|
#region Properties
|
|
private int _StartItemID;
|
|
public int StartItemID
|
|
{
|
|
get { return _StartItemID; }
|
|
set { _StartItemID = value; }
|
|
}
|
|
//private int _CopyEndID;
|
|
//public int CopyEndID
|
|
//{
|
|
// get { return _CopyEndID; }
|
|
// set { _CopyEndID = value; }
|
|
//}
|
|
private int _ItemID; // paste relative to this itemid
|
|
public int ItemID
|
|
{
|
|
get { return _ItemID; }
|
|
set { _ItemID = value; }
|
|
}
|
|
private EAddpingPart _AddType;
|
|
public EAddpingPart AddType
|
|
{
|
|
get { return _AddType; }
|
|
set { _AddType = 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 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 PastingPartCriteria(int startItemid, int itemID, EAddpingPart addType, int? type, int? fromType, DateTime dts, string userID)
|
|
{
|
|
_StartItemID = startItemid;
|
|
_ItemID = itemID;
|
|
_AddType = addType;
|
|
_Type = type;
|
|
_FromType = fromType;
|
|
_DTS = dts;
|
|
_UserID = userID;
|
|
}
|
|
#endregion
|
|
}
|
|
#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,
|
|
Replace=3
|
|
}
|
|
public ItemInfo NextItem
|
|
{
|
|
get
|
|
{
|
|
if (PrintAllAtOnce) return GetNextItem();
|
|
if (NextItemCount > 0 && NextItems != null && 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)
|
|
{
|
|
item._Ordinal = null;
|
|
item._TagsSetup = false;
|
|
//item.MyContent.ShowChange(); // Replaced with OnOrdinalChange below
|
|
if (key == null && item.NextItem != null)
|
|
key = item.NextItem.ItemID.ToString();
|
|
}
|
|
ItemInfo.OnOrdinalChange(items[0].ItemID); // After _Ordinal reset trigger event
|
|
}
|
|
}
|
|
public void ResetOrdinal()
|
|
{
|
|
ResetOrdinal(ItemID);
|
|
}
|
|
public static void DeleteItemInfoAndChildren(int itemID)
|
|
{
|
|
//Volian.Base.Library.VlnTimer _MyTimer = new Volian.Base.Library.VlnTimer();
|
|
//_MyTimer.ActiveProcess = "ConvertListToDictionary";
|
|
ConvertListToDictionary();
|
|
string key = itemID.ToString();
|
|
if(_CacheByPrimaryKey.ContainsKey(key))
|
|
{
|
|
|
|
ItemInfo [] items = _CacheByPrimaryKey[key].ToArray();
|
|
ItemInfo parent = items[0].ActiveParent as ItemInfo;
|
|
//_MyTimer.ActiveProcess = "ResetParts";
|
|
if (parent != null)
|
|
ItemInfo.ResetParts(parent.ItemID);
|
|
//Console.WriteLine("\r\n\r\n'Deleting Item {0}'\r\n{0}'Type ','ParentID','ParentUnique','ItemID','Unique'",itemID);
|
|
foreach (ItemInfo item in items)
|
|
{
|
|
//_MyTimer.ActiveProcess = "IsDeleted";
|
|
item.IsDeleted = true;
|
|
//_MyTimer.ActiveProcess = string.Format("OnDeleted {0}", items.Length);
|
|
item.OnDeleted(item);
|
|
//item.OnDeleted(item, _MyTimer);
|
|
//_MyTimer.ActiveProcess = "DeleteItemInfoAndChildren";
|
|
item.DeleteItemInfoAndChildren(" ");
|
|
}
|
|
//Console.WriteLine("\r\n'Item Deleted'");
|
|
|
|
}
|
|
//_MyTimer.ShowElapsedTimes("DeleteItemInfoAndChildren");
|
|
}
|
|
|
|
private void DeleteItemInfoAndChildren(string depth)
|
|
{
|
|
if (MyContent.LocalContentParts != null)
|
|
{
|
|
foreach (PartInfo part in MyContent.LocalContentParts)
|
|
{
|
|
if (part._MyItems != null)
|
|
{
|
|
int whereami = 1;
|
|
try
|
|
{
|
|
List<ItemInfo> items = new List<ItemInfo>();
|
|
foreach (ItemInfo item in part._MyItems)
|
|
{
|
|
items.Add(item);
|
|
}
|
|
foreach (ItemInfo item in items)
|
|
{
|
|
string key = item.ItemID.ToString();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
{
|
|
ItemInfo[] itemz = _CacheByPrimaryKey[key].ToArray();
|
|
foreach (ItemInfo itm in itemz)
|
|
{
|
|
//Console.WriteLine("'{0}cache ',{1},{2},{3},{4}", depth + depth, this.ItemID, this._MyItemInfoUnique, itm.ItemID, itm._MyItemInfoUnique);
|
|
//whereami = 2;
|
|
itm.OnDeleted(itm);
|
|
//whereami = 4;
|
|
itm.DeleteItemInfoAndChildren(depth + " ");
|
|
//whereami = 3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Console.WriteLine("'{0}noncache',{1},{2},{3},{4}", depth + depth, this.ItemID, this._MyItemInfoUnique, item.ItemID, item._MyItemInfoUnique);
|
|
//whereami = 5;
|
|
item.OnDeleted(item);
|
|
//whereami = 7;
|
|
item.DeleteItemInfoAndChildren(depth + " ");
|
|
//whereami = 6;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("where = {0}, type = {1}, msg = {2}", whereami, ex.GetType().Name, ex.Message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Dispose();
|
|
}
|
|
public static void RefreshPrevious(int? itemID, int? previousID)
|
|
{
|
|
if (itemID == null) return;
|
|
string key = itemID.ToString();
|
|
ConvertListToDictionary();
|
|
if (_CacheByPrimaryKey.ContainsKey(key))
|
|
foreach (ItemInfo tmpInfo in _CacheByPrimaryKey[key])
|
|
tmpInfo.RefreshPrevious(previousID);
|
|
}
|
|
private void RefreshPrevious(int? previousID)
|
|
{
|
|
if (_PreviousID != previousID)
|
|
{
|
|
if (MyPrevious != null) MyPrevious.RefreshNextItems(); // Update List for old value
|
|
_PreviousID = previousID; // Update the value
|
|
}
|
|
_MyPrevious = null; // Reset list so that the next line gets a new list
|
|
if (MyPrevious != null) MyPrevious.RefreshNextItems(); // Update List for new value
|
|
}
|
|
internal static ItemInfo CopyPasteReplaceItemInfoFetch(int copyStartID, ItemInfo itemInfo) // int itemID, int? type, int? fromType)
|
|
{
|
|
ItemInfo tmp = null;
|
|
if (itemInfo.GetType() == typeof(ProcedureInfo))
|
|
tmp = DataPortal.Fetch<ProcedureInfo>(new ItemInfo.PastingPartCriteria(copyStartID, itemInfo.ItemID, ItemInfo.EAddpingPart.Replace, itemInfo.MyContent.Type, itemInfo.MyContent.Type, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
else if (itemInfo.GetType() == typeof(SectionInfo))
|
|
tmp = DataPortal.Fetch<SectionInfo>(new ItemInfo.PastingPartCriteria(copyStartID, itemInfo.ItemID, ItemInfo.EAddpingPart.Replace, itemInfo.MyContent.Type, itemInfo.MyContent.Type, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
else
|
|
tmp = DataPortal.Fetch<StepInfo>(new ItemInfo.PastingPartCriteria(copyStartID, itemInfo.ItemID, ItemInfo.EAddpingPart.Replace, itemInfo.MyContent.Type, itemInfo.MyContent.Type, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
|
|
AddToCache(tmp);
|
|
return tmp;
|
|
}
|
|
|
|
}
|
|
public partial class Item
|
|
{
|
|
#region DeleteItemAndChildren
|
|
public static void DeleteItemAndChildren(ItemInfo item)
|
|
{
|
|
//Volian.Base.Library.VlnTimer _MyTimer = new Volian.Base.Library.VlnTimer();
|
|
if (!CanDeleteObject())
|
|
throw new System.Security.SecurityException("User not authorized to remove a Item");
|
|
try
|
|
{
|
|
ItemInfo nextItem = item.NextItem;
|
|
ItemInfo prevItem = item.MyPrevious;
|
|
DocVersionInfo docVersion = item.ItemDocVersionCount == 1 ? item.ItemDocVersions[0] : null;
|
|
item.OnBeforeDelete();
|
|
//_MyTimer.ActiveProcess = "DataPortal.Delete";
|
|
DataPortal.Delete(new DeleteCriteria(item.ItemID, Volian.Base.Library.VlnSettings.UserID));
|
|
if (nextItem != null) // Adjust PreviousID for NextItem
|
|
{
|
|
if (docVersion != null)
|
|
using (DocVersion dv = docVersion.Get())
|
|
DocVersionInfo.Refresh(dv);
|
|
//_MyTimer.ActiveProcess = "RefreshPrevious";
|
|
ItemInfo.RefreshPrevious(nextItem.ItemID, item.PreviousID);
|
|
// The order of the next two methods was required to fix a null reference
|
|
// when getting myparent. This bug was found when deleting a node from the
|
|
// tree when the RTBItem was not open (i.e. in the step editor window).
|
|
//_MyTimer.ActiveProcess = "RefreshItemParts";
|
|
nextItem.RefreshItemParts();
|
|
//nextItem.ResetOrdinal(); - UpdateTransitionText calls ResetOrdinal
|
|
//_MyTimer.ActiveProcess = "UpdateTransitionText";
|
|
if(prevItem != null)
|
|
prevItem.UpdateTransitionText();
|
|
else
|
|
nextItem.UpdateTransitionText();
|
|
}
|
|
else if (prevItem != null)
|
|
{
|
|
//_MyTimer.ActiveProcess = "RefreshNextItems";
|
|
prevItem.RefreshNextItems();
|
|
//_MyTimer.ActiveProcess = "ResetOrdinal";
|
|
if (prevItem.IsCaution || prevItem.IsNote) prevItem.ResetOrdinal();
|
|
//_MyTimer.ActiveProcess = "UpdateTransitionText";
|
|
prevItem.UpdateTransitionText();
|
|
}
|
|
//_MyTimer.ActiveProcess = "DeleteItemInfoAndChildren";
|
|
ItemInfo.DeleteItemInfoAndChildren(item.ItemID); // Dispose ItemInfo and Children
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("ItemInsertExt: Stacktrace = {0}", ex.StackTrace);
|
|
System.Data.SqlClient.SqlException exSQL = SqlException(ex);
|
|
if (exSQL != null && exSQL.Message.Contains("###Cannot Delete Item###"))
|
|
//return false;
|
|
throw exSQL;
|
|
else
|
|
throw new DbCslaException("Error on Item.DeleteItemAndChildren", ex);
|
|
}
|
|
//_MyTimer.ShowElapsedTimes("DeleteItemAndChildren");
|
|
}
|
|
private static System.Data.SqlClient.SqlException SqlException(Exception ex)
|
|
{
|
|
Type sqlExType = typeof(System.Data.SqlClient.SqlException);
|
|
while (ex != null)
|
|
{
|
|
if (ex.GetType() == sqlExType) return ex as System.Data.SqlClient.SqlException;
|
|
ex = ex.InnerException;
|
|
}
|
|
return null;
|
|
}
|
|
[Serializable()]
|
|
protected class DeleteCriteria
|
|
{
|
|
private int _ItemID;
|
|
public int ItemID
|
|
{ get { return _ItemID; } }
|
|
private string _UserID;
|
|
public string UserID
|
|
{
|
|
get { return _UserID; }
|
|
set { _UserID = value; }
|
|
}
|
|
public DeleteCriteria(int itemID,String userID)
|
|
{
|
|
_ItemID = itemID;
|
|
_UserID = userID;
|
|
}
|
|
}
|
|
[Transactional(TransactionalTypes.TransactionScope)]
|
|
private void DataPortal_Delete(DeleteCriteria criteria)
|
|
{
|
|
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] Item.DataPortal_Delete", GetHashCode());
|
|
try
|
|
{
|
|
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
|
|
{
|
|
using (SqlCommand cm = cn.CreateCommand())
|
|
{
|
|
cm.CommandType = CommandType.StoredProcedure;
|
|
cm.CommandText = "DeleteItemAndChildren";
|
|
cm.Parameters.AddWithValue("@ItemID", criteria.ItemID);
|
|
cm.Parameters.AddWithValue("@UserID", criteria.UserID);
|
|
cm.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (_MyLog.IsErrorEnabled) _MyLog.Error("Item.DataPortal_Delete", ex);
|
|
_ErrorMessage = ex.Message;
|
|
throw new DbCslaException("Item.DataPortal_Delete", ex);
|
|
}
|
|
}
|
|
#endregion
|
|
#region PasteReplace
|
|
public static ItemInfo PasteReplace(ItemInfo itemInfo, int copyStartID, string chgid)
|
|
{
|
|
if (!CanDeleteObject())
|
|
throw new System.Security.SecurityException("User not authorized to remove a Item");
|
|
try
|
|
{
|
|
ItemInfo newItemInfo = ItemInfo.CopyPasteReplaceItemInfoFetch(copyStartID, itemInfo); //itemInfo.ItemID, itemInfo.MyContent.Type, itemInfo.MyContent.Type);
|
|
// Delete business objects, including remove from tree
|
|
ItemInfo.DeleteItemInfoAndChildren(itemInfo.ItemID); // Dispose ItemInfo and Children
|
|
using (Item item = Get(newItemInfo.ItemID)) ItemInfo.Refresh(item);
|
|
ItemInfo.PasteSetChangeId(newItemInfo, chgid);
|
|
if (newItemInfo.NextItem != null) using (Item item = newItemInfo.NextItem.Get()) ItemInfo.Refresh(item);
|
|
newItemInfo.RefreshNextItems();
|
|
// if inserting after a caution or note, refreshes tabs. This will adjust bullets
|
|
// of any previous cautions or notes.
|
|
if (newItemInfo.IsCaution || newItemInfo.IsNote) newItemInfo.ResetOrdinal();
|
|
newItemInfo.UpdateTransitionText();
|
|
newItemInfo.UpdateROText();
|
|
newItemInfo.UpdatePastedStepTransitionText();
|
|
// Add to tree
|
|
if (newItemInfo.NextItemCount > 0)
|
|
{
|
|
using (ItemInfo itm = ItemInfo.Get(newItemInfo.NextItem.ItemID))
|
|
{
|
|
itm.OnNewSiblingBefore(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Before));
|
|
}
|
|
}
|
|
else if (newItemInfo.PreviousID != null)
|
|
{
|
|
using (ItemInfo itm2 = ItemInfo.Get((int)newItemInfo.PreviousID))
|
|
{
|
|
itm2.OnNewSiblingAfter(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.After));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newItemInfo.MyParent.OnNewChild(new ItemInfoInsertEventArgs(newItemInfo, ItemInfo.EAddpingPart.Child));
|
|
}
|
|
return newItemInfo;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (!HandleSqlExceptionOnCopy(ex))
|
|
{
|
|
if (ex.Message.Contains("has External Transitions and has no next step")
|
|
|| ex.Message.Contains("has External Transitions to it's children")
|
|
|| ex.Message.Contains("This step has been deleted")
|
|
)
|
|
throw ex;
|
|
System.Windows.Forms.MessageBox.Show("Details were written to the Error Log.", "Paste Replace Failed", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
|
|
return itemInfo;
|
|
}
|
|
else
|
|
return itemInfo;
|
|
}
|
|
}
|
|
#endregion
|
|
private static bool HandleSqlExceptionOnCopy(Exception ex)
|
|
{
|
|
if (ex.Message.Contains("This step has been deleted"))
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("The step being pasted has been deleted!", "Cannot Paste Deleted Step"
|
|
, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand);
|
|
return true;
|
|
}
|
|
if (ex.Message.Contains("This current step has been deleted in another session"))
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("The highlighted step has been deleted by another user!", "Cannot Paste Step"
|
|
, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|