1671 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1671 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: ctlXMLEdit.cs $     $Revision: 36 $
 | 
						|
 * $Author: Jsj $   $Date: 7/06/06 9:32a $
 | 
						|
 *
 | 
						|
 * $History: ctlXMLEdit.cs $
 | 
						|
 * 
 | 
						|
 * *****************  Version 36  *****************
 | 
						|
 * User: Jsj          Date: 7/06/06    Time: 9:32a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * needed full path to read ROAPP.INI
 | 
						|
 * 
 | 
						|
 * *****************  Version 35  *****************
 | 
						|
 * User: Jsj          Date: 5/03/05    Time: 11:44a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * 
 | 
						|
 * *****************  Version 34  *****************
 | 
						|
 * User: Jsj          Date: 7/02/03    Time: 9:26a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * made messagebox calls modal by removing the parent window reference
 | 
						|
 * 
 | 
						|
 * *****************  Version 33  *****************
 | 
						|
 * User: Kathy        Date: 6/11/03    Time: 2:01p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Bug fix B2003-045 (save date as part of graphic)
 | 
						|
 * 
 | 
						|
 * *****************  Version 32  *****************
 | 
						|
 * User: Kathy        Date: 5/21/03    Time: 12:41p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * B2003-036: save of group data to ro if both have a common field
 | 
						|
 * 
 | 
						|
 * *****************  Version 31  *****************
 | 
						|
 * User: Kathy        Date: 2/07/03    Time: 11:19a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Error on pathname compares if long filename
 | 
						|
 * 
 | 
						|
 * *****************  Version 30  *****************
 | 
						|
 * User: Kathy        Date: 2/03/03    Time: 10:36a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * UI Improve
 | 
						|
 * 
 | 
						|
 * *****************  Version 29  *****************
 | 
						|
 * User: Kathy        Date: 1/22/03    Time: 12:17p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * duplicate/save as bug
 | 
						|
 * 
 | 
						|
 * *****************  Version 28  *****************
 | 
						|
 * User: Kathy        Date: 1/15/03    Time: 1:56p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * sizing of labels & form
 | 
						|
 * 
 | 
						|
 * *****************  Version 27  *****************
 | 
						|
 * User: Kathy        Date: 1/08/03    Time: 10:05a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Add view image
 | 
						|
 * 
 | 
						|
 * *****************  Version 26  *****************
 | 
						|
 * User: Jsj          Date: 1/06/03    Time: 11:29a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * INI file logic
 | 
						|
 * 
 | 
						|
 * *****************  Version 25  *****************
 | 
						|
 * User: Jsj          Date: 1/02/03    Time: 3:47p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Added logic to check INI files for default graphics file extension
 | 
						|
 * 
 | 
						|
 * *****************  Version 24  *****************
 | 
						|
 * User: Jsj          Date: 12/17/02   Time: 4:51p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fixed date/time for graphic files
 | 
						|
 * 
 | 
						|
 * *****************  Version 23  *****************
 | 
						|
 * User: Kathy        Date: 12/16/02   Time: 12:11p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * once data is saved, don't flag it as changed
 | 
						|
 * 
 | 
						|
 * *****************  Version 22  *****************
 | 
						|
 * User: Kathy        Date: 12/13/02   Time: 10:05a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * bugs with combo (& more than one field with data)
 | 
						|
 * 
 | 
						|
 * *****************  Version 21  *****************
 | 
						|
 * User: Jsj          Date: 12/10/02   Time: 3:35p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Default Graphic file extension fix
 | 
						|
 * 
 | 
						|
 * *****************  Version 20  *****************
 | 
						|
 * User: Kathy        Date: 12/10/02   Time: 2:24p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fieldname special chars
 | 
						|
 * 
 | 
						|
 * *****************  Version 19  *****************
 | 
						|
 * User: Kathy        Date: 12/02/02   Time: 8:28a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fieldname replace chars
 | 
						|
 * 
 | 
						|
 * *****************  Version 18  *****************
 | 
						|
 * User: Kathy        Date: 11/26/02   Time: 11:08a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fix required bug on combo type & fix improve sizing
 | 
						|
 * 
 | 
						|
 * *****************  Version 17  *****************
 | 
						|
 * User: Kathy        Date: 11/20/02   Time: 11:36a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * zoom button moved on main form
 | 
						|
 * 
 | 
						|
 * *****************  Version 16  *****************
 | 
						|
 * User: Kathy        Date: 11/19/02   Time: 11:33a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * zoom tool tip & tab order
 | 
						|
 * 
 | 
						|
 * *****************  Version 15  *****************
 | 
						|
 * User: Kathy        Date: 10/24/02   Time: 11:15a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * some image file date (still needs fixed)
 | 
						|
 * 
 | 
						|
 * *****************  Version 14  *****************
 | 
						|
 * User: Kathy        Date: 10/15/02   Time: 2:14p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * required fields bug
 | 
						|
 * 
 | 
						|
 * *****************  Version 13  *****************
 | 
						|
 * User: Kathy        Date: 10/11/02   Time: 11:35a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * Required fields & restore data
 | 
						|
 * 
 | 
						|
 * *****************  Version 12  *****************
 | 
						|
 * User: Kathy        Date: 10/10/02   Time: 10:43a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * console.writeline->messagebox
 | 
						|
 * 
 | 
						|
 * *****************  Version 11  *****************
 | 
						|
 * User: Kathy        Date: 10/07/02   Time: 11:26a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * graphics image file support
 | 
						|
 * 
 | 
						|
 * *****************  Version 10  *****************
 | 
						|
 * User: Kathy        Date: 9/27/02    Time: 1:12p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fix digit as first char in fieldname
 | 
						|
 * 
 | 
						|
 * *****************  Version 9  *****************
 | 
						|
 * User: Jsj          Date: 9/26/02    Time: 12:12p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * removed reference
 | 
						|
 * 
 | 
						|
 * *****************  Version 8  *****************
 | 
						|
 * User: Jsj          Date: 9/26/02    Time: 11:09a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * added reference to VLNXML
 | 
						|
 * 
 | 
						|
 * *****************  Version 7  *****************
 | 
						|
 * User: Kathy        Date: 9/25/02    Time: 9:54a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * remove xmlvln
 | 
						|
 * 
 | 
						|
 * *****************  Version 6  *****************
 | 
						|
 * User: Kathy        Date: 9/19/02    Time: 9:59a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * fix minor bugs
 | 
						|
 * 
 | 
						|
 * *****************  Version 5  *****************
 | 
						|
 * User: Kathy        Date: 9/11/02    Time: 1:13p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * vlnxml
 | 
						|
 * 
 | 
						|
 * *****************  Version 4  *****************
 | 
						|
 * User: Kathy        Date: 9/10/02    Time: 12:17p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * modify xpath expression to find field contents
 | 
						|
 * 
 | 
						|
 * *****************  Version 3  *****************
 | 
						|
 * User: Kathy        Date: 9/05/02    Time: 12:41p
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * dev
 | 
						|
 * 
 | 
						|
 * *****************  Version 2  *****************
 | 
						|
 * User: Kathy        Date: 8/30/02    Time: 9:42a
 | 
						|
 * Updated in $/LibSource/ctlXMLEditLib
 | 
						|
 * dev
 | 
						|
 * 
 | 
						|
 * *****************  Version 1  *****************
 | 
						|
 * User: Jsj          Date: 8/23/02    Time: 3:02p
 | 
						|
 * Created in $/LibSource/ctlXMLEditLib
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Collections;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
using System.Data;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Drawing.Imaging;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
using System.Xml;
 | 
						|
using System.Xml.Schema;
 | 
						|
using System.Text;
 | 
						|
using RODBInterface;
 | 
						|
using Org.Mentalis.Files;
 | 
						|
//using IniFileIO;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
namespace ctlXMLEditLib
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// This windows control takes an input XML Schema and displays windows controls for the
 | 
						|
	/// schema elements.
 | 
						|
	/// If XML is also passed in, it uses that for the data.
 | 
						|
	/// Methods supported are:
 | 
						|
	///    ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema)
 | 
						|
	///			Constructor - VlnXmlElement contains data for edit and contains top
 | 
						|
	///						- document node if creating new xml data.
 | 
						|
	///						- XmlSchema contains field definitions
 | 
						|
	///	   bool SaveData 
 | 
						|
	///						- saves data in windows into passed in VlnXmlElement. 
 | 
						|
	///						-    returns true if successful, false if failed.
 | 
						|
	///	  
 | 
						|
	///    
 | 
						|
	/// </summary>
 | 
						|
	public class ctlXMLEdit : System.Windows.Forms.UserControl
 | 
						|
	{
 | 
						|
		/// <summary>
 | 
						|
		/// Required designer variable.
 | 
						|
		/// </summary>
 | 
						|
		private System.ComponentModel.Container components = null;
 | 
						|
		private Random random = new Random();
 | 
						|
		private XmlSchema myXmlSchema;
 | 
						|
		private int screenx;
 | 
						|
		private int screeny;
 | 
						|
		private int tabindx;
 | 
						|
		private bool mysavexml;
 | 
						|
		private Hashtable myHT;
 | 
						|
		private bool dosaveflag;
 | 
						|
		private VlnXmlElement editelem;
 | 
						|
		private XmlDocument editdoc;
 | 
						|
		private TextBox zoomtextbox;
 | 
						|
		// the following is used for handling images. Note that if we want to have more
 | 
						|
		// than one image defined in an ro, this should be become a list.
 | 
						|
		private TextBox GraphicsFiletextbox;
 | 
						|
		private TextBox GraphicsWdtextbox;
 | 
						|
		private TextBox GraphicsHttextbox;
 | 
						|
		private System.Windows.Forms.Button btnFindFile;
 | 
						|
		private string GraphicsText;
 | 
						|
		private ToolTip zmtooltip;
 | 
						|
		private string DefaultGraphicFileExtension;
 | 
						|
		int MaxWidth; // largest textbox/groupbox width to size control.
 | 
						|
		int himage, wimage;
 | 
						|
		int hmin, hmax;
 | 
						|
		int wmin, wmax;
 | 
						|
		int MAXLT = 60;  // make these defines
 | 
						|
		int MAXWT = 84;
 | 
						|
		int STDCPI = 12;
 | 
						|
		int STDLPI = 6;
 | 
						|
		int DPPL = (720/6);
 | 
						|
		int DPPC = (720/12);
 | 
						|
		int height, width;
 | 
						|
		
 | 
						|
		// use this struct to define attributes for the text box fields, storing
 | 
						|
		// the pattern, radio button association, required field flag, etc.
 | 
						|
		struct TextBoxAttrTag
 | 
						|
		{
 | 
						|
 | 
						|
			bool required;		//whether the field is required
 | 
						|
			string req_msg;		//message to print if required, but not set
 | 
						|
			string pattern;		//pattern for validation
 | 
						|
			RadioButton radio;	// if this text box has associated radio button
 | 
						|
			bool imagechild;	//whether this field is a subchild of an image
 | 
						|
			string imagename;	//if subchild of image, name of image parent (for save)
 | 
						|
			string imagedate;   //if this was filename, save the date/time stamp
 | 
						|
			public TextBoxAttrTag(bool reqd, string ptn, RadioButton rd, bool img, 
 | 
						|
				string imgname, string imgdate) 
 | 
						|
			{
 | 
						|
				this.req_msg = null;
 | 
						|
				this.required = reqd;
 | 
						|
				this.pattern = ptn;
 | 
						|
				this.radio = rd;
 | 
						|
				this.imagechild = img;
 | 
						|
				this.imagename = imgname;
 | 
						|
				this.imagedate = imgdate;
 | 
						|
			}
 | 
						|
			public void SetPattern(string pattern) {this.pattern = pattern;}
 | 
						|
			public void SetRequired(bool req) {this.required = req;}
 | 
						|
			public void SetRequiredMessage(string ireq_msg) {this.req_msg = ireq_msg;}
 | 
						|
			public string GetPattern { get {return pattern;}}
 | 
						|
			public string GetRequiredMessage { get {return req_msg;}}
 | 
						|
			public bool GetRequired { get {return required;}}
 | 
						|
			public RadioButton GetRadio { get {return radio;}}
 | 
						|
			public bool GetImageChild { get {return imagechild;}}
 | 
						|
			public string GetImageName { get {return imagename;}}
 | 
						|
			public string GetImageDate { get {return imagedate;}}
 | 
						|
			public void SetImageDate(string imgdate) {this.imagedate = imgdate;}
 | 
						|
		}
 | 
						|
 | 
						|
		public ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema, ArrayList reqfields)
 | 
						|
		{
 | 
						|
			// This call is required by the Windows.Forms Form Designer.
 | 
						|
			InitializeComponent();
 | 
						|
			zmtooltip = new ToolTip();
 | 
						|
			myHT = new Hashtable();
 | 
						|
			tabindx=0;
 | 
						|
			screenx=8;
 | 
						|
			screeny=10;
 | 
						|
			MaxWidth = 0;
 | 
						|
			mysavexml = false;
 | 
						|
			dosaveflag = false;
 | 
						|
			editelem = myelem;
 | 
						|
			editdoc = myelem.OwnerDocument;
 | 
						|
			myXmlSchema = myschema;
 | 
						|
			GraphicsText = null;
 | 
						|
			GraphicsFiletextbox = null;
 | 
						|
//			DefaultGraphicFileExtension = ".TIF"; // default graphics file extension
 | 
						|
			string ApplicationPath = Application.StartupPath;
 | 
						|
			string ROINI = Directory.GetCurrentDirectory()+ "\\ROAPP.INI";
 | 
						|
 | 
						|
			// Get the default file extension for graphic files
 | 
						|
//			DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("ROApp","Extention","",5,"ROAPP.INI");
 | 
						|
			// Bug fix: B2006-025
 | 
						|
			//  needed to pass the full path of ROAPP.INI
 | 
						|
			IniReader in1 = new IniReader(ROINI);
 | 
						|
			DefaultGraphicFileExtension = in1.ReadString("ROApp","Extention","");
 | 
						|
			if (DefaultGraphicFileExtension.Equals(""))
 | 
						|
			{
 | 
						|
				string ApplPathUp = ApplicationPath.ToUpper();
 | 
						|
				int idx = ApplPathUp.IndexOf("VE-PROMS.NET\\BIN");
 | 
						|
				if (idx >= 0)
 | 
						|
				{
 | 
						|
					string PromsINI = ApplicationPath.Substring(0, idx);
 | 
						|
					PromsINI += "VE-PROMS\\VEPROMS.INI";
 | 
						|
					IniReader in2 = new IniReader(PromsINI);
 | 
						|
					DefaultGraphicFileExtension = in2.ReadString("Graphics", "defaultext", ".TIF");
 | 
						|
				}
 | 
						|
				else
 | 
						|
					DefaultGraphicFileExtension = ".TIF";
 | 
						|
			}
 | 
						|
//			if (File.Exists(PromsINI))
 | 
						|
//				DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("Graphics","defaultext",".TIF",5,PromsINI);
 | 
						|
//			if (File.Exists("ROAPP.INI"))
 | 
						|
//				DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("ROApp","Extention",".TIF",5,"ROAPP.INI");
 | 
						|
			if (!DefaultGraphicFileExtension.StartsWith("."))
 | 
						|
				DefaultGraphicFileExtension = "." + DefaultGraphicFileExtension;
 | 
						|
 | 
						|
			// Put out window fields based on schema fields.
 | 
						|
			DisplaySchemaControls(myXmlSchema);
 | 
						|
 | 
						|
			// Add field data to fields.
 | 
						|
			DisplayFieldContents((XmlNode) myelem);
 | 
						|
 | 
						|
			// Set required fields based on list. (can add message later).
 | 
						|
			SetRequiredFields(reqfields);
 | 
						|
			dosaveflag=true;
 | 
						|
		}
 | 
						|
 | 
						|
		// set the required fields tag on those fields which are included in the passed
 | 
						|
		// in required fields list.
 | 
						|
		private void DoSet(TextBox hwnd, string msg)
 | 
						|
		{
 | 
						|
			if (hwnd == null) return;
 | 
						|
			if (hwnd.Tag != null)
 | 
						|
			{
 | 
						|
				TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
				tag.SetRequired(true);
 | 
						|
				tag.SetRequiredMessage(msg);
 | 
						|
				hwnd.Tag = tag;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void SetRequiredFields(ArrayList reqfields)
 | 
						|
		{
 | 
						|
			Object o;
 | 
						|
			TextBox hwnd;
 | 
						|
			string field, msg;
 | 
						|
			int indx;
 | 
						|
			foreach (string strfld in reqfields)
 | 
						|
			{
 | 
						|
				indx = strfld.IndexOf("\t");   // message is stored after field, tab delim
 | 
						|
				field = strfld.Substring(0,indx);
 | 
						|
				msg = strfld.Substring(indx,strfld.Length-indx);
 | 
						|
 | 
						|
				o = null;
 | 
						|
				o = myHT[field];
 | 
						|
				if (o == null)
 | 
						|
				{
 | 
						|
					// there may be an a,b,c,d tacked on to represent combo types.
 | 
						|
					// try them. if we have a combo type, then set them all as required
 | 
						|
					// because the checker will only check the one that is visible.
 | 
						|
					o = myHT[field+"a"];
 | 
						|
					if (o != null)   // set all combo types required, the checker
 | 
						|
					{
 | 
						|
						DoSet((TextBox)o,msg);
 | 
						|
						DoSet((TextBox)myHT[field+"b"],msg);
 | 
						|
						DoSet((TextBox)myHT[field+"c"],msg);
 | 
						|
						DoSet((TextBox)myHT[field+"d"],msg);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else if (o != null)
 | 
						|
				{
 | 
						|
					hwnd = (TextBox) o;
 | 
						|
					if (hwnd.Tag != null)
 | 
						|
					{
 | 
						|
						TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
						tag.SetRequired(true);
 | 
						|
						tag.SetRequiredMessage(msg);
 | 
						|
						hwnd.Tag = tag;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Given a parent XmlNode, walk through the child nodes & add the text for the
 | 
						|
		// node to the associated text box.
 | 
						|
		private void DisplayFieldContents(XmlNode node)
 | 
						|
		{
 | 
						|
			Object o;
 | 
						|
			TextBox hwnd;
 | 
						|
			XmlNode nd;
 | 
						|
			// if we have an image, check it for validity, i.e. file exists, etc.??
 | 
						|
			foreach (string str in myHT.Keys)
 | 
						|
			{
 | 
						|
				o = myHT[str];
 | 
						|
				hwnd = (TextBox) o;
 | 
						|
				nd = node.SelectSingleNode(str);
 | 
						|
				// if not found with just the string, search the tree.
 | 
						|
				if (nd==null)nd = node.SelectSingleNode("*/"+str);
 | 
						|
				if (nd != null)
 | 
						|
				{	
 | 
						|
					hwnd.Text = nd.InnerText;   // set the field's text from XML
 | 
						|
 | 
						|
					// check if this window has a button name as part of its tag. If
 | 
						|
					// so it's a combo type & the radio button/visibility may need to
 | 
						|
					// be reset. If this button is not checked (during setup), then
 | 
						|
					// check it. By setting it's Checked property to true, an event
 | 
						|
					// is thrown which causes the code to be run which turns off/on
 | 
						|
					// visibility of the text boxes.
 | 
						|
					if (hwnd.Tag != null)
 | 
						|
					{
 | 
						|
						TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
						RadioButton radio;
 | 
						|
						radio = tag.GetRadio;
 | 
						|
						
 | 
						|
						if (radio != null )
 | 
						|
						{
 | 
						|
							// Use a tag on the groupbox to know that the radio button
 | 
						|
							// was set - the first xml element in the group is the
 | 
						|
							// active one.
 | 
						|
							GroupBox gp = (GroupBox) radio.Parent;
 | 
						|
							if (gp.Tag == null && radio.Checked == false)
 | 
						|
							{
 | 
						|
								// see if this is the first member of the group in the 
 | 
						|
								// xml node.
 | 
						|
								string nmgr = str.Substring(0,str.Length-1);
 | 
						|
								XmlNode grpnd = (XmlNode) editelem.FirstChild;
 | 
						|
								bool first = true;
 | 
						|
								while (grpnd != null)
 | 
						|
								{
 | 
						|
									if (grpnd.Name.Substring(0,grpnd.Name.Length-1) == nmgr)
 | 
						|
									{
 | 
						|
										if (grpnd.Name == str)
 | 
						|
										{
 | 
						|
											if (first)
 | 
						|
											{
 | 
						|
												radio.Checked = true;
 | 
						|
												radio.Parent.Tag = true;
 | 
						|
											}
 | 
						|
											break;
 | 
						|
										}
 | 
						|
										first = false;
 | 
						|
									}
 | 
						|
									grpnd = grpnd.NextSibling;
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
						bool img;
 | 
						|
						img = tag.GetImageChild;
 | 
						|
						if (img==true && str == "Image_Filename")
 | 
						|
						{
 | 
						|
							int indx = hwnd.Text.IndexOf(" ");
 | 
						|
							if (indx>=0)
 | 
						|
							{
 | 
						|
								tag.SetImageDate(hwnd.Text.Substring(0,indx));
 | 
						|
								hwnd.Tag = tag;
 | 
						|
								hwnd.Text = hwnd.Text.Substring(indx+1,hwnd.Text.Length-indx-1);
 | 
						|
							}
 | 
						|
						}
 | 
						|
						if (img==true && str == "Image_Width")
 | 
						|
							width = System.Convert.ToInt32(hwnd.Text);
 | 
						|
						if (img==true && str == "Image_Height")
 | 
						|
							height = System.Convert.ToInt32(hwnd.Text);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// if we're doing an image file & all data has been set, update the
 | 
						|
			// height/width data of the image.
 | 
						|
			if (GraphicsFiletextbox != null && GraphicsFiletextbox.Text != "") UpdateHtWd();
 | 
						|
		}
 | 
						|
		public TextBox GetGraphicsFiletextbox()
 | 
						|
		{
 | 
						|
			return GraphicsFiletextbox;
 | 
						|
		}
 | 
						|
		public int GetMaxWidth()
 | 
						|
		{
 | 
						|
			// if MaxWidth is small, a scroll bar appears below the fields
 | 
						|
			// so make this a bit larger, so a scroll bar doesn't appear
 | 
						|
			if (MaxWidth<30) return MaxWidth+60;
 | 
						|
			return MaxWidth+30;
 | 
						|
		}
 | 
						|
		public int GetMaxLength()
 | 
						|
		{
 | 
						|
			return screeny+50;
 | 
						|
		}
 | 
						|
		public void SetNotSaved()
 | 
						|
		{
 | 
						|
			mysavexml = true;
 | 
						|
		}
 | 
						|
		/// <summary>
 | 
						|
		/// Clean up any resources being used.
 | 
						|
		/// </summary>
 | 
						|
		protected override void Dispose( bool disposing )
 | 
						|
		{
 | 
						|
			zmtooltip.RemoveAll();
 | 
						|
			if( disposing )
 | 
						|
			{
 | 
						|
				if( components != null )
 | 
						|
					components.Dispose();
 | 
						|
			}
 | 
						|
			base.Dispose( disposing );			
 | 
						|
		}
 | 
						|
 | 
						|
		// RestoreData restores the data in the text boxes to be that which was originally 
 | 
						|
		// sent into the control (ctlXMLEdit)
 | 
						|
		public void RestoreData()
 | 
						|
		{
 | 
						|
			dosaveflag=false;
 | 
						|
			mysavexml=false;
 | 
						|
			TextBox hwnd;
 | 
						|
			// first, clear out all of the text boxes.
 | 
						|
 | 
						|
			foreach (string str in myHT.Keys)
 | 
						|
			{
 | 
						|
				object o = myHT[str];
 | 
						|
				hwnd = (TextBox) o;
 | 
						|
				hwnd.Text = "";
 | 
						|
				TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
				RadioButton radio;
 | 
						|
				radio = tag.GetRadio;		
 | 
						|
				if (radio != null )
 | 
						|
				{
 | 
						|
					GroupBox gp = (GroupBox) radio.Parent;
 | 
						|
					gp.Tag = null;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// Add field data to fields.
 | 
						|
			DisplayFieldContents((XmlNode) editelem);
 | 
						|
			dosaveflag=true;
 | 
						|
		}
 | 
						|
 | 
						|
		public bool DataChanged()
 | 
						|
		{
 | 
						|
			if (mysavexml) return true;
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		// SaveData saves the data in the element which had been sent to the control. Return
 | 
						|
		// true if success, false if fail.
 | 
						|
		public bool SaveData()
 | 
						|
		{
 | 
						|
 | 
						|
			if (mysavexml) 
 | 
						|
			{				
 | 
						|
				TextBox hwnd;
 | 
						|
				TextBoxAttrTag tag;
 | 
						|
				string imgdate;
 | 
						|
 | 
						|
				//go thru the hash table to get textboxes. Find the ones that have text.
 | 
						|
				foreach (string str in myHT.Keys)
 | 
						|
				{
 | 
						|
					object o = myHT[str];
 | 
						|
					hwnd = (TextBox) o;
 | 
						|
					imgdate = null;
 | 
						|
 | 
						|
					// if this is a required field and there is no text, put out an error
 | 
						|
					// message and get out of here.
 | 
						|
					if (hwnd.Tag != null)
 | 
						|
					{
 | 
						|
						tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
						if (tag.GetRequired == true && hwnd.Visible == true && (hwnd.Text == null || hwnd.Text == ""))
 | 
						|
						{
 | 
						|
							string message = CvtFldToUserFld(str) + " must be entered because it is\nused to define the " + tag.GetRequiredMessage;
 | 
						|
							string caption = "Error on Save RO Data";
 | 
						|
							MessageBoxButtons buttons = MessageBoxButtons.OK;
 | 
						|
							DialogResult result;
 | 
						|
							result = MessageBox.Show(message, caption, buttons);
 | 
						|
							return (false);
 | 
						|
						}
 | 
						|
						imgdate = tag.GetImageDate;
 | 
						|
						
 | 
						|
					}
 | 
						|
					
 | 
						|
					// find the element in the current element node. 
 | 
						|
					// if text exists and the element exists, just reset the innertext. 
 | 
						|
					// if text exists and it's a new element, add it.
 | 
						|
					// if the element is there and there's no text. delete it.
 | 
						|
					XmlNode elmnode = (XmlNode) editelem;
 | 
						|
					XmlNode nd = elmnode.SelectSingleNode(str);
 | 
						|
					if (nd == null) nd = elmnode.SelectSingleNode("*/"+str);
 | 
						|
 | 
						|
					// handle, element exists - but text removed first (delete element)
 | 
						|
					if ((hwnd.Text == null || hwnd.Text == "") && nd != null)
 | 
						|
					{
 | 
						|
						XmlNode parent = nd.ParentNode;
 | 
						|
						parent.RemoveChild(nd);
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						// found the node, just set text and text exists, just modify text.
 | 
						|
						if (nd != null)
 | 
						|
						{
 | 
						|
							if (str == "Image_Filename")
 | 
						|
								nd.InnerText = imgdate + " " + hwnd.Text;
 | 
						|
							else
 | 
						|
								nd.InnerText = hwnd.Text;
 | 
						|
						}
 | 
						|
							// node not here. Make a new element
 | 
						|
						else if (hwnd.Text != null && hwnd.Text != "")
 | 
						|
						{	
 | 
						|
							// if this is part of an image, then be sure that the
 | 
						|
							// parent image node was created and if not, create it.
 | 
						|
							bool ischldimag = false;
 | 
						|
							if (hwnd.Tag != null)
 | 
						|
							{
 | 
						|
								tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
								if (tag.GetImageChild == true) ischldimag = true;
 | 
						|
							}
 | 
						|
							if (ischldimag)
 | 
						|
							{
 | 
						|
								tag = (TextBoxAttrTag) hwnd.Tag;   // yikes, compile errors
 | 
						|
								string imagnm = tag.GetImageName;
 | 
						|
								VlnXmlElement ielm;
 | 
						|
								VlnXmlElement newelem;
 | 
						|
								nd = elmnode.SelectSingleNode(imagnm);
 | 
						|
								if (nd == null) // make this image node.
 | 
						|
								{
 | 
						|
									newelem = (VlnXmlElement) editdoc.CreateElement(imagnm);
 | 
						|
									editelem.AppendChild((XmlNode) newelem);
 | 
						|
									ielm = newelem;
 | 
						|
								}
 | 
						|
								else
 | 
						|
									ielm = (VlnXmlElement) nd;
 | 
						|
								newelem = (VlnXmlElement) editdoc.CreateElement(str);
 | 
						|
								if (str == "Image_Filename")
 | 
						|
									newelem.InnerText = imgdate + " " + hwnd.Text;
 | 
						|
								else
 | 
						|
									newelem.InnerText = hwnd.Text;
 | 
						|
								ielm.AppendChild((XmlNode) newelem);
 | 
						|
							}
 | 
						|
							else
 | 
						|
							{
 | 
						|
								// just added at the current level
 | 
						|
								VlnXmlElement newelem = (VlnXmlElement) editdoc.CreateElement(str);
 | 
						|
								newelem.InnerText = hwnd.Text;
 | 
						|
								editelem.AppendChild((XmlNode) newelem);
 | 
						|
								nd = (XmlNode) newelem;
 | 
						|
							}
 | 
						|
						}
 | 
						|
						// check on order of combo types if this was one. Note that the 'active'
 | 
						|
						// type within the combo, i.e. text, variable, table or xyplot, must
 | 
						|
						// be the first one in xml tree (before the others) in order to be the 
 | 
						|
						// active one as presented to user. This was done since more than one can have data.
 | 
						|
						if (hwnd.Tag != null)
 | 
						|
						{
 | 
						|
							tag = (TextBoxAttrTag) hwnd.Tag;
 | 
						|
							RadioButton rb = tag.GetRadio;
 | 
						|
							if (rb != null)
 | 
						|
							{
 | 
						|
								if (rb.Checked == true)
 | 
						|
								{
 | 
						|
									// this one needs to be before any others (of the same
 | 
						|
									// group type) in the xml childlist - just make it 1st.
 | 
						|
									XmlNode parent = nd.ParentNode;
 | 
						|
									parent.RemoveChild(nd);
 | 
						|
									parent.PrependChild(nd);										
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
				mysavexml=false;   // data has been saved, don't allow it again.
 | 
						|
				return(true);
 | 
						|
			}
 | 
						|
			return (false);
 | 
						|
		}
 | 
						|
 | 
						|
		#region Component Designer generated code
 | 
						|
		/// <summary>
 | 
						|
		/// Required method for Designer support - do not modify 
 | 
						|
		/// the contents of this method with the code editor.
 | 
						|
		/// </summary>
 | 
						|
		private void InitializeComponent()
 | 
						|
		{
 | 
						|
			this.btnFindFile = new System.Windows.Forms.Button();
 | 
						|
			this.SuspendLayout();
 | 
						|
			// 
 | 
						|
			// btnFindFile
 | 
						|
			// 
 | 
						|
			this.btnFindFile.Location = new System.Drawing.Point(608, 8);
 | 
						|
			this.btnFindFile.Name = "btnFindFile";
 | 
						|
			this.btnFindFile.Size = new System.Drawing.Size(96, 24);
 | 
						|
			this.btnFindFile.TabIndex = 1;
 | 
						|
			this.btnFindFile.Text = "Find File";
 | 
						|
			this.btnFindFile.Visible = false;
 | 
						|
			this.btnFindFile.Click += new System.EventHandler(this.btnFindFile_click);
 | 
						|
			this.ResumeLayout(false);
 | 
						|
 | 
						|
			this.Controls.Add(btnFindFile);
 | 
						|
 | 
						|
		}
 | 
						|
		#endregion
 | 
						|
	
 | 
						|
		// Given a schema, display labels or radio buttons and their associated textboxes
 | 
						|
		// Radio button names are derived from removing the type from the element name.
 | 
						|
		private void DisplaySchemaControls(XmlSchema myXmlSchema)
 | 
						|
		{
 | 
						|
			// the first element is the group name, get past this to the data. This group
 | 
						|
			// name is a complex type, which is processed below.
 | 
						|
			bool first=true;						
 | 
						|
			try
 | 
						|
			{
 | 
						|
				foreach(object item in myXmlSchema.Items)
 | 
						|
				{
 | 
						|
					if (item is XmlSchemaElement && first) 
 | 
						|
					{
 | 
						|
						first=false;
 | 
						|
					}
 | 
						|
 | 
						|
					// in the RO schema (and any types derived from it), the fields are
 | 
						|
					// defined within the ComplexType. 
 | 
						|
					if (item is XmlSchemaComplexType)
 | 
						|
						DisplayXmlSchemaComplexType((XmlSchemaComplexType)item);  //complexType
 | 
						|
				}
 | 
						|
			}
 | 
						|
			catch(Exception e)
 | 
						|
			{
 | 
						|
				MessageBox.Show(e.ToString(),"Error displaying fields from schema");
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		//XmlSchemaComplexType
 | 
						|
		private void DisplayXmlSchemaComplexType(XmlSchemaComplexType complexType)
 | 
						|
		{
 | 
						|
			if (complexType.ContentModel == null)
 | 
						|
			{
 | 
						|
				if (complexType.Particle != null)
 | 
						|
					DisplayXmlSchemaParticle(complexType.Particle);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		//XmlSchemaSimpleType processes a simple type schema element which contains a fields
 | 
						|
		//  attributes such as patterns, maxLength and whether it is single (type is 
 | 
						|
		//  'normalizedString') or a multiline text box(type is 'string'). Also, a radio 
 | 
						|
		//  button is passed in if this was called to handle an element within a combo type.
 | 
						|
		//  This button is saved for a given text box so that initialization of these combo types can occur.
 | 
						|
		private string DisplayXmlSchemaSimpleType(XmlSchemaSimpleType simpleType, TextBox mytextbox, RadioButton radio, 
 | 
						|
			bool img, string imgname)
 | 
						|
		{
 | 
						|
			// set up for text box tag, which stores whether field is required and
 | 
						|
			// if a pattern exists for validation.
 | 
						|
			string pattern = null;
 | 
						|
			string getannot=null;
 | 
						|
			if (simpleType.Annotation != null) 
 | 
						|
			{
 | 
						|
				object item = simpleType.Annotation.Items[0];
 | 
						|
				if (item is XmlSchemaDocumentation)
 | 
						|
				{
 | 
						|
					XmlSchemaDocumentation doc = (XmlSchemaDocumentation) item;
 | 
						|
					XmlNode[] node = (XmlNode[]) doc.Markup;
 | 
						|
						
 | 
						|
					getannot = node[0].InnerText;
 | 
						|
					if (getannot == "VLN_FINDFILE") 
 | 
						|
					{
 | 
						|
						this.btnFindFile.Location = new System.Drawing.Point(mytextbox.Location.X+mytextbox.Width+50,mytextbox.Location.Y-(2*(int)mytextbox.Font.GetHeight()));
 | 
						|
						this.btnFindFile.Visible = true;
 | 
						|
						GraphicsFiletextbox = mytextbox;
 | 
						|
						GraphicsFiletextbox.LostFocus += new System.EventHandler(this.GraphicText_lostfocus);
 | 
						|
						getannot = null;
 | 
						|
					}
 | 
						|
					if (getannot!=null && getannot!="")
 | 
						|
					{
 | 
						|
						if (getannot.IndexOf("Lines")>=0)
 | 
						|
						{
 | 
						|
							GraphicsHttextbox = mytextbox;
 | 
						|
							mytextbox.LostFocus += new System.EventHandler(this.GraphicsHt_lostfocus);
 | 
						|
						}
 | 
						|
						if (getannot.IndexOf("Character")>=0)
 | 
						|
						{
 | 
						|
							GraphicsWdtextbox = mytextbox;
 | 
						|
							mytextbox.LostFocus += new System.EventHandler(this.GraphicsWd_lostfocus);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
					
 | 
						|
 | 
						|
			if (simpleType.Content is XmlSchemaSimpleTypeRestriction) 
 | 
						|
			{
 | 
						|
				// A Schema Type Restriction is used to define single or multi-line boxes.
 | 
						|
				XmlSchemaSimpleTypeRestriction myRestrictions = (XmlSchemaSimpleTypeRestriction) simpleType.Content;
 | 
						|
				if (myRestrictions.BaseTypeName.Name == "normalizedString") 
 | 
						|
					mytextbox.Multiline = false;
 | 
						|
				else
 | 
						|
				{
 | 
						|
					mytextbox.Multiline = true;
 | 
						|
					mytextbox.AcceptsReturn = true;
 | 
						|
					mytextbox.Height = (int) mytextbox.Font.GetHeight() * 4;
 | 
						|
					mytextbox.ScrollBars = ScrollBars.Vertical;
 | 
						|
					zmtooltip.SetToolTip(mytextbox, "Press Shift F2 To Zoom");
 | 
						|
				}
 | 
						|
 | 
						|
				// Schema facets were used for maxlength & patterns, process these if found.
 | 
						|
				foreach(XmlSchemaFacet facet in myRestrictions.Facets)
 | 
						|
				{
 | 
						|
					if (facet is XmlSchemaMaxLengthFacet)
 | 
						|
					{
 | 
						|
						if (mytextbox.Multiline == false)
 | 
						|
							mytextbox.MaxLength = System.Convert.ToInt32(facet.Value);
 | 
						|
						// if the box is small, make the width a little bigger so maxlength text can fit. 
 | 
						|
						int wd = System.Convert.ToInt32(facet.Value);
 | 
						|
						if (wd<5) wd++;
 | 
						|
						mytextbox.Width = (int) mytextbox.Font.SizeInPoints * wd;
 | 
						|
						MaxWidth = (mytextbox.Width>MaxWidth)?mytextbox.Width:MaxWidth;
 | 
						|
					}
 | 
						|
					else if (facet is XmlSchemaPatternFacet)
 | 
						|
					{
 | 
						|
						pattern = facet.Value;
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// Now setup a tag for the text box which will store attributes associated with it
 | 
						|
			// for seeing if it is a required field, checking a pattern or processing a radio box
 | 
						|
			// initialization.
 | 
						|
			if (mytextbox.Tag == null)
 | 
						|
			{
 | 
						|
				TextBoxAttrTag tag = new TextBoxAttrTag(false, pattern, radio, img, (img?imgname:null), null);
 | 
						|
				mytextbox.Tag = (object) tag;
 | 
						|
			}
 | 
						|
			return getannot;
 | 
						|
		}
 | 
						|
 | 
						|
		//XmlSchemaParticle's contain the individual schema elements which represent
 | 
						|
		//  fields defined for this given RO group. It may also contain a schema 'choice'
 | 
						|
		//  which was used to handle the combo type data type fields.
 | 
						|
		private void DisplayXmlSchemaParticle(XmlSchemaParticle particle)
 | 
						|
		{
 | 
						|
			if (particle is XmlSchemaElement)
 | 
						|
				DisplayXmlSchemaElement((XmlSchemaElement)particle);
 | 
						|
			else if (particle is XmlSchemaSequence)
 | 
						|
			{
 | 
						|
				foreach(XmlSchemaParticle particle1 in ((XmlSchemaSequence)particle).Items)
 | 
						|
					DisplayXmlSchemaParticle(particle1);
 | 
						|
			}
 | 
						|
			else if (particle is XmlSchemaChoice)
 | 
						|
				DisplayXmlSchemaChoice((XmlSchemaChoice) particle);
 | 
						|
			else
 | 
						|
				MessageBox.Show(particle.ToString(),"Not Implemented for this type");
 | 
						|
		}
 | 
						|
		
 | 
						|
		// For a combo field, display the radio button & the text field. Select the first 
 | 
						|
		// button. If data is also sent in during initialization of this control, i.e. 
 | 
						|
		// edit versus new, the selected button will be changed during the XML file
 | 
						|
		// data load process.
 | 
						|
		// Return value (set as reference params): 'x' & 'y' size of the text field so that 
 | 
						|
		//    the caller can determine the max to set the group box x, y size value and know 
 | 
						|
		//    how far to move down on the screen.
 | 
						|
		private void DisplayXmlSchemaRadioAndTextBox(XmlSchemaElement element, GroupBox gbox, bool first, int x, int y,
 | 
						|
			int boxx, ref int retx, ref int rety)
 | 
						|
		{
 | 
						|
			int ysize;
 | 
						|
			RadioButton radio = new RadioButton();
 | 
						|
			radio.Location = new System.Drawing.Point(x,20);
 | 
						|
			radio.Name = element.Name + element.SchemaTypeName.Name;
 | 
						|
			string tmp;
 | 
						|
			if (element.SchemaTypeName.Name.Length>1 && char.IsDigit(element.SchemaTypeName.Name,1))
 | 
						|
				tmp = element.SchemaTypeName.Name.Substring(1,element.SchemaTypeName.Name.Length-1);
 | 
						|
			else
 | 
						|
				tmp = element.SchemaTypeName.Name;
 | 
						|
			radio.Text = CvtFldToUserFld(tmp);
 | 
						|
			//radio.Width = (int) radio.Font.SizeInPoints * radio.Text.Length + 20;  // add 20 for button
 | 
						|
			
 | 
						|
			radio.TabIndex = 0;
 | 
						|
			ysize = (int) radio.Height;
 | 
						|
 | 
						|
			if (first) radio.Checked = true;
 | 
						|
			radio.CheckedChanged += new System.EventHandler(this.radiocheckchg);
 | 
						|
			gbox.Controls.Add(radio);
 | 
						|
 | 
						|
			TextBox tb = new TextBox();
 | 
						|
			tb.Location = new Point(boxx+20, y+25);
 | 
						|
			if (!first) tb.Visible = false;
 | 
						|
			myHT.Add(element.Name,tb);
 | 
						|
			// add the textbox to the ctlxmledit control rather than groupbox - the
 | 
						|
			// groupbox is just to control the choices, the text box won't display if in
 | 
						|
			// the groupbox.
 | 
						|
			Controls.Add(tb);
 | 
						|
			tb.TextChanged += new System.EventHandler(this.textbox_change);
 | 
						|
			tb.GotFocus += new System.EventHandler(this.textbox_zoombtn);
 | 
						|
			tb.KeyDown += new KeyEventHandler(MyOnKeyDown);
 | 
						|
			gbox.Contains(tb);
 | 
						|
			// the following will set attributes on the text boxes such as maxlength, multiline, etc.
 | 
						|
			DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType, tb, radio,false,null);	
 | 
						|
			rety = (ysize + 25 + tb.Height);
 | 
						|
			retx = tb.Width;
 | 
						|
		}
 | 
						|
 | 
						|
		//XmlSchemaChoice: processes the 'combo data type' which is represented by a
 | 
						|
		// a schema choice element. This is handled by a group box and using radio 
 | 
						|
		// button/textbox pairs to represent each element within the choice. 
 | 
						|
		private void DisplayXmlSchemaChoice(XmlSchemaChoice choice)
 | 
						|
		{
 | 
						|
			bool first = true;
 | 
						|
			int screenposx, screenposy;
 | 
						|
			int maxyfortext=0,maxxfortext=0;
 | 
						|
			GroupBox groupbox = new GroupBox();
 | 
						|
			groupbox.SuspendLayout();
 | 
						|
			groupbox.Location = new System.Drawing.Point(screenx,screeny);
 | 
						|
			XmlSchemaElement elem = (XmlSchemaElement) choice.Items[0];
 | 
						|
			groupbox.Name = elem.Name;
 | 
						|
			groupbox.TabStop = false;
 | 
						|
 | 
						|
			// remove the last character of the name for the title of the group box.
 | 
						|
			string tstr = CvtFldToUserFld(elem.Name);
 | 
						|
			groupbox.Text = tstr.Remove((tstr.Length)-1,1);
 | 
						|
			screenposx = screenx+20;
 | 
						|
			screenposy = screeny+20;
 | 
						|
 | 
						|
			foreach (object o in choice.Items)
 | 
						|
			{
 | 
						|
				// put out a radio button/text box for each item in the choice.
 | 
						|
				int xmax=0, ymax=0;
 | 
						|
				DisplayXmlSchemaRadioAndTextBox((XmlSchemaElement) o,groupbox,first,screenposx,screenposy,screenx,ref xmax,ref ymax);
 | 
						|
				first = false;
 | 
						|
				maxyfortext = ymax>maxyfortext?ymax:maxyfortext;
 | 
						|
				maxxfortext = xmax>maxxfortext?xmax:maxxfortext;
 | 
						|
				screenposx = screenposx + 160;				
 | 
						|
			}
 | 
						|
 | 
						|
			// get the widths of all children of this group box & use this to set the size 
 | 
						|
			// of the groupbox.
 | 
						|
			int gritms = groupbox.Controls.Count;
 | 
						|
			screeny=screeny+maxyfortext+10;
 | 
						|
			MaxWidth = (maxxfortext+40>MaxWidth)?maxxfortext+40:MaxWidth;
 | 
						|
			groupbox.Size = new System.Drawing.Size(maxxfortext+40, maxyfortext+10);
 | 
						|
			Controls.Add(groupbox);
 | 
						|
		}
 | 
						|
 | 
						|
		private void DisplayXmlSchemaElement(XmlSchemaElement element)
 | 
						|
		{
 | 
						|
			// always add a label.
 | 
						|
			Label mylabel;
 | 
						|
			int sscreeny;
 | 
						|
			mylabel =  new System.Windows.Forms.Label();
 | 
						|
			mylabel.Location = new Point(screenx, screeny);
 | 
						|
			mylabel.Name = element.Name;
 | 
						|
			mylabel.Text = CvtFldToUserFld(element.Name);
 | 
						|
			mylabel.AutoSize = true;
 | 
						|
			Controls.Add(mylabel);
 | 
						|
			// add 3 onto screeny so that textbox is slightly below label.
 | 
						|
			screeny = screeny+mylabel.Height+3;
 | 
						|
			sscreeny = screeny;   // save 'y' location in case of annotation.
 | 
						|
			if (element.SchemaType != null && element.SchemaType is XmlSchemaComplexType)
 | 
						|
			{
 | 
						|
				GraphicsText = element.Name;
 | 
						|
				DisplayXmlSchemaComplexType((XmlSchemaComplexType)element.SchemaType);
 | 
						|
				screeny+=30;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				TextBox mytextbox;
 | 
						|
				mytextbox = new TextBox();
 | 
						|
				mytextbox.Location = new Point(screenx, screeny);
 | 
						|
				myHT.Add(element.Name,mytextbox);
 | 
						|
				tabindx++;
 | 
						|
				Controls.Add(mytextbox);
 | 
						|
				screeny+=mytextbox.Height;
 | 
						|
				mytextbox.TextChanged += new System.EventHandler(this.textbox_change);
 | 
						|
				mytextbox.Validating += new System.ComponentModel.CancelEventHandler(this.textbox_Validating);
 | 
						|
				mytextbox.GotFocus += new System.EventHandler(this.textbox_zoombtn);
 | 
						|
				mytextbox.KeyDown += new KeyEventHandler(MyOnKeyDown);
 | 
						|
 | 
						|
				string labelAnnot;
 | 
						|
				bool imgchld = false;
 | 
						|
				if (element.Name == "Image_Filename" || element.Name == "Image_Height" || element.Name == "Image_Width") imgchld = true;
 | 
						|
				// Pass the textbox in to set attributes such as maxlength, multiline and pattern
 | 
						|
				labelAnnot = DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType,mytextbox, null,imgchld,GraphicsText);
 | 
						|
				if (labelAnnot != null)
 | 
						|
				{
 | 
						|
					Label annot;
 | 
						|
					annot =  new System.Windows.Forms.Label();
 | 
						|
					annot.Location = new Point(screenx+mytextbox.Width+10, sscreeny);
 | 
						|
					annot.Name = "annot" + screeny.ToString();
 | 
						|
					annot.Text = labelAnnot;
 | 
						|
					annot.AutoSize = true;
 | 
						|
					Controls.Add(annot);
 | 
						|
				}
 | 
						|
				screeny+=mytextbox.Height;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// the following is needed to load the control.
 | 
						|
		private void ctlXMLEdit_Load(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
		
 | 
						|
		}
 | 
						|
		
 | 
						|
		// when data in a text box has changed, flag it (except for when this
 | 
						|
		// happens during loading of original data). This flag will be used
 | 
						|
		// later to know whether to save data.
 | 
						|
		private void textbox_change(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			if(dosaveflag)mysavexml = true;
 | 
						|
		}
 | 
						|
 | 
						|
		// radiocheckchg - called when a radio button is selected. This will set
 | 
						|
		// visibility for associated text box. 
 | 
						|
		private void radiocheckchg(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			RadioButton btnsel = (RadioButton) sender;
 | 
						|
			TextBox assocbox;
 | 
						|
			string btntext, str;
 | 
						|
 | 
						|
			if(dosaveflag)mysavexml = true;
 | 
						|
			btntext = CvtUserFldToFld(btnsel.Text);
 | 
						|
			
 | 
						|
			// now get the actual textbox and set visibility depending
 | 
						|
			// on whether the box is checked, i.e. turned on(if checked, it should
 | 
						|
			// be set to visible)
 | 
						|
		
 | 
						|
			str = btnsel.Name.Replace(btntext,"");
 | 
						|
			object o = myHT[str];
 | 
						|
			if (o == null) return;
 | 
						|
			assocbox = (TextBox) o;
 | 
						|
			// make the text box visible if checked, otherwise, invisible
 | 
						|
			assocbox.Visible = btnsel.Checked;
 | 
						|
		}
 | 
						|
 | 
						|
		// these two methods convert user input field names from/to xml tags. (xml tags
 | 
						|
		// cannot begin with digit, have spaces or other special chars.
 | 
						|
		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<len) outstr += tmpstr.Substring(cur,len-cur);	
 | 
						|
 | 
						|
			return outstr;
 | 
						|
		}
 | 
						|
 | 
						|
		// The following can be used to validate the text, i.e. check the text against
 | 
						|
		// the pattern. this needs written yet (5/16/02)
 | 
						|
		private void MyValidatingCode(TextBox tb)
 | 
						|
		{
 | 
						|
			//get the text box's tag which contains a flag for whether this is required &
 | 
						|
			//if it has a pattern. If it has a pattern, validate the field against the pattern.
 | 
						|
			TextBoxAttrTag tag;
 | 
						|
			tag = (TextBoxAttrTag) tb.Tag;
 | 
						|
			string pattern = tag.GetPattern;
 | 
						|
			if (pattern != null) 
 | 
						|
			{
 | 
						|
				//see if text in box matches pattern
 | 
						|
				// if not throw exception.
 | 
						|
			}
 | 
						|
 | 
						|
			//USE THE FOLLOWING WHEN CHECKING FOR REQUIRED FIELDS
 | 
						|
			
 | 
						|
			// Confirm there is text in the control.
 | 
						|
			//if (textBox1.Text.Length == 0)
 | 
						|
			//{
 | 
						|
			//		throw new Exception("Email address is a required field");
 | 
						|
			//		}
 | 
						|
			// Confirm that there is a "." and an "@" in the e-mail address.
 | 
						|
			//		else if(textBox1.Text.IndexOf(".") == -1 || textBox1.Text.IndexOf("@") == -1)
 | 
						|
			//		{
 | 
						|
			//			throw new Exception("E-mail address must be valid e-mail address format." +
 | 
						|
			//				"\nFor example 'someone@microsoft.com'");
 | 
						|
			//		}
 | 
						|
		}
 | 
						|
 | 
						|
		// save which box we're on, for zoom processing.
 | 
						|
		private void textbox_zoombtn(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			TextBox textbox = (TextBox) sender;
 | 
						|
			if (textbox.Multiline == true || textbox == GraphicsFiletextbox) 
 | 
						|
				zoomtextbox = textbox;
 | 
						|
			else
 | 
						|
				zoomtextbox = null;
 | 
						|
		}
 | 
						|
 | 
						|
		private void textbox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
 | 
						|
		{ 
 | 
						|
			try
 | 
						|
			{
 | 
						|
				MyValidatingCode((TextBox) sender);
 | 
						|
			}
 | 
						|
 | 
						|
			catch(Exception ex)
 | 
						|
			{
 | 
						|
				// Cancel the event and select the text to be corrected by the user.
 | 
						|
				e.Cancel = true;
 | 
						|
				MessageBox.Show(ex.ToString(), "Error in validation");
 | 
						|
				//textBox1.Select(0, textBox1.Text.Length);
 | 
						|
 | 
						|
				// Set the ErrorProvider error with the text to display. 
 | 
						|
				//this.errorProvider1.SetError(textBox1, ex.Message);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		private void MyOnKeyDown(object objSender, KeyEventArgs kea)
 | 
						|
		{
 | 
						|
			if (((kea.Modifiers&Keys.Shift)==Keys.Shift) && kea.KeyCode == Keys.F2)
 | 
						|
			{
 | 
						|
				if (zoomtextbox == null)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Must have cursor in text box which should be zoomed.");
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				btnZoom_click(null, null);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		public void btnZoom_click(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			//TextBox tb = (TextBox) sender;
 | 
						|
			TextBoxAttrTag tag;
 | 
						|
			bool doimage = false;
 | 
						|
			if (zoomtextbox.Tag != null)
 | 
						|
			{
 | 
						|
				tag = (TextBoxAttrTag) zoomtextbox.Tag;
 | 
						|
				if (tag.GetImageName == "Image" && zoomtextbox.Text != null && zoomtextbox.Text !="") doimage = true;
 | 
						|
			}
 | 
						|
			if (doimage)
 | 
						|
			{
 | 
						|
				string GraphicsFileName = zoomtextbox.Text;
 | 
						|
				if (GraphicsFileName.IndexOf('.') == -1)
 | 
						|
					GraphicsFileName += DefaultGraphicFileExtension; // default graphics file extension
 | 
						|
				FileInfo fi = new FileInfo(GraphicsFileName);
 | 
						|
				if (fi.Exists == false) 
 | 
						|
				{
 | 
						|
					MessageBox.Show("Cannot view a missing graphics file.","Error");
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				ImageDialog dlg = new ImageDialog(GraphicsFileName);
 | 
						|
				dlg.ShowDialog();
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				ZoomDialog dlg = new ZoomDialog(zoomtextbox.Text);
 | 
						|
				dlg.ShowDialog();
 | 
						|
				// Determine the state of the DialogResult property for the form
 | 
						|
				if (dlg.DialogResult == DialogResult.OK)
 | 
						|
				{
 | 
						|
					// Create an instance of the ZoomText object to store the
 | 
						|
					// dialog data
 | 
						|
					string zt = dlg.ZoomText;
 | 
						|
					// Save the text in the text box.
 | 
						|
					zoomtextbox.Text = (zt);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		// The series of graphic file support were lifted from the old RO editor.
 | 
						|
		// They check for file existance, check date/time stamps before moving the
 | 
						|
		// file local & keep width/height of file proportional.
 | 
						|
		private void GraphicText_lostfocus(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			TextBox fnamebox = (TextBox) sender;
 | 
						|
			if (fnamebox.Text != "" && fnamebox.Modified == true)
 | 
						|
			{
 | 
						|
				FileInfo ifi = new FileInfo(fnamebox.Text);
 | 
						|
				if (ifi.Exists == false) 
 | 
						|
				{
 | 
						|
					MessageBoxButtons buttons = MessageBoxButtons.OK;
 | 
						|
					MessageBox.Show( "File does not exist.", 
 | 
						|
						"File Input Error", buttons);
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				bool ok = ValidGraphicsFile(fnamebox.Text);
 | 
						|
				if (ok != true)	
 | 
						|
				{
 | 
						|
					if (fnamebox.Text != "")fnamebox.Text.Replace(fnamebox.Text,"");
 | 
						|
					if (GraphicsWdtextbox.Text != "")GraphicsWdtextbox.Text = "";
 | 
						|
					if (GraphicsHttextbox.Text!= "")GraphicsHttextbox.Text = "";
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					GraphicsWdtextbox.Enabled = true;
 | 
						|
					GraphicsHttextbox.Enabled = true;
 | 
						|
					UpdateHtWd();
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (fnamebox.Text == null || fnamebox.Text == "")
 | 
						|
			{
 | 
						|
				GraphicsWdtextbox.Enabled = false;
 | 
						|
				GraphicsHttextbox.Enabled = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		string CalculatePromsDate(DateTime imgdate)
 | 
						|
		{
 | 
						|
			/* 
 | 
						|
			 * do some conversion so that proms will be able to use this
 | 
						|
			 * date/time. Proms had it in seconds since 00:00:00 1/1/1970.
 | 
						|
			 * .NET has it in ticks since 00:00:00 1/1/1
 | 
						|
			 */ 
 | 
						|
			DateTime promsdt = new DateTime(1970,1,1,0,0,0); // Jan 1, 1970
 | 
						|
			// Convert the promsdt to UTC (GMT)
 | 
						|
			DateTime promsdtU = promsdt.ToUniversalTime();
 | 
						|
			long promsdtU_num = promsdtU.Ticks / 10000000;
 | 
						|
 | 
						|
			// Convert the image file datetime to UTC
 | 
						|
			DateTime imgdateU = imgdate.ToUniversalTime();
 | 
						|
			long imgdateu_num = imgdateU.Ticks / 10000000;
 | 
						|
 | 
						|
			/**
 | 
						|
			 * Get the time adjustment for the current Time Zone with respect
 | 
						|
			 * to the coordinated universal time (UTC) - a.k.a. Greenwich mean time (GMT).
 | 
						|
			 * The time gotten for the Jan 1, 1970 is in UTC time, the imgdate time is
 | 
						|
			 * in EST.
 | 
						|
			 * 
 | 
						|
			 * Get the offset time between this time zone and UTC (GMT) time.
 | 
						|
			 * Convert the offset to seconds.
 | 
						|
			 * Subtract the offset from the UTC time gotten for Jan 1, 1970
 | 
						|
			 */
 | 
						|
			ThisTimeZone TZ = new ThisTimeZone();
 | 
						|
			TimeSpan TimeZoneSpan = TZ.GetUtcOffset(promsdt); // Time Zone offset from UTC
 | 
						|
			long TimeZoneAdj = Math.Abs(TimeZoneSpan.Ticks / 10000000); // convert to seconds
 | 
						|
 | 
						|
			/*
 | 
						|
			 * The file date/time and the Jan 1, 1970 adjustment date are in UTC.
 | 
						|
			 * Subtract the "Jan 1, 1970" date/time from the file date/time
 | 
						|
			 * the add the Time Zone offset to place the date/time value into
 | 
						|
			 * local time.
 | 
						|
			 */
 | 
						|
			long lsec = (imgdateu_num - promsdtU_num) + TimeZoneAdj;
 | 
						|
			string imgdt = lsec.ToString();
 | 
						|
			return imgdt;
 | 
						|
		}
 | 
						|
		/// Import the GetShortPathName function from the win32 kernel dll. This
 | 
						|
		/// is not supported in .net/C#	
 | 
						|
		[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
 | 
						|
		public static extern void GetShortPathName(
 | 
						|
			[MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath,
 | 
						|
			[MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath,
 | 
						|
			[MarshalAs(UnmanagedType.U4)] int cchBuffer);
 | 
						|
 | 
						|
		private bool ValidGraphicsFile(string GraphicFileName)
 | 
						|
		{
 | 
						|
			string iname = GraphicFileName;
 | 
						|
			if (iname == null || iname == "") return false;
 | 
						|
			GraphicsWdtextbox.Enabled = true;
 | 
						|
			GraphicsHttextbox.Enabled = true;
 | 
						|
			if (iname.IndexOf('.') == -1)
 | 
						|
				iname += DefaultGraphicFileExtension; // default graphics file extension
 | 
						|
			FileInfo ifi = new FileInfo(iname);  // input file & info
 | 
						|
			string ext = ifi.Extension;		 // returns '.bmp' etc
 | 
						|
			if (ext == null)
 | 
						|
			{
 | 
						|
				MessageBox.Show( "Missing file extension.","Error");
 | 
						|
				return false;
 | 
						|
			}	
 | 
						|
			else 
 | 
						|
			{
 | 
						|
				string Uext = ext.Substring(1,3).ToUpper();
 | 
						|
				if (Uext!="BMP"&&Uext!="EMF"&&Uext!="GIF"&&Uext!="ICO"&&Uext!="JPG"&&Uext!="PNG"&&Uext!="TIF"&&Uext!="WMF")
 | 
						|
				{
 | 
						|
					MessageBoxButtons buttons = MessageBoxButtons.OK;
 | 
						|
					//DialogResult result;
 | 
						|
					MessageBox.Show( "Not a supported graphics file type.", 
 | 
						|
						"Unsupported extension.", buttons);
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
 | 
						|
				// Get the path and filename.  ptr points to just the filename
 | 
						|
				int slindx;
 | 
						|
				string lname;
 | 
						|
				slindx = iname.LastIndexOf("\\");
 | 
						|
				if (slindx >0)
 | 
						|
					lname = iname.Substring(slindx+1,iname.Length-slindx-1);
 | 
						|
				else
 | 
						|
					lname = iname;
 | 
						|
				// now check to see if this is a local file - to do this, check
 | 
						|
				// to see if either has a "~" which may signify a short filename.
 | 
						|
				// If so, compare the short file names (Note that comparing long
 | 
						|
				// filenames didn't work, i.e. the kernel routine did not return
 | 
						|
				// a long filename if a short one was sent in).
 | 
						|
 | 
						|
				// open an existing file, or create a new one
 | 
						|
				
 | 
						|
				FileInfo lfi = new FileInfo(lname);  // local file & info
 | 
						|
				
 | 
						|
				if (lfi.Exists == false)    // !exist, copy it & move on
 | 
						|
				{
 | 
						|
					// Copy the file to the local directory
 | 
						|
					ifi.CopyTo(lname);
 | 
						|
					// update fields on window....
 | 
						|
					GraphicsFiletextbox.Text = lfi.Name;
 | 
						|
					TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
 | 
						|
					tag.SetImageDate(CalculatePromsDate(ifi.LastWriteTime));
 | 
						|
					GraphicsFiletextbox.Tag = tag;
 | 
						|
					UpdateHtWd();
 | 
						|
					return true;
 | 
						|
				}
 | 
						|
				else  // A local file exists by the same name
 | 
						|
				{ 
 | 
						|
					if (ifi.Exists == false)
 | 
						|
					{
 | 
						|
						MessageBox.Show("Input file doesn't exist.","Error");
 | 
						|
						return false;
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						// first just check if these are really the same, just the
 | 
						|
						// user put a path in.
 | 
						|
						int same = 0;
 | 
						|
						if (ifi.DirectoryName.IndexOf("~")>=0 || lfi.DirectoryName.IndexOf("~")>=0)
 | 
						|
						{
 | 
						|
						
 | 
						|
							StringBuilder shortlname = new StringBuilder(257);
 | 
						|
							StringBuilder shortiname = new StringBuilder(257);
 | 
						|
							GetShortPathName(ifi.DirectoryName,shortiname,257);
 | 
						|
							GetShortPathName(lfi.DirectoryName,shortlname,257);
 | 
						|
							same = String.Compare(shortlname.ToString(),shortlname.ToString());
 | 
						|
						}
 | 
						|
						if (same == 0)
 | 
						|
						{
 | 
						|
							TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
 | 
						|
							tag.SetImageDate(CalculatePromsDate(lfi.LastWriteTime));
 | 
						|
							GraphicsFiletextbox.Tag = tag;
 | 
						|
							return true;
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							// Is the file the same - size, date, time
 | 
						|
							// old code checked for both findfirst failures??
 | 
						|
							string msg=null;
 | 
						|
							if (lfi.LastWriteTime > ifi.LastWriteTime)
 | 
						|
								msg = "A newer copy of t";
 | 
						|
							else if (lfi.LastWriteTime < ifi.LastWriteTime)
 | 
						|
								msg = "An older copy of t";
 | 
						|
							else if (lfi.Length != ifi.Length)
 | 
						|
								msg = "A different copy of t";
 | 
						|
							msg = msg + "he selected file\nexists in the RO directory\n";
 | 
						|
							msg = msg + "Do you want to replace it\n";
 | 
						|
							msg = msg + "with the selected file?";
 | 
						|
							MessageBoxButtons buttons = MessageBoxButtons.YesNoCancel;
 | 
						|
							DialogResult result;
 | 
						|
							result = MessageBox.Show( msg, "Graphics File Copy", buttons);
 | 
						|
							if (result == DialogResult.Yes)
 | 
						|
							{
 | 
						|
								lfi.Delete();
 | 
						|
								ifi.CopyTo(lname,true);
 | 
						|
								// update dialog data & ht/wd
 | 
						|
								GraphicsFiletextbox.Text = lfi.Name;
 | 
						|
								TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
 | 
						|
								tag.SetImageDate(CalculatePromsDate(lfi.LastWriteTime));
 | 
						|
								GraphicsFiletextbox.Tag = tag;
 | 
						|
								UpdateHtWd();
 | 
						|
								return true;
 | 
						|
							}
 | 
						|
							else if (result != DialogResult.No)   // not yes or no. Cancel out.
 | 
						|
								return false;
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
		
 | 
						|
		// if changed height, calculate associated width
 | 
						|
		private void GraphicsHt_lostfocus(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			TextBox ht = (TextBox) sender;
 | 
						|
			if (ht.Modified == true)
 | 
						|
			{
 | 
						|
				try
 | 
						|
				{
 | 
						|
					int newht= System.Convert.ToInt32(ht.Text);
 | 
						|
					setHtWdBasedUponHeight(newht);
 | 
						|
				}
 | 
						|
				catch (Exception ee)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Invalid Height Input",ee.ToString());
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		// if changed width, calculate associated height
 | 
						|
		private void GraphicsWd_lostfocus(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			TextBox wd = (TextBox) sender;
 | 
						|
			if (wd.Modified == true)
 | 
						|
			{
 | 
						|
				try
 | 
						|
				{
 | 
						|
					int newwd= System.Convert.ToInt32(wd.Text);
 | 
						|
					setHtWdBasedUponWidth(newwd);
 | 
						|
				}
 | 
						|
				catch (Exception ee)
 | 
						|
				{
 | 
						|
					MessageBox.Show("Invalid Width Input", ee.ToString());
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}					
 | 
						|
 | 
						|
		private void setHtWdBasedUponHeight(int nuval)
 | 
						|
		{
 | 
						|
			int w,h;
 | 
						|
			if(himage!=0)
 | 
						|
			{
 | 
						|
				if(nuval==0)nuval=(himage+DPPL-1)/DPPL;
 | 
						|
				if(nuval > hmax)nuval=hmax;
 | 
						|
				else if(nuval < hmin)nuval=hmin;
 | 
						|
				h=nuval;
 | 
						|
				// The <<1, +1, and >>1 efectively round the result
 | 
						|
				// by multiplying by 2 performing the division adding
 | 
						|
				// 1 and dividing by 2
 | 
						|
				w=(((h*STDCPI*wimage)<<1)/(himage*STDLPI)+1)>>1;
 | 
						|
			} 
 | 
						|
			else 
 | 
						|
			{
 | 
						|
				w=h=0;
 | 
						|
			}
 | 
						|
			GraphicsWdtextbox.Text = w.ToString();
 | 
						|
			GraphicsHttextbox.Text = h.ToString();
 | 
						|
		}
 | 
						|
 | 
						|
		private void setHtWdBasedUponWidth(int nuval)
 | 
						|
		{
 | 
						|
			int w,h;
 | 
						|
			if(himage!=0)
 | 
						|
			{
 | 
						|
				if(nuval==0)nuval=(wimage+DPPC-1)/DPPC;
 | 
						|
				if(nuval > wmax)nuval=wmax;
 | 
						|
				else if(nuval < wmin)nuval=wmin;
 | 
						|
				w=nuval;
 | 
						|
				//
 | 
						|
				// The <<1, +1, and >>1 efectively round the result
 | 
						|
				// by multiplying by 2 performing the division adding
 | 
						|
				// 1 and dividing by 2
 | 
						|
				h=(((w*STDLPI*himage)<<1)/(wimage*STDCPI)+1)>>1;
 | 
						|
			} 
 | 
						|
			else 
 | 
						|
			{
 | 
						|
				w=h=0;
 | 
						|
			}
 | 
						|
			GraphicsWdtextbox.Text = w.ToString();
 | 
						|
			GraphicsHttextbox.Text = h.ToString();
 | 
						|
		}
 | 
						|
 | 
						|
		private void UpdateHtWd()
 | 
						|
		{
 | 
						|
			// copy the file local and also get it's width/height by reading the file.
 | 
						|
			Bitmap image;
 | 
						|
 | 
						|
			try 
 | 
						|
			{
 | 
						|
				string dir = Directory.GetCurrentDirectory();
 | 
						|
				string GraphicsFileName = GraphicsFiletextbox.Text;
 | 
						|
//				FileInfo fi = new FileInfo(GraphicsFiletextbox.Text);
 | 
						|
				if (GraphicsFileName.IndexOf('.') == -1)
 | 
						|
					GraphicsFileName += DefaultGraphicFileExtension; // default graphics file extension
 | 
						|
				FileInfo fi = new FileInfo(GraphicsFileName);
 | 
						|
				if (fi.Exists == false) 
 | 
						|
				{
 | 
						|
					MessageBox.Show("Graphics File is missing","Error");
 | 
						|
					wimage=himage=height=width=0;
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				
 | 
						|
				image = new Bitmap(GraphicsFileName);
 | 
						|
				himage = image.Height;
 | 
						|
				wimage = image.Width;
 | 
						|
				hmax=MAXLT; // 60 Lines
 | 
						|
				int hmxw=STDLPI*MAXWT*himage/(wimage*STDCPI);
 | 
						|
				if(hmxw < hmax)
 | 
						|
				{// Size is limited to the width of the paper
 | 
						|
					hmax=hmxw;
 | 
						|
					wmax=MAXWT;
 | 
						|
				} 
 | 
						|
				else 
 | 
						|
				{
 | 
						|
					wmax=STDCPI*hmax*wimage/(himage*STDLPI);
 | 
						|
				}
 | 
						|
				hmin=1;
 | 
						|
				int hmnw=STDLPI*6*himage/(wimage*STDCPI);
 | 
						|
				if(hmnw > hmin)
 | 
						|
				{// Size is limited by the width of the graphic
 | 
						|
					hmin=hmnw;
 | 
						|
					wmin=6;
 | 
						|
				} 
 | 
						|
				else 
 | 
						|
				{
 | 
						|
					wmin=STDCPI*1*wimage/(himage*STDLPI);
 | 
						|
				}
 | 
						|
				setHtWdBasedUponHeight(height);
 | 
						|
			}
 | 
						|
			catch (Exception exx)
 | 
						|
			{
 | 
						|
				MessageBox.Show(exx.Message.ToString(),"error on processing of graphics file");
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		private void btnFindFile_click(object sender, System.EventArgs e)
 | 
						|
		{
 | 
						|
			bool done = false;
 | 
						|
			while (done == false)
 | 
						|
			{
 | 
						|
				OpenFileDialog openFileDialog1 = new OpenFileDialog();
 | 
						|
				openFileDialog1.InitialDirectory = Directory.GetCurrentDirectory();
 | 
						|
				openFileDialog1.Filter = 
 | 
						|
					"Bitmap files (*.bmp)|*.bmp|Enhanced Windows metafiles (*.emf)|*.emf|Graphics Interchange Format (*.gif)|*.gif|Icons (*.ico)|*.ico|JPEG (*.jpg)|*.jpg|Portable Network Graphics (*.png)|*.png|TIFF (*.tif)|*.tif|Windows Metafile (*.wmf)|*.wmf" ;
 | 
						|
				openFileDialog1.FilterIndex = 7 ;
 | 
						|
				openFileDialog1.RestoreDirectory = true ;
 | 
						|
				openFileDialog1.CheckFileExists = true;
 | 
						|
//				try
 | 
						|
//				{
 | 
						|
					if(openFileDialog1.ShowDialog() != DialogResult.OK)
 | 
						|
						done = true;
 | 
						|
					else
 | 
						|
					{
 | 
						|
						string iname = openFileDialog1.FileName;
 | 
						|
						done = ValidGraphicsFile(iname);
 | 
						|
						if (done == true)
 | 
						|
						{
 | 
						|
							FileInfo fi = new FileInfo(iname);
 | 
						|
							GraphicsFiletextbox.Text = fi.Name;
 | 
						|
							UpdateHtWd();
 | 
						|
						}
 | 
						|
					}
 | 
						|
//				}
 | 
						|
//				catch (Exception j)
 | 
						|
//				{
 | 
						|
//					MessageBox.Show(j.Message,"debug");
 | 
						|
//				}
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
	}			
 | 
						|
 | 
						|
	/*
 | 
						|
	 * TimeZone is an Abstract Class.  You need to inherit the TimeZone Class
 | 
						|
	 * and overload a couple of it's functions in order to use it.
 | 
						|
	 * - called in CalculatePromsDate() above.
 | 
						|
	 */ 
 | 
						|
		public class ThisTimeZone : TimeZone
 | 
						|
	{
 | 
						|
		private TimeZone curTZ;
 | 
						|
		public TimeSpan SpanTZ;
 | 
						|
 | 
						|
		public ThisTimeZone()
 | 
						|
		{
 | 
						|
			curTZ = CurrentTimeZone;  // local timezone
 | 
						|
		}
 | 
						|
 | 
						|
		// get the UTC (GMT) value for the given date/time
 | 
						|
		public override TimeSpan GetUtcOffset(DateTime ForThisDate)
 | 
						|
		{
 | 
						|
			SpanTZ = curTZ.GetUtcOffset(ForThisDate); 
 | 
						|
			return SpanTZ;
 | 
						|
		}
 | 
						|
 | 
						|
		// Name of the local Daylight savings time zone
 | 
						|
		public override string DaylightName
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				return curTZ.DaylightName;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Name of the local standard time zone
 | 
						|
		public override string StandardName
 | 
						|
		{
 | 
						|
			get
 | 
						|
			{
 | 
						|
				return curTZ.StandardName;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Get the start and end dates for daylight savings
 | 
						|
		public override System.Globalization.DaylightTime GetDaylightChanges(int year)
 | 
						|
		{
 | 
						|
			return curTZ.GetDaylightChanges(year);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 |