Kathy 6366af8b47 Enhanced Document support
Null check
Move DisplayText.cs to CSLA
Enhanced Documents – don’t allow ‘Save’ RO on enhanced step
Enhanced Documents windowing
Enhanced Documents remove unnecessary options
Enhanced Documents – don’t allow ‘Save’ transition on enhanced step
Enhanced Documents/Insert,Delete,Paste
2016-01-20 16:43:23 +00:00

2042 lines
77 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;
using System.Windows.Forms;
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
{
public ItemInfo HandleSqlExceptionOnDelete(Exception ex)
{
if (ex.Message.Contains("has External Transitions and has no next step"))
{
using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitionsToChildren(ItemID))
{
DialogResult ans = MessageBox.Show("Transitions exist to this step and cannot be adjusted automatically." +
"\r\n\r\nDo you want to be placed on the " + (exTrans.Count > 1 ? "first " : "") + "substep with the problem Transition?" +
"\r\n\r\nSubsteps with Problem Transitions" +
exTrans.Summarize(),
"Cannot Delete This Step", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (ans == DialogResult.Yes)
{
return exTrans[0].MyContent.ContentItems[0];
}
}
}
else if (ex.Message.Contains("has External Transitions to Procedure"))
{
using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitionsToChildren(ItemID))
{
DialogResult ans = MessageBox.Show("Transitions exist to this procedure and cannot be adjusted automatically." +
"\r\n\r\nDo you want to be placed on the " + (exTrans.Count > 1 ? "first " : "") + "substep with the problem Transition?" +
"\r\n\r\nSubsteps with Problem Transitions" +
exTrans.Summarize(),
"Cannot Delete This Procedure", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (ans == DialogResult.Yes)
{
return exTrans[0].MyContent.ContentItems[0];
}
}
}
else if (ex.Message.Contains("has External Transitions to it's children"))
{
using (TransitionInfoList exTrans = TransitionInfoList.GetExternalTransitionsToChildren(ItemID))
{
DialogResult ans = MessageBox.Show("Transitions exist to substeps of this step and cannot be adjusted automatically." +
"\r\n\r\nDo you want to be placed on the " + (exTrans.Count > 1 ? "first " : "") + "substep with the problem Transition?" +
"\r\n\r\nSubsteps with Problem Transitions:" +
exTrans.Summarize(),
"Cannot Delete This Step", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (ans == DialogResult.Yes)
{
return exTrans[0].MyContent.ContentItems[0];
}
}
}
else
MessageBox.Show(ex.Message, "SQL Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return null;
}
#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; // keep track of sibling
ItemInfo firstSmart = null; // hls or top template step
ItemInfo parentSmart = null; // keep track of parent as creating children
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 = parentSmart = 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; // level = previous, add a sibling
if (level < prevlevel) // level < previous, go up to previous level's id
{
if (ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type == 39)
{
fromType = E_FromType.RNO;
addPart = EAddpingPart.Child;
newItemID = firstSmart.ItemID;
}
else
{
addPart = EAddpingPart.After;
newItemID = parentSmart.ItemID;
}
}
tmptext = 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 = parentSmart;
else if (level > prevlevel) parentSmart = siblingSmart;
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) || MyContent.Type < 10000)
tmp = DataPortal.Fetch<ProcedureInfo>(new PastingPartCriteria(copyStartID, itemID, addType, type, fromType, DateTime.Now, Volian.Base.Library.VlnSettings.UserID));
else if (GetType() == typeof(SectionInfo) || (MyContent.Type < 20000))
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 Enhanced Document Support
public ItemInfo DoAddEnhancedSteps(int enhType, int enhItemID, EAddpingPart addpart)
{
// get the item object in the enhanced document so that inserting of the new enhanced item and
// its children can be done:
ItemInfo existingEnhancedItemInfo = ItemInfo.Get(enhItemID);
ItemInfo newEnhancedItemInfo = existingEnhancedItemInfo.InsertEnhancedSteps(MyContent.Text, null, addpart, MyContent.Type, enhType, ItemID);
if (newEnhancedItemInfo == null) return null;
StepConfig sc = new StepConfig(MyContent.Config);
sc.AddEnhancedDocument(enhType, newEnhancedItemInfo.ItemID);
SaveConfig(sc.ToString());
return newEnhancedItemInfo;
}
public ItemInfo InsertEnhancedSteps(string text, string number, EAddpingPart addType, int? type, int eDocType, int newSourceID)
{
ItemInfo tmp = null;
if (addType == EAddpingPart.Child)
{
E_FromType fromType = E_FromType.Caution;
if (this.IsSection) fromType = E_FromType.Step;
else if (ActiveFormat.PlantFormat.FormatData.StepDataList[(int)type - 20000].Type.ToUpper() == "NOTE") fromType = E_FromType.Note;
tmp = InsertEnhancedSmartTemplateSubStep(text, number, this, addType, (int)type, fromType, newSourceID);
}
else
tmp = InsertEnhancedSmartTemplateSteps(text, number, this, addType, 20002, newSourceID);
if (tmp == null) return null;
// 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();
// Note that non-enhanced update transition and ro text at this point. But since
// transitions and ro's are converted to text, this is not needed.
if (addType == EAddpingPart.Child)
OnNewChild(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Child));
else if (addType == EAddpingPart.After)
{
OnNewSiblingAfter(new ItemInfoInsertEventArgs(tmp, EAddpingPart.After));
}
else if (addType == EAddpingPart.Before)
OnNewSiblingBefore(new ItemInfoInsertEventArgs(tmp, EAddpingPart.Before));
return tmp;
}
private ItemInfo InsertEnhancedSmartTemplateSubStep(string text, string number, ItemInfo tmp, EAddpingPart addType, int type, E_FromType fromTypeTop, int newSourceID)
{
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)
{
StepConfig sc = new StepConfig("");
sc.AddEnhancedDocument(0, newSourceID);
firstSmart = NewItemInfoFetch(ItemID, addType, number, tmptext, type, (int?)fromTypeTop, null, sc.ToString(), 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 InsertEnhancedSmartTemplateSteps(string text, string number, ItemInfo tmp, EAddpingPart eAddpingPart, int type, int newSourceID)
{
int newItemID = 0;
int topType = GetSmartTemplateTopLevelIndx();
if (topType == -1) return null;
int tpIndx = GetSmartTemplateIndex(topType, (int)MyContent.Type);
if (tpIndx != -1)
{
ItemInfo siblingSmart = null; // keep track of sibling
ItemInfo firstSmart = null; // hls or top template step
ItemInfo parentSmart = null; // keep track of parent as creating children
int level = ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].level;
string tmptext = text;
int prevlevel = level;
while (level > 0)
{
if (firstSmart == null)
{
// set stepconfig for this new enhanced item:
StepConfig sc = new StepConfig("");
sc.AddEnhancedDocument(0, newSourceID);
firstSmart = NewItemInfoFetch(ItemID, eAddpingPart, number, tmptext, type, null, null, sc.ToString(), DateTime.Now, Volian.Base.Library.VlnSettings.UserID);
siblingSmart = parentSmart = 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; // level = previous, add a sibling
if (level < prevlevel) // level < previous, go up to previous level's id
{
if (ActiveFormat.PlantFormat.FormatData.Templates[tpIndx].type == 39)
{
fromType = E_FromType.RNO;
addPart = EAddpingPart.Child;
newItemID = firstSmart.ItemID;
}
else
{
addPart = EAddpingPart.After;
newItemID = parentSmart.ItemID;
}
}
tmptext = 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 = parentSmart;
else if (level > prevlevel) parentSmart = siblingSmart;
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;
}
public ItemInfo EnhancedPasteItem(int copyStartID, ItemInfo pasteFromItem, EAddpingPart addType, string chgid)
{
EnhancedDocuments pasteFromItemsEnhancedDocuments = pasteFromItem.GetMyEnhancedDocuments();
if (pasteFromItemsEnhancedDocuments == null || pasteFromItemsEnhancedDocuments.Count == 0) return null;
ItemInfo newItemInfo = this;
ItemInfo newEnhancedItemInfo = null;
// need to save the original item ids in the copied item so that they can be
// changed to the new enhanced ids in 'config'. The oldid/newid pairs will
// be stored in a dictionary & the update will be made after the loop.
Dictionary<int, int> oldToNewEnhancedIds = new Dictionary<int, int>();
// tmpCopyStartSourceItem is the item that was copied in source.
ItemInfo tmpCopyStartSourceItem = ItemInfo.Get(copyStartID);
// loop through all enhanced document types, pasting in the copied item(s).
// Note that the copy/paste finds the enhanced items that relate to source,
// i.e. copied item & paste from, and uses those to do the copy/paste.
// sc is the config (passed in) for the item that we are pasting around.
foreach (EnhancedDocument edSource in pasteFromItem.GetMyEnhancedDocuments())
{
if (edSource.Type != 0)
{
ItemInfo tmpPasteItemFrom = ItemInfo.Get(edSource.ItemID); // here is problem
// get the 'enhanced' item to copy. To do this, get the enhanced link
// from source's config that matches this 'type'. Use that Id to get the enhanced
// Item that is to be copied:
int tmpCopyEnhancedID = 0;
foreach (EnhancedDocument edCopy in tmpCopyStartSourceItem.GetMyEnhancedDocuments())
{
if (edSource.Type == edCopy.Type)
{
tmpCopyEnhancedID = edCopy.ItemID;
break;
}
}
if (tmpCopyEnhancedID == 0) break; // no connected copied item.
if (addType == EAddpingPart.Before)
newEnhancedItemInfo = tmpPasteItemFrom.PasteSiblingBefore(tmpCopyEnhancedID, chgid);
else if (addType == EAddpingPart.After)
newEnhancedItemInfo = tmpPasteItemFrom.PasteSiblingAfter(tmpCopyEnhancedID, chgid);
else if (addType == EAddpingPart.Child)
newEnhancedItemInfo = tmpPasteItemFrom.PasteChild(tmpCopyEnhancedID, chgid);
else if (addType == EAddpingPart.Replace) // what about user interface for enhanced pasted steps?
{
ItemInfo enhReplaceItem = ItemInfo.Get(edSource.ItemID);
newEnhancedItemInfo = Item.PasteReplace(enhReplaceItem, tmpCopyEnhancedID, chgid);
}
// update the config data for the new enhanced item (procedure, section or step) to point back to the correct source
string cfgEnhStr = null;
if (newEnhancedItemInfo.IsStep)
{
StepConfig scnewenh = newEnhancedItemInfo.MyConfig as StepConfig;
if (scnewenh == null) break; //error here, i.e. should have a related enhanced step
scnewenh.MyEnhancedDocuments[0].ItemID = newItemInfo.ItemID;
scnewenh.SaveEnhancedDocuments();
cfgEnhStr = scnewenh.ToString();
}
else if (newEnhancedItemInfo.IsSection)
{
SectionConfig secnewenh = newEnhancedItemInfo.MyConfig as SectionConfig;
if (secnewenh == null) break; //error here, i.e. should have a related enhanced step
secnewenh.MyEnhancedDocuments[0].ItemID = newItemInfo.ItemID;
secnewenh.SaveEnhancedDocuments();
cfgEnhStr = secnewenh.ToString();
}
else if (newEnhancedItemInfo.IsProcedure)
{
ProcedureConfig pnewenh = newEnhancedItemInfo.MyConfig as ProcedureConfig;
if (pnewenh == null) break; //error here, i.e. should have a related enhanced step
pnewenh.MyEnhancedDocuments[0].ItemID = newItemInfo.ItemID;
pnewenh.SaveEnhancedDocuments();
cfgEnhStr = pnewenh.ToString();
}
if (cfgEnhStr != null) newEnhancedItemInfo.SaveConfig(cfgEnhStr);
// save the new enhanced step ids to set in the new source's config (to relate steps)
foreach (EnhancedDocument edNew in newItemInfo.GetMyEnhancedDocuments())
{
if (edNew.ItemID == tmpCopyEnhancedID) oldToNewEnhancedIds.Add(edNew.ItemID, newEnhancedItemInfo.ItemID);
}
}
}
// update the config to point to new enhanced document steps for the new source item
if (oldToNewEnhancedIds.Count > 0)
{
// save the updated config info on the newly pasted source: step, section or procedure:
string cfgNewSrc = null;
if (newItemInfo.IsStep)
{
StepConfig scnewpst1 = newItemInfo.MyConfig as StepConfig;
foreach (EnhancedDocument edOrig in scnewpst1.MyEnhancedDocuments)
edOrig.ItemID = oldToNewEnhancedIds[edOrig.ItemID];
scnewpst1.SaveEnhancedDocuments();
cfgNewSrc = scnewpst1.ToString();
}
else if (newItemInfo.IsSection)
{
SectionConfig secnewpst1 = newItemInfo.MyConfig as SectionConfig;
foreach (EnhancedDocument edOrig in secnewpst1.MyEnhancedDocuments)
edOrig.ItemID = oldToNewEnhancedIds[edOrig.ItemID];
secnewpst1.SaveEnhancedDocuments();
cfgNewSrc = secnewpst1.ToString();
}
else if (newItemInfo.IsProcedure)
{
ProcedureConfig pnewpst1 = newItemInfo.MyConfig as ProcedureConfig;
foreach (EnhancedDocument edOrig in pnewpst1.MyEnhancedDocuments)
edOrig.ItemID = oldToNewEnhancedIds[edOrig.ItemID];
pnewpst1.SaveEnhancedDocuments();
cfgNewSrc = pnewpst1.ToString();
}
if (cfgNewSrc != null) newItemInfo.SaveConfig(cfgNewSrc);
}
// if this is a HLS, then need to adjust links between any associated notes/cautions too:
if (newItemInfo.IsStep)
{
StepConfig scForNC = newItemInfo.MyConfig as StepConfig;
foreach (EnhancedDocument ed in scForNC.MyEnhancedDocuments) EnhancedSetNoteCautionLinks(newItemInfo, ed.Type);
}
return newEnhancedItemInfo;
}
#region HandleEnhancedNoteCautionConfigLinks
private static void EnhancedSetNoteCautionLinks(ItemInfo newItemInfo, int enhType)
{
// For this enhanced document type, adjust all of the ids to link between source & enhanced if there are
// notes & cautions. Notes first. There may be some source notes that aren't linked and some enhanced
// that are not linked, so account for this.
// get the high level enhanced step, this will be used for both note & caution code:
ItemInfo enhHls = null;
foreach (EnhancedDocument enh in newItemInfo.GetMyEnhancedDocuments())
{
if (enh.Type == enhType)
{
enhHls = ItemInfo.Get(enh.ItemID);
break;
}
}
if (newItemInfo.IsHigh && enhHls != null && newItemInfo.Notes != null && newItemInfo.Notes.Count > 0)
{
int srcIndxNt = 0;
int enhIndxNt = 0;
// for each note association between the source & enhanced document, update
// the config items to link them.
ItemInfo srcNtItem = newItemInfo.Notes[srcIndxNt];
while (srcNtItem != null)
{
StepConfig scSourceNote = newItemInfo.Notes[srcIndxNt].MyConfig as StepConfig;
if (scSourceNote.MyEnhancedDocuments.Count > 0)
{
// Loop through for each enhanced document related to the pasted source HLS
foreach (EnhancedDocument enh in srcNtItem.GetMyEnhancedDocuments())
{
if (enh.Type == enhType)
{
// Find hls in enhanced in order to get its notes to set their config to
// point back to the new source's note itemid. There may be enhanced items that
// don't connect back, so find one that does based on Enhance HLS note list &
// the notes' links back to source.
ItemInfo enhNtItem = null;
while (enhNtItem == null && enhIndxNt < enhHls.Notes.Count)
{
ItemInfo enhTstNote = enhHls.Notes[enhIndxNt];
StepConfig enhTstNoteCfg = enhTstNote.MyConfig as StepConfig;
if (enhTstNoteCfg.MyEnhancedDocuments.Count > 0)
{
foreach (EnhancedDocument enhNt in enhTstNote.GetMyEnhancedDocuments())
{
if (enhNt.Type == 0) // found it:
{
enhNtItem = enhTstNote;
break;
}
}
}
if (enhNtItem == null) enhIndxNt++;
}
if (enhNtItem != null)
{
StepConfig scNewEnhancedNote = enhNtItem.MyConfig as StepConfig;
scNewEnhancedNote.MyEnhancedDocuments[0].ItemID = newItemInfo.Notes[srcIndxNt].ItemID;
scNewEnhancedNote.SaveEnhancedDocuments();
enhNtItem.SaveConfig(scNewEnhancedNote.ToString());
foreach (EnhancedDocument noteEnh in scSourceNote.MyEnhancedDocuments)
{
if (noteEnh.Type == enhType)
{
noteEnh.ItemID = enhHls.Notes[enhIndxNt].ItemID;
scSourceNote.SaveEnhancedDocuments();
newItemInfo.Notes[srcIndxNt].SaveConfig(scSourceNote.ToString());
break;
}
}
enhIndxNt++;
}
}
}
}
srcIndxNt++;
srcNtItem = srcIndxNt>=newItemInfo.Notes.Count?null:newItemInfo.Notes[srcIndxNt];
}
}
// now do any cautions.
if (newItemInfo.IsHigh && newItemInfo.Cautions != null && newItemInfo.Cautions.Count > 0)
{
int srcIndxCt = 0;
int enhIndxCt = 0;
// for each caution association between the source & enhanced document, update
// the config items to link them.
ItemInfo srcCtItem = newItemInfo.Cautions[srcIndxCt];
while (srcCtItem != null)
{
StepConfig scSourceCaution = newItemInfo.Cautions[srcIndxCt].MyConfig as StepConfig;
if (scSourceCaution.MyEnhancedDocuments.Count > 0)
{
// Loop through for each enhanced document related to the pasted source HLS
foreach (EnhancedDocument enh in srcCtItem.GetMyEnhancedDocuments())
{
if (enh.Type == enhType)
{
// Find hls in enhanced in order to get its notes to set their config to
// point back to the new source's note itemid.
ItemInfo enhCtItem = null;
while (enhCtItem == null && enhIndxCt < enhHls.Cautions.Count)
{
ItemInfo enhTstCaut = enhHls.Cautions[enhIndxCt];
StepConfig enhTstCautCfg = enhTstCaut.MyConfig as StepConfig;
if (enhTstCautCfg.MyEnhancedDocuments.Count > 0)
{
foreach (EnhancedDocument enhCt in enhTstCaut.GetMyEnhancedDocuments())
{
if (enhCt.Type == 0)
{
enhCtItem = enhTstCaut;
break;
}
}
}
if (enhCtItem == null) enhIndxCt++;
}
if (enhCtItem != null)
{
StepConfig scNewEnhancedCaution = enhCtItem.MyConfig as StepConfig;
scNewEnhancedCaution.MyEnhancedDocuments[0].ItemID = newItemInfo.Cautions[srcIndxCt].ItemID;
scNewEnhancedCaution.SaveEnhancedDocuments();
enhCtItem.SaveConfig(scNewEnhancedCaution.ToString());
foreach (EnhancedDocument cautionEnh in scSourceCaution.MyEnhancedDocuments)
{
if (cautionEnh.Type == enh.Type)
{
cautionEnh.ItemID = enhHls.Cautions[enhIndxCt].ItemID;
scSourceCaution.SaveEnhancedDocuments();
newItemInfo.Cautions[srcIndxCt].SaveConfig(scSourceCaution.ToString());
break;
}
}
enhIndxCt++;
}
}
}
}
srcIndxCt++;
srcCtItem = srcIndxCt >= newItemInfo.Cautions.Count ? null : newItemInfo.Cautions[srcIndxCt];
}
}
}
#endregion
#region HandleEnhancedStepConfigLinks
private void EnhancedSetStepLinks(ItemInfo newSourceSectionInfo, int enhType)
{
//for the input source section, link all HLS to enhanced HLS (and any associated cautions/notes). Note that
// this assumes that all source steps are linked, but there may be 'deleted' steps in enhanced that may not be linked back.
ItemInfo newEnhSectionInfo = null;
ItemInfo enhStep = null; // in enhanced document, find first step that has links (there may be enhanced steps that don't have links)
SectionConfig newSectCfg = newSourceSectionInfo.MyConfig as SectionConfig;
foreach (EnhancedDocument ed in newSectCfg.MyEnhancedDocuments)
{
if (ed.Type == enhType)
{
newEnhSectionInfo = ItemInfo.Get(ed.ItemID);
StepConfig cfg = newEnhSectionInfo.Steps[0].MyConfig as StepConfig;
if (cfg.MyEnhancedDocuments.Count > 0) enhStep = newEnhSectionInfo.Steps[0];
else enhStep = GetNextEnhancedStep(newEnhSectionInfo.Steps[0]);
break;
}
}
if (enhStep == null) return;
// now adjust all of the ids to link between source & enhanced for this section's steps.
// The enhType represents which enhanced document we are working with, for example, backgrounds or deviations.
for (int iStp = 0; iStp < newSourceSectionInfo.Steps.Count; iStp++)
{
StepConfig scSourceStep = newSourceSectionInfo.Steps[iStp].MyConfig as StepConfig;
if (scSourceStep.MyEnhancedDocuments.Count > 0)
{
// Loop through for each enhanced document related to the pasted source HLS
foreach (EnhancedDocument enh in scSourceStep.MyEnhancedDocuments)
{
if (enh.Type == enhType)
{
// Find hls in enhanced in order to set the config to point back to the new source's itemid.
ItemInfo enhHls = enhStep;
StepConfig scNewEnhancedStep = enhHls.MyConfig as StepConfig;
scNewEnhancedStep.MyEnhancedDocuments[0].ItemID = newSourceSectionInfo.Steps[iStp].ItemID;
scNewEnhancedStep.SaveEnhancedDocuments();
enhHls.SaveConfig(scNewEnhancedStep.ToString());
// set the source to go to this enh.
enh.ItemID = enhHls.ItemID;
scSourceStep.SaveEnhancedDocuments();
newSourceSectionInfo.Steps[iStp].SaveConfig(scSourceStep.ToString());
EnhancedSetNoteCautionLinks(newSourceSectionInfo.Steps[iStp], enhType);
}
}
}
enhStep = GetNextEnhancedStep(enhStep);
}
}
private ItemInfo GetNextEnhancedStep(ItemInfo itemInfo)
{
if (itemInfo==null) return null;
ItemInfo curStep = itemInfo.NextItem;
while (curStep != null)
{
StepConfig cfg = curStep.MyConfig as StepConfig;
if (cfg.MyEnhancedDocuments.Count > 0) return curStep;
curStep = curStep.NextItem;
}
return null;
}
private ItemInfo GetNextEnhancedSection(ItemInfo itemInfo)
{
if (itemInfo == null) return null;
ItemInfo curSect = itemInfo.NextItem;
while (curSect != null)
{
SectionConfig cfg = curSect.MyConfig as SectionConfig;
if (cfg.MyEnhancedDocuments.Count > 0) return curSect;
curSect = curSect.NextItem;
}
return null;
}
#endregion
public ItemInfo PasteEnhancedItems(int copyStartID, ItemInfo pasteFromItem, EAddpingPart addType, string chgid)
{
ItemInfo retItem = null;
if (IsProcedure) // newly Pasted Item is a procedure.
{
// the following pastes each type of enhanced procedure, including its sections/steps
EnhancedPasteItem(copyStartID, pasteFromItem, addType, chgid);
// for each enhanced type for this procedure, adjust the config data for its sections/steps:
ProcedureConfig sourceProcConfig = this.MyConfig as ProcedureConfig;
foreach (EnhancedDocument enhProc in sourceProcConfig.MyEnhancedDocuments)
{
if (enhProc.Type != 0)
{
ItemInfo pastedEnhancedProc = ItemInfo.Get(enhProc.ItemID);
// get the first enhanced section, there may be non-linked sections before first linked section:
SectionConfig firstEnhSectionConfig = pastedEnhancedProc.Sections == null ? null : pastedEnhancedProc.Sections[0].MyConfig as SectionConfig;
ItemInfo pastedEnhancedCurrentSection = null;
if (firstEnhSectionConfig.MyEnhancedDocuments.Count > 0) pastedEnhancedCurrentSection = pastedEnhancedProc.Sections[0];
else pastedEnhancedCurrentSection = GetNextEnhancedSection(pastedEnhancedProc.Sections[0]);
// newly pasted procedure has sections/steps, need to adjust 'MyEnhancedDocuments' config items to point to correct
if (Sections != null)
{
foreach (ItemInfo sourceSect in Sections)
{
SectionConfig srcCfg = sourceSect.MyConfig as SectionConfig;
if (srcCfg != null && (srcCfg.Section_LnkEnh=="Y" || srcCfg.Section_LnkEnh=="T") && srcCfg.MyEnhancedDocuments != null && srcCfg.MyEnhancedDocuments.Count > 0)
{
// use pastedEnhancedCurrentSection to link to:
foreach (EnhancedDocument ed in srcCfg.MyEnhancedDocuments)
{
if (ed.Type == enhProc.Type)
{
ed.ItemID = pastedEnhancedCurrentSection.ItemID;
srcCfg.SaveEnhancedDocuments();
sourceSect.SaveConfig(srcCfg.ToString());
break;
}
}
SectionConfig enhSectCfg = pastedEnhancedCurrentSection.MyConfig as SectionConfig;
enhSectCfg.MyEnhancedDocuments[0].ItemID = sourceSect.ItemID;
enhSectCfg.SaveEnhancedDocuments();
pastedEnhancedCurrentSection.SaveConfig(enhSectCfg.ToString());
if (srcCfg.Section_LnkEnh == "Y") EnhancedSetStepLinks(sourceSect, enhProc.Type); //if steps, do them for this type
pastedEnhancedCurrentSection = GetNextEnhancedSection(pastedEnhancedCurrentSection);
}
}
}
}
}
retItem = null;
}
else if (IsSection)
{
ItemInfo pastedSect = EnhancedPasteItem(copyStartID, pasteFromItem, addType, chgid);
SectionConfig sourceSectConfig = this.MyConfig as SectionConfig;
foreach (EnhancedDocument enhSect in sourceSectConfig.MyEnhancedDocuments)
if (enhSect.Type != 0) EnhancedSetStepLinks(this, enhSect.Type);
retItem = pastedSect;
}
else if (pasteFromItem.IsStep || (pasteFromItem.IsSection && addType == EAddpingPart.Child))
{
ItemInfo pastedStep = EnhancedPasteItem(copyStartID, pasteFromItem, addType, chgid);
retItem = pastedStep;
}
return retItem;
}
private void SaveConfig(string cfg)
{
using (Content c1 = Content.Get(ContentID))
{
c1.Config = cfg;
c1.Save();
}
RefreshConfig();
}
#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)
{
Csla.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 (Csla.ApplicationContext.ExecutionLocation == Csla.ApplicationContext.ExecutionLocations.Client)
Csla.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)
{
Csla.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 (Csla.ApplicationContext.ExecutionLocation == Csla.ApplicationContext.ExecutionLocations.Client)
Csla.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)
{
System.Data.SqlClient.SqlException exSQL = SqlException(ex);
if (exSQL != null && exSQL.Message.Contains("###Cannot Delete Item###"))
throw exSQL;
Console.WriteLine("ItemInsertExt: Stacktrace = {0}", ex.StackTrace);
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 && !ex.Message.Contains("###Cannot Delete Item###"))
_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)
{
ItemInfo iii = itemInfo.HandleSqlExceptionOnDelete(ex);
if (iii != null) return iii;
if (!HandleSqlExceptionOnCopy(ex))
{
if (ex.Message.Contains("has External Transitions and has no next step")
|| ex.Message.Contains("has External Transitions to Procedure")
|| 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;
}
}
}