using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.IO; using System.Windows.Forms; using VEPROMS.CSLA.Library; using XYPlots; using DevComponents.DotNetBar; using System.Text.RegularExpressions; using Volian.Base.Library; using JR.Utils.GUI.Forms; //using VG; namespace Volian.Controls.Library { public partial class DisplayRO : UserControl { private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #region Properties private DisplayTabControl _TabControl; public DisplayTabControl TabControl { get { return _TabControl; } set { _TabControl = value; } } private ROFstInfo _CurROFST = null; private ROFSTLookup _CurROFSTLookup = null; private ROFSTLookup _MyROFSTLookup; public ROFSTLookup MyROFSTLookup { get { return _MyROFSTLookup; } set { _MyROFSTLookup = value; LoadTree(); } } private ROFstInfo _MyROFST; public ROFstInfo MyROFST { get { return _MyROFST; } set { if (!Visible) return; // don't reset anything if the form is invisible. _MyROFST = value; // define the tree nodes based on this rofst LoadTree(); } } private RoUsageInfo _CurROLink; public RoUsageInfo CurROLink { get { return _CurROLink; } set { if (!Visible) return; // don't reset anything if the form is invisible. if (value != null) // modify - set the controls to the current ro { if (_CurROLink == value) return; _CurROLink = value; _SavCurROLink = _CurROLink; UpdateROTree(); } else // insert - clear out controls { _CurROLink = value; tbROValue.Text = null; lbROId.Text = ""; tvROFST.SelectedNode = null; btnGoToRO.Enabled = btnSaveRO.Enabled = btnCancelRO.Enabled = false; } } } private RoUsageInfo _SavCurROLink; private StepRTB _MyRTB; public StepRTB MyRTB { get { return _MyRTB; } set { if (!Visible) return; int origRoDbId = -1; if (_MyRTB != null) { _MyRTB.LinkChanged -= new StepRTBLinkEvent(MyRTB_LinkChanged); _MyRTB.SelectionChanged -= new EventHandler(MyRTB_SelectionChanged); if (_MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociationCount>0) origRoDbId = _MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst.RODbID; } if (value == null) return; _MyRTB = value; MyRTB.LinkChanged += new StepRTBLinkEvent(MyRTB_LinkChanged); MyRTB.SelectionChanged+=new EventHandler(MyRTB_SelectionChanged); if (MyRTB.MyLinkText == null) { CurROLink = null; _SavCurROLink = null; } // Test to see if this myrtf is using the same rofst as the previous. If // not we may have to reset the ro.fst for the tree if the new working // draft has a different ro.fst than the original: if (_MyRTB != null && _MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociationCount > 0) { if (origRoDbId != _MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst.RODbID) MyROFST = _MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociations[0].MyROFst; } // This docversion doesn't have an rofst associated with it, clear the ro tree. else if (_MyRTB.MyItemInfo.MyDocVersion.DocVersionAssociationCount <= 0) MyROFST = null; } } // B2019-161 When tracking timing time this action private static VolianTimer _TimeActivity = new VolianTimer("DisplayRO MyRTB_SelectionChanged", 117); void MyRTB_SelectionChanged(object sender, EventArgs e) { _TimeActivity.Open(); lbFound.SelectionMode = SelectionMode.None; lbFound.DataSource = null; //Spin through ROs looking for the selected text if (MyRTB.SelectedText != "") { string lookFor = MyRTB.SelectedText.Replace('\u2011', '-').Replace(@"\u9586?", @"\\"); List children = null; if (_MyROFST != null) children = _MyROFST.GetROFSTLookup(Mydvi).GetRosByValue(lookFor); if (children != null) { lbFound.Visible = true; lbFound.DataSource = children.ToArray(); lbFound.SelectionMode = SelectionMode.One; lbFound.SelectedIndex = -1; } else lbFound.Visible = false; } else lbFound.Visible = false; _TimeActivity.Close(); } void MyRTB_LinkChanged(object sender, StepPanelLinkEventArgs args) { if (MyRTB.MyLinkText == null) CurROLink = null; else { CurROLink = args.MyLinkText.MyRoUsageInfo; } } //private DocVersionInfo _Mydvi; public DocVersionInfo Mydvi { get { return MyROFSTLookup != null ? MyROFSTLookup.MyDocVersionInfo : null; } // get { return _Mydvi; } //set { _Mydvi = value; } } private ProgressBarItem _ProgressBar; public ProgressBarItem ProgressBar { get { return _ProgressBar; } set { _ProgressBar = value; } } //public int ProgBarMax //{ // get { return _ProgressBar.Maximum; } // set { _ProgressBar.Maximum = value; } //} //public int ProgBarValue //{ // get { return _ProgressBar.Value; } // set { _ProgressBar.Value = value; } //} //public string ProgBarText //{ // get { return _ProgressBar.Text; } // set // { // _ProgressBar.TextVisible = true; // _ProgressBar.Text = value; // } //} private static UserInfo _MyUserInfo = null; public static UserInfo MyUserInfo { get { return _MyUserInfo; } set { _MyUserInfo = value; } } #endregion #region Constructors public DisplayRO() // B2019-043 jsj 2019Mar21 - Removed the DisplayTabControl parameter from the constructor { InitializeComponent(); // jsj 2019Mar21 - This is initialized in frmVEPROMS.Designer.cs and in frmVEPROMS.cs in the constructor after the call to InitializeComponent() // When we had passed in the DisplayTabControl as a parameter, "DisplayRO(DisplayTabControl tc)", the frmVEPROMS designer would not include a NEW call for DisplayRO // in the "Windows Form Designer generated code" Region and thus cause the design view to no longer appear. //TabControl = tc;// B2017-074 Added DisplayTabControl to the constructor to assure that it is set _ProgressBar = null; panelRoValue.BackColor = Color.Cornsilk; panelValue.BackColor = Color.Cornsilk; } #endregion #region Events ROFSTLookup.rochild selectedChld; private void tvROFST_AfterSelect(object sender, TreeViewEventArgs e) { tbROValue.Text = null; lbROId.Text = ""; btnCancelRO.Enabled = false; btnSaveRO.Enabled = false; btnPreviewRO.Enabled = false; btnGoToRO.Enabled = false; if (e.Node.Tag is ROFSTLookup.rochild) { ROFSTLookup.rochild chld = (ROFSTLookup.rochild)e.Node.Tag; selectedChld = chld; if (chld.value != null) { RoUsageInfo SavROLink = null; if (_SavCurROLink != null) SavROLink = _SavCurROLink; ; lbROId.Text = chld.appid; // Allow the user to select a different return value. //btnSaveRO.Enabled = ((_SavCurROLink == null) || !(chld.roid.Substring(0, 12).ToLower().Equals(SavROLink.ROID.Substring(0, 12).ToLower()))); //btnCancelRO.Enabled = ((_SavCurROLink != null) && chld.roid.Substring(0, 12).ToLower() != SavROLink.ROID.Substring(0, 12).ToLower()); string childroid = chld.roid.ToLower() + "0000"; childroid = childroid.Substring(0, 16); bool isenh = MyRTB != null && MyRTB.MyItemInfo != null && MyRTB.MyItemInfo.IsEnhancedStep; //B2017-245 Disable SAveRO buttton for Procedues and Sections bool isNotStep = MyRTB != null && MyRTB.MyItemInfo != null && (MyRTB.MyItemInfo.IsProcedure || MyRTB.MyItemInfo.IsSection); btnSaveRO.Enabled = !isNotStep && !isenh && UserInfo.CanEdit(MyUserInfo, Mydvi) && ((_SavCurROLink == null) || !(childroid.Equals(SavROLink.ROID.ToLower()))); //added security check (UserInfo.CanEdit) btnCancelRO.Enabled = ((_SavCurROLink != null) && childroid != SavROLink.ROID.ToLower()); btnGoToRO.Enabled = UserInfo.CanEditROs(MyUserInfo, Mydvi); // Writers and Reviewers cannot edit ROs (run the RO Editor) switch (chld.type) { case 1: // standard (regular) text RO type tbROValue.Text = chld.value.Replace(@"\u160?", " "); btnPreviewRO.Enabled = false; if (chld.roid.StartsWith("FFFF")) btnGoToRO.Enabled = false; break; case 2: // Table RO type case 3: // This is type 3 when part of a multiple return value tbROValue.Text = "(Table)"; btnPreviewRO.Enabled = true; break; case 4: // X/Y Plot RO type tbROValue.Text = "(Graph)"; btnPreviewRO.Enabled = true; break; case 8: // Intergrated Graphics RO type tbROValue.Text = "(Image)"; btnPreviewRO.Enabled = true; break; } } } //if (e.Node.Tag is ROFST.rochild) //{ // ROFST.rochild chld = (ROFST.rochild)e.Node.Tag; // if (chld.type == 1 && chld.value != null) // { // string SavROLink = ""; // if (_SavCurROLink != null) // SavROLink = _SavCurROLink.Substring(_SavCurROLink.IndexOf(' ') + 1, 12); // tbROValue.Text = chld.value; // btnSaveRO.Enabled = ((_SavCurROLink == null) || !(chld.roid.Equals(SavROLink))); // btnCancelRO.Enabled = ((_SavCurROLink != null) && !(chld.roid.Equals(SavROLink))); // } // //else // //{ // // tbROValue.Text = null; // // btnCancelRO.Enabled = btnSaveRO.Enabled = false; // //} //} ////else ////{ //// tbROValue.Text = null; //// btnCancelRO.Enabled = btnSaveRO.Enabled = false; ////} } private void tvROFST_BeforeExpand(object sender, TreeViewCancelEventArgs e) { LoadChildren(e.Node); } private E_ROValueType _ROTypeFilter = E_ROValueType.All; public E_ROValueType ROTypeFilter { get { return _ROTypeFilter; } set { _ROTypeFilter = value; LoadTree(); } } private E_ROValueType _CurrentROTypeFilter = E_ROValueType.All; private void LoadChildren(TreeNode tn) { object tag = tn.Tag; if (tn.FirstNode != null && tn.FirstNode.Text != "VLN_DUMMY_FOR_TREE") return; // already loaded. if (tn.FirstNode != null && tn.FirstNode.Text == "VLN_DUMMY_FOR_TREE") tn.FirstNode.Remove(); ROFSTLookup.rochild[] chld = null; if (tn.Tag is ROFSTLookup.rodbi) { ROFSTLookup.rodbi db = (ROFSTLookup.rodbi)tn.Tag; chld = db.children; } else if (tn.Tag is ROFSTLookup.rochild) { ROFSTLookup.rochild ch = (ROFSTLookup.rochild)tn.Tag; chld = ch.children; } else { Console.WriteLine("error - no type"); return; } // if children, add dummy node if (chld != null && chld.Length > 0) { ProgressBar_Initialize(chld.Length, tn.Text); for (int i = 0; i < chld.Length; i++) { ProgressBar_SetValue(i); TreeNode tmp = null; // if this is a group, i.e. type 0, add a dummy node if (chld[i].type == 0 && chld[i].children == null) //skip it. // TODO: KBR how to handle this? //Console.WriteLine("ro junk"); continue; else if (ROTypeFilter != E_ROValueType.All && (chld[i].type & (uint)ROTypeFilter) == 0) continue; // ignore if does not match filter else if (/*chld[i].type == 1 && */ chld[i].value == null) { tmp = new TreeNode(chld[i].title); tmp.Tag = chld[i]; //tn.Nodes.Add(tmp); int index = FindIndex(tn.Nodes, tmp.Text); tn.Nodes.Insert(index, tmp); TreeNode sub = new TreeNode("VLN_DUMMY_FOR_TREE"); tmp.Nodes.Add(sub); } //else if (chld[i].type == 2 && chld[i].value == null) // table //{ // if ((MyRTB.MyItemInfo.MyContent.Type % 10000) == (int)E_FromType.Table) // { // tmp = new TreeNode(chld[i].title); // tmp.Tag = chld[i]; // tn.Nodes.Add(tmp); // TreeNode sub = new TreeNode("VLN_DUMMY_FOR_TREE"); // tmp.Nodes.Add(sub); // } //} else { tmp = new TreeNode(chld[i].title.Replace(@"\u160?"," ")); tmp.Tag = chld[i]; if (chld[i].roid.Length == 16) tn.Nodes.Add(tmp); else { int index = FindIndex(tn.Nodes, tmp.Text); tn.Nodes.Insert(index, tmp); } } } } ProgressBar_Clear(); } private int FindIndex(TreeNodeCollection nodes, string value) { int index = 0; foreach (TreeNode node in nodes) { if (GreaterValue(node.Text, value)) return index; index++; } return index; } private static Regex _RegExGetNumber = new Regex(@"^ *[+-]?[.,0-9/]+(E[+-]?[0-9]+)?"); // Sort by numeric value if possible, Otherwise sort alphabetically. public static bool GreaterValue(string value1, string value2) { Match match1 = _RegExGetNumber.Match(value1); Match match2 = _RegExGetNumber.Match(value2); if (match1.Success && !match1.Value.Contains("/") && match2.Success && !match2.Value.Contains("/")) // Compare the numeric value { double dbl1; double dbl2; //B2017-232 changed from Parse to TryParse. AEP had figure title that had a number containing two periods which caused Parse to error if (double.TryParse(match1.ToString(), out dbl1) && double.TryParse(match2.ToString(), out dbl2)) return dbl1 > dbl2; } return String.Compare(value1, value2, true) > 0; } public void RefreshRoTree() { string roid = null; if (tvROFST.SelectedNode != null) { if (tvROFST.SelectedNode.Tag is ROFSTLookup.rochild) { ROFSTLookup.rochild chld = (ROFSTLookup.rochild)tvROFST.SelectedNode.Tag; roid = chld.roid; } } _CurROFST = null; _CurROFSTLookup = null; LoadTree(); if (_SelectedRoidBeforeRoEditor != null) { ExpandTree(_SelectedRoidBeforeRoEditor); _SelectedRoidBeforeRoEditor = null; } } private void LoadTree() { if (_MyROFST == null) { tvROFST.Nodes.Clear(); _CurROFST = null; _CurROFSTLookup = null; return; } if (_MyROFST == _CurROFST && ROTypeFilter == _CurrentROTypeFilter && _MyROFSTLookup == _CurROFSTLookup) return; tvROFST.Nodes.Clear(); _CurROFST = _MyROFST; _CurROFSTLookup = _MyROFSTLookup; _CurrentROTypeFilter = ROTypeFilter; for (int i = 0; i < _MyROFST.GetROFSTLookup(Mydvi).myHdr.myDbs.Length; i++) { TreeNode tn = new TreeNode(_MyROFST.GetROFSTLookup(Mydvi).myHdr.myDbs[i].dbiTitle); tn.Tag = _MyROFST.GetROFSTLookup(Mydvi).myHdr.myDbs[i]; tvROFST.Nodes.Add(tn); AddDummyGroup(_MyROFST.GetROFSTLookup(Mydvi).myHdr.myDbs[i], tn); } if ((ROTypeFilter == E_ROValueType.Text || ROTypeFilter == E_ROValueType.All) && this.Mydvi != null && this.Mydvi.MultiUnitCount > 1) { TreeNode tnn = tvROFST.Nodes.Add("Unit Information"); /* if (ROID == "FFFF00000001") return _ROFstInfo.docVer.DocVersionConfig.Unit_Number; if (ROID == "FFFF00000002") return _ROFstInfo.docVer.DocVersionConfig.Other_Unit_Number; if (ROID == "FFFF00000003") return _ROFstInfo.docVer.DocVersionConfig.Unit_Text; if (ROID == "FFFF00000004") return _ROFstInfo.docVer.DocVersionConfig.Other_Unit_Text; if (ROID == "FFFF00000005") return _ROFstInfo.docVer.DocVersionConfig.Unit_ID; if (ROID == "FFFF00000006") return _ROFstInfo.docVer.DocVersionConfig.Other_Unit_ID; if (ROID == "FFFF00000007") return _ROFstInfo.docVer.DocVersionConfig.Unit_Name; if (ROID == "FFFF00000008") return _ROFstInfo.docVer.DocVersionConfig.Other_Unit_Name; */ /* TreeNode cn = tnn.Nodes.Add("Number"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000001"); cn = tnn.Nodes.Add("Other Number"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000002"); cn = tnn.Nodes.Add("Text"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000003"); cn = tnn.Nodes.Add("Other Text"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000004"); cn = tnn.Nodes.Add("ID"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000005"); cn = tnn.Nodes.Add("Other ID"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000006"); cn = tnn.Nodes.Add("Name"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000007"); cn = tnn.Nodes.Add("Other Name"); cn.Tag = MyROFST.ROFSTLookup.GetRoChild("FFFF00000008"); */ TreeNode cn = tnn.Nodes.Add("Number"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000001"); cn = tnn.Nodes.Add("Other Number"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000002"); cn = tnn.Nodes.Add("Text"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000003"); cn = tnn.Nodes.Add("Other Text"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000004"); cn = tnn.Nodes.Add("ID"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000005"); cn = tnn.Nodes.Add("Other ID"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000006"); cn = tnn.Nodes.Add("Name"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000007"); cn = tnn.Nodes.Add("Other Name"); cn.Tag = MyROFSTLookup.GetRoChild("FFFF00000008"); } } private void AddDummyGroup(ROFSTLookup.rodbi rodbi, TreeNode tn) { if (rodbi.children != null && rodbi.children.Length > 0) { TreeNode tmp = new TreeNode("VLN_DUMMY_FOR_TREE"); tn.Nodes.Add(tmp); } } private void UpdateROTree() { // walk down from root of tree, expanding values in the string // that represents the ro link. //string tmpstr = _CurROLink; //int sp = tmpstr.IndexOf(" "); // because parse of ro info is wrong!! //int rousageid = System.Convert.ToInt32(tmpstr.Substring(0, sp)); ExpandTree(_CurROLink.ROID);// tmpstr.Substring(sp + 1, tmpstr.Length - sp - 1); } private void ExpandTree(string roid) { string db = roid.Substring(0, 4); bool multValSel = false; if (roid.Length == 16) multValSel = true; ROFSTLookup.rochild rochld = MyROFSTLookup.GetRoChild(roid.Substring(0, 12).ToUpper()); // use this to walk up tree until database - this is used to expand tree. List path = new List(); int myid = rochld.ID; while (myid > 0) { path.Insert(0, myid); myid = rochld.ParentID; String pROID = string.Format("{0}{1:X08}",db,myid); rochld = MyROFSTLookup.GetRoChild(pROID); //rochld = MyROFST.ROFSTLookup.GetRoChildFromID(myid); Did not include db if (rochld.ID == -1) myid = -1; } TreeNode tnExpand = null; int titm = System.Convert.ToInt32(db, 16); //(db); // find database first foreach (TreeNode tn in tvROFST.Nodes) { if (tn.Tag != null) { ROFSTLookup.rodbi thisdb = (ROFSTLookup.rodbi)tn.Tag; if (thisdb.dbiID == titm) { LoadChildren(tn); tnExpand = tn; break; } } } if (tnExpand == null) return; // something went wrong? // use the path id list to load/find the treeview's nodes. foreach (int citm in path) { LoadChildren(tnExpand); tnExpand.Expand(); foreach (TreeNode tn in tnExpand.Nodes) { ROFSTLookup.rochild chld = (ROFSTLookup.rochild)tn.Tag; if (chld.ID == citm) { tnExpand = tn; break; } } } if (tnExpand != null) { // If a multiple return value, try to select the proper node if (multValSel) { LoadChildren(tnExpand); tnExpand.Expand(); foreach (TreeNode tn in tnExpand.Nodes) { if (tn.Tag != null) { ROFSTLookup.rochild chld = (ROFSTLookup.rochild)tn.Tag; if (chld.roid.ToUpper() == roid.ToUpper()) { tnExpand = tn; break; } } } } tvROFST.SelectedNode = tnExpand; } } private void btnSaveRO_Click(object sender, EventArgs e) { SaveRO(); } private void SaveRO() { if (tbROValue.Text == null || tbROValue.Text == "") { FlexibleMessageBox.Show("Must select an RO Value from the tree."); return; } Object obj = tvROFST.SelectedNode.Tag; if (obj is ROFSTLookup.rochild) { ROFSTLookup.rochild roch = (ROFSTLookup.rochild)obj; DisplayTabItem dti = TabControl.SelectedDisplayTabItem; //.OpenItem(_ItemInfo); // open the corresponding procedure text if (dti.MyDSOTabPanel != null) // A Word Document tab is the active tab { int dbiId = System.Convert.ToInt32(roch.roid.Substring(0, 4), 16); ROFSTLookup.rodbi[] dbs = MyROFSTLookup.GetRODatabaseList(); bool dbFound = false; ROFSTLookup.rodbi db = dbs[0]; foreach (ROFSTLookup.rodbi rodbi in dbs) { if (dbiId == rodbi.dbiID) { db = rodbi; dbFound = true; break; } } string AccPageID; if (!dbFound) { if (roch.roid.StartsWith("FFFF")) { AccPageID = "<" + roch.appid + ">"; } else { FlexibleMessageBox.Show("Error occurred finding RO. Contact Volian"); return; } } else { string accPrefix = db.dbiAP.Replace(Mydvi.DocVersionConfig.RODefaults_graphicsprefix, "IG"); accPrefix = accPrefix.Replace(Mydvi.DocVersionConfig.RODefaults_setpointprefix, "SP"); // string accPrefix = (roch.type == 8) ? _Mydvi.DocVersionConfig.RODefaults_graphicsprefix : _Mydvi.DocVersionConfig.RODefaults_setpointprefix; string suffix = (roch.roid.Length == 12 || roch.roid.Substring(12, 4) == "0041") ? "" : "." + ((char)Convert.ToInt32(roch.roid.Substring(12, 4), 16)).ToString(); AccPageID = string.Format("<{0}-{1}{2}>", accPrefix, roch.appid, suffix);// makes for example Console.WriteLine(AccPageID); } //string AccPageID = string.Format("{0} <{1}-{2}>", ConvertSymbolsAndStuff(selectedChld.value), accPrefix, roch.appid); // value and accesory ID //string AccPageID = string.Format("{0} {1}", ConvertSymbolsAndStuff(selectedChld.value), string.Format(@"#Link:ReferencedObject: {0} {1}", roch.roid, _MyROFST.MyRODb.RODbID)); // value and link reference //if (MessageBox.Show(AccPageID,"Place on Windows Clipboard?",MessageBoxButtons.YesNo) == DialogResult.Yes) // Clipboard.SetText(AccPageID); // Insert the RO text at the current cursor position in the word document // NOTE: assuming any type of RO can be put in an Accessory (MSWord) Document if (dti.MyDSOTabPanel != null) dti.MyDSOTabPanel.InsertText(AccPageID); } else if (MyRTB != null) // a Procedure Steps section tab is active { if (CheckROSelection(roch)) // check for RO type is valid for this type of step/substep { // the roid may be 12 or 16 chars long, with the last 4 set if there is unit specific // menuing. Pad to 12 to store in the rousage table. string padroid = (roch.roid.Length <= 12) ? roch.roid + "0000" : roch.roid; string linktxt = string.Format(@"#Link:ReferencedObject: {0} {1}", padroid, _MyROFST.MyRODb.RODbID); // Resolve symbols and scientific notation in the RO return value string valtxt = _MyROFST.GetROFSTLookup(Mydvi).GetTranslatedRoValue(padroid, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, MyRTB.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues); //ConvertSymbolsAndStuff(selectedChld.value); MyRTB.OnRoInsert(this, new StepRTBRoEventArgs(valtxt, selectedChld.value, linktxt, padroid, _MyROFST.MyRODb.RODbID)); } btnGoToRO.Enabled = btnSaveRO.Enabled = btnCancelRO.Enabled = btnPreviewRO.Enabled = false; _SavCurROLink = null; CurROLink = null; } } } private bool CheckROSelection(ROFSTLookup.rochild selectedRO) { bool goodToGo = true; bool replacingRO = (_SavCurROLink != null); string insrpl = (replacingRO) ? "Cannot Replace" : "Cannot Insert"; string errormsg = ""; switch (selectedRO.type) { case 1: // regular text RO if (MyRTB.MyItemInfo.IsFigure) { errormsg = (replacingRO) ? "a Figure with a non-figure." : "a text RO in a Figure type."; goodToGo = false; } break; case 2: // table RO if (MyRTB.MyItemInfo.IsFigure) { errormsg = (replacingRO) ? "a Figure with a non-figure." : "a table into a Figure type."; goodToGo = false; } else if (!MyRTB.MyItemInfo.IsTable) { errormsg = (replacingRO) ? "a non-table RO with a Table RO." : "a table into a non-table type."; //TODO: Prompt user to insert a new Table substep type and place this RO into it goodToGo = false; } break; case 4: // X/Y Plot RO type if (!MyRTB.MyItemInfo.IsAccPages) { errormsg = (replacingRO) ? "a non-X/Y Plot RO with an X/Y Plot RO." : "an X/Y Plot RO in an non-Accessory Page type."; //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it goodToGo = false; } break; case 8: // figure (intergrated graphics) if (!MyRTB.MyItemInfo.IsFigure && !MyRTB.MyItemInfo.IsAccPages) { errormsg = (replacingRO) ? "a graphics RO with a non-graphcis RO." : "a Graphics RO in an non-Figure or a non-Accessory Page type."; //TODO: Prompt user to insert a new substep type that handles x/y Plots and place this RO into it goodToGo = false; } break; } if (!goodToGo) FlexibleMessageBox.Show(string.Format("{0} {1}", insrpl, errormsg), (replacingRO) ? "Invalid RO Replacement" : "Invalid RO Insert"); return goodToGo; } private void btnCancelRO_Click(object sender, EventArgs e) { _CurROLink = _SavCurROLink; btnCancelRO.Enabled = false; UpdateROTree(); } private void btnPreviewRO_Click(object sender, EventArgs e) { if (selectedChld.type == 8) // integrated graphic { string fname = selectedChld.value.Substring(0, selectedChld.value.IndexOf('\n')); int thedot = fname.LastIndexOf('.'); ROImageInfo tmp = null; if (thedot == -1 || (thedot != (fname.Length - 4))) { tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); fname += string.Format(".{0}", MyROFST.MyRODb.RODbConfig.GetDefaultGraphicExtension()); } if (tmp == null) tmp = ROImageInfo.GetByROFstID_FileName(MyROFST.ROFstID, fname); if (tmp == null) tmp = MyROFST.GetROImageByFilename(fname, null); if (tmp !=null) { ROImageConfig rc = new ROImageConfig(tmp); int size = Convert.ToInt32(rc.Image_Size); PreviewROImage pvROImg = new PreviewROImage(ROImageInfo.Decompress(tmp.Content,size), selectedChld.title); pvROImg.ShowDialog(); } else FlexibleMessageBox.Show(string.Format("Cannot Find Image Data: {0}, {1}", MyROFST.ROFstID, fname)); } else if (selectedChld.type == 2) // table { PreviewMultiLineRO pmlROTable = new PreviewMultiLineRO(selectedChld.value, selectedChld.title); pmlROTable.ShowDialog(); } else if (selectedChld.type == 4) // x/y plot { /* //PreviewMultiLineRO pmlROTable = new PreviewMultiLineRO(selectedChld.value, selectedChld.title); //pmlROTable.ShowDialog(); // This will show the graph commands this.Cursor = Cursors.WaitCursor; // TemporaryFolder is magical. It will automatically (behind the scenes) build a path to a temporary // folder on the user's machine. It does this only the first time it's reference (GET), after that // it uses what it has. string pdfname = TemporaryFolder; //@"G:\debugdat\testplot\"; pdfname += "\\" + selectedChld.appid + ".pdf"; //if (File.Exists(pdfname)) // File.Delete(pdfname); XYPlot ROGraph = new XYPlot(selectedChld.value); VGOut_C1PDF pdf = VGOut_C1PDF.Create(); ROGraph.Process(pdf); pdf.Save(pdfname); this.Cursor = Cursors.Default; // Run an internet browser window WebBrowser wb = new WebBrowser(pdfname); wb.TitleText = selectedChld.title; wb.ShowDialog();// .Show(); // Run the default PDF reader //System.Diagnostics.Process ActRdr = System.Diagnostics.Process.Start(pdfname); //ActRdr.WaitForExit(); // Wait for the PDF viewing process to close then delete the temporary file // wait for a one minute max if (!WaitToDeleteFile(pdfname,1)) MessageBox.Show(string.Format("The PDF viewer was holding this file open: \n\n{0}",pdfname),"Cannot Delete Temporary File"); */ frmXYPlot plot = new frmXYPlot(selectedChld.appid + " - " + selectedChld.title, selectedChld.value); plot.Show(); } } private void ProgressBar_Initialize(int max, string desc) { if (_ProgressBar != null) { _ProgressBar.Maximum = max; _ProgressBar.Text = desc; _ProgressBar.TextVisible = true; } } private void ProgressBar_SetValue(int curval) { if (_ProgressBar != null) { _ProgressBar.Value = curval; } } private void ProgressBar_Clear() { if (_ProgressBar != null) { _ProgressBar.Text = ""; _ProgressBar.Maximum = 0; _ProgressBar.Value = 0; //_ProgressBar.TextVisible = false; // B2017-125 text in progress was not alway being displayed } } #region Utils /// /// Keep trying to delete the given file until successful OR until MaxMinutes has elasped /// /// File to delete (including path) /// Maxium Minutes to keep trying /// private static bool WaitToDeleteFile(string fname, int MaxMinutes) { bool deletedfile = false; DateTime dt_start = DateTime.Now; DateTime dt_loop = dt_start; int mins_start = dt_start.Minute; int mins_loop = dt_loop.Minute; while (!deletedfile && ((mins_loop - mins_start) < MaxMinutes)) { try { dt_loop = DateTime.Now; File.Delete(fname); deletedfile = true; } catch { continue; // The process is still holding file, try again. } } return deletedfile; } #endregion // utils private string _SelectedRoidBeforeRoEditor = null; private void lbROId_DoubleClick(object sender, EventArgs e) { if (tvROFST.SelectedNode == null) return; if (!UserInfo.CanEditROs(MyUserInfo, Mydvi)) return; // do not allow writers and reviews to run the RO Editor if (VlnSettings.ReleaseMode.Equals("DEMO")) { FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); return; } //string roapp = Environment.GetEnvironmentVariable("roapp"); string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable Object obj = tvROFST.SelectedNode.Tag; if (obj is ROFSTLookup.rochild) { ROFSTLookup.rochild roch = (ROFSTLookup.rochild)obj; _SelectedRoidBeforeRoEditor = roch.roid; string args = "\"" + _MyROFST.MyRODb.FolderPath + "\" " + roch.roid.ToLower(); System.Diagnostics.Process.Start(roapp, args); } } #endregion private void lbFound_SelectedValueChanged(object sender, EventArgs e) { ROFSTLookup.roChild child = lbFound.SelectedValue as ROFSTLookup.roChild; if (child != null) { ExpandTree(child.MyChild.roid); } } private void btnGoToRO_Click(object sender, EventArgs e) { if (tvROFST.SelectedNode == null) return; RunRoEditor(); } private void RunRoEditor() { if (VlnSettings.ReleaseMode.Equals("DEMO")) { FlexibleMessageBox.Show("Referenced Object Editor not available in the Demo version.", "PROMS Demo Version"); return; } //string roapp = Environment.GetEnvironmentVariable("roapp"); string roapp = Volian.Base.Library.ExeInfo.GetROEditorPath(); // get the path to the RO Editor Executable Object obj = tvROFST.SelectedNode.Tag; if (obj is ROFSTLookup.rochild) { ROFSTLookup.rochild roch = (ROFSTLookup.rochild)obj; _SelectedRoidBeforeRoEditor = roch.roid; string args = "\"" + _MyROFST.MyRODb.FolderPath + "\" " + roch.roid.ToLower(); if (!Directory.Exists(_MyROFST.MyRODb.FolderPath)) { FlexibleMessageBox.Show(string.Format("RO Database directory does not exist: {0}", _MyROFST.MyRODb.FolderPath)); return; } System.Diagnostics.Process.Start(roapp, args); } } private void tvROFST_DoubleClick(object sender, EventArgs e) { // B2016-132: don't process a double click on an RO if on an enhanced step: if (MyRTB != null && MyRTB.MyItemInfo != null && MyRTB.MyItemInfo.IsEnhancedStep) return; //if (tvROFST.SelectedNode == null) return; //RunRoEditor(); SaveRO(); } public void SetFindDocROButton(bool enabled) { this.btnFindDocRO.Enabled = enabled; } // C2016-044: support click of the 'Find Doc RO' button: private void btnFindDocRO_Click(object sender, EventArgs e) { DisplayTabItem dti = _TabControl==null?null:_TabControl.SelectedDisplayTabItem; if (dti != null && dti.MyDSOTabPanel != null) { // the currently selected tab control is a word document - see if it has an // active selection. If not, tell the user that text needs to be selected before // the ro can be found. string mytext = dti.MyDSOTabPanel.GetSelectedString(); if (mytext == null || mytext == "") { FlexibleMessageBox.Show(this, "Text must be selected in the document in order for an RO find to be performed.", "Select Text", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } else { // see if there are any ro's for the selected text & if so, display in the lbFound list: string lookFor = mytext.Replace('\u2011', '-').Replace(@"\u9586?", @"\\"); List children = null; if (_MyROFST != null) children = _MyROFST.GetROFSTLookup(Mydvi).GetRosByValue(lookFor); if (children != null) { lbFound.Visible = true; lbFound.DataSource = children.ToArray(); lbFound.SelectionMode = SelectionMode.One; lbFound.SelectedIndex = -1; } else lbFound.Visible = false; } } } } }