From 09a397bed2cba7e04ecf0cd4fd3b02c8766d8211 Mon Sep 17 00:00:00 2001 From: mschill Date: Wed, 1 Jul 2026 07:21:25 -0400 Subject: [PATCH] B2026-054 - When performing a Transition search, the Formats dropdown list is repeating several times. --- .../Volian.Controls.Library/DisplaySearch.cs | 292 +++++++++--------- 1 file changed, 145 insertions(+), 147 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index b0dd922e..61bbb2ea 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -15,24 +15,24 @@ using System.Linq; namespace Volian.Controls.Library { - public partial class DisplaySearch : UserControl - { - #region Public Events/Handlers + public partial class DisplaySearch : UserControl + { + #region Public Events/Handlers - public event DisplaySearchEvent PrintRequest; + public event DisplaySearchEvent PrintRequest; public event DisplaySearchEvent SearchComplete; private void OnPrintRequest(DisplaySearchEventArgs args) { if (PrintRequest != null) PrintRequest(this, args); - } + } private void OnSearchComplete(DisplaySearchEventArgs args) { if (SearchComplete != null) SearchComplete(this, args); - } + } #endregion @@ -43,9 +43,9 @@ namespace Volian.Controls.Library // B2023-076: Adding option to select all procedure sets private const string SelectAllProcedureSetsText = "Select All Procedure Sets"; - // B2019-161 When tracking timing time this action - private static VolianTimer _TimeActivity = new VolianTimer("DisplaySearch _TmrRefresh_Tick", 399); - private Timer _TmrRefresh = null; + // B2019-161 When tracking timing time this action + private static VolianTimer _TimeActivity = new VolianTimer("DisplaySearch _TmrRefresh_Tick", 399); + private Timer _TmrRefresh = null; public FormatVersionList myFormatVersionList; private ItemInfo _SearchIncTransII = null; @@ -220,7 +220,7 @@ namespace Volian.Controls.Library { _TmrRefresh = new Timer(); _TmrRefresh.Interval = 1000; - _TmrRefresh.Tick += _TmrRefresh_Tick; + _TmrRefresh.Tick += _TmrRefresh_Tick; } return _TmrRefresh; } @@ -325,7 +325,7 @@ namespace Volian.Controls.Library if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) { // RO Search ROFSTLookup.rochild[] chld = null; - ROFSTLookup.rochild ch; + ROFSTLookup.rochild ch; if (cmboTreeROs.SelectedNode != null) { if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) @@ -337,22 +337,22 @@ namespace Volian.Controls.Library else { if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi) - { + { ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)cmboTreeROs.SelectedNode.Tag; - return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4")); - } + return _MyRODbID.ToString() + ":" + string.Format("{0}", db.dbiID.ToString("X4")); + } else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) - { + { ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; chld = ch.children; - // build a list of ROs to search - // B2022-118: remove the ending comma otherwise query will fail - string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); - if (strRtnStr.EndsWith(",")) - strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); - return strRtnStr; - } - } + // build a list of ROs to search + // B2022-118: remove the ending comma otherwise query will fail + string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); + if (strRtnStr.EndsWith(",")) + strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); + return strRtnStr; + } + } } } return string.Empty; @@ -468,15 +468,18 @@ namespace Volian.Controls.Library this.Refresh(); myFormatVersionList = FormatVersionList.GetFormatVersions(); cbxTranVersion.DisplayMember = "Title"; - int lastLastFormatID = 0; - foreach (FormatVersion fv in myFormatVersionList) + + List fvlst = myFormatVersionList.GroupBy(x => x.FormatID).Select(group => new + FormatVersion(title: group.Max(x => x.Title), + formatID: group.Key, + versionID: group.Max(x => x.VersionID) + )).OrderBy(y => y.Title).ToList(); + + foreach (FormatVersion fv in fvlst) { - if (fv.FormatID != lastLastFormatID) - { - cbxTranVersion.Items.Add(fv); - lastLastFormatID = fv.FormatID; - } + cbxTranVersion.Items.Add(fv); } + cbxTranVersion.SelectedIndexChanged -= new EventHandler(cbxTranVersion_SelectedIndexChanged); cbxTranVersion.SelectedIndexChanged += new EventHandler(cbxTranVersion_SelectedIndexChanged); cbxTranFormat.SelectedIndexChanged -= new EventHandler(cbxTranFormat_SelectedIndexChanged); @@ -556,14 +559,9 @@ namespace Volian.Controls.Library string versionList = string.Empty; string sep = string.Empty; FormatVersion sfv = cbxTranVersion.SelectedItem as FormatVersion; - foreach (FormatVersion fv in myFormatVersionList) - { - if (fv.FormatID == sfv.FormatID) - { - versionList += sep + fv.VersionID; - sep = ","; - } - } + + versionList = string.Join(",", myFormatVersionList.Where(x => x.FormatID == sfv?.FormatID).Select(y => y.VersionID)); + cbxTranVersion.Tag = versionList; cbxTranFormatFillIn(versionList); if (dicExpandedFolderNodes.Count > 0) @@ -616,7 +614,7 @@ namespace Volian.Controls.Library dicSelectedFolderNodes.Clear(); } } - this.Cursor = Cursors.Default; + this.Cursor = Cursors.Default; } // C2020-033: Update the search panel for Incoming transitions. This gets called from the tree view & the ribbon @@ -828,10 +826,10 @@ namespace Volian.Controls.Library { DevComponents.AdvTree.Node pnode = sender as DevComponents.AdvTree.Node; if (pnode != null && pnode.HasChildNodes) - { - CheckTreeNodeChildren(pnode.Nodes); - } - } + { + CheckTreeNodeChildren(pnode.Nodes); + } + } public void advTreeProcSetsFillIn(bool blSeachTabClicked) { @@ -846,15 +844,15 @@ namespace Volian.Controls.Library topnode.Text = "Available Procedure Sets"; topnode.Tag = fi; topnode.DataKey = fi.FolderID; - advTreeProcSets.Nodes.Add(topnode); + advTreeProcSets.Nodes.Add(topnode); //advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert); - //B2023-076: Adding option to select all procedure sets + //B2023-076: Adding option to select all procedure sets DevComponents.AdvTree.Node selectAllNode = new Node(); selectAllNode.Text = SelectAllProcedureSetsText; selectAllNode.Tag = SelectAllProcedureSetsText; selectAllNode.CheckBoxVisible = true; - selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); + selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); topnode.Nodes.Add(selectAllNode); if (fi.SortedChildFolders != null) @@ -865,7 +863,7 @@ namespace Volian.Controls.Library newnode.Text = fic.ToString(); newnode.Tag = fic; newnode.DataKey = fi.FolderID; - AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. cntnd++; if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0) // allow for '+' for tree expansion { @@ -873,7 +871,7 @@ namespace Volian.Controls.Library { DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); tnt.Text = DummyNodeText; - newnode.Nodes.Add(tnt); + newnode.Nodes.Add(tnt); } topnode.Nodes.Add(newnode); } @@ -885,7 +883,7 @@ namespace Volian.Controls.Library newnode.Text = fi.ToString(); newnode.Tag = fi; newnode.DataKey = fi.FolderID; - AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. topnode.Nodes.Add(newnode); lstCheckedDocVersions.Add(Mydocversion); buildSetToSearchPanelTitle(); @@ -897,7 +895,7 @@ namespace Volian.Controls.Library fi = Mydocversion.MyFolder; topnode = new DevComponents.AdvTree.Node(); topnode.Text = fi.ToString(); - advTreeProcSets.Nodes.Add(topnode); + advTreeProcSets.Nodes.Add(topnode); topnode.Tag = fi; topnode.DataKey = fi.FolderID; } @@ -935,31 +933,31 @@ namespace Volian.Controls.Library newnode.Text = fic.ToString(); newnode.Tag = fic; newnode.DataKey = fic.FolderID; - par.Nodes.Add(newnode); + par.Nodes.Add(newnode); AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. newnode.Enabled = true; - if (fic.ChildFolderCount > 0) // B2017-176: Only expand if folder has folders (not working draft nodes) + if (fic.ChildFolderCount > 0) // B2017-176: Only expand if folder has folders (not working draft nodes) { DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); tnt.Text = DummyNodeText; - newnode.Nodes.Add(tnt); - // B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code - // that would check if this should be enabled if seraching for transition types. The transition controls - // had a list of associated docversions, so needed to get the docversion in the folder: + newnode.Nodes.Add(tnt); + // B2017-176: Only expand if folder has folders (not working draft nodes): the following was moved from the code + // that would check if this should be enabled if seraching for transition types. The transition controls + // had a list of associated docversions, so needed to get the docversion in the folder: if (tabSearchTypes.SelectedTab == tabTranSearch) - { + { if (!dicSelectedFolderNodes.ContainsKey(newnode)) dicSelectedFolderNodes.Add(newnode, false); // get the docversion for this folder, if it has one and determine whether it is enabled for transitions: string svid = null; if (fic.FolderDocVersionCount > 0) svid = fic.FolderDocVersions[0].VersionID.ToString(); newnode.Enabled = svid != null && cbxTranVersion.Tag != null ? cbxTranVersion.Tag.ToString().Contains(svid) : false; - } - } - } + } + } } } } + } public void AdvTree_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e) { @@ -979,9 +977,9 @@ namespace Volian.Controls.Library if (topNode != null) { topNode.EnsureVisible(); - } } } + } #endregion @@ -1061,12 +1059,12 @@ namespace Volian.Controls.Library DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem(); btnCM.Text = string.Format("{0}", (char)sym.Unicode); - // to name button use unicode rather than desc, desc may have spaces or odd chars + // to name button use unicode rather than desc, desc may have spaces or odd chars btnCM.Name = "btnCM" + sym.Unicode.ToString(); btnCM.Tooltip = sym.Desc; btnCM.Tag = string.Format(@"{0}", sym.Unicode); btnCM.FontBold = true; - btnCM.Click += new System.EventHandler(btnSym_Click); + btnCM.Click += new System.EventHandler(btnSym_Click); galSymbols.SubItems.Add(btnCM); } } @@ -1117,7 +1115,7 @@ namespace Volian.Controls.Library newnode = new DevComponents.AdvTree.Node(); newnode.Text = nodetext; newnode.Selectable = selectable; - AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. + AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. return newnode; } @@ -1164,7 +1162,7 @@ namespace Volian.Controls.Library bool allowNonAdmin = IncTranCvtPerm(); List itmsEditable = new List(); // return this list int listCount = 0; - if (all) // Check all in list + if (all) // Check all in list { listCount = _SearchResults.Count; foreach (ItemInfo ii in _SearchResults) @@ -1214,9 +1212,9 @@ namespace Volian.Controls.Library // C2020-033: convert selected transitions to text private void btnTranCvtSelToTxt_Click(object sender, EventArgs e) { - // First see if all selected can be converted, i.e. user has permission to edit + // First see if all selected can be converted, i.e. user has permission to edit List lbis = lbSrchResultsIncTrans.CheckedItems; - List itmsEditable = TranCvtCheckPermission(false); + List itmsEditable = TranCvtCheckPermission(false); if (itmsEditable == null || itmsEditable.Count == 0) return; TranCvtToTxt(itmsEditable); fromTranCvtBtn = true; @@ -1450,7 +1448,7 @@ namespace Volian.Controls.Library DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle); tn.Tag = db; - cmboTreeROs.Nodes.Add(tn); + cmboTreeROs.Nodes.Add(tn); AddDummyGroup(db, tn); } @@ -1505,26 +1503,26 @@ namespace Volian.Controls.Library ROFSTLookup.rochild[] chld = null; if (tn.Tag is ROFSTLookup.rodbi) - { + { ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; - MyROFSTLookup.LoadChildren(ref db); - chld = db.children; - } + MyROFSTLookup.LoadChildren(ref db); + chld = db.children; + } else if (tn.Tag is ROFSTLookup.rochild) - { + { ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; - MyROFSTLookup.LoadChildren(ref ch); - chld = ch.children; - } - else - { - Console.WriteLine("error - no type"); - return; - } + MyROFSTLookup.LoadChildren(ref ch); + chld = ch.children; + } + else + { + Console.WriteLine("error - no type"); + return; + } - // if children, add dummy node - // B2022-026 RO Memory Reduction code - need to check length - if (chld != null && chld.Length > 0) + // if children, add dummy node + // B2022-026 RO Memory Reduction code - need to check length + if (chld != null && chld.Length > 0) { ProgressBar_Initialize(chld.Length, tn.Text); @@ -1533,11 +1531,11 @@ namespace Volian.Controls.Library ProgressBar_SetValue(i); DevComponents.AdvTree.Node tmp = null; - ROFSTLookup.rochild roc = chld[i]; + ROFSTLookup.rochild roc = chld[i]; - // if this is a group, i.e. type 0, add a dummy node - // B2022-026 RO Memory Reduction code - check children length - if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) + // if this is a group, i.e. type 0, add a dummy node + // B2022-026 RO Memory Reduction code - check children length + if (roc.type == 0 && !MyROFSTLookup.HasChildren(ref roc)) { continue; // Ignore: Junk Scenario } @@ -1556,33 +1554,33 @@ namespace Volian.Controls.Library } - if (roc.value == null) - { + if (roc.value == null) + { tmp = new DevComponents.AdvTree.Node(roc.title); tmp.Tag = roc; - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); - DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText); - tmp.Nodes.Add(sub); - } - else - { + DevComponents.AdvTree.Node sub = new DevComponents.AdvTree.Node(DummyNodeText); + tmp.Nodes.Add(sub); + } + else + { tmp = new DevComponents.AdvTree.Node(roc.title); tmp.Tag = roc; - if (roc.roid.Length == 16) - { - tn.Nodes.Add(tmp); - } - else - { - int index = FindIndex(tn.Nodes, tmp.Text); - tn.Nodes.Insert(index, tmp); - } - } - } + if (roc.roid.Length == 16) + { + tn.Nodes.Add(tmp); + } + else + { + int index = FindIndex(tn.Nodes, tmp.Text); + tn.Nodes.Insert(index, tmp); + } + } + } } ProgressBar_Clear(); @@ -1611,18 +1609,18 @@ namespace Volian.Controls.Library cbxFndUnLnkROVals.Enabled = false; } else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) - { + { ROFSTLookup.rochild ro = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; - // B2022-026 RO Memory Reduction code - check children length - cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0); - } + // B2022-026 RO Memory Reduction code - check children length + cbxFndUnLnkROVals.Enabled = (ro.children == null || ro.children.Length <= 0); + } - if (!cbxFndUnLnkROVals.Enabled) + if (!cbxFndUnLnkROVals.Enabled) cbxFndUnLnkROVals.Checked = false; } - private void gpFindROs_EnabledChanged(object sender, EventArgs e) - { + private void gpFindROs_EnabledChanged(object sender, EventArgs e) + { if (gpFindROs.Enabled) gpFindROs.Style.BackColor = Color.Yellow; else @@ -1826,24 +1824,24 @@ namespace Volian.Controls.Library { ListBoxItem lbi = sender as ListBoxItem; if (lbi != null) - { - ItemBindingData ibd = lbi.Tag as ItemBindingData; + { + ItemBindingData ibd = lbi.Tag as ItemBindingData; ItemInfo ii = ibd.DataItem as ItemInfo; - bool allowNonAdmin = IncTranCvtPerm(); + bool allowNonAdmin = IncTranCvtPerm(); if (lbi.CheckState == CheckState.Checked && ii != null) - { - if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) - { - FlexibleMessageBox.Show("You do not have permission to edit the procedure, section, or step.", - "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); - lbi.CheckState = CheckState.Unchecked; - } - } - // B2021-018: use the CheckedItems.Count on the list box for the search results for - // incoming transitions to determine whether to enable the convert selected to text: - btnTranCvtSelToTxt.Enabled = (lbSrchResultsIncTrans.CheckedItems.Count > 0); - } - } + { + if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) + { + FlexibleMessageBox.Show("You do not have permission to edit the procedure, section, or step.", + "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); + lbi.CheckState = CheckState.Unchecked; + } + } + // B2021-018: use the CheckedItems.Count on the list box for the search results for + // incoming transitions to determine whether to enable the convert selected to text: + btnTranCvtSelToTxt.Enabled = (lbSrchResultsIncTrans.CheckedItems.Count > 0); + } + } private void GrpPanSearchResults_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { @@ -2186,8 +2184,8 @@ namespace Volian.Controls.Library { docVersionList += sep + dvi.VersionID.ToString(); sep = ","; - } - } + } + } // B2018-134 to search specifically for Outside Transitions, set docVeronList to empty string so that all procedure sets are considered if (cbxTranCategory.SelectedItem.ToString() == "Outside") docVersionList = string.Empty; @@ -2449,8 +2447,8 @@ namespace Volian.Controls.Library } } - // if the selected folder has a docversion, handle it: - if (n.Tag != SelectAllProcedureSetsText) + // if the selected folder has a docversion, handle it: + if (n.Tag != SelectAllProcedureSetsText) { FolderInfo fi = (FolderInfo)n.Tag; RefreshLstCheckedDocVersions(); @@ -2569,7 +2567,7 @@ namespace Volian.Controls.Library { Node newnode = new DevComponents.AdvTree.Node(); newnode.Text = str; - advTreeStepTypes.Nodes.Add(newnode); + advTreeStepTypes.Nodes.Add(newnode); } buildStepTypePannelTitle(); } @@ -2658,16 +2656,16 @@ namespace Volian.Controls.Library { vid = vid.IndexOf(",") < 0 ? vid : vid.Substring(0, cbxTranVersion.Tag.ToString().IndexOf(",")); - DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid)); - TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList; + DocVersionInfo dvi = DocVersionInfo.Get(int.Parse(vid)); + TransTypeList ttl = dvi.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList; cbxTranFormat.Items.Clear(); cbxTranFormat.Items.Add("All"); - for (int i = 0; i < ttl.MaxIndex; i++) - { - cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty))); - } + for (int i = 0; i < ttl.MaxIndex; i++) + { + cbxTranFormat.Items.Add(new TransItem(ttl[i].TransMenu.Replace("?.", string.Empty), ttl[i].TransFormat.Replace("?.", string.Empty))); + } cbxTranFormat.SelectedIndex = 0; cbxTranCategory.Items.Clear(); @@ -3299,7 +3297,7 @@ namespace Volian.Controls.Library } } catch (Exception ex) - { + { FlexibleMessageBox.Show("An error occurred while reading the xml file.\r\n\r\nThis can happen when the file selected for the Load is not saved\r\n" + "from a PROMS Search or if some of the steps no longer exist.", "Search Load Failed", MessageBoxButtons.OK); } @@ -3476,9 +3474,9 @@ namespace Volian.Controls.Library break; } } - } + } - private void btnCopySearchResults_Click(object sender, EventArgs e) + private void btnCopySearchResults_Click(object sender, EventArgs e) { ICollection myList = lbSrchResults.DataSource as ICollection; if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[4]) myList = lbSrchResultsIncTrans.DataSource as ICollection; @@ -3660,7 +3658,7 @@ namespace Volian.Controls.Library } } - #endregion + #endregion - public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args); + public delegate void DisplaySearchEvent(object sender, DisplaySearchEventArgs args); } -- 2.52.0