702 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			702 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: Plant.cs $     $Revision: 10 $
 | 
						|
 * $Author: Jsj $   $Date: 10/20/06 9:34a $
 | 
						|
 *
 | 
						|
 * $History: Plant.cs $
 | 
						|
 * 
 | 
						|
 * *****************  Version 10  *****************
 | 
						|
 * User: Jsj          Date: 10/20/06   Time: 9:34a
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * long name fix
 | 
						|
 * 
 | 
						|
 * *****************  Version 9  *****************
 | 
						|
 * User: Jsj          Date: 9/26/06    Time: 9:38a
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * check for a siingle quote in directory name
 | 
						|
 * 
 | 
						|
 * *****************  Version 8  *****************
 | 
						|
 * User: Kathy        Date: 6/06/05    Time: 12:35p
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * Allow lock set even if system lock set
 | 
						|
 * 
 | 
						|
 * *****************  Version 7  *****************
 | 
						|
 * User: Kathy        Date: 4/12/05    Time: 1:01p
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * 
 | 
						|
 * *****************  Version 6  *****************
 | 
						|
 * User: Kathy        Date: 2/02/05    Time: 10:13a
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * B2005-006: fix missing proc sets under plant
 | 
						|
 * 
 | 
						|
 * *****************  Version 5  *****************
 | 
						|
 * User: Kathy        Date: 1/31/05    Time: 11:06a
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * Fix B2005-005 (connection & delete directory errors). also, fix icon
 | 
						|
 * usage & security for new
 | 
						|
 * 
 | 
						|
 * *****************  Version 4  *****************
 | 
						|
 * User: Kathy        Date: 1/24/05    Time: 2:45p
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * B2005-004 fixes
 | 
						|
 * 
 | 
						|
 * *****************  Version 3  *****************
 | 
						|
 * User: Kathy        Date: 1/14/05    Time: 10:38a
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * B2004-061: Fix security optoins
 | 
						|
 * 
 | 
						|
 * *****************  Version 2  *****************
 | 
						|
 * User: Kathy        Date: 1/10/05    Time: 12:58p
 | 
						|
 * Updated in $/LibSource/VEObject
 | 
						|
 * B2004-063 fix
 | 
						|
 * 
 | 
						|
 * *****************  Version 1  *****************
 | 
						|
 * User: Kathy        Date: 7/27/04    Time: 8:53a
 | 
						|
 * Created in $/LibSource/VEObject
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
using System;
 | 
						|
using System.Collections;
 | 
						|
using System.Text;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.IO;
 | 
						|
using System.Xml;
 | 
						|
using System.ComponentModel;
 | 
						|
using Utils;
 | 
						|
using VENetwork;
 | 
						|
 | 
						|
namespace VEObject
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// This defines the VEO_Plant class which handles plant data. This contains
 | 
						|
	/// support for the vexxx layer.
 | 
						|
	/// </summary>
 | 
						|
	public class VEO_Plant : VEO_Base
 | 
						|
	{
 | 
						|
		public long accessFlags;
 | 
						|
		protected string tmpTitle;
 | 
						|
		protected string tmpLocation;
 | 
						|
		protected bool changeLocation;
 | 
						|
		protected bool changeTitle;
 | 
						|
		private string PrevDirectory;
 | 
						|
		public VEO_Plant(UserRunTime iusrRunTime, string ititle, string ipath)
 | 
						|
		{
 | 
						|
			// iconStates are the imagelist indexes for the tree view (imglist1)
 | 
						|
			// the states are Nolock, LockedByMe, LockedByOther, LockPending, Empty.
 | 
						|
			iconStates = new int[5] {3,21,5,22,4};
 | 
						|
			_Title = ititle;
 | 
						|
			_Location = ipath;
 | 
						|
			usrRunTime = iusrRunTime;
 | 
						|
			changeLocation=false;
 | 
						|
			changeTitle=false;
 | 
						|
			IsEmpty=false;
 | 
						|
			VEObjectType=(int)VEObjectTypesDefs.Plant;
 | 
						|
			isNew=false;
 | 
						|
			LoadLockInfo();
 | 
						|
			icon = iconStates[(int)Lock.LockStatus];
 | 
						|
			if (Lock.LockStatus != VENetwork.Status.LockedByOther)
 | 
						|
			{
 | 
						|
				if (ipath != null)
 | 
						|
				{
 | 
						|
					string[] dirs = new string[40];
 | 
						|
					dirs = Directory.GetDirectories(ipath);
 | 
						|
					if (dirs.Length == 0)
 | 
						|
					{
 | 
						|
						IsEmpty=true;
 | 
						|
						//only reset the icon to empty if there is no lock icon.
 | 
						|
						//if a lock, show the lock icon
 | 
						|
						if (Lock.LockStatus == VENetwork.Status.NoLock) icon = iconStates[(int)VEO_IconStates.Empty];
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public override void LoadLockInfo()
 | 
						|
		{
 | 
						|
			Lock = new VELock(_Location, usrRunTime.myUserData, usrRunTime.InMultiUserMode?VENetwork.LockTypes.Plant:VENetwork.LockTypes.None);
 | 
						|
		}
 | 
						|
		
 | 
						|
		// Properties used for modify of 'Properties' from File menu.
 | 
						|
		[Description("Location"),Category("Plant"),ReadOnly(true)]public string Location
 | 
						|
		{
 | 
						|
			get{return _Location;}
 | 
						|
			set{_Location=value;}
 | 
						|
		}
 | 
						|
 | 
						|
		[Description("Title"),Category("Plant")]public string Title
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				if (!changeTitle)
 | 
						|
					return _Title;
 | 
						|
				else
 | 
						|
					return tmpTitle;
 | 
						|
			}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				changeTitle=true;
 | 
						|
				tmpTitle=value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// The open method checks for multi-user settings at the plant level. It
 | 
						|
		// also positions into the plant directory.
 | 
						|
		public override bool Open()
 | 
						|
		{
 | 
						|
			isOpen = true;
 | 
						|
			PrevDirectory = Directory.GetCurrentDirectory();
 | 
						|
			if(_Location!=null)Directory.SetCurrentDirectory(_Location);
 | 
						|
			if (Connection!=null)Connection.Enter(false);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		// The close method resets, if necessary from any multi-user settings and
 | 
						|
		// positions back to the datapath directory (which is a level above the 
 | 
						|
		// current level)
 | 
						|
		public override bool Close()
 | 
						|
		{
 | 
						|
			if (!isOpen)return false;
 | 
						|
			isOpen=false;
 | 
						|
			if (Connection!=null)Connection.Exit();
 | 
						|
			Directory.SetCurrentDirectory("..");
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		public override void Restore()
 | 
						|
		{
 | 
						|
			changeTitle=false;
 | 
						|
		}
 | 
						|
 | 
						|
		public override bool Delete()
 | 
						|
		{
 | 
						|
			DialogResult result = MessageBox.Show("Are you sure you want to delete the entire plant directory " + this._Location,"Confirm Delete Again",MessageBoxButtons.YesNoCancel);
 | 
						|
			if (result == DialogResult.Yes)
 | 
						|
			{
 | 
						|
				// delete the entire directory
 | 
						|
				if (Directory.Exists(this._Location)) 
 | 
						|
				{
 | 
						|
					if(isOpen)Close();
 | 
						|
					try
 | 
						|
					{
 | 
						|
						Directory.Delete(this._Location,true);
 | 
						|
					}
 | 
						|
					catch (Exception e)
 | 
						|
					{
 | 
						|
						MessageBox.Show("Could not delete directory - manually delete " + this._Location + ". Cause: " + e.Message);
 | 
						|
					}
 | 
						|
					if (Directory.Exists(this._Location))
 | 
						|
					{
 | 
						|
						MessageBox.Show("Unable to delete the plant directory.");
 | 
						|
						return false;
 | 
						|
					}
 | 
						|
					return true;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		private void CreateProcSet(string dirpath, XmlElement nm, string dirname, long flags)
 | 
						|
		{
 | 
						|
			// see if there is a title file in the directory and use
 | 
						|
			// it if there is, otherwise use menuname & if there's no menu
 | 
						|
			// name, use the directory name.
 | 
						|
			VEO_ProcSet procset = null;		
 | 
						|
			string titlepath = dirpath + "\\" + "Title";
 | 
						|
			FileInfo fi = new FileInfo(titlepath);
 | 
						|
			if (File.Exists(titlepath))
 | 
						|
			{
 | 
						|
				StreamReader myReader = new StreamReader(titlepath);
 | 
						|
				titlepath = myReader.ReadLine();
 | 
						|
				myReader.Close();
 | 
						|
				procset = new VEO_ProcSet(usrRunTime, titlepath.Trim(), dirpath, flags);
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if (nm != null)
 | 
						|
					procset = new VEO_ProcSet(usrRunTime, nm.InnerText, dirpath, flags);
 | 
						|
				else
 | 
						|
				{
 | 
						|
					string tmpdirnm = dirname;
 | 
						|
					int indx=0;
 | 
						|
					// if this is temp change directory, tack on text to recognize it
 | 
						|
					if ((indx=dirpath.ToUpper().IndexOf("TMPCHG"))>-1)
 | 
						|
						tmpdirnm = dirname + " - Temporary Change Version";
 | 
						|
					// if this is approved, tack on Current Approved Version to the title
 | 
						|
					else if ((indx=dirpath.ToUpper().IndexOf("APPROVED"))>-1)
 | 
						|
						tmpdirnm = dirname + " - Current Approved Version";					
 | 
						|
					procset =  new VEO_ProcSet(usrRunTime, tmpdirnm, dirpath,flags);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			procset.parentObj = this;
 | 
						|
			Children.Add(procset);
 | 
						|
		}
 | 
						|
 | 
						|
		// private method, used below, to add a directory to the child list
 | 
						|
		// (list contains proc sets)
 | 
						|
		private bool ProcessDirName(XmlElement par, string dirname, int plntsecindx)
 | 
						|
		{
 | 
						|
			XmlNodeList nodeList = par.SelectNodes("ProcFile");
 | 
						|
			if (nodeList == null) return false;
 | 
						|
		
 | 
						|
			foreach (XmlNode dirnd in nodeList)
 | 
						|
			{
 | 
						|
				XmlElement dele=(XmlElement)dirnd;
 | 
						|
				string dirpath = _Location + "\\" + dirname;
 | 
						|
				if (File.Exists(dirpath+"\\"+dirnd.InnerText))
 | 
						|
				{
 | 
						|
					// 
 | 
						|
					// see if there's an exception or a requirement, i.e. use
 | 
						|
					// the Working Draft if there's no proc2 directory (Except)
 | 
						|
					// or use the Working Draft Unit 1 if there's a proc2
 | 
						|
					// directory (Require)
 | 
						|
					bool excpt = false;
 | 
						|
					bool req = true;
 | 
						|
					string path1=null;
 | 
						|
					XmlElement except = (XmlElement) par.SelectSingleNode("Exception");
 | 
						|
					if (except != null)
 | 
						|
					{
 | 
						|
						// if this exception directory exists, don't add this to
 | 
						|
						// the set.
 | 
						|
						
 | 
						|
						path1 = dirpath + "\\" + except.InnerText;
 | 
						|
						if (Directory.Exists(path1)) excpt = true;
 | 
						|
					}
 | 
						|
					XmlElement require = (XmlElement) par.SelectSingleNode("Require");
 | 
						|
					if (require != null)
 | 
						|
					{
 | 
						|
						// if this require directory exists, add this to set only
 | 
						|
						// if this exists.
 | 
						|
						path1 = dirpath + "\\" + require.InnerText;
 | 
						|
						if (Directory.Exists(path1) == false) req = false;
 | 
						|
					}
 | 
						|
					if (excpt == false && req == true)
 | 
						|
					{
 | 
						|
						XmlElement nm = (XmlElement) par.SelectSingleNode("MenuName");
 | 
						|
						long flags=0L;
 | 
						|
						// bug fix B2006-045
 | 
						|
						// need to convert long folder/file names to short (8.3)
 | 
						|
						ShortName sname = new ShortName(dirpath);
 | 
						|
						bool hasSec = usrRunTime.sec.ProcSetHasSecurity(plntsecindx, Path.GetFileName(sname.ShortFileName));
 | 
						|
//						bool hasSec = usrRunTime.sec.ProcSetHasSecurity(plntsecindx, dirname);
 | 
						|
						if (this.usrRunTime.sec==null) flags=Security.SUPERACCESS;
 | 
						|
						else if (hasSec) flags = usrRunTime.sec.GetProcSecurity(sname.ShortFileName);
 | 
						|
						//						else if (hasSec) flags = usrRunTime.sec.GetProcSecurity(dirpath);
 | 
						|
						
 | 
						|
						if((hasSec && flags!=0L) || (!hasSec&&!usrRunTime.sec.BlockAccess()))
 | 
						|
						{
 | 
						|
							CreateProcSet(dirpath, nm, dirname, flags);
 | 
						|
							return true;
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		
 | 
						|
		// This method processes through the SubDirSearch xmlelement tree in 
 | 
						|
		// menuwin2.xml to see if the input procedure set directory has valid
 | 
						|
		// procedure set subdirectories.  Arguments are:
 | 
						|
		// subtop is xmlelement for the SubDirSearch in menuwin2.xml, dir is actual
 | 
						|
		// procset directory name (for example, procs, proc000.dvt, etc) and
 | 
						|
		// dname is the name to be used for the directory name in the menuwin2.xml
 | 
						|
		// file under the SubDirSearch xmlelement tree (for example, procs, *.dvt, etc)
 | 
						|
		private bool ProcessSubDir(XmlElement subtop, string dri, string dname, int plntsecindx)
 | 
						|
		{
 | 
						|
			XmlNodeList nodeList;
 | 
						|
			string xp = "descendant::ProcSet[Dir = \'" + dname + "\']";
 | 
						|
 | 
						|
			try
 | 
						|
			{
 | 
						|
				nodeList = subtop.SelectNodes(xp);
 | 
						|
				// for each possible subdirectory for this directory, see if it
 | 
						|
				// exists.
 | 
						|
				foreach (XmlNode subdirname in nodeList)
 | 
						|
				{
 | 
						|
					XmlElement subdele=(XmlElement)subdirname;
 | 
						|
					XmlNodeList FnodeList = subdirname.SelectNodes("ProcFile");
 | 
						|
					// see if the files listed exist, if so, add them to the
 | 
						|
					// plant procset list.
 | 
						|
					foreach (XmlNode dirnd in FnodeList)
 | 
						|
					{
 | 
						|
						XmlElement dele=(XmlElement)dirnd;
 | 
						|
						string dirpath = _Location + "\\" + dri;
 | 
						|
						if (File.Exists(dirpath+"\\"+dirnd.InnerText))
 | 
						|
						{
 | 
						|
							XmlElement nm = (XmlElement) subdirname.SelectSingleNode("MenuName");							
 | 
						|
							string subdir = dirnd.InnerText.Substring(0,dirnd.InnerText.LastIndexOf("\\"));
 | 
						|
 | 
						|
							long flags=0L;
 | 
						|
							bool hasSec = usrRunTime.sec.ProcSetHasSecurity(plntsecindx, dri+"\\"+subdir);
 | 
						|
							if (this.usrRunTime.sec==null) flags=Security.SUPERACCESS;
 | 
						|
							else if (hasSec) flags = usrRunTime.sec.GetProcSecurity(dirpath + "\\" + subdir);
 | 
						|
						
 | 
						|
							if((hasSec && flags!=0L) || (!hasSec&&!usrRunTime.sec.BlockAccess()))
 | 
						|
								CreateProcSet(dirpath+"\\"+subdir, nm, dri, flags);
 | 
						|
						}
 | 
						|
						break;   // out of file check foreach
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			catch (Exception e)
 | 
						|
			{
 | 
						|
				MessageBox.Show(e.Message);
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		// Using the menuwin2.xml file, read in child list by seeing which
 | 
						|
		// directories (proc sets) are contained in this vexxx directory.
 | 
						|
		public override bool Read(bool ChkForChldOnly)
 | 
						|
		{
 | 
						|
			bool didone;
 | 
						|
			Cursor.Current = Cursors.WaitCursor;
 | 
						|
 | 
						|
			// using the . Then do exist tests to see if they 
 | 
						|
			// exist on this datapath.
 | 
						|
			usrRunTime.LoadMenuWin2();
 | 
						|
			XmlDocument xmldoc = usrRunTime.menuwin2XML.GetXmlDoc();
 | 
						|
 | 
						|
			XmlElement top = (XmlElement) xmldoc.FirstChild; 
 | 
						|
			XmlElement sys = (XmlElement) top.SelectSingleNode("PlantAttach");
 | 
						|
			XmlElement subtop = (XmlElement) top.SelectSingleNode("SubDirSearch");
 | 
						|
			
 | 
						|
			DirectoryInfo cur = new DirectoryInfo(_Location);
 | 
						|
			DirectoryInfo[] diArr = cur.GetDirectories();
 | 
						|
			int plntsecindx = usrRunTime.sec.GetPlantSecurityIndex(_Location);
 | 
						|
 | 
						|
			foreach (DirectoryInfo dri in diArr)
 | 
						|
			{
 | 
						|
				XmlNodeList nodeList;
 | 
						|
				string dname = null;
 | 
						|
				int indx;
 | 
						|
				if ((indx=dri.Name.IndexOf("."))>-1)
 | 
						|
				{
 | 
						|
					//must be *.prc, *.bck, *.dvt, *.sl? 
 | 
						|
					if (indx+4<=dri.Name.Length)
 | 
						|
					{
 | 
						|
						dname = "*." + dri.Name.Substring(indx+1,3).ToLower();
 | 
						|
						if (dname.StartsWith("*.sl"))
 | 
						|
							dname = dname.Substring(0,4) + "?";
 | 
						|
					}
 | 
						|
					else
 | 
						|
						dname = null;
 | 
						|
				}
 | 
						|
				else if ((indx=dri.Name.IndexOf("'"))>-1)
 | 
						|
				{
 | 
						|
					// bug fix B2006-047
 | 
						|
					// if not a .PRC folder, then we get an error looking up
 | 
						|
					// the directory name in XML (if it has an ' in the name)
 | 
						|
					dname = null;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					dname = dri.Name.ToLower();
 | 
						|
				}
 | 
						|
 | 
						|
 | 
						|
				if (dname!=null)
 | 
						|
				{
 | 
						|
					string xp = "descendant::ProcSet[Dir = \'" + dname + "\']";
 | 
						|
 | 
						|
					try
 | 
						|
					{
 | 
						|
						nodeList = sys.SelectNodes(xp);
 | 
						|
						foreach (XmlNode dirname in nodeList)
 | 
						|
						{
 | 
						|
							XmlElement dele=(XmlElement)dirname;
 | 
						|
							didone = ProcessDirName(dele, dri.Name, plntsecindx);
 | 
						|
							if (Children.Count > 0 && ChkForChldOnly) 
 | 
						|
							{
 | 
						|
								Cursor.Current = Cursors.Default;
 | 
						|
								return true;
 | 
						|
							}
 | 
						|
							// if a directory was found, see if any 
 | 
						|
							// subdirectories exist that need added too.
 | 
						|
							bool didsub = false;
 | 
						|
							if (didone) didsub = ProcessSubDir(subtop, dri.Name, dname, plntsecindx);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					catch (Exception e)
 | 
						|
					{
 | 
						|
						MessageBox.Show(e.Message.ToString());
 | 
						|
						Cursor.Current = Cursors.Default;
 | 
						|
						return false;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// if no children, change icon to empty (unless it has a lock icon)
 | 
						|
			if (Children.Count <=0 && Lock.LockStatus == VENetwork.Status.NoLock) icon = iconStates[(int)VEO_IconStates.Empty];
 | 
						|
			Cursor.Current = Cursors.Default;
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		// write out change (modification of title for plant) for plant to
 | 
						|
		// the menuwin.xml file
 | 
						|
		public override bool Write()
 | 
						|
		{
 | 
						|
 | 
						|
			string newtitle=null;
 | 
						|
			if (changeTitle)
 | 
						|
			{
 | 
						|
				newtitle = tmpTitle;
 | 
						|
				bool success = usrRunTime.ModMenuWin(newtitle, this._Title);
 | 
						|
				if (success==false)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Could not modify title for the plant.");
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
				MessageBox.Show("Please send \\ve-proms\\menuwin & \\ve-proms\\menuwin.xml files to Volian.");
 | 
						|
				_Title=newtitle;
 | 
						|
				changeTitle=false;
 | 
						|
			}
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		// create a new proc set object (child for this plant)
 | 
						|
		public override Object MakeNewChild()
 | 
						|
		{
 | 
						|
			if (!isOpen)Open();
 | 
						|
			VEO_ProcSet ps = new VEO_ProcSetN(usrRunTime,null,_Location);
 | 
						|
			return ps;	
 | 
						|
		}
 | 
						|
 | 
						|
		// save a new proc set (child for this plant)
 | 
						|
		public override bool SaveChild(Object obj)
 | 
						|
		{
 | 
						|
			VEO_ProcSetN ps = (VEO_ProcSetN) obj;
 | 
						|
			
 | 
						|
			// check for valid child
 | 
						|
			bool valid = ps.IsValid();
 | 
						|
			if (valid == false) return false;
 | 
						|
 | 
						|
			valid = ps.SaveNew("dummy");
 | 
						|
			if (valid == true)
 | 
						|
			{
 | 
						|
				// add this item to this plants list of children.
 | 
						|
				Children.Add((VEO_ProcSet)obj);
 | 
						|
				ps.parentObj=this;
 | 
						|
				ps._Location = this._Location + "\\" + ps._Location;
 | 
						|
				ps.icon=iconStates[0];
 | 
						|
				// if this plant's icon is 'empty', change it to either lock (if locked),
 | 
						|
				// or to not empty.
 | 
						|
				icon = iconStates[(int)Lock.LockStatus];
 | 
						|
				IsEmpty=false;
 | 
						|
			}
 | 
						|
			return valid;
 | 
						|
		}
 | 
						|
 | 
						|
		// save a new plant directory
 | 
						|
		public override bool SaveNew(string pth)
 | 
						|
		{
 | 
						|
 | 
						|
			// check for non-empty data.
 | 
						|
 | 
						|
			if (tmpLocation == null || tmpLocation == "" || tmpTitle == null || tmpTitle == "")
 | 
						|
			{
 | 
						|
				MessageBox.Show("Need to fill in all data.");
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			// for this new plant, make the directory and write out
 | 
						|
			// to the menuwin & menuwin.xml files.
 | 
						|
			
 | 
						|
			// if using the file browser dialog, the drive may be included, if so
 | 
						|
			// check that the directory matches the datapath.
 | 
						|
			int slash = tmpLocation.LastIndexOf("\\");
 | 
						|
			if (slash>0)
 | 
						|
			{
 | 
						|
				string drvtmp = tmpLocation.Substring(0,slash+1);
 | 
						|
				ShortName sname = new ShortName(drvtmp);
 | 
						|
				string drv=sname.ShortFileName;
 | 
						|
				sname = null;
 | 
						|
				if (drv.ToUpper() != pth.ToUpper()) 
 | 
						|
				{
 | 
						|
					MessageBox.Show("Invalid path, directory must match datapath");
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
				// remove the drive part of the path, it's added back later.
 | 
						|
				tmpLocation = tmpLocation.Substring(slash+1,tmpLocation.Length-(slash+1));
 | 
						|
			}
 | 
						|
 | 
						|
			// check for ve*
 | 
						|
			if (tmpLocation.Substring(0,2).ToUpper() != "VE")
 | 
						|
			{
 | 
						|
				MessageBox.Show("First two characters must be 'VE' for new plant directory name.");
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			// also check that the name is not greater than 8 characters (an old 16-bit hangover)
 | 
						|
			if (tmpLocation.Length>8)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Directory/plant name must be 8 characters or less.");
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			// make path to new directory & check for existence.
 | 
						|
			string curpath=null;
 | 
						|
			curpath = pth + "\\" + this.tmpLocation;
 | 
						|
			DirectoryInfo cur = new DirectoryInfo(curpath);
 | 
						|
 | 
						|
			if (cur.Exists )
 | 
						|
			{
 | 
						|
				DirectoryInfo[] di = cur.GetDirectories("*");
 | 
						|
				FileInfo[] fi = cur.GetFiles("*");
 | 
						|
				if (di.Length>0 || fi.Length>0)
 | 
						|
				{
 | 
						|
					MessageBox.Show("The plant directory you specified already exists & has contents. Enter a different name.");
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// if the directory exists & it is already in the menu file, it didn't succeed
 | 
						|
			// in adding the new item.
 | 
						|
			if (cur.Exists && (usrRunTime.IsInMenuWin(this.tmpLocation)!=0))
 | 
						|
			{
 | 
						|
				MessageBox.Show("The plant directory you specified already exists and the plant name exists in the menu files.");
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			try
 | 
						|
			{
 | 
						|
				if (cur.Exists == false)cur.Create();
 | 
						|
			}
 | 
						|
			catch (Exception e)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Error creating directory: " + e.Message);
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			// now add to end of menuwin & menuwin.xml.
 | 
						|
			bool success = usrRunTime.AddToMenuWin(this.tmpTitle,this.tmpLocation);
 | 
						|
			if (success==false)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Could not add directory to ve-proms menuing files. Could not create plant directory.");
 | 
						|
				cur.Delete();
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
			MessageBox.Show("The VE-PROMS Security Access Module (VESAM) may need to be used to set permissions to access the new plant.");
 | 
						|
			_Title=tmpTitle;
 | 
						|
			_Location=tmpLocation;
 | 
						|
			changeTitle=false;
 | 
						|
			changeLocation=false;
 | 
						|
			// set a security flag for this. Cases could be that there is no security in vesam,
 | 
						|
			// that it has security in vesam, though it didn't exist for this user until now, 
 | 
						|
			// or the user could be super user.
 | 
						|
			accessFlags=0L;
 | 
						|
			int idx = usrRunTime.sec.GetPlantSecurityIndex(curpath);
 | 
						|
			accessFlags = usrRunTime.sec.GetPlantSecurity(idx);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		public override void DoListView(ListView veoListView)
 | 
						|
		{
 | 
						|
			ListViewItem item=null;
 | 
						|
			veoListView.Columns.Add("Location", 120, HorizontalAlignment.Left);
 | 
						|
			veoListView.Columns.Add("Title", 300, HorizontalAlignment.Left);
 | 
						|
			
 | 
						|
			for (int i=0; i<Children.Count; i++)
 | 
						|
			{
 | 
						|
				VEO_ProcSet ps = (VEO_ProcSet) Children[i];
 | 
						|
				item = new ListViewItem(ps._Location,ps.icon);
 | 
						|
				item.Tag = ps;
 | 
						|
				item.SubItems.Add(ps._Title);
 | 
						|
				veoListView.Items.Add(item);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		public override bool CollapseSibling()
 | 
						|
		{
 | 
						|
			if (!usrRunTime.InMultiUserMode) return false;
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		public override bool mnuAllowLckDB()
 | 
						|
		{
 | 
						|
			if (!usrRunTime.InMultiUserMode) return false;
 | 
						|
			//if (amILockedByMe()==true) return false;
 | 
						|
			if (Lock.LockStatus==VENetwork.Status.LockedByOther)return false;
 | 
						|
			// if there are no children, allow a lock in case the user is creating a plant level
 | 
						|
			// with procedure set			
 | 
						|
			if (this.Children.Count==0) return true;
 | 
						|
			if ((accessFlags&Security.LOCKSET)==Security.LOCKSET && Lock.LockStatus==VENetwork.Status.NoLock) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		public override bool mnuAllowUnlckDB()
 | 
						|
		{
 | 
						|
			if (!usrRunTime.InMultiUserMode) return false;
 | 
						|
			if ((accessFlags&Security.LOCKSET)==Security.LOCKSET&&(Lock.LockStatus==VENetwork.Status.Locked||
 | 
						|
				Lock.LockStatus==VENetwork.Status.LockPending)) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		public override bool mnuAllowDelete()
 | 
						|
		{
 | 
						|
			if (amILockedByMe()==false) return false;
 | 
						|
			if(usrRunTime.sec.SystemAdminFlag) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		public override bool mnuAllowNew()
 | 
						|
		{
 | 
						|
			if (amILockedByMe()==false) return false;
 | 
						|
			if (usrRunTime.sec.PermissionToManageFlag) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		public override bool canEdit()
 | 
						|
		{
 | 
						|
			if (amILockedByMe()==false) return false;
 | 
						|
			if(usrRunTime.sec.SystemAdminFlag) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// the following class is used to support the New plant option from the 'Properties'
 | 
						|
	// dialog by making location to be editable.
 | 
						|
	class VEO_PlantN : VEO_Plant
 | 
						|
	{
 | 
						|
		public VEO_PlantN(UserRunTime iusrRunTime, string ititle, string ipath)
 | 
						|
			: base(iusrRunTime, ititle, ipath)
 | 
						|
		{
 | 
						|
			isNew=true;
 | 
						|
		}
 | 
						|
		
 | 
						|
		// this method is used so that if a new datapath is created, it is associated
 | 
						|
		// with editable properties (such as path). When the object exists this is
 | 
						|
		// not editable. So when a new object is created, if it's successful, it's
 | 
						|
		// copied to an object which is not editable for the treeview & any further
 | 
						|
		// operations.
 | 
						|
		public override Object Copy()
 | 
						|
		{
 | 
						|
			VEO_Plant plnt = new VEO_Plant(usrRunTime,this._Title,this._Location);
 | 
						|
			plnt.parentObj = this.parentObj;
 | 
						|
			plnt.accessFlags = this.accessFlags;
 | 
						|
			return (Object) plnt;
 | 
						|
		}
 | 
						|
 | 
						|
		public void SaveFields()
 | 
						|
		{
 | 
						|
			_Location=tmpLocation;
 | 
						|
			_Title=tmpTitle;
 | 
						|
			changeLocation=false;
 | 
						|
			changeTitle=false;
 | 
						|
 | 
						|
		}
 | 
						|
		[Description("Location"),Category("Plant"),ReadOnly(false),EditorAttribute(typeof(VECreateFolderBrowserDlg), typeof(System.Drawing.Design.UITypeEditor))]public new string Location
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				if (!changeLocation)
 | 
						|
					return _Location;
 | 
						|
				else
 | 
						|
					return tmpLocation;
 | 
						|
			}
 | 
						|
			set
 | 
						|
			{
 | 
						|
				changeLocation=true;
 | 
						|
				tmpLocation=value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |