/********************************************************************************************* * Copyright 2021 - Volian Enterprises, Inc. All rights reserved. * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * ------------------------------------------------------------------------------ * $Workfile: ROEditor.cs $ $Revision: 54 $ * $Author: Kathy $ $Date: 7/20/04 2:15p $ * * $History: ROEditor.cs $ * * ***************** Version 54 ***************** * User: Kathy Date: 7/20/04 Time: 2:15p * Updated in $/EXE/RefObj/ROEditor * B2004-021 improve duplicate error message * * ***************** Version 53 ***************** * User: Kathy Date: 7/15/04 Time: 11:11a * Updated in $/EXE/RefObj/ROEditor * Fix B2004-017 * * ***************** Version 52 ***************** * User: Jsj Date: 1/21/04 Time: 12:11p * Updated in $/EXE/RefObj/ROEditor * calls new function to get currently selected field type for multi type * field * * ***************** Version 51 ***************** * User: Jsj Date: 1/07/04 Time: 2:19p * Updated in $/EXE/RefObj/ROEditor * allow use of SQL Server * * ***************** Version 50 ***************** * User: Kathy Date: 10/15/03 Time: 10:30a * Updated in $/EXE/RefObj/ROEditor * found/fixed as part of B2003-060 - will go thru QA process for that * bug's fix * * ***************** Version 49 ***************** * User: Jsj Date: 7/02/03 Time: 9:25a * Updated in $/EXE/RefObj/ROEditor * made messagebox calls modal by removing the parent window reference * * ***************** Version 48 ***************** * User: Kathy Date: 5/30/03 Time: 12:48p * Updated in $/EXE/RefObj/ROEditor * B2003-044: sync up xml with UI tree view * * ***************** Version 47 ***************** * User: Kathy Date: 5/21/03 Time: 12:52p * Updated in $/EXE/RefObj/ROEditor * B2003-034: if only one field for ro, wasn't always processing it. * * ***************** Version 46 ***************** * User: Kathy Date: 5/07/03 Time: 1:59p * Updated in $/EXE/RefObj/ROEditor * B2003-033 fixed. * * ***************** Version 45 ***************** * User: Jsj Date: 4/14/03 Time: 3:03p * Updated in $/EXE/RefObj/ROEditor * changes due to RO FST file creation speed up * * ***************** Version 44 ***************** * User: Kathy Date: 3/26/03 Time: 2:20p * Updated in $/EXE/RefObj/ROEditor * speed up initial load * * ***************** Version 43 ***************** * User: Kathy Date: 3/11/03 Time: 11:26a * Updated in $/EXE/RefObj/ROEditor * be sure tree isloaded for group def change * * ***************** Version 42 ***************** * User: Kathy Date: 3/04/03 Time: 11:13a * Updated in $/EXE/RefObj/ROEditor * may be more than 1 new database for tree at a time * * ***************** Version 41 ***************** * User: Kathy Date: 2/24/03 Time: 11:09a * Updated in $/EXE/RefObj/ROEditor * fixed new with implicit cancel bug (crash) * * ***************** Version 40 ***************** * User: Jsj Date: 2/21/03 Time: 5:33p * Updated in $/EXE/RefObj/ROEditor * fixed RO | Save menu item enable/disable state * * ***************** Version 39 ***************** * User: Kathy Date: 2/03/03 Time: 10:40a * Updated in $/EXE/RefObj/ROEditor * ui improve * * ***************** Version 38 ***************** * User: Kathy Date: 1/22/03 Time: 12:18p * Updated in $/EXE/RefObj/ROEditor * duplicate/save as bug * * ***************** Version 37 ***************** * User: Kathy Date: 1/15/03 Time: 1:57p * Updated in $/EXE/RefObj/ROEditor * improve UI * * ***************** Version 36 ***************** * User: Jsj Date: 1/13/03 Time: 12:00p * Updated in $/EXE/RefObj/ROEditor * fixed call to data conversion * * ***************** Version 35 ***************** * User: Kathy Date: 1/08/03 Time: 10:07a * Updated in $/EXE/RefObj/ROEditor * view image support * * ***************** Version 34 ***************** * User: Kathy Date: 1/07/03 Time: 9:25a * Updated in $/EXE/RefObj/ROEditor * roeditor.own & specific ro (from vfw) * * ***************** Version 33 ***************** * User: Jsj Date: 1/06/03 Time: 11:31a * Updated in $/EXE/RefObj/ROEditor * logic for No RO directory, Emply RO directroy, and RO directory with * paradox database * * ***************** Version 32 ***************** * User: Jsj Date: 1/02/03 Time: 3:57p * Updated in $/EXE/RefObj/ROEditor * added INI file logic * * ***************** Version 31 ***************** * User: Kathy Date: 12/17/02 Time: 9:47a * Updated in $/EXE/RefObj/ROEditor * fix some duplicate/save as bugs * * ***************** Version 30 ***************** * User: Kathy Date: 12/16/02 Time: 12:12p * Updated in $/EXE/RefObj/ROEditor * added cancel button & fixed some duplicate/saveas bugs * * ***************** Version 29 ***************** * User: Kathy Date: 12/13/02 Time: 10:06a * Updated in $/EXE/RefObj/ROEditor * if 'cancel' from edit, was 'stuck' on that edit control * * ***************** Version 28 ***************** * User: Kathy Date: 12/10/02 Time: 2:26p * Updated in $/EXE/RefObj/ROEditor * fieldname special chars & bug fixes * * ***************** Version 27 ***************** * User: Jsj Date: 12/06/02 Time: 3:28p * Updated in $/EXE/RefObj/ROEditor * fix for parameter display data (ignoring the data for now) * * ***************** Version 26 ***************** * User: Kathy Date: 12/06/02 Time: 11:59a * Updated in $/EXE/RefObj/ROEditor * improve tree view & fix minor menuing things * * ***************** Version 25 ***************** * User: Kathy Date: 12/02/02 Time: 8:30a * Updated in $/EXE/RefObj/ROEditor * fieldname replace chars * * ***************** Version 24 ***************** * User: Jsj Date: 11/27/02 Time: 12:54p * Updated in $/EXE/RefObj/ROEditor * Modification to create the RO.FST file * * ***************** Version 23 ***************** * User: Kathy Date: 11/26/02 Time: 11:10a * Updated in $/EXE/RefObj/ROEditor * add icons, list view & improve sizing * * ***************** Version 22 ***************** * User: Kathy Date: 11/20/02 Time: 1:29p * Updated in $/EXE/RefObj/ROEditor * selecting 'x' doesn't close it - fixed. * * ***************** Version 21 ***************** * User: Kathy Date: 11/20/02 Time: 11:37a * Updated in $/EXE/RefObj/ROEditor * zoom btn & ask about save for mod data * * ***************** Version 20 ***************** * User: Kathy Date: 11/19/02 Time: 11:30a * Updated in $/EXE/RefObj/ROEditor * Fix a variety of UI bugs * * ***************** Version 19 ***************** * User: Kathy Date: 10/24/02 Time: 11:17a * Updated in $/EXE/RefObj/ROEditor * save as, duplicate and delete top group * * ***************** Version 18 ***************** * User: Kathy Date: 10/15/02 Time: 2:19p * Updated in $/EXE/RefObj/ROEditor * added new hi-level group * * ***************** Version 17 ***************** * User: Kathy Date: 10/11/02 Time: 11:37a * Updated in $/EXE/RefObj/ROEditor * Restore Btn, bug fixes * * ***************** Version 16 ***************** * User: Kathy Date: 10/10/02 Time: 10:03a * Updated in $/EXE/RefObj/ROEditor * accessory page id & try to make xml tree in sync with tree control * * ***************** Version 15 ***************** * User: Jsj Date: 10/03/02 Time: 4:53p * Updated in $/EXE/RefObj/ROEditor * got the Edit menus (cut,paste,etc) working * * ***************** Version 14 ***************** * User: Jsj Date: 10/03/02 Time: 1:27p * Updated in $/EXE/RefObj/ROEditor * put back missing variables for tree nodes * * ***************** Version 13 ***************** * User: Jsj Date: 10/02/02 Time: 5:46p * Updated in $/EXE/RefObj/ROEditor * added an Edit menu item to the popup and RO menus. Added logic to * enable or disable the Save, Expand/Collaspe, and Properties menu items, * added an About dialog box. Added logic to clear the edit pane. * * ***************** Version 12 ***************** * User: Kathy Date: 10/02/02 Time: 2:43p * Updated in $/EXE/RefObj/ROEditor * more tying tree to data * * ***************** Version 11 ***************** * User: Kathy Date: 10/02/02 Time: 1:39p * Updated in $/EXE/RefObj/ROEditor * insert/delete group/ro tie tree to code (round 1) * * ***************** Version 10 ***************** * User: Jsj Date: 10/02/02 Time: 12:11p * Updated in $/EXE/RefObj/ROEditor * added Delete to popup, and added logic to right mouse button so that it * selects the tree node and modifies the popup menu based on if that node * is colasped or expanded. * * ***************** Version 9 ***************** * User: Jsj Date: 10/01/02 Time: 4:50p * Updated in $/EXE/RefObj/ROEditor * added menus and ability to pass in a database path * * ***************** Version 8 ***************** * User: Kathy Date: 9/27/02 Time: 1:20p * Updated in $/EXE/RefObj/ROEditor * fix minor problems with listing groups without ros * * ***************** Version 7 ***************** * User: Kathy Date: 9/25/02 Time: 9:57a * Updated in $/EXE/RefObj/ROEditor * dev * * ***************** Version 6 ***************** * User: Kathy Date: 9/19/02 Time: 10:04a * Updated in $/EXE/RefObj/ROEditor * minor changes during dev * * ***************** Version 5 ***************** * User: Kathy Date: 9/11/02 Time: 1:16p * Updated in $/EXE/RefObj/ROEditor * vlnxml * * ***************** Version 4 ***************** * User: Kathy Date: 9/10/02 Time: 12:55p * Updated in $/EXE/RefObj/ROEditor * menutitle attribute * * ***************** Version 3 ***************** * User: Kathy Date: 9/05/02 Time: 12:41p * Updated in $/EXE/RefObj/ROEditor * dev * * ***************** Version 2 ***************** * User: Kathy Date: 8/28/02 Time: 10:58a * Updated in $/EXE/RefObj/ROEditor * development * * ***************** Version 1 ***************** * User: Jsj Date: 8/23/02 Time: 3:35p * Created in $/EXE/RefObj/ROEditor *********************************************************************************************/ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Windows.Forms; using System.Data; using System.Xml; using System.Xml.Schema; using System.Text; using System.IO; using ctlXMLEditLib; using RODBInterface; using ROFields; using Org.Mentalis.Files; using System.Runtime.InteropServices; using System.Linq; using System.Collections.Generic; //using IniFileIO; namespace ROEditor { /// /// Summary description for Form1. /// /// public class Form1 : System.Windows.Forms.Form { private ctlXMLEditLib.ctlXMLEdit ctlXMLEdit2; private RODB myrodb; private string DbConnectPath; private System.ComponentModel.IContainer components; private System.Windows.Forms.Splitter splitter1; private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem10; private System.Windows.Forms.MenuItem menuNewGroup; private System.Windows.Forms.MenuItem menuEdit; private System.Windows.Forms.MenuItem menuEditCopy; private System.Windows.Forms.MenuItem menuEditCut; private System.Windows.Forms.MenuItem menuEditPaste; private System.Windows.Forms.MenuItem menuTools; private System.Windows.Forms.MenuItem menuToolsROFST; private System.Windows.Forms.MenuItem menuHelp; private System.Windows.Forms.MenuItem menuHelpAbout; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.MenuItem menuRO; private System.Windows.Forms.MenuItem menuRONew; private System.Windows.Forms.MenuItem menuNewRefObj; private System.Windows.Forms.MenuItem menuROEdit; private System.Windows.Forms.MenuItem menuROCut; private System.Windows.Forms.MenuItem menuROPaste; private System.Windows.Forms.MenuItem menuRODelete; private System.Windows.Forms.MenuItem menuROSave; private System.Windows.Forms.MenuItem menuROProperties; private System.Windows.Forms.MenuItem menuROExit; private System.Windows.Forms.MenuItem menuItem1; private XmlDocument myroXmlDoc; private VlnXmlElement newone; private TreeNode TreeNewparent; private System.Windows.Forms.MenuItem menuItem3; private System.Windows.Forms.MenuItem menuItem5; private System.Windows.Forms.MenuItem menuEditUndo; private System.Windows.Forms.MenuItem menuEditDelete; private System.Windows.Forms.MenuItem menuEditSelAll; private TreeNode LastSelectedNode; private TextBox _CurrentTextBox; // currently selected TextBox field public static string[] PCChildren; //C2021-026 list of Parent/Child Children public TextBox CurrentTextBox { get { return _CurrentTextBox; } set { _CurrentTextBox = value; } } public List ROsSelectedforMultiMove { get; set; } //to allow multiple RO nodes to be selected public bool ROCutWasSelected { get; set; } = false; private VlnXmlElement rootXml; private TreeNode rootNode; private System.Windows.Forms.ImageList imageListRoTree; private System.Windows.Forms.TreeView roTreeView; private System.Windows.Forms.ListView roListView; private System.Windows.Forms.ToolBar tbar; private bool _duplicate_active; private bool duplicate_active { get { return _duplicate_active; } set { _duplicate_active = value; // C2015-017 hide the label indicating user is working with a duplicate of an exiting RO lblDuplicateRO.Visible = value; } } private const int ROGROUPIMAGE = 0; private System.Windows.Forms.Panel panel2; private const int ROIMAGE = 1; private Color MULTISELECTCOLOR = Color.LightGreen; //back color that multiselected ROs will show private ToolBarButton tbtnSave; private ToolBarButton tbtnRestore; private ToolBarButton tbtnCancel; private ToolBarButton tbtnSaveAs; private ToolBarButton tbtnDuplicate; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.ImageList imageListToolBar; private Label lblDuplicateRO; private ToolBarButton tbtnZoom; public Form1(string PassedInPath, string specificro) { // // Required for Windows Form Designer support // InitializeComponent(); // B2019-082 set the date format on the VEPROMS.exe thread to U.S. for i/o of a date string // this is to correct an issue for a UAE customer who could not open some procedures due to the desktop date setting using the "DD/MM/YYYY" instead of the "MM/DD/YYYY" format // NOTE: not doing the "Using System.Threading;" statement at beginning of file because it conflicts with the declaration of the "Timer" variable System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); // The data path the was passed in. DbConnectPath = PassedInPath; // Setup the context menu MenuItem[] ContextMenuItemList = new MenuItem[8]; ContextMenuItemList[0] = new MenuItem("Expand/Collaspe",new EventHandler(roTreeView_ToggleExpandCollapse)); ContextMenuItemList[1] = menuRONew.CloneMenu(); ContextMenuItemList[2] = menuROEdit.CloneMenu(); ContextMenuItemList[3] = menuROCut.CloneMenu(); ContextMenuItemList[4] = menuROPaste.CloneMenu(); ContextMenuItemList[5] = menuRODelete.CloneMenu(); ContextMenuItemList[6] = menuROSave.CloneMenu(); ContextMenuItemList[7] = menuROProperties.CloneMenu(); ContextMenu treePopupMenu = new ContextMenu(ContextMenuItemList); // Add the root to the tree. // C2017-003: support for sql server if (UsingSQLServer(DbConnectPath)) myrodb = new SqlRODB(DbConnectPath, SqlConnectionStr, false); else myrodb = new AccessRODB(DbConnectPath); // if using the access database (not sql) and the data has been converted, try to connect using the sql connection // string that was written to access when data was converted: if (!UsingSQLServer(Directory.GetCurrentDirectory())) { string constring = myrodb.RODB_HasBeenConverted(); if (constring != null) { MessageBox.Show("This Referenced Object Database has been converted to sql. The program will attempt to use the sql version of the database. If this does not work, you will be prompted for a connection string, if not available, contact your Database Administrator", "RO Microsoft Access problem"); SqlConnectionStr = constring; bool canConnect = SqlRODB.TestConnect(constring); if (!canConnect) // can't get data from this sql database, ask user to enter a string. { string userConstring = SqlRODB.GetSqlDbConnectString(constring); if (userConstring == null) { MessageBox.Show("Cannot connect to the correct database. Contact your Database or Proms Administrator"); return; } SqlConnectionStr = userConstring; // write new string to access database if (!myrodb.RODB_WriteSqlConnectToAccess(userConstring)) { MessageBox.Show("Cannot save the new connection string. Contact your Database or Proms Administrator"); this.Close(); } } myrodb.dbProviderType = (int)RODB.DB_PROVIDER.SQL_SERVER; myrodb = new SqlRODB(DbConnectPath, SqlConnectionStr, true); } } myroXmlDoc = myrodb.RODB_GetRoot(); rootXml = (VlnXmlElement) myroXmlDoc.FirstChild; rootNode = new TreeNode("Referenced Objects",ROGROUPIMAGE,ROGROUPIMAGE); rootNode.Tag = rootXml; roTreeView.Nodes.Add(rootNode); roTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.roTreeView_AfterSelect); roTreeView.DoubleClick += new System.EventHandler(this.roTreeView_OnDoubleClick); roTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.roTreeView_BeforeExpand); roTreeView.Sorted = true; roTreeView.ContextMenu = treePopupMenu; roTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(roTreeView_OnMouseDown); // For each group, get its subgroup. bool success = myrodb.RODB_GetRootGroups((VlnXmlElement)myroXmlDoc.FirstChild); if (success == false) this.Close(); VlnXmlElement group = (VlnXmlElement) myroXmlDoc.FirstChild.FirstChild; while (group != null) { // Add the top groups to tree control as a node. TreeNode grnode = new TreeNode(CvtFldToUserFld(group.InnerText),ROGROUPIMAGE,ROGROUPIMAGE); grnode.Tag = group; rootNode.Nodes.Add(grnode); string haskids = group.GetAttribute("HasChild"); if (haskids == "True") // add a 'dummy' node to tree if there are any { TreeNode subch = new TreeNode("VLN_DUMMY_FOR_TREE"); subch.Tag = group; grnode.Nodes.Add(subch); } group = (VlnXmlElement) group.NextSibling; } newone = null; rootNode.Expand(); duplicate_active = false; if (specificro != null) DoSpecificRO(specificro); } private void DoSpecificRO(string specificro) { // if a specific RO was passed in. Load the xml tree from it to the root & then // edit it through the ctlXmledit. // from the input tbl string, get a table name. ArrayList levelRecids = new ArrayList(); int itbl = System.Convert.ToInt32(specificro.Substring(0,4),16); string stbl = System.Convert.ToString(itbl,10); string pstbl = stbl.PadLeft(6,'0'); string tbname = "RO" + pstbl; string recid = specificro.Substring(4,8); // read in this element from the table. VlnXmlElement spro; spro = myrodb.RODB_ReadRO(tbname, recid); // RODB_ReadRO will return a NULL if the RO cannot be found // Pop up a message box to notify the user. // This will leave the RO Editor open. The user can continue to work or just close it. if (spro == null) { MessageBox.Show("Could not find this RO", "RO Not Found", MessageBoxButtons.OK); return; } VlnXmlElement parent; string parentid; parentid = spro.GetAttribute("ParentID"); string sproParentid = parentid; // walk up tree to get the path through the tree. VlnXmlElement child = spro; while (parentid != null && parentid != "00000000") { parent = myrodb.RODB_ReadRO(tbname, parentid); if (parent != null) { parentid = parent.GetAttribute("ParentID"); levelRecids.Add(parent.GetAttribute("RecID")); if (parentid == "00000000") break; parent.AppendChild(child); child = parent; } else parentid = null; } // Now hook this into the top part of tree by loading data into // xml & hooking it into the tree control. string attrele; string attrspro; TreeNode trnd = rootNode.FirstNode; VlnXmlElement ele; for (int i=levelRecids.Count-1; i>=0; i--) { ele = (VlnXmlElement) trnd.Tag; attrele = ele.GetAttribute((i==levelRecids.Count-1)?"Table":"RecID"); if (i==levelRecids.Count-1) attrspro = spro.GetAttribute("Table"); else attrspro = (string) levelRecids[i]; while (attrele != attrspro) { // get next one. trnd = trnd.NextNode; ele = (VlnXmlElement) trnd.Tag; attrele = ele.GetAttribute((i==levelRecids.Count-1)?"Table":"RecID"); } if (trnd == null) { MessageBox.Show("Error editting RO"); return; } LoadKids(trnd); trnd = trnd.FirstNode; } // lastly select the active node, this will load up everything we need. if (trnd == null) { MessageBox.Show("Error editting RO"); return; } ele = (VlnXmlElement) trnd.Tag; attrele = ele.GetAttribute("RecID"); while (attrele != spro.GetAttribute("RecID")) { trnd = trnd.NextNode; ele = (VlnXmlElement) trnd.Tag; attrele = ele.GetAttribute("RecID"); } if (trnd == null) { MessageBox.Show("Error editting RO"); return; } roTreeView.SelectedNode = trnd; } protected void roTreeView_AfterSelect (object sender, System.Windows.Forms.TreeViewEventArgs e) { TreeNode PreviousNode = LastSelectedNode; // if the same node was selected, don't do anything. if (LastSelectedNode != null && LastSelectedNode.Equals(roTreeView.SelectedNode)) return; TreeNode CurrentNode = roTreeView.SelectedNode; if (LastSelectedNode == null) LastSelectedNode = CurrentNode; if (CurrentNode != null) { if (!LastSelectedNode.Equals(CurrentNode)) { int retval = roTreeView_ClearEditDisplay(false); if (retval == -1) // cancel { roTreeView.SelectedNode = LastSelectedNode; return; } LastSelectedNode = CurrentNode; } // if selected to make new, but didn't add any data, remove it. if (newone!=null) { XmlNode parent = newone.ParentNode; parent.RemoveChild(newone); newone=null; } /* enable/disable menu items */ // Enable the Save item if changes were made // Just copy the state of the Save Button menuROSave.Enabled = tbtnSave.Enabled; roTreeView.ContextMenu.MenuItems[6].Enabled = tbtnSave.Enabled; // Should the properties menu item be available? VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag; if (curelem.Name == "vlnGroup") menuROProperties.Enabled = true; else menuROProperties.Enabled = false; // Should the delete menu item be available, i.e. at top node, NO! if (curelem.Name == "RO_Root") { menuRODelete.Enabled = false; menuNewRefObj.Enabled = false; } else { menuRODelete.Enabled = true; menuNewRefObj.Enabled = true; } // Is there field text to edit? // yes if current node is either a subgroup or ro value node menuROEdit.Enabled = roTreeView_IsSubgroupOrRO(); LoadKids(CurrentNode); if (curelem.Name != "RO_Root" && curelem.Name != "vlnGroup") EditRO(curelem); else updateRoListView(CurrentNode); //cut is only enabled on RO Values menuROCut.Enabled = roTreeView_IsSubgroupOrRO() && curelem.Name != "vlnGroup"; roTreeView.ContextMenu.MenuItems[3].Enabled = menuROCut.Enabled; //paste is only enabled on subgroups and only once Cut has been selected menuROPaste.Enabled = roTreeView_IsSubgroupOrRO() && curelem.Name == "vlnGroup" && ROCutWasSelected && (ROsSelectedforMultiMove.Count > 0); roTreeView.ContextMenu.MenuItems[4].Enabled = menuROPaste.Enabled; //code to allow selection of multiple nodes for Move //if Ctrl/Shift Key is held down if (ROsSelectedforMultiMove == null) ROsSelectedforMultiMove = new List(); // B2021-094 added check that Control and Alt keys were not pressed with shift key // if user does the keystroke (Goto selected RO from step editor) // but only lifts up on the G key, it was dropping down into this code below // and getting a null reference error upon initial entry in to the RO Editor if ((Control.ModifierKeys & Keys.Shift) != 0 && (Control.ModifierKeys & Keys.Control) == 0 && (Control.ModifierKeys & Keys.Alt) == 0) { //if shift is held down, clear existing nodes then add the range of nodes roTreeView_ClearAllMultiSelect(); if (PreviousNode.Index < CurrentNode.Index) { //Traverse Down TreeNode nodeIter = PreviousNode; do { VlnXmlElement curelemforNodeIter = (VlnXmlElement)nodeIter.Tag; if (curelemforNodeIter.Name != "RO_Root" && curelemforNodeIter.Name != "vlnGroup") { nodeIter.BackColor = MULTISELECTCOLOR; ROsSelectedforMultiMove.Add(nodeIter); } } while (nodeIter != CurrentNode && (nodeIter = nodeIter.NextNode) != null); } else { //Traverse Up TreeNode nodeIter = PreviousNode; do { VlnXmlElement curelemforNodeIter = (VlnXmlElement)nodeIter.Tag; if (curelemforNodeIter.Name != "RO_Root" && curelemforNodeIter.Name != "vlnGroup") { nodeIter.BackColor = MULTISELECTCOLOR; ROsSelectedforMultiMove.Add(nodeIter); } } while (nodeIter != CurrentNode && (nodeIter = nodeIter.PrevNode) != null); } } else { //deselect all currently selected if ctrl key not held down, //add the current item that is clicked //ignoring if a group or subgroup is clicked if (curelem.Name != "RO_Root" && curelem.Name != "vlnGroup") { if ((Control.ModifierKeys & Keys.Control) == 0) roTreeView_ClearAllMultiSelect(); roTreeView.SelectedNode.BackColor = MULTISELECTCOLOR; ROsSelectedforMultiMove.Add(roTreeView.SelectedNode); } } } } //clear all multiselected items protected void roTreeView_ClearAllMultiSelect() { foreach (TreeNode tn in ROsSelectedforMultiMove) tn.BackColor = Color.White; ROsSelectedforMultiMove.Clear(); } private string CvtUserFldToFld(string fldname) { if (fldname.Length < 2) return fldname; // a digit cannot start an xml fieldname, prepend a "__" to it. string tmp0; if (char.IsDigit(fldname,0)) tmp0 = "__" + fldname; else tmp0 = fldname; // an xml fieldname cannot have a space, change it to a "__" string tmpstr = tmp0.Replace(" ","__"); int len = tmpstr.Length; int cnt = 0; // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10) // of the character we replaced. string OKpunch = "-._"; string outstr = ""; int decval; while (cnt < len) { char tmpchr = tmpstr[cnt]; if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) ) { decval = tmpchr; outstr += OKpunch + decval.ToString("D3"); } else { outstr += tmpchr.ToString(); } cnt++; } return outstr; } private string CvtFldToUserFld(string fldname) { string tmpstr0; if (fldname.Length < 2) return fldname; // an xml element name cannot begin with a digit. we had prepended a "__" if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2)) tmpstr0 = fldname.Substring(2,fldname.Length-2); else tmpstr0 = fldname; // an xml element name cannot have a space, we converted to a "__" string tmpstr = tmpstr0.Replace("__"," "); int len = tmpstr.Length; int cur = 0; // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10) // of the character we replaced. string OKpunch = "-._"; string outstr = ""; int decval, indx; if (tmpstr.Length <6) indx = -1; else indx=tmpstr.IndexOf(OKpunch,cur); string asc_spchar; while (indx>=0) { outstr += tmpstr.Substring(cur,indx-cur); asc_spchar = tmpstr.Substring(indx+3,3); decval = System.Convert.ToInt16(asc_spchar,10); outstr += System.Convert.ToChar(decval).ToString(); cur = indx+6; if (cur+6 > len) indx = -1; else indx = tmpstr.IndexOf(OKpunch,cur); } if (cur 0) { if (CurrentNode.IsExpanded) roTreeView.ContextMenu.MenuItems[0].Text = "Collapse"; else roTreeView.ContextMenu.MenuItems[0].Text = "Expand"; roTreeView.ContextMenu.MenuItems[0].Enabled = true; } else { roTreeView.ContextMenu.MenuItems[0].Text = "Expand/Collapse"; roTreeView.ContextMenu.MenuItems[0].Enabled = false; } // Should the save option be available? // Just reflect the Save button state. roTreeView.ContextMenu.MenuItems[6].Enabled = tbtnSave.Enabled; menuROSave.Enabled = tbtnSave.Enabled; // Should the properties menu item be available? VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag; if (curelem.Name == "vlnGroup") roTreeView.ContextMenu.MenuItems[7].Enabled = true; else roTreeView.ContextMenu.MenuItems[7].Enabled = false; // should delete menu item be available, i.e. top node NO! if (curelem.Name == "RO_Root") { roTreeView.ContextMenu.MenuItems[5].Enabled = false; roTreeView.ContextMenu.MenuItems[1].MenuItems[1].Enabled = false; } else { roTreeView.ContextMenu.MenuItems[5].Enabled = true; roTreeView.ContextMenu.MenuItems[1].MenuItems[1].Enabled = true; } // Is there field text to edit? // yes if current node is either a subgroup or ro value node roTreeView.ContextMenu.MenuItems[2].Enabled = roTreeView_IsSubgroupOrRO(); } } } /* * return true if current tree node is a either a subgroup or a RO */ protected bool roTreeView_IsSubgroupOrRO() { bool rtnval = false; TreeNode CurrentNode = roTreeView.SelectedNode; VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag; if (curelem.Name != "RO_Root") { if (curelem.Name == "vlnGroup") { TreeNode PNode = CurrentNode.Parent; VlnXmlElement pelem = (VlnXmlElement) PNode.Tag; rtnval = (pelem.Name == "vlnGroup"); } else rtnval = true; } return rtnval; } /* * Clear the edit display (panel on the right side) */ protected int roTreeView_ClearEditDisplay(bool cancel) { if (ctlXMLEdit2 != null) { if (cancel != true) { // first see if there is changes to data, if so, then prompt to see if // user wants to continue. bool chgdata = ctlXMLEdit2.DataChanged(); if (chgdata == true) { DialogResult dr = MessageBox.Show("Do you want to save your changes?","Warning:",MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) { TreeNode tr=null; bool ok = SaveRO(ref tr); // savero needs a tree node if (ok == false) return -1; } else if (dr == DialogResult.Cancel) return -1; } } ctlXMLEdit2.Dispose(); this.panel2.Controls.Remove(ctlXMLEdit2); this.panel2.Visible = false; tbtnSave.Enabled = false; menuROSave.Enabled = tbtnSave.Enabled; tbtnRestore.Enabled = false; tbtnSaveAs.Enabled = false; tbtnDuplicate.Enabled = false; tbtnZoom.Enabled = false; tbtnZoom.Text = "Zoom"; ctlXMLEdit2 = null; } // The current text box no longer has focus. CurrentTextBox = null; tbtnCancel.Enabled = false; roTreeView_ResetEditMenu(); duplicate_active = false; return 0; } protected void roListView_ClearListDisplay() { if (roListView != null) { roListView.Dispose(); this.panel1.Controls.Remove(roListView); roListView=null; } } private void CreateCtlXmlEdit2(VlnXmlElement curelem, XmlSchema myschema, ArrayList reqfields, ArrayList fieldsWithApplic) { ctlXMLEdit2 = new ctlXMLEditLib.ctlXMLEdit(curelem,myschema,reqfields,fieldsWithApplic,PCChildren); // C2021-026 pass in P/C enabled information ctlXMLEdit2.AutoScroll = true; ctlXMLEdit2.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); ctlXMLEdit2.Name = "ctlXMLEdit2"; ctlXMLEdit2.Size = new System.Drawing.Size(ctlXMLEdit2.GetMaxWidth(),ctlXMLEdit2.GetMaxLength()); this.panel2.Visible = true; this.panel2.Size = new System.Drawing.Size(ctlXMLEdit2.GetMaxWidth()+20,ctlXMLEdit2.GetMaxLength()+10); this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; ctlXMLEdit2.TabIndex = 4; ctlXMLEdit2.Tag = ""; /* * Spin through all of the controls and assign an event handler * for changed text so that when the user changes any of the RO Text, * the Save button will become enabled */ System.Collections.IEnumerator ctlEnumerator = ctlXMLEdit2.Controls.GetEnumerator(); while (ctlEnumerator.MoveNext()) { Control TmpInfo; TmpInfo = (Control)ctlEnumerator.Current; if (TmpInfo is GroupBox) { System.Collections.IEnumerator ctlGroup = TmpInfo.Controls.GetEnumerator();; while(ctlGroup.MoveNext()) { Control tmpradio = (Control) ctlGroup.Current; tmpradio.Click += new EventHandler(ctlXMLEdit2_ClickControl); } } else { TmpInfo.TextChanged += new EventHandler(ctlXMLEdit2_TextChanged); TmpInfo.Click += new EventHandler(ctlXMLEdit2_ClickControl); } } this.panel2.Controls.Add(ctlXMLEdit2); tbtnCancel.Enabled = true; } // C2021-026 Get a list of fields that are P/C enabled private ArrayList GetApplcFieldListForElement(VlnXmlElement elem) { ArrayList rtnval = null; ArrayList InUseApplcList = null; ArrayList AvailList = null; ArrayList InUseList = null; string origFieldsInUse = ""; string origApplicFields = ""; ArrayList tmp = myrodb.RODB_GetFields((VlnXmlElement)elem.ParentNode, (uint)RecordType.Schema); // put the items in the AvailList box. if (AvailList == null) AvailList = new ArrayList(); for (int i = 0; i < tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary InUseList = myrodb.RODB_GetFieldsInUse((VlnXmlElement)elem.ParentNode, AvailList, "FieldsInUse", ref origFieldsInUse, false); InUseApplcList = myrodb.RODB_GetApplicabilityEnabledFields((VlnXmlElement)elem.ParentNode, InUseList, ref origApplicFields, ApplicabilityEnabled()); rtnval = new ArrayList(); foreach (ROField rof in InUseApplcList) rtnval.Add(rof.GetFieldname); return rtnval; } private void EditRO(VlnXmlElement curelem) { ArrayList fieldsWithApplic = null; newone=null; // can't edit fields for top or top group nodes (top node not editable, // and top group node data change at properties level). if (curelem.Name == "RO_Root" || curelem.ParentNode.Name == "RO_Root") return; int retval = roTreeView_ClearEditDisplay(false); if (retval == -1) return; roListView_ClearListDisplay(); XmlSchema myschema; // If no schema exists, then the definition of the item may not be complete - give // a message. (B2004-017) if (curelem.Name != "vlnGroup") { // C2021-026 Get the list of fields with P/C enabled // use the curelm.parent and calls similar to what is in RODefFrm.cs fieldsWithApplic = GetApplcFieldListForElement(curelem); myschema = myrodb.RODB_GetSchema(curelem); if (myschema==null) { MessageBox.Show("RO Definition does not exist, check RO Definition under Properties for the Group that contains this RO."); return; } } else { // B2017-015: if editing a group/subgroup, use the parent's schema to get the fields to edit for the menuing. VlnXmlElement sch = curelem; if (curelem.ParentNode.Name != "RO_Root") sch = (VlnXmlElement) sch.ParentNode; myschema = myrodb.RODB_GetGroupSchema(sch); if (myschema==null) { MessageBox.Show("Subgroup Definition does not exist, check Subgroup Definition under Properties for the Group that contains this Subgroup."); return; } } ArrayList reqfields = curelem.GetRequiredFields(); CreateCtlXmlEdit2(curelem,myschema, reqfields, fieldsWithApplic); // C2021-026 pass in P/C enabled fields this.panel2.Controls.Add(ctlXMLEdit2); tbtnSave.Enabled=false; // set initial states of buttons on edit tbtnRestore.Enabled=false; tbtnCancel.Enabled=true; tbtnSaveAs.Enabled=false; tbtnDuplicate.Enabled=true; tbtnZoom.Enabled = false; ctlXMLEdit2.Focus(); } protected void roTreeView_OnDoubleClick (object sender, System.EventArgs e) { VlnXmlElement curelem = (VlnXmlElement) roTreeView.SelectedNode.Tag; EditRO(curelem); } protected void roTreeView_ResetEditMenu () { this.menuEditCopy.Enabled = false; this.menuEditCut.Enabled = false; this.menuEditPaste.Enabled = false; this.menuEditDelete.Enabled = false; this.menuEditSelAll.Enabled = false; this.menuEditUndo.Enabled = false; } protected void ctlXMLEdit2_ClickControl(object sender, EventArgs e) { TextBox tmpTxtbx = new TextBox(); CurrentTextBox = null; roTreeView_ResetEditMenu(); if (sender.GetType() == tmpTxtbx.GetType()) { tmpTxtbx = (TextBox)sender; CurrentTextBox = tmpTxtbx; // the text box currently selected if (CurrentTextBox.Multiline) { tbtnZoom.Text = "Zoom"; tbtnZoom.Enabled = true; } else if (CurrentTextBox == ctlXMLEdit2.GetGraphicsFiletextbox() && CurrentTextBox.Text != null && CurrentTextBox.Text != "") { tbtnZoom.Enabled = true; tbtnZoom.Text = "View Image"; } else { tbtnZoom.Text = "Zoom"; tbtnZoom.Enabled = false; } if (tmpTxtbx.CanUndo) this.menuEditUndo.Enabled = true; if (tmpTxtbx.TextLength != tmpTxtbx.SelectionLength) { this.menuEditSelAll.Enabled = true; } if (tmpTxtbx.SelectionLength > 0) { this.menuEditDelete.Enabled = true; this.menuEditCopy.Enabled = true; this.menuEditCut.Enabled = true; } object dataobj = System.Windows.Forms.Clipboard.GetDataObject(); if (dataobj != null) this.menuEditPaste.Enabled=true; } else if (sender is RadioButton) { tbtnCancel.Enabled = true; tbtnSave.Enabled = true; tbtnRestore.Enabled = true; if (newone == null) { tbtnSaveAs.Enabled = true; } else { tbtnSaveAs.Enabled = false; } } menuROSave.Enabled = tbtnSave.Enabled; } protected void ctlXMLEdit2_TextChanged(object sender, EventArgs e) { if (CurrentTextBox != null) { this.menuEditUndo.Enabled = true; this.menuEditSelAll.Enabled = (CurrentTextBox.TextLength > 0); } tbtnSave.Enabled = true; tbtnRestore.Enabled = true; if (newone == null) { tbtnSaveAs.Enabled = true; } else { tbtnSaveAs.Enabled = false; } tbtnCancel.Enabled = true; menuROSave.Enabled = tbtnSave.Enabled; //B2021-080 set the mysavexml flag to true to ensure the text change will be saved if (this.CurrentTextBox != null && this.CurrentTextBox.Parent !=null) (this.CurrentTextBox.Parent as ctlXMLEdit).mysavexml = true; } private void LoadKids(TreeNode enode) { VlnXmlElement elem; elem = (VlnXmlElement)enode.Tag; string haskids; string kidsloaded; haskids = elem.GetAttribute("HasChild"); kidsloaded = elem.GetAttribute("ChildLoaded"); if (haskids == "True" && kidsloaded == "False" ) { // if there's a dummy tree node (used to have tree control expansion for // items not yet loaded, delete child in tree control) XmlNode tmpnode = (XmlNode) elem; XmlNode chldnode; VlnXmlElement echild; if (enode.FirstNode.Text == "VLN_DUMMY_FOR_TREE") enode.FirstNode.Remove(); Cursor.Current = Cursors.WaitCursor; myrodb.RODB_GetChildData(elem,true); chldnode = tmpnode.FirstChild; while (chldnode != null) { if (chldnode is VlnXmlElement) { echild = (VlnXmlElement) chldnode; TreeNode chldnd; if (echild.Name == "vlnGroup") { chldnd = new TreeNode(echild.GetAttribute("MenuTitle"),ROGROUPIMAGE,ROGROUPIMAGE); chldnd.Tag = echild; enode.Nodes.Add(chldnd); // add a 'dummy' node to tree if there are any children string haskids1="False"; string kidsloaded1="False"; if (echild.HasAttribute("HasChild")==true) haskids1 = echild.GetAttribute("HasChild"); if (echild.HasAttribute("ChildLoaded")==true) kidsloaded1 = echild.GetAttribute("ChildLoaded"); if (haskids1=="True" && kidsloaded1=="False") { TreeNode subch = new TreeNode("VLN_DUMMY_FOR_TREE"); chldnd.Nodes.Add(subch); } } else { // If this is a group defintion subtree it will only have one // child, which is the text definition for the subgroup. Don't // include these in the tree. int levelcnt = chldnode.ChildNodes.Count; string TheMenuTitle = echild.GetAttribute("MenuTitle"); if (levelcnt>=1 && !TheMenuTitle.Equals("")) { chldnd = new TreeNode(TheMenuTitle,ROIMAGE,ROIMAGE); chldnd.Tag = echild; chldnd.Name = echild.GetAttribute("RecID"); enode.Nodes.Add(chldnd); } } } chldnode = chldnode.NextSibling; } Cursor.Current = Cursors.Default; } } protected void roTreeView_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { LoadKids(e.Node); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the co`de editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.imageListRoTree = new System.Windows.Forms.ImageList(this.components); this.splitter1 = new System.Windows.Forms.Splitter(); this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components); this.menuRO = new System.Windows.Forms.MenuItem(); this.menuRONew = new System.Windows.Forms.MenuItem(); this.menuNewGroup = new System.Windows.Forms.MenuItem(); this.menuNewRefObj = new System.Windows.Forms.MenuItem(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuROEdit = new System.Windows.Forms.MenuItem(); this.menuROCut = new System.Windows.Forms.MenuItem(); this.menuROPaste = new System.Windows.Forms.MenuItem(); this.menuRODelete = new System.Windows.Forms.MenuItem(); this.menuROSave = new System.Windows.Forms.MenuItem(); this.menuROProperties = new System.Windows.Forms.MenuItem(); this.menuItem10 = new System.Windows.Forms.MenuItem(); this.menuROExit = new System.Windows.Forms.MenuItem(); this.menuEdit = new System.Windows.Forms.MenuItem(); this.menuEditUndo = new System.Windows.Forms.MenuItem(); this.menuItem3 = new System.Windows.Forms.MenuItem(); this.menuEditCut = new System.Windows.Forms.MenuItem(); this.menuEditCopy = new System.Windows.Forms.MenuItem(); this.menuEditPaste = new System.Windows.Forms.MenuItem(); this.menuEditDelete = new System.Windows.Forms.MenuItem(); this.menuItem5 = new System.Windows.Forms.MenuItem(); this.menuEditSelAll = new System.Windows.Forms.MenuItem(); this.menuTools = new System.Windows.Forms.MenuItem(); this.menuToolsROFST = new System.Windows.Forms.MenuItem(); this.menuHelp = new System.Windows.Forms.MenuItem(); this.menuHelpAbout = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.panel1 = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); this.roTreeView = new System.Windows.Forms.TreeView(); this.tbar = new System.Windows.Forms.ToolBar(); this.tbtnSave = new System.Windows.Forms.ToolBarButton(); this.tbtnCancel = new System.Windows.Forms.ToolBarButton(); this.tbtnRestore = new System.Windows.Forms.ToolBarButton(); this.tbtnSaveAs = new System.Windows.Forms.ToolBarButton(); this.tbtnDuplicate = new System.Windows.Forms.ToolBarButton(); this.tbtnZoom = new System.Windows.Forms.ToolBarButton(); this.imageListToolBar = new System.Windows.Forms.ImageList(this.components); this.lblDuplicateRO = new System.Windows.Forms.Label(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // imageListRoTree // this.imageListRoTree.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListRoTree.ImageStream"))); this.imageListRoTree.TransparentColor = System.Drawing.Color.Transparent; this.imageListRoTree.Images.SetKeyName(0, ""); this.imageListRoTree.Images.SetKeyName(1, ""); // // splitter1 // this.splitter1.Location = new System.Drawing.Point(220, 28); this.splitter1.Name = "splitter1"; this.splitter1.Size = new System.Drawing.Size(8, 591); this.splitter1.TabIndex = 4; this.splitter1.TabStop = false; // // mainMenu1 // this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuRO, this.menuEdit, this.menuTools, this.menuHelp, this.menuItem2}); // // menuRO // this.menuRO.Index = 0; this.menuRO.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuRONew, this.menuItem1, this.menuROEdit, this.menuROCut, this.menuROPaste, this.menuRODelete, this.menuROSave, this.menuROProperties, this.menuItem10, this.menuROExit}); this.menuRO.Text = "RO"; // // menuRONew // this.menuRONew.Index = 0; this.menuRONew.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuNewGroup, this.menuNewRefObj}); this.menuRONew.Text = "New ..."; // // menuNewGroup // this.menuNewGroup.Index = 0; this.menuNewGroup.Text = "Group"; this.menuNewGroup.Click += new System.EventHandler(this.menuNewGroup_Click); // // menuNewRefObj // this.menuNewRefObj.Index = 1; this.menuNewRefObj.Text = "Referenced Object"; this.menuNewRefObj.Click += new System.EventHandler(this.menuNewRefObj_Click); // // menuItem1 // this.menuItem1.Index = 1; this.menuItem1.Text = "-"; // // menuROEdit // this.menuROEdit.Enabled = false; this.menuROEdit.Index = 2; this.menuROEdit.Text = "Edit"; this.menuROEdit.Click += new System.EventHandler(this.menuROEdit_Click); // // menuROCut // this.menuROCut.Enabled = false; this.menuROCut.Index = 3; this.menuROCut.Text = "Cut (Move RO)"; this.menuROCut.Click += new System.EventHandler(this.menuROCut_Click); // // menuROPaste // this.menuROPaste.Enabled = false; this.menuROPaste.Index = 4; this.menuROPaste.Text = "Paste (Move RO)"; this.menuROPaste.Click += new System.EventHandler(this.menuROPaste_Click); // // menuRODelete // this.menuRODelete.Index = 5; this.menuRODelete.Text = "Delete"; this.menuRODelete.Click += new System.EventHandler(this.menuRODelete_Click); // // menuROSave // this.menuROSave.Enabled = false; this.menuROSave.Index = 6; this.menuROSave.Text = "Save"; this.menuROSave.Click += new System.EventHandler(this.menuROSave_Click); // // menuROProperties // this.menuROProperties.Index = 7; this.menuROProperties.Text = "Properties"; this.menuROProperties.Click += new System.EventHandler(this.menuROProperties_Click); // // menuItem10 // this.menuItem10.Index = 8; this.menuItem10.Text = "-"; // // menuROExit // this.menuROExit.Index = 9; this.menuROExit.Text = "Exit RO Editor"; this.menuROExit.Click += new System.EventHandler(this.menuROExit_Click); // // menuEdit // this.menuEdit.Index = 1; this.menuEdit.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuEditUndo, this.menuItem3, this.menuEditCut, this.menuEditCopy, this.menuEditPaste, this.menuEditDelete, this.menuItem5, this.menuEditSelAll}); this.menuEdit.Text = "Edit"; // // menuEditUndo // this.menuEditUndo.Enabled = false; this.menuEditUndo.Index = 0; this.menuEditUndo.Text = "&Undo"; this.menuEditUndo.Click += new System.EventHandler(this.menuEditUndo_Click); // // menuItem3 // this.menuItem3.Index = 1; this.menuItem3.Text = "-"; // // menuEditCut // this.menuEditCut.Enabled = false; this.menuEditCut.Index = 2; this.menuEditCut.Text = "Cu&t"; this.menuEditCut.Click += new System.EventHandler(this.menuEditCut_Click); // // menuEditCopy // this.menuEditCopy.Enabled = false; this.menuEditCopy.Index = 3; this.menuEditCopy.Text = "&Copy"; this.menuEditCopy.Click += new System.EventHandler(this.menuEditCopy_Click); // // menuEditPaste // this.menuEditPaste.Enabled = false; this.menuEditPaste.Index = 4; this.menuEditPaste.Text = "&Paste"; this.menuEditPaste.Click += new System.EventHandler(this.menuEditPaste_Click); // // menuEditDelete // this.menuEditDelete.Enabled = false; this.menuEditDelete.Index = 5; this.menuEditDelete.Text = "&Delete"; this.menuEditDelete.Click += new System.EventHandler(this.menuEditDelete_Click); // // menuItem5 // this.menuItem5.Index = 6; this.menuItem5.Text = "-"; // // menuEditSelAll // this.menuEditSelAll.Enabled = false; this.menuEditSelAll.Index = 7; this.menuEditSelAll.Text = "Select &All"; this.menuEditSelAll.Click += new System.EventHandler(this.menuEditSelAll_Click); // // menuTools // this.menuTools.Index = 2; this.menuTools.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuToolsROFST}); this.menuTools.Text = "Tools"; // // menuToolsROFST // this.menuToolsROFST.Index = 0; this.menuToolsROFST.Text = "Create RO.FST"; this.menuToolsROFST.Click += new System.EventHandler(this.menuToolsROFST_Click); // // menuHelp // this.menuHelp.Index = 3; this.menuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuHelpAbout}); this.menuHelp.Text = "Help"; // // menuHelpAbout // this.menuHelpAbout.Index = 0; this.menuHelpAbout.Text = "About"; this.menuHelpAbout.Click += new System.EventHandler(this.menuHelpAbout_Click); // // menuItem2 // this.menuItem2.Index = 4; this.menuItem2.Text = ""; // // panel1 // this.panel1.AutoScroll = true; this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.panel1.Controls.Add(this.panel2); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(228, 28); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(752, 591); this.panel1.TabIndex = 5; // // panel2 // this.panel2.AutoScroll = true; this.panel2.Location = new System.Drawing.Point(0, 0); this.panel2.Name = "panel2"; this.panel2.Size = new System.Drawing.Size(235, 118); this.panel2.TabIndex = 0; this.panel2.Visible = false; // // roTreeView // this.roTreeView.Dock = System.Windows.Forms.DockStyle.Left; this.roTreeView.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.roTreeView.ImageIndex = 0; this.roTreeView.ImageList = this.imageListRoTree; this.roTreeView.ItemHeight = 18; this.roTreeView.Location = new System.Drawing.Point(0, 28); this.roTreeView.Name = "roTreeView"; this.roTreeView.SelectedImageIndex = 0; this.roTreeView.Size = new System.Drawing.Size(220, 591); this.roTreeView.TabIndex = 3; this.roTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.roTreeView_AfterSelect_1); // // tbar // this.tbar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] { this.tbtnSave, this.tbtnCancel, this.tbtnRestore, this.tbtnSaveAs, this.tbtnDuplicate, this.tbtnZoom}); this.tbar.DropDownArrows = true; this.tbar.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbar.ImageList = this.imageListToolBar; this.tbar.Location = new System.Drawing.Point(0, 0); this.tbar.Name = "tbar"; this.tbar.ShowToolTips = true; this.tbar.Size = new System.Drawing.Size(980, 28); this.tbar.TabIndex = 0; this.tbar.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right; this.tbar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tbar_OnClick); // // tbtnSave // this.tbtnSave.Enabled = false; this.tbtnSave.ImageIndex = 0; this.tbtnSave.Name = "tbtnSave"; this.tbtnSave.Text = "Save"; // // tbtnCancel // this.tbtnCancel.Enabled = false; this.tbtnCancel.ImageIndex = 1; this.tbtnCancel.Name = "tbtnCancel"; this.tbtnCancel.Text = "Cancel"; // // tbtnRestore // this.tbtnRestore.Enabled = false; this.tbtnRestore.ImageIndex = 2; this.tbtnRestore.Name = "tbtnRestore"; this.tbtnRestore.Text = "Restore"; // // tbtnSaveAs // this.tbtnSaveAs.Enabled = false; this.tbtnSaveAs.ImageIndex = 3; this.tbtnSaveAs.Name = "tbtnSaveAs"; this.tbtnSaveAs.Text = "Save As"; // // tbtnDuplicate // this.tbtnDuplicate.Enabled = false; this.tbtnDuplicate.ImageIndex = 4; this.tbtnDuplicate.Name = "tbtnDuplicate"; this.tbtnDuplicate.Text = "Duplicate"; // // tbtnZoom // this.tbtnZoom.Enabled = false; this.tbtnZoom.ImageIndex = 5; this.tbtnZoom.Name = "tbtnZoom"; this.tbtnZoom.Text = "Zoom"; // // imageListToolBar // this.imageListToolBar.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListToolBar.ImageStream"))); this.imageListToolBar.TransparentColor = System.Drawing.Color.Transparent; this.imageListToolBar.Images.SetKeyName(0, ""); this.imageListToolBar.Images.SetKeyName(1, ""); this.imageListToolBar.Images.SetKeyName(2, ""); this.imageListToolBar.Images.SetKeyName(3, ""); this.imageListToolBar.Images.SetKeyName(4, ""); this.imageListToolBar.Images.SetKeyName(5, ""); // // lblDuplicateRO // this.lblDuplicateRO.AutoSize = true; this.lblDuplicateRO.ForeColor = System.Drawing.Color.Red; this.lblDuplicateRO.Location = new System.Drawing.Point(570, 9); this.lblDuplicateRO.Name = "lblDuplicateRO"; this.lblDuplicateRO.Size = new System.Drawing.Size(139, 13); this.lblDuplicateRO.TabIndex = 6; this.lblDuplicateRO.Text = "Working With Duplicate RO"; this.lblDuplicateRO.Visible = false; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(980, 619); this.Controls.Add(this.lblDuplicateRO); this.Controls.Add(this.panel1); this.Controls.Add(this.splitter1); this.Controls.Add(this.roTreeView); this.Controls.Add(this.tbar); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Menu = this.mainMenu1; this.Name = "Form1"; this.Text = "RO Edit"; this.panel1.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); } //Cut/Paste (Move ROs) added as part of CSM-C2024-027 / Part of 2024 PROMS Upgrades private void menuROCut_Click(object sender, EventArgs e) { ROCutWasSelected = true; string msgstr = "It is recommended that after moving ROs, you create a FST and use it to update RO Values in PROMS to ensure RO Links properly move to the new location as well.\n\n Are you sure you wish to move the RO(s)?"; DialogResult AnswerYN = MessageBox.Show(msgstr, "Moving ROs", MessageBoxButtons.YesNo); if (AnswerYN != DialogResult.Yes) ROCutWasSelected = false; } //part of CSM-C2024-027 / Part of 2024 PROMS Upgrades //Paste Selected - will move individual ROs private void menuROPaste_Click(object sender, EventArgs e) { if (ROCutWasSelected && ROsSelectedforMultiMove.Count == 0) { MessageBox.Show("Cut must be selected before able to Paste/Move a RO"); return; } foreach (TreeNode tnToCut in ROsSelectedforMultiMove) { VlnXmlElement ROtoCut = ((VlnXmlElement) tnToCut.Tag); if (((VlnXmlElement)roTreeView.SelectedNode.Tag).GetAttribute("Table") != ROtoCut.GetAttribute("Table")) { MessageBox.Show("You can only move a RO within the same table."); break; //exit foreach loop } string TheMenuTitle = ROtoCut.GetAttribute("MenuTitle"); if (!string.IsNullOrEmpty(TheMenuTitle)) { TreeNode orig_parent = tnToCut.Parent; if (moveRO(ROtoCut)) { //if move was successful, remove the moved item from it's previous parent //so it will only have a parent of where it moved to XmlNode node = ROtoCut.ParentNode; node.RemoveChild(ROtoCut); if (orig_parent != null) { roTreeView.Nodes.Remove(tnToCut); updateRoListView(orig_parent); roTreeView.Refresh(); } } } } roTreeView_ClearAllMultiSelect(); tbtnRestore.Enabled = false; tbtnSave.Enabled = false; tbtnCancel.Enabled = true; tbtnSaveAs.Enabled = false; tbtnDuplicate.Enabled = true; duplicate_active = false; ROCutWasSelected = false; menuROCut.Enabled = false; roTreeView.ContextMenu.MenuItems[3].Enabled = menuROCut.Enabled; menuROPaste.Enabled = false; roTreeView.ContextMenu.MenuItems[4].Enabled = menuROPaste.Enabled; roTreeView.Refresh(); } //part of CSM-C2024-027 / Part of 2024 PROMS Upgrades //Will move individual ROs private bool moveRO(VlnXmlElement ROtoMove) { //making a copy into newro //if everything is successful, once done //will remove ROtoMove and keep the Clone with the changed position //if any errors/issues, will remove the cloned newro and keep ROtoMove VlnXmlElement newro = (VlnXmlElement)ROtoMove.Clone(); VlnXmlElement placetomoveroto = (VlnXmlElement)roTreeView.SelectedNode.Tag; string orig_title = ROtoMove.GetMenuString(ROtoMove.GetMenuValueTemplate("MenuItem"), false); //remove original link, and put it at new place in the menu //set table to be new place that you are moving item to //put at new place in menu newro.SetAttribute("Table", placetomoveroto.GetAttribute("Table")); newro.SetAttribute("ParentID", placetomoveroto.GetAttribute("RecID")); placetomoveroto.AppendChild((XmlNode)newro); //Check that must have the same Fields in use string dummy = ""; // need for RODB_GetFIeldsInUse call, won't be used. ArrayList AvailList_ROtoMove = myrodb.RODB_GetFields(ROtoMove, (uint)RecordType.Schema); IEnumerable InUseList_ROtoMove = myrodb.RODB_GetFieldsInUse(ROtoMove, AvailList_ROtoMove, "FieldsInUse", ref dummy, false).OfType(); List flds_InUseList_ROtoMove = InUseList_ROtoMove.Select(x => x.GetFieldname).OrderBy(t => t).ToList(); ArrayList AvailList_placetomoveroto = myrodb.RODB_GetFields(placetomoveroto, (uint)RecordType.Schema); List flds_InUseList_placetomoveroto = myrodb.RODB_GetFieldsInUse(placetomoveroto, AvailList_placetomoveroto, "FieldsInUse", ref dummy, false).OfType().Select(x => x.GetFieldname).OrderBy(t => t).ToList(); if (!Enumerable.SequenceEqual(flds_InUseList_ROtoMove, flds_InUseList_placetomoveroto)) { MessageBox.Show($"RO: {orig_title}. The fields in use must be the same between the item you are moving and where you are moving the item. The fields used in these values can be found under \"Properties => Referenced Object Definition\" of an RO Group. Cannot move.", "Problem moving RO item."); placetomoveroto.RemoveChild(newro); return false; } //if duplicate Accessory Page Id, return with Error message string acctmpl = newro.GetAccPageIDTemplate(); string newacc = newro.GetAccPageIDString(acctmpl); if (newacc == null) { MessageBox.Show($"RO: {orig_title}. Values for the fields used for the \"Accessory Pages Access\" are missing. The template required for the place this RO is moving to is: {acctmpl}", "Problem saving data"); placetomoveroto.RemoveChild(newro); return false; } else if (myrodb.IsDuplicateAccPageID(newro, newacc)) { MessageBox.Show($"RO: {orig_title}. The fields used for the \"Accessory Pages Access\" values must be unique. The fields used in these values can be found under \"Properties\" of an RO Group. Cannot save.", "Problem saving data"); placetomoveroto.RemoveChild(newro); return false; } //if already an item in the menu with the same title, then return with Error message string mnutmp = newro.GetMenuValueTemplate("MenuItem"); string mnutitle = newro.GetMenuString(mnutmp, false); if (newro.IsDuplicateMenuTitle(mnutitle)) { MessageBox.Show($"RO: {orig_title}. The fields used for the \"Menu\" values must be unique. The fields used in these values can be found under \"Properties\" of an RO Group. Cannot save.", "Problem saving data"); placetomoveroto.RemoveChild(newro); return false; } newro.SetAttribute("MenuTitle", mnutitle); //Check that required Fields have Values ArrayList reqfields = newro.GetRequiredFields(); foreach (string fldname in reqfields) { string fname_inxml = fldname.Split(new string[] { "\t" }, StringSplitOptions.None)[0]; string fname = CvtFldToUserFld(fname_inxml); if (!InUseList_ROtoMove.Any(x=> x.GetFieldname == CvtFldToUserFld(fldname.Split(new string[] { "\t" }, StringSplitOptions.None)[0])) || newro.ChildNodes.Cast().Any(x => x.Name == fname_inxml && x.InnerText.Length == 0)) { MessageBox.Show($"RO: {orig_title}. Required field \"{fname}\" is missing a value that is required. Please be sure RO has a value for this field before moving the RO.", "Problem saving data"); placetomoveroto.RemoveChild(newro); return false; } } bool success = myrodb.RODB_WriteRO(newro, true); //if successful, update the UI if (success) { TreeNode newt = new TreeNode(mnutitle, ROIMAGE, ROIMAGE); newt.Tag = newro; newt.Name = newro.GetAttribute("RecID"); roTreeView.SelectedNode.Nodes.Add(newt); updateRoListView(newt.Parent); roTreeView.Refresh(); } else { MessageBox.Show($"RO: {orig_title}. Unable to Move Item. An unexpected error occurred while moving the item, please contact Volian Support", "Problem saving moved item"); placetomoveroto.RemoveChild(newro); roTreeView.Refresh(); } return success; } #endregion [DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd); /// /// The main entry point for the application. /// static void BringWindowToFront() { Process currentProcess = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName); Process process = null; for (int i = 0; i < processes.Length; i++) { if (processes[i].SessionId != currentProcess.SessionId) { process = processes[i]; break; } } if (process == null) return; SetForegroundWindow(process.MainWindowHandle); } [STAThread] static void Main(string[] args) { bool StartupROEditor = true; FileStream fsown=null; FileInfo fiown=null; String specificro = null; string ConnectionPath = ""; // Let's open the database & set up for the tree structure... // if an RO directory path was passed in, then change the // current working directory to it. // this path will also be used to generate a connection string // the the Access database. if (args.Length > 0) { if (args[0].ToUpper().StartsWith("PC=")) PCChildren = args[0].Substring(3).Split(','); //C2021-026 list of Parent/Child Children else ConnectionPath = args[0]; // Directory.SetCurrentDirectory(ConnectionPath); } if (ConnectionPath == null) // RO Path was not passed in, find ROPATH { ConnectionPath = FindTheRODirectory(); } if (args.Length > 1) { if (args[1].ToUpper().StartsWith("PC=")) PCChildren = args[1].Substring(3).Split(','); //C2021-026 list of Parent/Child Children else if (args[1].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[1]; else specificro = args[1]; } if (args.Length > 2) { if (args[2].ToUpper().StartsWith("PC=")) PCChildren = args[2].Substring(3).Split(','); //C2021-026 list of Parent/Child Children else if (args[2].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[2]; else specificro = args[2]; } if (args.Length > 3) if (args[3].ToUpper().StartsWith("PC=")) PCChildren = args[3].Substring(3).Split(','); //C2021-026 list of Parent/Child Children else if (args[3].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[3]; else specificro = args[3]; RODB.PCChildList = PCChildren; //C2021-026 pass the Parent/Child info to the RODB class try { // Convert the RO data if needed if (!CheckForDataConversion(ConnectionPath)) ConnectionPath = null; // force exit } catch (Exception e) { MessageBox.Show(e.Message, "Error on check for data conversion"); // Application.Exit(); } // Process the given RO Path if (ConnectionPath == null) { // no RO directory MessageBox.Show("Could not locate a Referenced Objects (RO) directory.\n\nIt should be inside your VExxx directory or at the same level as your VExxx directory.","RO Editor"); StartupROEditor = false; } else if (ConnectionPath.Equals("")) { // already in RO directory ConnectionPath = Directory.GetCurrentDirectory(); } else { // Change to the RO Directory try { Directory.SetCurrentDirectory(ConnectionPath); } catch (Exception e) { MessageBox.Show(e.Message, e.GetType().ToString()); } } if (StartupROEditor) { // The ROEditor.OWN file assures that only one individual at a time can edit the RO database. // The file is opened and kept open while the user is editing the database. The contents of the // file will identify the current user and state when the edit session began. try { fiown = new FileInfo("RoEditor.own"); try { // Try to delete the owner file. If another process has the file open, this delete will fail. // If the file is closed, it will be deleted, and the user will be placed in the editor. The users // name and the time when this session began will be placed in the owner file. fiown.Delete(); } catch(Exception ex) { fsown = fiown.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); TextReader tr1 = new StreamReader(fsown); string who1 = tr1.ReadToEnd(); MessageBox.Show(ex.Message + "\r\n\r\n" + who1, "RO Editor In Use", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } fsown = fiown.Open(FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); TextReader tr = new StreamReader(fsown); string who = tr.ReadToEnd(); tr.Close(); if (who.Contains(Environment.UserName.ToUpper())) { BringWindowToFront(); return; } } catch(Exception e) { MessageBox.Show(e.Message,"fileinfo"); } // Open the file just specified. Open it so that no-one else can use it try { fsown = fiown.Open( FileMode.Create, FileAccess.ReadWrite, FileShare.Read ); TextWriter tw = new StreamWriter(fsown); tw.WriteLine("Current User: {0}, Date and Time Started: {1}", Environment.UserName.ToUpper(), DateTime.Now.ToString("MM/dd/yyyy @ hh:mm")); tw.Flush(); } catch (IOException ex) { fsown = fiown.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); TextReader tr = new StreamReader(fsown); string who = tr.ReadToEnd(); tr.Close(); if(who.Contains(Environment.UserName.ToUpper())) { BringWindowToFront(); //Process[] p = Process.GetProcessesByName("ROEditor"); //Process cp = Process.GetCurrentProcess(); //for (int i = 0; i < p.Length; i++) //{ // if (p[i].SessionId != cp.SessionId) // { // SetForegroundWindow(p[i].MainWindowHandle); // break; // } //} } else MessageBox.Show(who, "Another user is executing the RoEditor"); return; } // If there isn't a RO database file, ask user if we should create an empty one. if (!File.Exists("ROMaster.mdb") && !UsingSQLServer(Directory.GetCurrentDirectory())) { DialogResult AnswerYN; string msgstr = "The RO directory (" + Directory.GetCurrentDirectory() +") is empty.\n\n Create an empty RO database?"; AnswerYN = MessageBox.Show(msgstr,"RO Editor",MessageBoxButtons.YesNo); if (AnswerYN == DialogResult.Yes) { string SourceRODatabase = Application.StartupPath + "\\ROMaster.mdb"; string DestRODatabase = Directory.GetCurrentDirectory() + "\\ROMaster.mdb"; File.Copy(SourceRODatabase,DestRODatabase); } else StartupROEditor = false; } } if (StartupROEditor) { Application.Run(new Form1(ConnectionPath,specificro)); if (fsown != null) { fsown.Close(); fiown.Delete(); } Application.Exit(); } } // C2021-026 was Parent/Child information passed into the RO Editor? public static bool ApplicabilityEnabled() { return (PCChildren != null && PCChildren.Length > 0); } /* * Look for the RO directory via PROC.INI and by * looking for a \RO directory in the current VEplant * directory and at the same level as VEplant */ static string FindTheRODirectory() { string RtnStr = ""; string CurDir = Directory.GetCurrentDirectory(); CurDir = CurDir.ToUpper(); bool InProcdureDir = false; // are we in the RO directory? if (!CurDir.EndsWith("\\RO")) //not in RO directory { if (File.Exists("PROC.INI")) // Get the ROPATH from the PROC.INI file if possible { InProcdureDir = true; IniReader ini = new IniReader("PROC.INI"); RtnStr = ini.ReadString("RO Defaults","ROPATH",""); } if (RtnStr.Equals("")) // no ROPATH specified { RtnStr = "..\\RO"; // check default location if (!Directory.Exists(RtnStr)) { // Check for Global ROs (at the same directory level as the VEplant directory) if (CurDir.EndsWith("TMPCHG")) // handle temporary change directory { InProcdureDir = false; RtnStr = "..\\..\\..\\..\\RO"; } else // Check for Global RO, assume we are in PROCS or .PRC directory RtnStr = "..\\..\\RO"; if (!Directory.Exists(RtnStr) && InProcdureDir) { // Could not find RO directory. // Instruct the user to create one. DialogResult AnswerYN; int idx = CurDir.LastIndexOf("\\"); RtnStr = CurDir.Substring(0,idx+1) + "RO"; // default location string msgstr = "A RO directory (folder) does not exist.\n\n Create a RO directory in the default location (" + RtnStr + ")?"; AnswerYN = MessageBox.Show(msgstr,"RO Editor",MessageBoxButtons.YesNo); if (AnswerYN == DialogResult.Yes) { Directory.CreateDirectory(RtnStr); } else RtnStr = null; } else RtnStr = null; } } } return RtnStr; } // C2017-003: support for sql server static public string SqlConnectionStr = null; static bool UsingSQLServer(string ROdir) { // using sql if there is a connection string or if defined in roapp.ini if (SqlConnectionStr != null && SqlConnectionStr != "") return true; bool Rtn = false; string ROiniPath = ROdir + "\\ROAPP.INI"; IniReader ini = new IniReader(ROiniPath); SqlConnectionStr = ini.ReadString("Database Server", "Path", ""); if (SqlConnectionStr.Length > 1) Rtn = true; return Rtn; } static bool CheckForDataConversion(string ROdir) { bool Rtn = true; // Check to see if we need to convert Old RO data if (ROdir != null) { string testParadoxFile = ROdir; string testAccessFile = ROdir; if (!ROdir.Equals("")) { testParadoxFile += "\\"; testAccessFile += "\\"; } testParadoxFile += "ROMASTER.DB"; // Paradox file testAccessFile += "ROMaster.mdb"; // Access file // if (File.Exists(testParadoxFile)) if (File.Exists(testParadoxFile) && !(File.Exists(testAccessFile) || UsingSQLServer(ROdir))) { // Display a message to the user that the data needs converted DialogResult AnswerYN; AnswerYN = MessageBox.Show("The RO data needs to be converted for the New RO Editor.\n\n Proceed with the data conversion?","RO Editor",MessageBoxButtons.YesNo); if (AnswerYN == DialogResult.Yes) { // Convert old RO Data string argstr = ROdir; if (ROdir.Equals("")) argstr = Directory.GetCurrentDirectory(); string ConversionExePath = Application.StartupPath + "\\ParadoxConversion.exe "; // Need to move out of RO directory to convert it Directory.SetCurrentDirectory("..\\"); // create a process & wait until it exits. Process myProcess = new Process(); myProcess.StartInfo.FileName = ConversionExePath; myProcess.StartInfo.Arguments=argstr; myProcess.Start(); myProcess.WaitForExit(); Directory.SetCurrentDirectory(argstr); } else Rtn = false; } } return Rtn; } private void menuROSave_Click(object sender, System.EventArgs e) { tbar_SaveClick(); } private void menuROExit_Click(object sender, System.EventArgs e) { Close(); Application.Exit(); // Exit() does not run the destructors } /* * If the xml data becomes inconsistent with the tree view, reload the first * level. */ private void CleanUpTree(VlnXmlElement curelem, TreeNode nd) { // Unload any children because data may have changed and it can be // reloaded. nd.Collapse(); int cnt = nd.Nodes.Count; bool add_dummykid = false; if (cnt > 0) add_dummykid = true; for (int i=0; i 1) || (levelcnt==1 && !TheMenuTitle.Equals(""))) { AllGroups = false; ListViewItem item=null; bool first = true; for (int i=0; i< InUseList.Count; i++) { rof = (ROField) InUseList[i]; if (rof.GetFieldname != null) { uint ftype = rof.GetFieldType; if (ftype == (uint)ROFields.FieldTypes.SingleTxt || ftype == (uint)ROFields.FieldTypes.VariableTxt || ftype == (uint)ROFields.FieldTypes.FrmtSingleTxt || ftype == (uint)ROFields.FieldTypes.Combination) { string nm0 = rof.GetFieldname; nm = rof.MakeFieldName(nm0); nd = curele.SelectSingleNode(nm); if (nd==null)nd = curele.SelectSingleNode("*/"+nm); if (nd==null) nd = curele.GetCurrentOfMultiFields(curele,nm); // if (nd==null)nd = curele.SelectSingleNode(nm+"a"); // if (nd==null)nd = curele.SelectSingleNode(nm+"b"); // if (nd==null)nd = curele.SelectSingleNode(nm+"c"); // if (nd==null)nd = curele.SelectSingleNode(nm+"d"); string data; if(nd==null) data=" "; else data=nd.InnerText; if(first==true) { item = new ListViewItem(data,ROIMAGE); first=false; item.Tag = curele; } else item.SubItems.Add(data); } } } roListView.Items.Add(item); } } } curnd = curnd.NextSibling; } if (AllGroups == true) { roListView.Columns.Clear(); roListView.Columns.Add("Group",250,HorizontalAlignment.Left); } roListView.Visible=true; } private void updateRoListView(TreeNode node) { VlnXmlElement selele; selele = (VlnXmlElement) node.Tag; if (selele.Name != "vlnGroup" && selele.Name != "RO_Root") { // if we already have a list view, and we're still under the same parent, // leave the list view, otherwise clear it. VlnXmlElement curele = null; if (roListView != null && roListView.Items.Count > 0) { curele = (VlnXmlElement) roListView.Items[0].Tag; if (selele.ParentNode != curele.ParentNode)roListView_ClearListDisplay(); } return; } else { if (roListView == null) { this.roListView = new System.Windows.Forms.ListView(); this.panel1.Controls.Add(roListView); this.roListView.Dock = System.Windows.Forms.DockStyle.Fill; this.roListView.LargeImageList = this.imageListRoTree; this.roListView.Name = "roListView"; this.roListView.Size = new System.Drawing.Size(688, 700); this.roListView.AllowColumnReorder = true; this.roListView.FullRowSelect = true; this.roListView.SmallImageList = this.imageListRoTree; this.roListView.TabIndex = 5; this.roListView.DoubleClick += new System.EventHandler(this.roListView_OnDoubleClick); this.roListView.View = View.Details; MyListViewComparer LVCompare = new MyListViewComparer(); this.roListView.ListViewItemSorter = LVCompare; roListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.roListView_Column_Header_OnClick); } DisplayGroupElements(selele); } } void roListView_Column_Header_OnClick(object sender, ColumnClickEventArgs e) { int indx = e.Column; MyListViewComparer LVCompare = (MyListViewComparer) roListView.ListViewItemSorter; LVCompare.SetColumnToSortBy(indx); roListView.Sort(); } private void roTreeView_AfterSelect_1(object sender, System.Windows.Forms.TreeViewEventArgs e) { } } // This class is used to sort by the selected list view column public class MyListViewComparer : IComparer { int column; public int Compare (object x, object y) { ListViewItem xitm = (ListViewItem) x; ListViewItem yitm = (ListViewItem) y; string xbuff = xitm.SubItems[column].Text; string ybuff = yitm.SubItems[column].Text; int rtnval = 0; int xcnt=0,ycnt=0; int xlen,ylen; byte xbyte, ybyte; xlen = xbuff.Length; ylen = ybuff.Length; if (xbuff.Length > 0 && xbuff[0] == '<') rtnval = 0; if (ybuff.Length > 0 && ybuff[0] == '<') rtnval = 0; while ((rtnval==0) && ((xcnt < xlen) || (ycnt < ylen))) { xbyte = (xcnt == xlen)? (byte)0 : (byte)xbuff[xcnt++]; ybyte = (ycnt == ylen)? (byte)0 : (byte)ybuff[ycnt++]; rtnval = xbyte - ybyte; } return rtnval; } public void SetColumnToSortBy(int col) { column = col; } } }