From 4c4396e8c825afe04ab9ac99a8f85880abe6383e Mon Sep 17 00:00:00 2001 From: Kathy Date: Tue, 10 Jan 2017 13:01:58 +0000 Subject: [PATCH] C2017-002 Allow inheritance of step data elements --- .../VEPROMS.CSLA.Library/Extension/ItemExt.cs | 15 ++ .../Format/PlantFormat.cs | 161 +++++++++++++++--- .../VEPROMS.CSLA.Library/Format/vlnFormat.cs | 9 +- .../Volian.Controls.Library/StepTabRibbon.cs | 4 +- 4 files changed, 160 insertions(+), 29 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index 463e92b5..6682753a 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -1882,11 +1882,26 @@ namespace VEPROMS.CSLA.Library { get { + if ((int)MyContent.Type < 20000) return null; int typ = (int)MyContent.Type - 20000; foreach (StepData sd in ActiveFormat.PlantFormat.FormatData.StepDataList) { if (sd.Index == typ) return sd; } + // Handle inheritance (step data may not be in current format, may inherit from parents: + IFormatOrFormatInfo parentFormat = ActiveFormat.PlantFormat.FormatData.MyParentFormat; + while (parentFormat != null) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + if (InheritedList != null) + { + foreach (StepData sdi in InheritedList) + { + if (sdi.Index == typ) return sdi; + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; + } return null; } } diff --git a/PROMS/VEPROMS.CSLA.Library/Format/PlantFormat.cs b/PROMS/VEPROMS.CSLA.Library/Format/PlantFormat.cs index 93ac4981..ca9a4b6d 100644 --- a/PROMS/VEPROMS.CSLA.Library/Format/PlantFormat.cs +++ b/PROMS/VEPROMS.CSLA.Library/Format/PlantFormat.cs @@ -434,8 +434,38 @@ namespace VEPROMS.CSLA.Library List sds = new List(); foreach (StepData sd in StepDataList) { - if (!sd.Inactive && sd.StepEditData.Searchable && sd.StepEditData.TypeMenu.InMenu) - sds.Add(new StepDataRetval(sd.StepEditData.TypeMenu.MenuItem, Convert.ToInt32(sd.Index))); + if (!sd.Inactive && sd.StepEditData.Searchable && sd.StepEditData.TypeMenu.InMenu) + sds.Add(new StepDataRetval(sd.StepEditData.TypeMenu.MenuItem, Convert.ToInt32(sd.Index))); + } + // now add any from the inherited list (but only if type is not in the list) + IFormatOrFormatInfo parentFormat = MyParentFormat; + while (parentFormat != null) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + foreach (StepData sd1 in InheritedList) + { + if (!sd1.Inactive && sd1.StepEditData.Searchable && sd1.StepEditData.TypeMenu.InMenu) + { + // if not in the sds list, add it: + // note that the list of StepDataRetval (sds) 'Contains' method did not find an existing StepData item - that is why the code loops + // through list rather than using 'Contains': + bool found = false; + foreach (StepDataRetval lrtvl in sds) + { + if (lrtvl.Index == sd1.Index) + { + found = true; + break; + } + } + if (!found) + { + StepDataRetval tmpsdrv = new StepDataRetval(sd1.StepEditData.TypeMenu.MenuItem, Convert.ToInt32(sd1.Index)); + sds.Add(tmpsdrv); + } + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; } return sds; } @@ -444,15 +474,35 @@ namespace VEPROMS.CSLA.Library StepData top = sd; while (top.ParentType != "Base") { + bool foundit = false; string sParStp = StepDataList[formatStepType].ParentType; foreach (StepData stp in StepDataList) { if (top.ParentType == stp.Type) { top = stp; + foundit = true; break; } } + if (!foundit) + { + IFormatOrFormatInfo parentFormat = MyParentFormat; + while (parentFormat != null && !foundit) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + foreach (StepData stp1 in InheritedList) + { + if (top.ParentType == stp1.Type) + { + top = stp1; + foundit = true; + break; + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; + } + } } return top; } @@ -500,13 +550,36 @@ namespace VEPROMS.CSLA.Library if (topType.Type == curType) retval = cntitm; cntitm++; } + bool foundInCur = false; foreach (StepData sd in StepDataList) { if (sd.ParentType == topType.Type) { - int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd, curType, _CurItemInfo, ref cntitm); + int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd, curType, _CurItemInfo, ref cntitm, false); if (sd.Type == curType) retval = tmpindx; if (retval < 0 && tmpindx > 0) retval = tmpindx; + foundInCur = true; + } + } + // Handle inheritance (step data may not be in current format, may inherit from parents): + if (!foundInCur) + { + IFormatOrFormatInfo parentFormat = MyParentFormat; + bool foundit = false; + while (parentFormat != null && !foundit) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + foreach (StepData sd1 in InheritedList) + { + if (sd1.ParentType == topType.Type) + { + int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd1, curType, _CurItemInfo, ref cntitm, true); + if (sd1.Type == curType) retval = tmpindx; + if (retval < 0 && tmpindx > 0) retval = tmpindx; + foundit = true; // stop after finding the type in the closest parent, i.e. don't keep walking up tree. + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; } } } @@ -514,7 +587,7 @@ namespace VEPROMS.CSLA.Library return sds; } - private int DoListChildStepTypes(bool alwaysAdd, ref List sds, StepData topType, string curType, ItemInfo _CurItemInfo, ref int cntitm) + private int DoListChildStepTypes(bool alwaysAdd, ref List sds, StepData topType, string curType, ItemInfo _CurItemInfo, ref int cntitm, bool doInherit) { int retval = -1; if (alwaysAdd || (topType.StepEditData.TypeMenu.InMenu && ((topType.StepEditData.TypeMenu.RnoInMenu) || @@ -538,13 +611,36 @@ namespace VEPROMS.CSLA.Library cntitm++; } } + bool foundInCur = false; foreach (StepData sd in StepDataList) { if (sd.ParentType == topType.Type) { - int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd, curType, _CurItemInfo, ref cntitm); + int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd, curType, _CurItemInfo, ref cntitm, false); if (sd.Type == curType) retval = tmpindx; if (retval < 0 && tmpindx > 0) retval = tmpindx; + foundInCur = true; + } + } + // Handle inheritance (step data may not be in current format, may inherit from parents): + if (!foundInCur && doInherit) + { + IFormatOrFormatInfo parentFormat = MyParentFormat; + bool foundit = false; + while (parentFormat != null && !foundit) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + foreach (StepData sd1 in InheritedList) + { + if (sd1.ParentType == topType.Type) + { + int tmpindx = DoListChildStepTypes(alwaysAdd, ref sds, sd1, curType, _CurItemInfo, ref cntitm, true); + if (sd1.Type == curType) retval = tmpindx; + if (retval < 0 && tmpindx > 0) retval = tmpindx; + foundit = true; + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; } } } @@ -4832,22 +4928,25 @@ namespace VEPROMS.CSLA.Library { foreach (StepData stepData in this) if (stepData.Type == type) return stepData; - //foreach (StepData stepData1 in InheritedList) - // if (stepData1.Type == type) return stepData1; - return null; - } - } - public StepData this[int index] - { - get - { - foreach (StepData stepData in this) - if (stepData.Index == index) return stepData; - //foreach (StepData stepData1 in InheritedList) - // if (stepData1.Index == index) return stepData1; + StepDataList ttlParent = (StepDataList) InheritedList; //Check Inherited Value + if (ttlParent != null) + return ttlParent[type]; // note that this is recursive, i.e. if doesn't get found in parent, goes to parent's parent. return null; } } + // the following was commented out because it uses the vlnFormat version of the code that indexes the list. + //public StepData this[int index] + //{ + // get + // { + // foreach (StepData stepData in this) + // if (stepData.Index == index) return stepData; + // StepDataList ttlParent = (StepDataList)InheritedList; //Check Inherited Value + // if (ttlParent != null) + // return ttlParent[index]; + // return null; + // } + //} public StepDataList(XmlNodeList xmlNodeList, IFormatOrFormatInfo myFormat) : base(xmlNodeList, myFormat) { } private StepData _HLS; public StepData HLS @@ -5008,14 +5107,24 @@ namespace VEPROMS.CSLA.Library return sd; } } - //foreach (StepData sdi in InheritedList) - //{ - // if (sdi.Type == "Equation") - // { - // _Equation = sdi; - // return sdi; - // } - //} + // Handle inheritance (step data may not be in current format, may inherit from parents): + IFormatOrFormatInfo parentFormat = this.MyFormat.PlantFormat.FormatData.MyParentFormat; + while (parentFormat != null) + { + vlnIndexedFormatList InheritedList = parentFormat.PlantFormat.FormatData.StepDataList; + if (InheritedList != null) + { + foreach (StepData sdi in InheritedList) + { + if (sdi.Type == "Equation") + { + _Equation = sdi; + return sdi; + } + } + } + parentFormat = parentFormat.PlantFormat.FormatData.MyParentFormat; + } return null; } } diff --git a/PROMS/VEPROMS.CSLA.Library/Format/vlnFormat.cs b/PROMS/VEPROMS.CSLA.Library/Format/vlnFormat.cs index 2cda70d8..275b56f7 100644 --- a/PROMS/VEPROMS.CSLA.Library/Format/vlnFormat.cs +++ b/PROMS/VEPROMS.CSLA.Library/Format/vlnFormat.cs @@ -279,7 +279,14 @@ namespace VEPROMS.CSLA.Library return _MyFormat; } } - + private IFormatOrFormatInfo _MyParentFormat; + public IFormatOrFormatInfo MyParentFormat + { + get + { + return MyFormat.MyIParent; + } + } public virtual string GetPDDisplayName() { return ToString(); } public virtual string GetPDName() diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index 2b33b37a..6efaf170 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -1250,7 +1250,7 @@ namespace Volian.Controls.Library public void SetButtonAndMenuEnabling(bool docontextmenus) { if (_MyStepRTB == null) return; - if (_MyStepRTB.FieldToEdit != E_FieldToEdit.StepText && !MyItemInfo.IsFigure & !MyItemInfo.IsRtfRaw) // want menu enabling for figures & aations + if (_MyStepRTB.FieldToEdit != E_FieldToEdit.StepText && !MyItemInfo.IsFigure && !MyItemInfo.IsRtfRaw) // want menu enabling for figures & aations return; // No need to change menu that does not get used DocVersionInfo dvi = MyEditItem.MyItemInfo.MyProcedure.ActiveParent as DocVersionInfo; if (dvi == null) return; @@ -1682,7 +1682,7 @@ namespace Volian.Controls.Library btnInsSubstep.Enabled = (actable & E_AccStep.AddingSub) > 0; btnInsBefore.Enabled = btnInsBefH.Enabled = !MyItemInfo.IsRNOPart && (actable & E_AccStep.AddingPrev) > 0; btnInsAfter.Enabled = btnInsAftH.Enabled = !MyItemInfo.IsRNOPart && (actable & E_AccStep.AddingNext) > 0; - btnInsEquation.Enabled = (actable & E_AccStep.AddingTable) > 0 && MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Equation != null; + btnInsEquation.Enabled = (actable & E_AccStep.AddingTable) > 0; // if this step has a table, figure or equation, disable both of those buttons. if (MyItemInfo.Tables != null && MyItemInfo.Tables.Count > 0)