diff --git a/PROMS/Volian.Controls.Library/DisplaySearch.cs b/PROMS/Volian.Controls.Library/DisplaySearch.cs index 61bbb2ea..f30c8bb2 100644 --- a/PROMS/Volian.Controls.Library/DisplaySearch.cs +++ b/PROMS/Volian.Controls.Library/DisplaySearch.cs @@ -15,6 +15,8 @@ using System.Linq; namespace Volian.Controls.Library { +#pragma warning disable IDE1006 // Naming Styles +#pragma warning disable IDE0044 // Add readonly modifier public partial class DisplaySearch : UserControl { #region Public Events/Handlers @@ -24,14 +26,12 @@ namespace Volian.Controls.Library private void OnPrintRequest(DisplaySearchEventArgs args) { - if (PrintRequest != null) - PrintRequest(this, args); + PrintRequest?.Invoke(this, args); } private void OnSearchComplete(DisplaySearchEventArgs args) { - if (SearchComplete != null) - SearchComplete(this, args); + SearchComplete?.Invoke(this, args); } #endregion @@ -218,8 +218,10 @@ namespace Volian.Controls.Library { if (_TmrRefresh == null) { - _TmrRefresh = new Timer(); - _TmrRefresh.Interval = 1000; + _TmrRefresh = new Timer + { + Interval = 1000 + }; _TmrRefresh.Tick += _TmrRefresh_Tick; } return _TmrRefresh; @@ -324,7 +326,6 @@ namespace Volian.Controls.Library { if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) { // RO Search - ROFSTLookup.rochild[] chld = null; ROFSTLookup.rochild ch; if (cmboTreeROs.SelectedNode != null) { @@ -336,18 +337,16 @@ namespace Volian.Controls.Library } else { - if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi) + if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rodbi db) { - 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) + else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild roch) { - ch = (ROFSTLookup.rochild)cmboTreeROs.SelectedNode.Tag; - chld = ch.children; + ROFSTLookup.rochild[] chld = roch.children; // build a list of ROs to search // B2022-118: remove the ending comma otherwise query will fail - string strRtnStr = _MyRODbID.ToString() + ":" + GetROsToSearch(chld); + string strRtnStr = $"{_MyRODbID.ToString()}:{GetROsToSearch(chld)}"; if (strRtnStr.EndsWith(",")) strRtnStr = strRtnStr.Substring(0, strRtnStr.Length - 1); return strRtnStr; @@ -391,7 +390,6 @@ namespace Volian.Controls.Library cmbResultsStyle.Enabled = false; tabSearchTypes.SelectedTabChanged += new TabStrip.SelectedTabChangedEventHandler(tabSearchTypes_SelectedTabChanged); // Don't do this here. If you do then the /DB parameter has not yet been set, which will cause the database menu to be displayed - //SetupContextMenu(); // so that the symbol list is available without selecting a procedure set or procedure } #endregion @@ -447,20 +445,6 @@ namespace Volian.Controls.Library } btnSearch.Enabled = (cbxTranCategory.Items.Count > 0); // B2017-038 disable search button if no format selected //enable-disable doc version nodes based on version type if selected - if (cbxTranVersion.SelectedIndex > -1) - { - if (dicExpandedFolderNodes.Count > 0) - { - foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys) - { - DocVersionInfo dvi = (DocVersionInfo)n.Tag; - if (cbxTranVersion.Tag.ToString().Contains(dvi.VersionID.ToString())) - n.Enabled = true; - else - n.Enabled = false; - } - } - } //setup transition format versions this.Cursor = Cursors.WaitCursor; if (myFormatVersionList == null) @@ -475,6 +459,10 @@ namespace Volian.Controls.Library versionID: group.Max(x => x.VersionID) )).OrderBy(y => y.Title).ToList(); + //B2026-055 – Transition Search Improvements + //Added an All option to allow resetting of the enabling/disabling tree options + cbxTranVersion.Items.Add(new FormatVersion("All", -1, -1)); + foreach (FormatVersion fv in fvlst) { cbxTranVersion.Items.Add(fv); @@ -504,32 +492,6 @@ namespace Volian.Controls.Library public void cbxTranFormat_SelectedIndexChanged(object sender, EventArgs e) { - #region 1st cut - //if (cbxTranFormat.SelectedItem.ToString() == "All") - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("All"); - // cbxTranCategory.Items.Add("Internal"); - // cbxTranCategory.Items.Add("External"); - // cbxTranCategory.Items.Add("Outside"); - // cbxTranCategory.SelectedIndex = 0; - //} - //else if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc")) - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("All"); - // cbxTranCategory.Items.Add("External"); - // cbxTranCategory.Items.Add("Outside"); - // cbxTranCategory.SelectedIndex = 0; - //} - //else - //{ - // cbxTranCategory.Items.Clear(); - // cbxTranCategory.Items.Add("Internal"); - // cbxTranCategory.SelectedIndex = 0; - //} - #endregion - #region 2nd cut if (cbxTranFormat.SelectedItem.ToString().Contains("{Proc")) { @@ -564,31 +526,16 @@ namespace Volian.Controls.Library cbxTranVersion.Tag = versionList; cbxTranFormatFillIn(versionList); - if (dicExpandedFolderNodes.Count > 0) - { - foreach (DevComponents.AdvTree.Node n in dicExpandedFolderNodes.Keys) - { - FolderInfo fi = (FolderInfo)n.Tag; - // if this folder has a docversion, use its id: - string svid = null; - if (fi.FolderDocVersionCount > 0) - svid = fi.FolderDocVersions[0].VersionID.ToString(); - if (cbxTranVersion.Tag.ToString().Contains(svid)) - n.Enabled = true; - else - n.Enabled = false; - } - } - List uncheckNodes = new List(); + List uncheckNodes = new List(); foreach (DevComponents.AdvTree.Node n in dicSelectedFolderNodes.Keys) { - FolderInfo fi = (FolderInfo)n.Tag; // this was crashing in old version of code + FolderInfo fi = n.Tag as FolderInfo; // this was crashing in old version of code // if this folder has a docversion, use its id: string svid = null; - if (fi.FolderDocVersionCount > 0) + if (fi?.FolderDocVersionCount > 0) svid = fi.FolderDocVersions[0].VersionID.ToString(); - if (svid != null && !versionList.Contains(svid)) + if (svid != null && !string.IsNullOrEmpty(versionList) && !versionList.Split(',').Contains(svid)) uncheckNodes.Add(n); else n.Enabled = true; @@ -614,13 +561,17 @@ namespace Volian.Controls.Library dicSelectedFolderNodes.Clear(); } } + + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + TraverseTree(advTreeProcSets.Nodes[0], cbxTranVersion.Tag?.ToString().Split(',')); + this.Cursor = Cursors.Default; } // C2020-033: Update the search panel for Incoming transitions. This gets called from the tree view & the ribbon public void UpdateSearchIncTransResults() { - //IncTransSelectedCount = 0; tabSearchTypes.SelectedTab = tabSearchTypes.Tabs[4]; lbSrchResultsIncTrans.DataSource = null; @@ -697,13 +648,6 @@ namespace Volian.Controls.Library DevComponents.AdvTree.Node newnode; advTreeStepTypes.Nodes.Clear(); // Add a dummy node for searching Word Sections (MS Word sections) - //newnode = new DevComponents.AdvTree.Node(); - //newnode.Text = "Word Sections"; - //newnode.Selectable = true; - //newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter; - //newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox; - //newnode.CheckBoxThreeState = false; - //newnode.CheckBoxVisible = true; newnode = NewAdvTreeNode("WORD Sections", true, true); // C2020-010: Change Accessory Sections to Word Sections wordSectionTreeNode = newnode; // C2021-028: RNO Only search, disable Word section tree node @@ -721,16 +665,6 @@ namespace Volian.Controls.Library StepData sd = sdl[sdr.Index]; // get the step type record string parentName = sd.ParentType; // this gets the parent of the this step/substep type - //Console.WriteLine("{0} {1} - {2}", parentName,sd.Type,sdr.Name); - //newnode = new DevComponents.AdvTree.Node(); - //newnode.Text = sdr.Name; - //newnode.Name = sd.Type; // this needed for the FindNodeByName() function - //newnode.Tag = sd; - //newnode.Selectable = true; - //newnode.CheckBoxAlignment = DevComponents.AdvTree.eCellPartAlignment.NearCenter; - //newnode.CheckBoxStyle = eCheckBoxStyle.CheckBox; - //newnode.CheckBoxThreeState = false; - //newnode.CheckBoxVisible = true; if (parentName.Equals("Base")) { newnode = NewAdvTreeNode(sdr.Name, true, true); @@ -824,8 +758,7 @@ namespace Volian.Controls.Library //C2023-010: Select all child nodes when a subtype is selected private void pnode_selected(object sender, EventArgs e) { - DevComponents.AdvTree.Node pnode = sender as DevComponents.AdvTree.Node; - if (pnode != null && pnode.HasChildNodes) + if (sender is DevComponents.AdvTree.Node pnode && pnode.HasChildNodes) { CheckTreeNodeChildren(pnode.Nodes); } @@ -840,18 +773,21 @@ namespace Volian.Controls.Library int fiCount = fi.ChildFolderCount; advTreeProcSets.Nodes.Clear(); lstCheckedDocVersions.Clear(); - topnode = new DevComponents.AdvTree.Node(); - topnode.Text = "Available Procedure Sets"; - topnode.Tag = fi; - topnode.DataKey = fi.FolderID; + topnode = new DevComponents.AdvTree.Node + { + Text = "Available Procedure Sets", + Tag = fi, + DataKey = fi.FolderID + }; advTreeProcSets.Nodes.Add(topnode); - //advTreeProcSets.AfterNodeInsert += new TreeNodeCollectionEventHandler(advTreeProcSets_AfterNodeInsert); //B2023-076: Adding option to select all procedure sets - DevComponents.AdvTree.Node selectAllNode = new Node(); - selectAllNode.Text = SelectAllProcedureSetsText; - selectAllNode.Tag = SelectAllProcedureSetsText; - selectAllNode.CheckBoxVisible = true; + DevComponents.AdvTree.Node selectAllNode = new Node + { + Text = SelectAllProcedureSetsText, + Tag = SelectAllProcedureSetsText, + CheckBoxVisible = true + }; selectAllNode.NodeClick += new EventHandler(AllProcedureSets_clicked); topnode.Nodes.Add(selectAllNode); @@ -859,18 +795,22 @@ namespace Volian.Controls.Library { foreach (FolderInfo fic in fi.SortedChildFolders) { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fic.ToString(); - newnode.Tag = fic; - newnode.DataKey = fi.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fic.ToString(), + Tag = fic, + DataKey = fi.FolderID + }; AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. cntnd++; if (fic.ChildFolderCount > 0 || fic.FolderDocVersionCount > 0) // allow for '+' for tree expansion { if (fic.ChildFolderCount > 0) // B2017-176: Do not display the Working Draft node (don't create dummy for expander) { - DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); - tnt.Text = DummyNodeText; + DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node + { + Text = DummyNodeText + }; newnode.Nodes.Add(tnt); } topnode.Nodes.Add(newnode); @@ -879,10 +819,12 @@ namespace Volian.Controls.Library } else { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fi.ToString(); - newnode.Tag = fi; - newnode.DataKey = fi.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fi.ToString(), + Tag = fi, + DataKey = fi.FolderID + }; AddCheckBox(true, newnode);//C2016-045 Allow Folders to be selected. topnode.Nodes.Add(newnode); lstCheckedDocVersions.Add(Mydocversion); @@ -893,8 +835,10 @@ namespace Volian.Controls.Library { cntnd++; fi = Mydocversion.MyFolder; - topnode = new DevComponents.AdvTree.Node(); - topnode.Text = fi.ToString(); + topnode = new DevComponents.AdvTree.Node + { + Text = fi.ToString() + }; advTreeProcSets.Nodes.Add(topnode); topnode.Tag = fi; topnode.DataKey = fi.FolderID; @@ -929,43 +873,48 @@ namespace Volian.Controls.Library { foreach (FolderInfo fic in fi.SortedChildFolders) { - DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = fic.ToString(); - newnode.Tag = fic; - newnode.DataKey = fic.FolderID; + DevComponents.AdvTree.Node newnode = new DevComponents.AdvTree.Node + { + Text = fic.ToString(), + Tag = fic, + DataKey = fic.FolderID + }; 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) { - DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node(); - tnt.Text = DummyNodeText; + DevComponents.AdvTree.Node tnt = new DevComponents.AdvTree.Node + { + 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: - if (tabSearchTypes.SelectedTab == tabTranSearch) + if (tabSearchTypes.SelectedTab == tabTranSearch && !dicSelectedFolderNodes.ContainsKey(newnode)) + dicSelectedFolderNodes.Add(newnode, false); + } + + 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; + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + TraverseTree(advTreeProcSets.Nodes[0], cbxTranVersion.Tag?.ToString().Split(',')); } } } } } - } public void AdvTree_AfterExpandorCollapse(object sender, AdvTreeNodeEventArgs e) { Node bottomNode = BottomTreeNode(cmboTreeROs.AdvTree.Nodes); - Node lastNode = cmboTreeROs.AdvTree.Nodes[cmboTreeROs.AdvTree.Nodes.Count - 1]; + _ = cmboTreeROs.AdvTree.Nodes[cmboTreeROs.AdvTree.Nodes.Count - 1]; //LastNode int top = cmboTreeROs.AdvTree.Nodes[0].Bounds.Top; - int bottom = bottomNode.Bounds.Bottom + 5; + int bottom; int hScrollBarHeight = cmboTreeROs.AdvTree.HScrollBar != null ? cmboTreeROs.AdvTree.HScrollBar.Height : 0; bottom = bottomNode.Bounds.Bottom + 5; cmboTreeROs.AdvTree.Size = new Size(cmboTreeROs.AdvTree.Size.Width, Math.Min(525, bottom - top + hScrollBarHeight)); @@ -974,12 +923,9 @@ namespace Volian.Controls.Library { int yLookFor = (bottom - cmboTreeROs.AdvTree.Size.Height) + 2 * hScrollBarHeight; Node topNode = FindTreeNodeAt(cmboTreeROs.AdvTree.Nodes, yLookFor); - if (topNode != null) - { - topNode.EnsureVisible(); + topNode?.EnsureVisible(); } } - } #endregion @@ -988,8 +934,10 @@ namespace Volian.Controls.Library public void SetupAnnotationSearch(AnnotationDetails annotationDetails, DisplayTabControl tc) { _AnnotationDetails = annotationDetails; - List annoTypes = new List(); - annoTypes.Add(new AnnotationTypeSearch("All Annotations", string.Empty)); + List annoTypes = new List + { + new AnnotationTypeSearch("All Annotations", string.Empty) + }; AnnotationTypeInfoList annoList = AnnotationTypeInfoList.Get(); foreach (AnnotationTypeInfo ati in annoList) annoTypes.Add(new AnnotationTypeSearch(ati.Name, ati.TypeID.ToString())); @@ -1056,14 +1004,15 @@ namespace Volian.Controls.Library foreach (Symbol sym in sl) { - DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem(); - - btnCM.Text = string.Format("{0}", (char)sym.Unicode); + DevComponents.DotNetBar.ButtonItem btnCM = new DevComponents.DotNetBar.ButtonItem + { + Text = string.Format("{0}", (char)sym.Unicode), // 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; + Name = $"btnCM{sym.Unicode.ToString()}", + Tooltip = sym.Desc, + Tag = string.Format(@"{0}", sym.Unicode), + FontBold = true + }; btnCM.Click += new System.EventHandler(btnSym_Click); galSymbols.SubItems.Add(btnCM); } @@ -1112,9 +1061,11 @@ namespace Volian.Controls.Library private DevComponents.AdvTree.Node NewAdvTreeNode(string nodetext, bool selectable, bool chxbxvisable) { DevComponents.AdvTree.Node newnode; - newnode = new DevComponents.AdvTree.Node(); - newnode.Text = nodetext; - newnode.Selectable = selectable; + newnode = new DevComponents.AdvTree.Node + { + Text = nodetext, + Selectable = selectable + }; AddCheckBox(chxbxvisable, newnode);//C2016-045 Allow Folders to be selected. return newnode; } @@ -1161,7 +1112,7 @@ namespace Volian.Controls.Library // folder properties dialog bool allowNonAdmin = IncTranCvtPerm(); List itmsEditable = new List(); // return this list - int listCount = 0; + int listCount; if (all) // Check all in list { listCount = _SearchResults.Count; @@ -1185,14 +1136,13 @@ namespace Volian.Controls.Library // not all can be converted to text. If count of itmsEditable & lbis are different some cannot be edited. if (itmsEditable.Count == 0) { - FlexibleMessageBox.Show("You do not have permission to edit any of the procedures, sections, and/or steps" + (all ? "." : " that are selected."), + FlexibleMessageBox.Show($"You do not have permission to edit any of the procedures, sections, and/or steps{(all ? "." : " that are selected.")}", "Convert Transition to Text", MessageBoxButtons.OK, MessageBoxIcon.Information); return null; } else if (itmsEditable.Count != listCount) { - DialogResult ans = FlexibleMessageBox.Show("You only have permission to edit some of the procedures, sections, and/or steps that are selected.procedures, sections, and/or steps" + (all ? "." : " that are selected.") + - "\r\n\r\n Should the conversion of the transitions to text continue?", + DialogResult ans = FlexibleMessageBox.Show($"You only have permission to edit some of the procedures, sections, and/or steps that are selected.procedures, sections, and/or steps{(all ? "." : " that are selected.")}\r\n\r\n Should the conversion of the transitions to text continue?", "Convert Transition to Text", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.No) return null; } @@ -1213,7 +1163,7 @@ namespace Volian.Controls.Library private void btnTranCvtSelToTxt_Click(object sender, EventArgs e) { // First see if all selected can be converted, i.e. user has permission to edit - List lbis = lbSrchResultsIncTrans.CheckedItems; + _ = lbSrchResultsIncTrans.CheckedItems; List itmsEditable = TranCvtCheckPermission(false); if (itmsEditable == null || itmsEditable.Count == 0) return; TranCvtToTxt(itmsEditable); @@ -1446,8 +1396,10 @@ namespace Volian.Controls.Library { ROFSTLookup.rodbi db = dbs[i]; - DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle); - tn.Tag = db; + DevComponents.AdvTree.Node tn = new DevComponents.AdvTree.Node(db.dbiTitle) + { + Tag = db + }; cmboTreeROs.Nodes.Add(tn); AddDummyGroup(db, tn); @@ -1500,17 +1452,14 @@ namespace Volian.Controls.Library if (tn.HasChildNodes && tn.Nodes[0].Text != DummyNodeText) return; // already loaded. if (tn.HasChildNodes && tn.Nodes[0].Text == DummyNodeText) tn.Nodes[0].Remove(); - ROFSTLookup.rochild[] chld = null; - - if (tn.Tag is ROFSTLookup.rodbi) + ROFSTLookup.rochild[] chld; + if (tn.Tag is ROFSTLookup.rodbi db) { - ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; MyROFSTLookup.LoadChildren(ref db); chld = db.children; } - else if (tn.Tag is ROFSTLookup.rochild) + else if (tn.Tag is ROFSTLookup.rochild ch) { - ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; MyROFSTLookup.LoadChildren(ref ch); chld = ch.children; } @@ -1529,8 +1478,6 @@ namespace Volian.Controls.Library for (int i = 0; i < chld.Length; i++) { ProgressBar_SetValue(i); - DevComponents.AdvTree.Node tmp = null; - ROFSTLookup.rochild roc = chld[i]; // if this is a group, i.e. type 0, add a dummy node @@ -1554,10 +1501,13 @@ namespace Volian.Controls.Library } + Node tmp; if (roc.value == null) { - tmp = new DevComponents.AdvTree.Node(roc.title); - tmp.Tag = roc; + tmp = new DevComponents.AdvTree.Node(roc.title) + { + Tag = roc + }; int index = FindIndex(tn.Nodes, tmp.Text); tn.Nodes.Insert(index, tmp); @@ -1567,8 +1517,10 @@ namespace Volian.Controls.Library } else { - tmp = new DevComponents.AdvTree.Node(roc.title); - tmp.Tag = roc; + tmp = new DevComponents.AdvTree.Node(roc.title) + { + Tag = roc + }; if (roc.roid.Length == 16) { @@ -1608,9 +1560,8 @@ namespace Volian.Controls.Library { cbxFndUnLnkROVals.Enabled = false; } - else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild) + else if (cmboTreeROs.SelectedNode.Tag is ROFSTLookup.rochild ro) { - 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); } @@ -1632,12 +1583,7 @@ namespace Volian.Controls.Library bool keeplooking = true; //build a stack (bread crumb trail) of where is procedure set came from within the tree. Stack crumbs = new Stack(); - //crumbs.Push(Mydocversion.Name); // ex: "working draft" - //crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures" - //crumbs.Push(Mydocversion.MyFolder.MyParent.Name); // ex: "STPNOC-South Texas" - //crumbs.Push(advTreeProcSets.Nodes[0].Text); //top node of my tree - //crumbs.Push(Mydocversion.Name); // ex: "working draft" crumbs.Push(Mydocversion.MyFolder.Name); // ex: "Emergency Procedures" FolderInfo fi = Mydocversion.MyFolder.MyParent; while (fi != null) @@ -1822,13 +1768,11 @@ namespace Volian.Controls.Library // item to be clicked and to turn on/off the btnTranCvtSelToTxt button for converting selected to test. private void lbSrchResultsIncTrans_ItemClicked(object sender, EventArgs e) { - ListBoxItem lbi = sender as ListBoxItem; - if (lbi != null) + if (sender is ListBoxItem lbi) { ItemBindingData ibd = lbi.Tag as ItemBindingData; - ItemInfo ii = ibd.DataItem as ItemInfo; bool allowNonAdmin = IncTranCvtPerm(); - if (lbi.CheckState == CheckState.Checked && ii != null) + if (lbi.CheckState == CheckState.Checked && ibd.DataItem is ItemInfo ii) { if (!allowNonAdmin && !UserInfo.CanEdit(MyUserInfo, ii.MyDocVersion)) { @@ -2039,11 +1983,8 @@ namespace Volian.Controls.Library bool includeSpecialChars = (TextSearchString != @"\?"); // true; // Build list of selected types that were searched string typstr = null; - foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s; - TypesSelected = "Filtered By: " + ((typstr != null) ? typstr : "All Step Types"); - //TypesSelected = "Step Types Searched: " + ((typstr != null) ? typstr : "all step types"); - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "all step types"); - //TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types"; + foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : $"{typstr}, {s}"; + TypesSelected = $"Filtered By: {typstr ?? "All Step Types"}"; string unitPrefix = string.Empty; if (Mydocversion != null) unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber; @@ -2063,11 +2004,8 @@ namespace Volian.Controls.Library } else { - //string typstr = null; - //foreach (string s in lstCheckedStepTypesStr) typstr = typstr==null?s:typstr + ", " + s; - //ReportTitle = "Search for Selected Types"; //"Proms - Search by Type: " + typstr; ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr; - TypesSelected = "Filtered By: " + typstr; + TypesSelected = $"Filtered By: {typstr}"; SearchString = null; // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, string.Empty, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Value, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); @@ -2076,14 +2014,6 @@ namespace Volian.Controls.Library } else { - //if (textSearchString.Equals(string.Empty)) - //{ - // MessageBox.Show("Please enter some search text, then click the Search button", "No Search Text"); - // cbxTextSearchText.Focus(); - //} - //else - //{ - //ReportTitle = string.Format("Proms - {0} Search for '{1}'", cbxBooleanTxtSrch.Checked ? "Boolean" : "Text", TextSearchString); ReportTitle = string.Format("Search for '{0}'", TextSearchString); // C2020-009: Search - Allow search 'By Word'. @@ -2114,8 +2044,6 @@ namespace Volian.Controls.Library } } SearchString = TextSearchString; - //TypesSelected = (typstr != null) ? "Searched Step Types: " + typstr : "Searched All Step Types"; - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); // B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, TextSearchString /*.Replace(@"\",@"\u9586?")*/, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, cbxIncROTextSrch.Checked ? ItemSearchIncludeLinks.Value : ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); @@ -2129,7 +2057,6 @@ namespace Volian.Controls.Library { LastSearchWasAnnotations = true; // B2019-119 only refresh annotation search results if an annotation search was done SearchString = null; - //ReportTitle = string.Format("Proms - Annotation Search for '{0}'", cbxTextSearchAnnotation.Text); if (cbxTextSearchAnnotation.Text == null || cbxTextSearchAnnotation.Text == string.Empty) { ReportTitle = string.Format("Find {0}{1}", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty); @@ -2138,14 +2065,8 @@ namespace Volian.Controls.Library { ReportTitle = string.Format("Search {0}{1} For '{2}'", cbxAnnoTypes.Text, (cbxAnnoTypes.SelectedIndex > 0) ? " Annotations" : string.Empty, cbxTextSearchAnnotation.Text); } - //ReportTitle = string.Format("Search Annotations for '{0}'", cbxTextSearchAnnotation.Text); - //string srchStr = ConvertSpecialChars(cbxTextSearchAnnotation.Text);//cbxTextSearchAnnotation.Text; - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); - - //SearchResults = ItemInfoList.GetListFromAnnotationSearch(dviSearchList, typeSearchList, textSearchString, srchStr, cbxCaseSensitiveAnnoText.Checked); SearchResults = ItemInfoList.GetListFromAnnotationSearch(DVISearchList, TypeSearchList, AnnotationSearchType, cbxTextSearchAnnotation.Text, cbxCaseSensitiveAnnoText.Checked, unitPrefix); - //UpdateAnnotationSearchResults(); cmbResultsStyleIndex = 2; // display annotation text in results // C2019-001: Search in RNO steps only if (cbxRnoOnlyAnnot.Checked) GetInRNOResults(); @@ -2153,9 +2074,7 @@ namespace Volian.Controls.Library else if (tabSearchTypes.SelectedTab == tabSearchTypes.Tabs[2]) // RO Search { SearchString = null; - //ReportTitle = "Proms - Referenced Object Search"; ReportTitle = string.Format("Search For Referenced Object:\n{0}", cmboTreeROs.Text); - //TypesSelected = "Searched Step Types: " + ((typstr != null) ? typstr : "All Step Types"); if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) { @@ -2175,22 +2094,37 @@ namespace Volian.Controls.Library { ReportTitle = string.Format("Search For Transitions: Transition Type: {0}, Transition Category: {1}", cbxTranFormat.SelectedItem, cbxTranCategory.SelectedItem); string docVersionList = string.Empty; + bool bypassSearch = false; if (lstCheckedDocVersions.Count == 0) docVersionList = cbxTranVersion.Tag.ToString(); else { - string sep = string.Empty; - foreach (DocVersionInfo dvi in lstCheckedDocVersions) + //B2026-055 – Transition Search Improvements + //Changed matching to take Filtered Formats into account if both tree + //Items selected and Format dropdown filtered + if (string.IsNullOrEmpty(cbxTranVersion.Tag?.ToString())) { - docVersionList += sep + dvi.VersionID.ToString(); - sep = ","; + docVersionList = string.Join(",", lstCheckedDocVersions.Select(y => y.VersionID.ToString())); + } + else + { + var fromatversionslst = cbxTranVersion.Tag.ToString().Split(',').Select(int.Parse); + var selectedversionlst = lstCheckedDocVersions.Select(y => y.VersionID); + docVersionList = string.Join(",", fromatversionslst.Intersect(selectedversionlst)); + + if (string.IsNullOrEmpty(docVersionList)) + { + bypassSearch = true; + FlexibleMessageBox.Show("No Matches Found.", "Search"); } } + } // 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") + if (cbxTranCategory.SelectedItem?.ToString() == "Outside") docVersionList = string.Empty; // added TypeSearchList for bug fix B2015-055 - SearchResults = ItemInfoList.GetListFromTransitionSearch(docVersionList, cbxTranFormat.SelectedIndex - 1, cbxTranCategory.SelectedItem.ToString() == "All" ? string.Empty : cbxTranCategory.SelectedItem.ToString(), TypeSearchList); + if (cbxTranFormat.SelectedIndex == -1) cbxTranFormatFillIn(docVersionList); + if (!bypassSearch) SearchResults = ItemInfoList.GetListFromTransitionSearch(docVersionList, cbxTranFormat.SelectedIndex - 1, cbxTranCategory.SelectedItem?.ToString() == "All" ? string.Empty : (cbxTranCategory.SelectedItem?.ToString() ?? string.Empty), TypeSearchList); cmbResultsStyleIndex = 3; // display step text in results // C2019-001: Search in RNO steps only if (cbxRnoOnlyTrans.Checked) GetInRNOResults(); @@ -2247,16 +2181,13 @@ namespace Volian.Controls.Library string tmpmsg = (cbxBooleanTxtSrch.Checked && ex.Message.Contains("Syntax error") && ex.Message.Contains("full-text search")) ? "Place \"\" around words that you are searching for, so that parser can better understand what you are trying to find" : ex.Message; - FlexibleMessageBox.Show(tmpmsg, "Search Error: " + ex.GetType().Name); + FlexibleMessageBox.Show(tmpmsg, $"Search Error: {ex.GetType().Name}"); } finally { Cursor = savcursor; } - //Console.WriteLine("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds); OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); - //if (VlnSettings.DebugMode) - // MessageBox.Show(string.Format("{0} Milliseconds", TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks).TotalMilliseconds)); } private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) @@ -2317,7 +2248,7 @@ namespace Volian.Controls.Library if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = AnnotationInfo.Get(ii.ItemAnnotations[0].AnnotationID).SearchText; } - if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = "None - [" + ii.DisplayText + "]"; + if (ii.SearchAnnotationText == null) ii.SearchAnnotationText = $"None - [{ii.DisplayText}]"; else { hasAnnot = true; @@ -2467,7 +2398,7 @@ namespace Volian.Controls.Library //C2025-005 Find Step Elements //Need to refresh the Doc List and Available Step Types //if All Procedure Sets was selected - if (n.Tag == SelectAllProcedureSetsText) + if (n.Tag is string txt && txt == SelectAllProcedureSetsText) { if (n.Checked) { @@ -2518,7 +2449,6 @@ namespace Volian.Controls.Library { if (tn.Checked) { - //tn.Style = DevComponents.AdvTree.NodeStyles.Apple; // sets green background on selected folder(s) //B2023-112: Don't crash if on top 'All' node (did not have associated folder) FolderInfo fi = tn.Tag as FolderInfo; // if this folder has a docversion, use its id: @@ -2565,8 +2495,10 @@ namespace Volian.Controls.Library lstCheckedStepTypesStr.Clear(); foreach (string str in strs) { - Node newnode = new DevComponents.AdvTree.Node(); - newnode.Text = str; + Node newnode = new DevComponents.AdvTree.Node + { + Text = str + }; advTreeStepTypes.Nodes.Add(newnode); } buildStepTypePannelTitle(); @@ -2655,17 +2587,24 @@ namespace Volian.Controls.Library private void cbxTranFormatFillIn(string vid) { vid = vid.IndexOf(",") < 0 ? vid : vid.Substring(0, cbxTranVersion.Tag.ToString().IndexOf(",")); + //B2026-055 – Transition Search Improvements + //Change the order of items happening + //previous order was causing an error when clicked downdownlist to + //show all items and then didn't select an item in the list + cbxTranFormat.Items.Clear(); + cbxTranFormat.Items.Add("All"); + if (!string.IsNullOrEmpty(vid)) + { 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))); } + } cbxTranFormat.SelectedIndex = 0; cbxTranCategory.Items.Clear(); @@ -2715,9 +2654,9 @@ namespace Volian.Controls.Library if (advTreeStepTypes.Nodes.Count == 1 && n.Checked) { - if (n.Tag is DocVersionInfo) // Only set MyDocVersion if it is a DocVersion + if (n.Tag is DocVersionInfo info) // Only set MyDocVersion if it is a DocVersion { - Mydocversion = (DocVersionInfo)n.Tag; + Mydocversion = info; StartAdvTreeStepTypesFillIn();// B2016-258 Hang after selecting a procedure if the Step Type panel is open on the search panel } } @@ -2742,8 +2681,6 @@ namespace Volian.Controls.Library if (n.Checked) { - //n.Style = DevComponents.AdvTree.NodeStyles.Apple; // B2023-112: coloring of proc set tree nodes was not working correctly - if (sd == null) { //C2023-010: Since the tag is null for Word Sections and HLS types, we need to determine which one has been selected. Word sections we need @@ -2872,7 +2809,7 @@ namespace Volian.Controls.Library xpStepTypes.TitleStyle.BackColor1.Color = saveXpStepTypeTitleColor; } - else //lstCheckedStepTypes.Count > 0 + else { // show how many selected whether panel is expanded or not xpStepTypes.TitleText = string.Format("{0} Step Element{1} Selected", lstCheckedStepTypes.Count, (lstCheckedStepTypes.Count > 1) ? "s" : string.Empty); // B2018-132 changed second {0} to {1} @@ -2944,7 +2881,6 @@ namespace Volian.Controls.Library private bool OnlyWordSectTypeSel() { // B2021-100: Enable/disable the RNO Only checkbox & WORD Sections tree node in Step Elements to Search. - // lstCheckedStepTypes[x] = 0 for Word sections: if (lstCheckedStepTypes != null && lstCheckedStepTypes.Count == 1 && lstCheckedStepTypes[0] == 0) return true; @@ -3143,11 +3079,6 @@ namespace Volian.Controls.Library lbSrchResults.DataSource = null; lbSrchResults.Items.Clear(); toolTip1.SetToolTip(lbSrchResults, null); - string unitPrefix = string.Empty; - if (Mydocversion != null) - unitPrefix = Mydocversion.DocVersionConfig.Unit_ProcedureNumber; - if (unitPrefix.EndsWith("#")) - unitPrefix = unitPrefix.Replace("#", string.Empty); Cursor = Cursors.WaitCursor; try // B2021-045: don't crash if xml file cannot be loaded. @@ -3177,7 +3108,7 @@ namespace Volian.Controls.Library Node tnode = advTreeProcSets.FindNodeByDataKey(folderID); if (tnode != null) tnode.Checked = true; } - Mydocversion = tmpdvi == null ? fromLoadFiledvi : tmpdvi; + Mydocversion = tmpdvi ?? fromLoadFiledvi; } AdvTreeStepTypesFillIn(); @@ -3200,10 +3131,10 @@ namespace Volian.Controls.Library } string typstr = null; - foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : typstr + ", " + s; - TypesSelected = "Filtered By: " + ((typstr != null) ? typstr : "All Step Types"); + foreach (string s in lstCheckedStepTypesStr) typstr = typstr == null ? s : $"{typstr}, {s}"; + TypesSelected = $"Filtered By: {typstr ?? "All Step Types"}"; ReportTitle = "Step Element Report"; //"Proms - Search by Type: " + typstr; - TypesSelected = "Filtered By: " + typstr; + TypesSelected = $"Filtered By: {typstr}"; advTreeStepTypes.RefreshItems(); buildStepTypePannelTitle(); } @@ -3296,7 +3227,7 @@ namespace Volian.Controls.Library } } } - catch (Exception ex) + catch (Exception) { 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,6 +3407,46 @@ namespace Volian.Controls.Library } } + //B2026-055 – Transition Search Improvements + //Update Enabling/Disabling of Tree Elements + public bool TraverseTree(DevComponents.AdvTree.Node node, string[] versions) + { + bool result = true; + int numhiddenchildnodes = 0; + + // Recursively call this method for each child node + foreach (DevComponents.AdvTree.Node childNode in node.Nodes) + { + if (!TraverseTree(childNode, versions)) + { + numhiddenchildnodes++; + } + } + + // Process the current node (e.g., enable it if it is contained) + + //Select all always shows + //also Enable Dummy Nodes by default + if (versions == null || (versions.Length == 1 && string.IsNullOrEmpty(versions[0])) || node.Tag == null || (node.Tag is string txt && txt == SelectAllProcedureSetsText)) + { + node.Enabled = true; + return true; + } + //if all child nodes are hidden, hide the parent + else if (numhiddenchildnodes == node.Nodes.Count) + { + result = false; + } + + FolderInfo fi = (FolderInfo)node.Tag; + if (fi.FolderDocVersionCount > 0) + { + result = versions.Contains(fi.FolderDocVersions[0].VersionID.ToString()); + } + + node.Enabled = result; + return result; + } private void btnCopySearchResults_Click(object sender, EventArgs e) { ICollection myList = lbSrchResults.DataSource as ICollection; @@ -3541,7 +3512,6 @@ namespace Volian.Controls.Library private bool IncTransCvtAllToTextPerm() { if (_SearchResults == null) return false; - int cnt = 0; bool allowNonAdmin = IncTranCvtPerm(); foreach (ItemInfo ii in _SearchResults) { @@ -3657,6 +3627,8 @@ namespace Volian.Controls.Library } } } +#pragma warning restore IDE1006 // Naming Styles +#pragma warning restore IDE0044 // Add readonly modifier #endregion