1329 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1329 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Text;
 | |
| using System.Text.RegularExpressions;
 | |
| using System.Windows.Forms;
 | |
| using System.Runtime.InteropServices; // For DragHelper
 | |
| using System.Reflection;
 | |
| using Csla;
 | |
| using Csla.Validation;
 | |
| using VEPROMS.CSLA.Library;
 | |
| 
 | |
| namespace Volian.Controls.Library
 | |
| {
 | |
| 	#region DelegatesAndEventArgs
 | |
| 	public delegate void vlnTreeViewEvent(object sender, vlnTreeEventArgs args);
 | |
| 	public delegate bool vlnTreeViewBoolEvent(object sender, vlnTreeEventArgs args);
 | |
| 	public delegate TreeNode vlnTreeViewTreeNodeEvent(object sender, vlnTreeEventArgs args);
 | |
| 	public delegate DialogResult vlnTreeViewPropertyEvent(object sender, vlnTreePropertyEventArgs args);
 | |
| 	public partial class vlnTreeEventArgs
 | |
| 	{
 | |
| 		#region Business Methods
 | |
| 		private TreeNode _Node;
 | |
| 		public TreeNode Node
 | |
| 		{
 | |
| 			get { return _Node; }
 | |
| 			set { _Node = value; }
 | |
| 		}
 | |
| 		private TreeNode _Destination=null;
 | |
| 		public TreeNode Destination
 | |
| 		{
 | |
| 			get { return _Destination; }
 | |
| 			set { _Destination = value; }
 | |
| 		}
 | |
| 		private int _Index;
 | |
| 		public int Index
 | |
| 		{
 | |
| 			get { return _Index; }
 | |
| 			set { _Index = value; }
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region Factory Methods
 | |
| 		private vlnTreeEventArgs() { ;}
 | |
| 		public vlnTreeEventArgs(TreeNode node)
 | |
| 		{
 | |
| 			_Node = node;
 | |
| 		}
 | |
| 		public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index)
 | |
| 		{
 | |
| 			_Node = node;
 | |
| 			_Destination = destination;
 | |
| 			_Index = index;
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| 	public partial class vlnTreePropertyEventArgs : EventArgs
 | |
| 	{
 | |
| 		private string _Title;
 | |
| 		public string Title
 | |
| 		{
 | |
| 			get { return _Title; }
 | |
| 			set { _Title = value; }
 | |
| 		}
 | |
| 		private object _ConfigObject;
 | |
| 		public object ConfigObject
 | |
| 		{
 | |
| 			get { return _ConfigObject; }
 | |
| 			set { _ConfigObject = value; }
 | |
| 		}
 | |
| 		private FolderConfig _FolderConfig;
 | |
| 		public FolderConfig FolderConfig
 | |
| 		{
 | |
| 			get { return _FolderConfig; }
 | |
| 			set { _ConfigObject = _FolderConfig = value; }
 | |
| 		}
 | |
| 		private DocVersionConfig _DocVersionConfig;
 | |
| 		public DocVersionConfig DocVersionConfig
 | |
| 		{
 | |
| 			get { return _DocVersionConfig; }
 | |
| 			set { _ConfigObject = _DocVersionConfig = value; }
 | |
| 		}
 | |
| 		private ProcedureConfig _ProcedureConfig;
 | |
| 		public ProcedureConfig ProcedureConfig
 | |
| 		{
 | |
| 			get { return _ProcedureConfig; }
 | |
| 			set { _ConfigObject = _ProcedureConfig = value; }
 | |
| 		}
 | |
| 		private SectionConfig _SectionConfig;
 | |
| 		public SectionConfig SectionConfig
 | |
| 		{
 | |
| 			get { return _SectionConfig; }
 | |
| 			set { _ConfigObject = _SectionConfig = value; }
 | |
| 		}
 | |
| 		private vlnTreePropertyEventArgs() { ;}
 | |
| 		public vlnTreePropertyEventArgs(string title, FolderConfig folderConfig)
 | |
| 		{
 | |
| 			_Title = title;
 | |
| 			FolderConfig = folderConfig;
 | |
| 		}
 | |
| 		public vlnTreePropertyEventArgs(string title, DocVersionConfig docVersionConfig)
 | |
| 		{
 | |
| 			_Title = title;
 | |
| 			DocVersionConfig = docVersionConfig;
 | |
| 		}
 | |
| 		public vlnTreePropertyEventArgs(string title, ProcedureConfig procedureConfig)
 | |
| 		{
 | |
| 			_Title = title;
 | |
| 			ProcedureConfig = procedureConfig;
 | |
| 		}
 | |
| 		public vlnTreePropertyEventArgs(string title, SectionConfig sectionConfig)
 | |
| 		{
 | |
| 			_Title = title;
 | |
| 			DocStyleListConverter.MySection = sectionConfig.MySection;
 | |
| 			SectionConfig = sectionConfig;
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 	public partial class vlnTreeView : TreeView
 | |
| 	{
 | |
| 		#region Local Vars
 | |
| 		private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | |
| 
 | |
| 		FolderInfo _LastFolderInfo = null;
 | |
| 		ProcedureInfo _LastProcedureInfo = null;
 | |
| 		DocVersionInfo _LastDocVersionInfo = null;
 | |
| 		SectionInfo _LastSectionInfo = null;
 | |
| 		VETreeNode _LastTreeNode = null;
 | |
| 		StepInfo _LastStepInfo = null;
 | |
| 		ItemInfo _LastItemInfo = null;
 | |
| 		#endregion
 | |
| 		#region Events
 | |
| 		public event vlnTreeViewEvent NodeMove;
 | |
| 		private void OnNodeMove(object sender, vlnTreeEventArgs args)
 | |
| 		{
 | |
| 			if (NodeMove != null) NodeMove(sender, args);
 | |
| 		}
 | |
| 		public event vlnTreeViewEvent NodeCopy;
 | |
| 		private void OnNodeCopy(object sender, vlnTreeEventArgs args)
 | |
| 		{
 | |
| 			if (NodeCopy != null) NodeCopy(sender, args);
 | |
| 		}
 | |
| 		public event vlnTreeViewPropertyEvent NodeOpenProperty;
 | |
| 		private DialogResult OnNodeOpenProperty(object sender, vlnTreePropertyEventArgs args)
 | |
| 		{
 | |
| 			if (NodeOpenProperty != null) return NodeOpenProperty(sender, args);
 | |
| 			return DialogResult.Cancel;
 | |
| 		}
 | |
| 		public event vlnTreeViewEvent NodeSelect;
 | |
| 		private void OnNodeSelect(object sender, vlnTreeEventArgs args)
 | |
| 		{
 | |
| 			if (NodeSelect != null) NodeSelect(sender, args);
 | |
| 		}
 | |
| 		public event vlnTreeViewEvent NodeSelectionChange;
 | |
| 		private void OnNodeSelectionChange(object sender, vlnTreeEventArgs args)
 | |
| 		{
 | |
| 			if (NodeSelectionChange != null) NodeSelectionChange(sender, args);
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region Constructors
 | |
| 		public vlnTreeView()
 | |
| 		{
 | |
| 			InitializeComponent();
 | |
| 			this.AllowDrop = true;
 | |
| 			DragHelper.InitCommonControls();
 | |
| 			this.ItemDrag += new ItemDragEventHandler(tv_ItemDrag);
 | |
| 			this.DragDrop += new DragEventHandler(tv_DragDrop);
 | |
| 			this.DragEnter += new DragEventHandler(tv_DragEnter);
 | |
| 			this.DragLeave += new EventHandler(tv_DragLeave);
 | |
| 			this.DragOver += new DragEventHandler(tv_DragOver);
 | |
| 			this.MouseDown += new MouseEventHandler(tv_MouseDown);
 | |
| 			this.KeyPress += new KeyPressEventHandler(tv_KeyPress);
 | |
| 			base.AfterSelect += new TreeViewEventHandler(tv_AfterSelect);
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region MenuSupport
 | |
| 		private void tv_AfterSelect(object sender, TreeViewEventArgs e)
 | |
| 		{
 | |
| 			OnNodeSelectionChange(sender, new vlnTreeEventArgs(e.Node));
 | |
| 		}
 | |
| 		// use to determine which menu items have been selected for those tree nodes
 | |
| 		// that allow more than one type of operation associated with their selection. 
 | |
| 		public enum MenuSelections : int
 | |
| 		{
 | |
| 			Folder = 1, FolderBefore = 2, FolderAfter = 3, DocVersion = 4, Procedure = 5, ProcedureBefore = 6, ProcedureAfter = 7, Section = 8, SectionBefore = 9, SectionAfter = 10, Step = 11, StepBefore = 12, StepAfter = 13
 | |
| 		}
 | |
| 		void tv_MouseDown(object sender, MouseEventArgs e)
 | |
| 		{
 | |
| 			if (e.Button == MouseButtons.Right)
 | |
| 			{
 | |
| 				VETreeNode tn = this.GetNodeAt(new Point(e.X, e.Y)) as VETreeNode;
 | |
| 				if (tn != null)
 | |
| 				{
 | |
| 					this.SelectedNode = tn as TreeNode;
 | |
| 					Application.DoEvents();
 | |
| 					// Display Menu
 | |
| 					ToolStripMenuItem mi = new ToolStripMenuItem();
 | |
| 					ContextMenu cm = new ContextMenu();
 | |
| 
 | |
| 					#region Menu_New
 | |
| 					if (tn.VEObject as FolderInfo != null)
 | |
| 					{
 | |
| 						// For Folders, if no children, can add either docversion or folder.  If children are
 | |
| 						// folders then can only add another folder, and if children are docversions can only
 | |
| 						// add docversion.
 | |
| 						FolderInfo fi = tn.VEObject as FolderInfo;
 | |
| 						if (fi.MyParent != null)		// don't allow insert before/after if at top node
 | |
| 						{
 | |
| 							cm.MenuItems.Add("Insert Folder Before", new EventHandler(mi_Click));
 | |
| 							cm.MenuItems.Add("Insert Folder After", new EventHandler(mi_Click));
 | |
| 						}
 | |
| 						if (fi.FolderDocVersionCount == 0) cm.MenuItems.Add("New Folder", new EventHandler(mi_Click));
 | |
| 						if (fi.ChildFolderCount == 0) cm.MenuItems.Add("New Document Version", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					else if (tn.VEObject as DocVersionInfo != null)		// DocVersions can only contain procs
 | |
| 						cm.MenuItems.Add("New Procedure", new EventHandler(mi_Click));
 | |
| 					else if (tn.VEObject as ProcedureInfo != null)		// Procs can only contain sections
 | |
| 					{
 | |
| 						cm.MenuItems.Add("Insert Procedure Before", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("Insert Procedure After", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("New Section", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					else if (tn.VEObject as SectionInfo != null)
 | |
| 					{
 | |
| 						// A step Section can contain other steps or can contain subsections (either step section
 | |
| 						// or word doc section). Also note that there can be a mix.
 | |
| 						// A word doc section can contain another subsection (either step section or word doc section),
 | |
| 						// but cannot contain steps.
 | |
| 						SectionInfo si = tn.VEObject as SectionInfo;
 | |
| 						// Do not need step versus Word doc options, user enters this in property page during
 | |
| 						// insert process.
 | |
| 						cm.MenuItems.Add("Insert Section Before", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("Insert Section After", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("New Subsection", new EventHandler(mi_Click));
 | |
| 						if (si.IsStepSection) cm.MenuItems.Add("New Step", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					else if (tn.VEObject as StepInfo != null)
 | |
| 					{
 | |
| 						cm.MenuItems.Add("Insert Step Before", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("Insert Step After", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					#endregion
 | |
| 					#region Menu_Open
 | |
| 					if (!tn.IsExpanded && tn.VEObject as SectionInfo != null)
 | |
| 					{
 | |
| 						SectionInfo si = tn.VEObject as SectionInfo;
 | |
| 						if (si.IsStepSection) cm.MenuItems.Add("Open", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					else if (!tn.IsExpanded && tn.VEObject as StepInfo != null)
 | |
| 					{
 | |
| 						StepInfo stpi = tn.VEObject as StepInfo;
 | |
| 						if (stpi.HasChildren) cm.MenuItems.Add("Open", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					else if (!tn.IsExpanded)
 | |
| 						cm.MenuItems.Add("Open", new EventHandler(mi_Click));
 | |
| 					#endregion
 | |
| 					#region Menu_CutCopy
 | |
| 					// For initial release, cut/copy are not available for folders or docversions
 | |
| 					if (tn.VEObject as FolderInfo != null && tn.VEObject as DocVersionInfo != null)
 | |
| 					{
 | |
| 						cm.MenuItems.Add("Cut", new EventHandler(mi_Click));
 | |
| 						cm.MenuItems.Add("Copy", new EventHandler(mi_Click));
 | |
| 					}
 | |
| 					#endregion
 | |
| 					#region MenuPaste
 | |
| 					// Find what's in paste buffer & determine whether the paste can occur for the selected node.
 | |
| 					//ItemInfo iiClipboard = Clipboard.GetData("ItemInfo") as ItemInfo;
 | |
| 					//if (iiClipboard != null)
 | |
| 					//{
 | |
| 					//    // can it be pasted at current node.
 | |
| 					//    if (tn.VEObject as DocVersionInfo != null)		// paste item must be a proc
 | |
| 					//    {
 | |
| 					//        if (iiClipboard.IsProcedure) cm.MenuItems.Add("Paste Procedure", new EventHandler(mi_Click));
 | |
| 					//    }
 | |
| 					//    else
 | |
| 					//    {
 | |
| 					//        ItemInfo iiPasteHere = tn.VEObject as ItemInfo;
 | |
| 					//        if (iiPasteHere != null)
 | |
| 					//        {
 | |
| 					//            if (iiPasteHere.IsProcedure && iiClipboard.IsSection)  // procedure must have sections only
 | |
| 					//                cm.MenuItems.Add("Paste Section", new EventHandler(mi_Click));
 | |
| 					//            else if (iiPasteHere.IsSection && iiClipboard.IsSection)
 | |
| 					//                cm.MenuItems.Add("Paste Section", new EventHandler(mi_Click));
 | |
| 					//            else if (iiPasteHere.IsStepSection && iiClipboard.IsStep)
 | |
| 					//                cm.MenuItems.Add("Paste Step", new EventHandler(mi_Click));
 | |
| 					//        }
 | |
| 					//    }
 | |
| 					//}
 | |
| 					#endregion
 | |
| 					#region Menu_Delete
 | |
| 					// Add delete to the menu unless at the very 'top' node.
 | |
| 					if (tn.Parent!=null) cm.MenuItems.Add("Delete", new EventHandler(mi_Click));
 | |
| 					#endregion
 | |
| 					#region Menu_Properties
 | |
| 					cm.MenuItems.Add("Properties...", new EventHandler(mi_Click));
 | |
| 					#endregion
 | |
| 					cm.Show(this, new Point(e.X, e.Y));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		void mi_Click(object sender, EventArgs e)
 | |
| 		{
 | |
| 			MenuItem mi = (MenuItem)sender;
 | |
| 			SelectedNode.Expand();
 | |
| 			switch (mi.Text)
 | |
| 			{
 | |
| 				case "Open":
 | |
| 					OpenNode();
 | |
| 					break;
 | |
| 				case "Insert Folder Before":
 | |
| 					tv_NodeNew(MenuSelections.FolderBefore);
 | |
| 					break;
 | |
| 				case "Insert Folder After":
 | |
| 					tv_NodeNew(MenuSelections.FolderAfter);
 | |
| 					break;
 | |
| 				case "New Folder": 
 | |
| 					tv_NodeNew(MenuSelections.Folder);					
 | |
| 					break;
 | |
| 				case "New Document Version":
 | |
| 					tv_NodeNew(MenuSelections.DocVersion);
 | |
| 					break;
 | |
| 				case "New Procedure":
 | |
| 					tv_NodeNew(MenuSelections.Procedure);
 | |
| 					break;
 | |
| 				case "Insert Procedure Before":
 | |
| 					tv_NodeNew(MenuSelections.ProcedureBefore);
 | |
| 					break;
 | |
| 				case "Insert Procedure After":
 | |
| 					tv_NodeNew(MenuSelections.ProcedureAfter);
 | |
| 					break;
 | |
| 				case "New Section":
 | |
| 				case "New Subsection":
 | |
| 					tv_NodeNew(MenuSelections.Section);
 | |
| 					break;
 | |
| 				case "Insert Section Before":
 | |
| 					tv_NodeNew(MenuSelections.SectionBefore);
 | |
| 					break;
 | |
| 				case "Insert Section After":
 | |
| 					tv_NodeNew(MenuSelections.SectionAfter);
 | |
| 					break;
 | |
| 				case "Insert Step Before":
 | |
| 					tv_NodeNew(MenuSelections.StepBefore);
 | |
| 					break;
 | |
| 				case "Insert Step After":
 | |
| 					tv_NodeNew(MenuSelections.StepAfter);
 | |
| 					break;
 | |
| 				case "New Step":
 | |
| 					tv_NodeNew(MenuSelections.Step);
 | |
| 					break;
 | |
| 				case "Cut"://Cut the selected node
 | |
| 					// Cut to Clipboard
 | |
| 					break;
 | |
| 				case "Copy"://Copy the selected node
 | |
| 					// Add to Clipboard
 | |
| 					break;
 | |
| 				case "Paste"://Paste the clipboard node
 | |
| 					// this is either a copy or a move depending upon where it came from
 | |
| 					// if it is from a cut then when the paste is done it should be set to a copy
 | |
| 					break;
 | |
| 				case "Delete"://Delete the selected node
 | |
| 					if (tv_NodeDelete())
 | |
| 					{
 | |
| 						TreeNode myParent = SelectedNode.Parent;
 | |
| 						SelectedNode.Remove();
 | |
| 						SelectedNode = myParent;
 | |
| 						OnNodeSelect(this, new vlnTreeEventArgs(SelectedNode));
 | |
| 					}
 | |
| 					break;
 | |
| 				case "Properties..."://Show the properties for the selected node
 | |
| 					SetLastValues((VETreeNode)SelectedNode);
 | |
| 					SetupNodeProperties();
 | |
| 					break;
 | |
| 				default:
 | |
| 					MessageBox.Show(string.Format("Unrecognized Menu Item '{0}'", mi.Text));
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region PropertyPagesInterface
 | |
| 		private void SetupNodeProperties()
 | |
| 		{
 | |
| 			VETreeNode tn = SelectedNode as VETreeNode;
 | |
| 			if (tn==null)return;
 | |
| 
 | |
| 			if ((tn.VEObject as FolderInfo) != null)
 | |
| 				OpenProperties(tn.VEObject as FolderInfo);
 | |
| 			else if ((tn.VEObject as DocVersionInfo) != null)
 | |
| 				OpenProperties(tn.VEObject as DocVersionInfo);
 | |
| 			else if ((tn.VEObject as ProcedureInfo) != null)
 | |
| 				OpenProperties(tn.VEObject as ProcedureInfo);
 | |
| 			else if ((tn.VEObject as SectionInfo) != null)
 | |
| 				OpenProperties(tn.VEObject as SectionInfo);
 | |
| 			else if ((tn.VEObject as StepInfo) != null)
 | |
| 				MessageBox.Show("Open up info tab or whatever is associated with step");
 | |
| 			tn.RefreshNode();
 | |
| 		}
 | |
| 		private void OpenProperties(FolderInfo folderInfo)
 | |
| 		{
 | |
| 			using (Folder folder = folderInfo.Get())
 | |
| 			{
 | |
| 				if(OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} Properties", folder.FolderConfig.Name),folder.FolderConfig))==DialogResult.OK)
 | |
| 					folder.Save().Dispose();
 | |
| 			}
 | |
| 		}
 | |
| 		private void OpenProperties(DocVersionInfo dvInfo)
 | |
| 		{
 | |
| 			using (DocVersion dv = dvInfo.Get())
 | |
| 			{
 | |
| 				if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0} Properties", dv.DocVersionConfig.Name), dv.DocVersionConfig)) == DialogResult.OK)
 | |
| 					dv.Save().Dispose();
 | |
| 			}
 | |
| 		}
 | |
| 		private void OpenProperties(ProcedureInfo procInfo)
 | |
| 		{
 | |
| 			using (Procedure proc = procInfo.Get())
 | |
| 			{
 | |
| 				if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(string.Format("{0}  {1} Properties", proc.ProcedureConfig.Number, proc.ProcedureConfig.Title), proc.ProcedureConfig)) == DialogResult.OK)
 | |
| 					proc.Save().Dispose();
 | |
| 			}
 | |
| 		}
 | |
| 		private void OpenProperties(SectionInfo sectInfo)
 | |
| 		{
 | |
| 			using (Section sect = sectInfo.Get())
 | |
| 			{
 | |
| 				string title = null;
 | |
| 				if (sectInfo.SectionConfig.Number.Length > 0)
 | |
| 					title = string.Format("{0}  {1} Properties", sectInfo.SectionConfig.Number, sectInfo.SectionConfig.Title);
 | |
| 				else
 | |
| 					title = string.Format("{0} Properties", sectInfo.SectionConfig.Title);
 | |
| 				if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(title, sect.SectionConfig)) == DialogResult.OK)
 | |
| 					sect.Save().Dispose();
 | |
| 				sect.MyContent.Dispose(); // Force Dispose of related content
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region OpenNode
 | |
| 		private void tv_KeyPress(object sender, KeyPressEventArgs e)
 | |
| 		{
 | |
| 			if (e.KeyChar == '\r')
 | |
| 			{
 | |
| 				OpenNode();
 | |
| 				e.Handled = true;
 | |
| 			}
 | |
| 		}
 | |
| 		public void OpenNode()
 | |
| 		{
 | |
| 			VETreeNode tn = SelectedNode as VETreeNode;
 | |
| 			if (tn != null)
 | |
| 			{
 | |
| 				if (tn.VEObject.GetType() == typeof(FolderInfo) || tn.VEObject.GetType() == typeof(DocVersionInfo))
 | |
| 				{
 | |
| 					if (tn.Nodes.Count > 0)
 | |
| 					{
 | |
| 						tn.Expand();
 | |
| 						SelectedNode = tn.Nodes[0];
 | |
| 						Focus();
 | |
| 					}
 | |
| 				}
 | |
| 				else
 | |
| 					OnNodeSelect(this, new vlnTreeEventArgs(SelectedNode));
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region InsertAllLevels
 | |
| 		public void tv_NodeNew(MenuSelections newtype)
 | |
| 		{
 | |
| 			VETreeNode tn = null;
 | |
| 			if (SelectedNode == null) return;
 | |
| 			SetLastValues((VETreeNode)SelectedNode);
 | |
| 
 | |
| 			#region InsertFolderOrDocVersion
 | |
| 			if (_LastFolderInfo != null)
 | |
| 			{
 | |
| 				using (Folder parentfolder = _LastFolderInfo.Get())
 | |
| 				{
 | |
| 					if (newtype == MenuSelections.DocVersion)
 | |
| 					{
 | |
| 						using (DocVersion docversion = DocVersion.MakeDocVersion(parentfolder, "New Document Version", "Title", null, null, null))
 | |
| 						{
 | |
| 							ShowBrokenRules(docversion.BrokenRulesCollection);
 | |
| 							SetLastValues(DocVersionInfo.Get(docversion.VersionID));
 | |
| 							if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs("New Document Version", docversion.DocVersionConfig)) == DialogResult.OK)
 | |
| 								docversion.Save().Dispose();
 | |
| 							tn = new VETreeNode(_LastDocVersionInfo);
 | |
| 							SelectedNode.Nodes.Add(tn);		// add tree node to end of list.
 | |
| 						}
 | |
| 					}
 | |
| 					else if (newtype == MenuSelections.Folder)
 | |
| 					{
 | |
| 						string uniquename = _LastFolderInfo.UniqueChildName("New Folder");
 | |
| 						using (Folder folder = Folder.MakeFolder(parentfolder, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, string.Empty, DateTime.Now, "Test"))
 | |
| 						{
 | |
| 							ShowBrokenRules(folder.BrokenRulesCollection);
 | |
| 							SetLastValues(FolderInfo.Get(folder.FolderID));
 | |
| 							if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
 | |
| 								folder.Save().Dispose();
 | |
| 							tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo);
 | |
| 							SelectedNode.Nodes.Add(tn);	// add new tree node to end of childlist.
 | |
| 							
 | |
| 						}
 | |
| 					}
 | |
| 					else if (newtype == MenuSelections.FolderAfter||newtype == MenuSelections.FolderBefore)
 | |
| 					{
 | |
| 						string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder");
 | |
| 						int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0);
 | |
| 						FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.FolderID);
 | |
| 						double? myorder = parfolderinfo.NewManualOrder(myindex); 
 | |
| 						using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, "Test"))
 | |
| 						{
 | |
| 							ShowBrokenRules(folder.BrokenRulesCollection);
 | |
| 							SetLastValues(FolderInfo.Get(folder.FolderID));
 | |
| 							if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
 | |
| 								folder.Save().Dispose();
 | |
| 							tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo);
 | |
| 							if (newtype == MenuSelections.FolderBefore) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index, tn);
 | |
| 							if (newtype == MenuSelections.FolderAfter) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 1, tn);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 			#region InsertProcedure
 | |
| 			else if (newtype == MenuSelections.Procedure)
 | |
| 			{
 | |
| 				using (Procedure procedure = Procedure.MakeProcedure(_LastDocVersionInfo, _LastDocVersionInfo.Procedures.Count!=0?_LastDocVersionInfo.Procedures[_LastDocVersionInfo.Procedures.Count-1]:null, null, "New Procedure", 0))
 | |
| 				{
 | |
| 					ShowBrokenRules(procedure.BrokenRulesCollection);
 | |
| 					SetLastValues(ProcedureInfo.Get(procedure.ItemID));
 | |
| 					if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs("New Procedure", procedure.ProcedureConfig)) == DialogResult.OK)
 | |
| 						procedure.Save().Dispose();
 | |
| 					tn = new VETreeNode(_LastProcedureInfo);
 | |
| 					SelectedNode.Nodes.Add(tn);		// add tree node to end of list.
 | |
| 				}
 | |
| 			}
 | |
| 			else if (newtype == MenuSelections.ProcedureAfter || newtype == MenuSelections.ProcedureBefore)
 | |
| 			{
 | |
| 				int tvindex = SelectedNode.Index;
 | |
| 				// if inserting before, the parent is set in case previous is null, i.e. beginning of the list.
 | |
| 				using (Procedure procedure = Procedure.MakeProcedure((newtype == MenuSelections.ProcedureAfter) ? null : _LastProcedureInfo.ActiveParent, (newtype == MenuSelections.ProcedureAfter) ? _LastProcedureInfo : _LastProcedureInfo.MyPrevious, null, "New Procedure", 0))
 | |
| 				{
 | |
| 					ShowBrokenRules(procedure.BrokenRulesCollection);
 | |
| 					SetLastValues(ProcedureInfo.Get(procedure.ItemID));
 | |
| 					if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs("New Procedure", procedure.ProcedureConfig)) == DialogResult.OK)
 | |
| 						procedure.Save().Dispose();
 | |
| 					tn = new VETreeNode(_LastProcedureInfo);
 | |
| 					TreeNode par = SelectedNode.Parent;
 | |
| 					par.Nodes.Insert(tvindex + ((newtype == MenuSelections.ProcedureBefore) ? 0 : 1), tn);
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 			#region InsertSection
 | |
| 			else if (newtype == MenuSelections.Section)		// Insert subsection at end of parents section list
 | |
| 			{
 | |
| 				if (!(_LastProcedureInfo == null) || !(_LastSectionInfo == null))
 | |
| 				{
 | |
| 					using (Section section = Section.MakeSection(_LastItemInfo, _LastItemInfo.LastChild(E_FromType.Section), null, "New Section", 10000))// not sure of type - dataloader has: 10000+docstyleindx
 | |
| 					{
 | |
| 						ShowBrokenRules(section.BrokenRulesCollection);
 | |
| 						SetLastValues(SectionInfo.Get(section.ItemID));
 | |
| 						if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs("New Section", section.SectionConfig)) == DialogResult.OK)
 | |
| 						{
 | |
| 							section.Save().Dispose();
 | |
| 							FinishSectionSave(section);		// make a word document if type was set to word document.
 | |
| 						}
 | |
| 
 | |
| 						tn = new VETreeNode(_LastSectionInfo);
 | |
| 						SelectedNode.Nodes.Add(tn);		// add tree node to end of list.
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			else if (newtype == MenuSelections.SectionAfter || newtype == MenuSelections.SectionBefore)
 | |
| 			{
 | |
| 				int tvindex = SelectedNode.Index;
 | |
| 				// if inserting before, the parent is set in case previous is null, i.e. beginning of the list.
 | |
| 				//ItemInfo parent = (newtype == MenuSelections.SectionAfter) ? null : _LastSectionInfo.MyParent;
 | |
| 				using (Section section = Section.MakeSection((newtype == MenuSelections.SectionAfter) ? null : _LastSectionInfo.MyParent, (newtype == MenuSelections.SectionAfter) ? _LastSectionInfo : _LastSectionInfo.MyPrevious, null, "New Section", 10000))
 | |
| 				{
 | |
| 					ShowBrokenRules(section.BrokenRulesCollection);
 | |
| 					SetLastValues(SectionInfo.Get(section.ItemID));
 | |
| 					if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs("New Section", section.SectionConfig)) == DialogResult.OK)
 | |
| 					{
 | |
| 						section.Save().Dispose();
 | |
| 						FinishSectionSave(section);		// make a word document if type was set to word document.
 | |
| 					}
 | |
| 					tn = new VETreeNode(_LastSectionInfo);
 | |
| 					TreeNode par = SelectedNode.Parent;
 | |
| 					par.Nodes.Insert(tvindex + ((newtype == MenuSelections.SectionBefore) ? 0 : 1), tn);
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 			#region InsertStep
 | |
| 			else if (newtype == MenuSelections.Step)				// insert step from section - no substeps from tree.
 | |
| 			{
 | |
| 				using (Step step = Step.MakeStep(_LastItemInfo, _LastItemInfo.LastChild(E_FromType.Step),  null, "New Step", 20001, E_FromType.Step))
 | |
| 				{
 | |
| 					ShowBrokenRules(step.BrokenRulesCollection);
 | |
| 					SetLastValues(StepInfo.Get(step.ItemID));
 | |
| 					tn = new VETreeNode(_LastStepInfo);
 | |
| 					SelectedNode.Nodes.Add(tn);		// add tree node to end of list.
 | |
| 				}
 | |
| 			}
 | |
| 			else if (newtype == MenuSelections.StepAfter || newtype == MenuSelections.StepBefore && _LastStepInfo != null)
 | |
| 			{
 | |
| 				int tvindex = SelectedNode.Index;
 | |
| 				// if inserting before, the parent is set in case previous is null, i.e. beginning of the list.
 | |
| 				ItemInfo parent = (newtype == MenuSelections.StepAfter) ? null : _LastStepInfo.MyParent;
 | |
| 				using (Step step = Step.MakeStep(parent, (newtype == MenuSelections.StepAfter) ? _LastStepInfo : _LastStepInfo.MyPrevious, null, "New Step", 20001, E_FromType.Step))
 | |
| 				{
 | |
| 					ShowBrokenRules(step.BrokenRulesCollection);
 | |
| 					SetLastValues(StepInfo.Get(step.ItemID));
 | |
| 					tn = new VETreeNode(_LastStepInfo);
 | |
| 					TreeNode par = SelectedNode.Parent;
 | |
| 					par.Nodes.Insert(tvindex + ((newtype == MenuSelections.StepBefore) ? 0 : 1), tn);
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 
 | |
| 			SelectedNode = tn;
 | |
| 			OnNodeSelect(this, new vlnTreeEventArgs(SelectedNode));
 | |
| 			Refresh();
 | |
| 		}
 | |
| 		/// <summary>
 | |
| 		/// NewName will check the existing children to assure that the name is not a duplicate name.
 | |
| 		/// </summary>
 | |
| 		/// <param name="parentFolderInfo"></param>
 | |
| 		/// <param name="folderName"></param>
 | |
| 		/// <returns></returns>
 | |
| 		//private string NewName(FolderInfo parentFolderInfo, string folderName)
 | |
| 		//{
 | |
| 		//    string retval = folderName;
 | |
| 		//    int iSuffix = -1;
 | |
| 		//    parentFolderInfo.RefreshChildFolders();
 | |
| 		//    foreach (FolderInfo fi in parentFolderInfo.ChildFolders)
 | |
| 		//    {
 | |
| 		//        if (fi.Name.StartsWith(folderName))
 | |
| 		//        {
 | |
| 		//            if (fi.Name == folderName)
 | |
| 		//                iSuffix = 0;
 | |
| 		//            else if (Regex.IsMatch(fi.Name, folderName + "[_][0-9]+"))
 | |
| 		//            {
 | |
| 		//                int ii = int.Parse(fi.Name.Substring(1 + folderName.Length));
 | |
| 		//                if (ii > iSuffix) iSuffix = ii;
 | |
| 		//            }
 | |
| 		//        }
 | |
| 		//    }
 | |
| 		//    if (iSuffix >= 0)
 | |
| 		//        retval = string.Format("{0}_{1}", folderName, iSuffix + 1);
 | |
| 		//    // Console.WriteLine("FolderName = '{0}'", retval);
 | |
| 		//    return retval;
 | |
| 		//}
 | |
| 		private void FinishSectionSave(Section section)
 | |
| 		{
 | |
| 			ItemInfo sectinfo = ItemInfo.Get(section.ItemID);
 | |
| 			
 | |
| 			// need to find out if this is a word document type section & if it is, create a new word doc.
 | |
| 			bool isWordSect = true;
 | |
| 			int sectype = (int) sectinfo.MyContent.Type - 10000;
 | |
| 			PlantFormat pf = sectinfo.ActiveFormat.PlantFormat;
 | |
| 			for (int i = 0; i < pf.DocStyles.DocStyleList.Count; i++)
 | |
| 			{
 | |
| 				if (pf.DocStyles.DocStyleList[i].Index == sectype)
 | |
| 				{
 | |
| 					isWordSect = !pf.DocStyles.DocStyleList[i].IsStepSection;
 | |
| 					break;
 | |
| 				}
 | |
| 			}
 | |
| 			if (isWordSect && !sectinfo.HasWordContent)
 | |
| 			{
 | |
| 				Content cont = Content.Get(sectinfo.MyContent.ContentID);
 | |
| 
 | |
| 				Byte[] tstbyte = System.Text.Encoding.Default.GetBytes("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033\\uc1 }\r\n");
 | |
| 				Document doc = Document.MakeDocument(null, tstbyte, null, null);
 | |
| 				Entry entry = cont.MyEntry;
 | |
| 				entry.MyDocument = Document.Get(doc.DocID);
 | |
| 				cont.Save().Dispose();
 | |
| 			}
 | |
| 		}
 | |
| 		private void ShowBrokenRules(BrokenRulesCollection brs)
 | |
| 		{
 | |
| 			if (brs != null)
 | |
| 			{
 | |
| 				foreach (BrokenRule br in brs)
 | |
| 				{
 | |
| 					Console.WriteLine("broken rule {0}", br.Description);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region DeleteAllLevels
 | |
| 		private bool tv_NodeDelete()
 | |
| 		{
 | |
| 			OnNodeSelect(this, new vlnTreeEventArgs(SelectedNode));
 | |
| 			SetLastValues((VETreeNode)SelectedNode);
 | |
| 
 | |
| 			DialogResult result = MessageBox.Show("Are you sure you want to delete " + SelectedNode.Text, "Verify Delete",
 | |
| 				MessageBoxButtons.YesNo, MessageBoxIcon.Question);
 | |
| 			if (result == DialogResult.Yes)
 | |
| 			{
 | |
| 				if (_LastFolderInfo != null)
 | |
| 				{
 | |
| 					Folder.Delete(_LastFolderInfo.FolderID);
 | |
| 					_LastFolderInfo = null;
 | |
| 					return true;
 | |
| 				}
 | |
| 				else if (_LastDocVersionInfo != null)
 | |
| 				{
 | |
| 					DocVersion.Delete(_LastDocVersionInfo.VersionID);
 | |
| 					_LastDocVersionInfo = null;
 | |
| 					return true;
 | |
| 				}
 | |
| 				else if (_LastProcedureInfo != null)
 | |
| 				{
 | |
| 					Procedure.Delete(_LastProcedureInfo.ItemID);
 | |
| 					_LastProcedureInfo = null;
 | |
| 					return true;
 | |
| 				}
 | |
| 				else if (_LastSectionInfo != null)
 | |
| 				{
 | |
| 					Section.Delete(_LastSectionInfo.ItemID);
 | |
| 					_LastSectionInfo = null;
 | |
| 					return true;
 | |
| 				}
 | |
| 				else if (_LastStepInfo != null)
 | |
| 				{
 | |
| 					Step.Delete(_LastStepInfo.ItemID);
 | |
| 					_LastStepInfo = null;
 | |
| 					return true;
 | |
| 				}
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region SetLastValuesAndSaveIfChangedStuff
 | |
| 		private void SetLastValues(VETreeNode node)
 | |
| 		{
 | |
| 			_LastTreeNode = node;
 | |
| 			SetLastValues(node.VEObject);
 | |
| 		}
 | |
| 		private void SetLastValues(IVEDrillDownReadOnly veobject)
 | |
| 		{
 | |
| 			_LastFolderInfo = veobject as FolderInfo;
 | |
| 			_LastDocVersionInfo = veobject as DocVersionInfo;
 | |
| 			_LastProcedureInfo = veobject as ProcedureInfo;
 | |
| 			_LastSectionInfo = veobject as SectionInfo;
 | |
| 			_LastStepInfo = veobject as StepInfo;
 | |
| 			_LastItemInfo = veobject as ItemInfo;
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region Cursor
 | |
| 		private bool SetupDragCursor(ImageList il, TreeNode tn)
 | |
| 		{
 | |
| 			// Reset image list used for drag image
 | |
| 			il.Images.Clear();
 | |
| 			int howBig = tn.Bounds.Size.Width + this.Indent;
 | |
| 			if (howBig > 256) howBig = 256;
 | |
| 			il.ImageSize = new Size(howBig, tn.Bounds.Height);
 | |
| 
 | |
| 			// Create new bitmap
 | |
| 			// This bitmap will contain the tree node image to be dragged
 | |
| 			Bitmap bmp = new Bitmap(tn.Bounds.Width + this.Indent, tn.Bounds.Height);
 | |
| 
 | |
| 			// Get graphics from bitmap
 | |
| 			Graphics gfx = Graphics.FromImage(bmp);
 | |
| 
 | |
| 			// Draw node icon into the bitmap
 | |
| 			if (this.ImageList != null) gfx.DrawImage(this.ImageList.Images[0], 0, 0);
 | |
| 
 | |
| 			// Draw node label into bitmap
 | |
| 			gfx.DrawString(tn.Text, this.Font, new SolidBrush(this.ForeColor),
 | |
| 				//				new SolidBrush(Color.Blue),
 | |
| 				(float)this.Indent, 1.0f);
 | |
| 
 | |
| 			// Add bitmap to imagelist
 | |
| 			_dragImageList.Images.Add(bmp);
 | |
| 
 | |
| 			// Get mouse position in client coordinates
 | |
| 			Point p = this.PointToClient(Control.MousePosition);
 | |
| 
 | |
| 			// Compute delta between mouse position and node bounds
 | |
| 			int dx = p.X + this.Indent - tn.Bounds.Left;
 | |
| 			int dy = p.Y - tn.Bounds.Top;
 | |
| 
 | |
| 			// Begin dragging image
 | |
| 			return DragHelper.ImageList_BeginDrag(_dragImageList.Handle, 0, dx, dy);
 | |
| 		}
 | |
| 		private void tv_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
 | |
| 		{
 | |
| 			// Get drag node and select it
 | |
| 			try
 | |
| 			{
 | |
| 				TreeNode dragNode = (TreeNode)e.Item;
 | |
| 				Type t = dragNode.GetType();
 | |
| 				if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Item Drag {0} - {1}", t.FullName, t.BaseType.FullName);
 | |
| 				Type t2 = Type.GetType(t.FullName);
 | |
| 				if(t2 != null)
 | |
| 					if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Item Drag {0} - {1}", t2.FullName, t2.BaseType.FullName);
 | |
| 				this.SelectedNode = dragNode;
 | |
| 				if (SetupDragCursor(_dragImageList, dragNode))
 | |
| 				{
 | |
| 					this.DoDragDrop(dragNode, DragDropEffects.Move | DragDropEffects.Copy);// Begin dragging
 | |
| 					DragHelper.ImageList_EndDrag();// End dragging image
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				if(_MyLog.IsErrorEnabled)_MyLog.Error("tv_ItemDrag", ex);
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region DragDrop
 | |
| 		ImageList _dragImageList = new ImageList();
 | |
| 		public enum DropPosition : int
 | |
| 		{
 | |
| 			Child = 0, Before = 1, After = 2
 | |
| 		}
 | |
| 		private class DropLocation
 | |
| 		{
 | |
| 			#region Business Methods
 | |
| 			private TreeNode _dropNode;
 | |
| 			public TreeNode DropNode
 | |
| 			{
 | |
| 				get { return _dropNode; }
 | |
| 				set { _dropNode = value; }
 | |
| 			}
 | |
| 			private int _index;
 | |
| 			public int Index
 | |
| 			{
 | |
| 				get { return _index; }
 | |
| 				set { _index = value; }
 | |
| 			}
 | |
| 			private DropPosition _position;
 | |
| 			public DropPosition Position
 | |
| 			{
 | |
| 				get { return _position; }
 | |
| 				set { _position = value; }
 | |
| 			}
 | |
| 			DateTime _lastScroll;
 | |
| 			public DateTime LastScroll
 | |
| 			{
 | |
| 				get { return _lastScroll; }
 | |
| 			}
 | |
| 			private string _location = string.Empty; 
 | |
| 			#endregion
 | |
| 			#region Constructors
 | |
| 			public DropLocation(TreeView tv, System.Windows.Forms.DragEventArgs e, DateTime lastScroll)
 | |
| 			{
 | |
| 				_lastScroll = lastScroll;
 | |
| 				_dropNode = tv.GetNodeAt(tv.PointToClient(new Point(e.X, e.Y)));
 | |
| 				if (_dropNode == null) return;
 | |
| 				int OffsetY = tv.PointToClient(Cursor.Position).Y - _dropNode.Bounds.Top;
 | |
| 				if (OffsetY < _dropNode.Bounds.Height / 3) // First Third - Before
 | |
| 				{
 | |
| 					_index = _dropNode.Index;
 | |
| 					_dropNode = _dropNode.Parent;
 | |
| 					_position = DropPosition.Before;
 | |
| 					_location = string.Format("Before1 {0}[{1}] y={2}", _dropNode.Text, _index, OffsetY);
 | |
| 				}
 | |
| 				else if ((OffsetY / 2) < _dropNode.Bounds.Height / 3) // Second Third - Child
 | |
| 				{
 | |
| 					_location = string.Format("Child {0} y={1}", _dropNode.Text, OffsetY);
 | |
| 					_position = DropPosition.Child;
 | |
| 					_index = 0;
 | |
| 					if (_dropNode.Parent == null)
 | |
| 					{
 | |
| 						if(_MyLog.IsInfoEnabled)_MyLog.Info("Root Node");
 | |
| 					}
 | |
| 				}
 | |
| 				else // Last Third - After Now I need to check the X value
 | |
| 				{
 | |
| 					if (_dropNode.NextVisibleNode != null && _dropNode.Nodes.Count > 0 && _dropNode.IsExpanded)// Has Children & Expanded - Insert first child 
 | |
| 					{
 | |
| 						//						_dropNode = _dropNode.Nodes[0];
 | |
| 						_index = 0;
 | |
| 						_position = DropPosition.Before;
 | |
| 						_location = string.Format("Before2 {0}[{1}] y={2}", _dropNode.Text, _index, OffsetY);
 | |
| 					}
 | |
| 					else // No Children or Children Collapsed - Insert Next at various levels depending upon horizontal location.
 | |
| 					{
 | |
| 						Point pt = tv.PointToClient(new Point(e.X, e.Y));
 | |
| 						TreeNode nextParent = _dropNode.NextNode;
 | |
| 						if (nextParent != null) nextParent = nextParent.Parent;
 | |
| 						do
 | |
| 						{
 | |
| 							_index = _dropNode.Index;
 | |
| 							_dropNode = _dropNode.Parent;
 | |
| 						} while (pt.X < _dropNode.Bounds.X && _dropNode != nextParent);
 | |
| 						_location = string.Format("After {0}[{1}] y={2}", _dropNode.Text, _index, OffsetY);
 | |
| 						_position = DropPosition.After;
 | |
| 					}
 | |
| 				}
 | |
| 				LimitMoves(e);
 | |
| 			}
 | |
| 			public void LimitMoves(DragEventArgs e)
 | |
| 			{
 | |
| 				if ((e.KeyState & 8) == 0)
 | |
| 				{
 | |
| 					//TreeNode dragNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
 | |
| 					//TreeNode dragNode = (TreeNode)e.Data.GetData("TreeTest.FolderTreeNode");
 | |
| 					TreeNode dragNode = vlnTreeView.GetTreeNodeFromData(e.Data);
 | |
| 					switch (_position)
 | |
| 					{
 | |
| 						case DropPosition.Before:
 | |
| 							if (dragNode == _dropNode.Nodes[_index] || dragNode == _dropNode.Nodes[_index].PrevNode)
 | |
| 							{
 | |
| 								//					if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Before {0} {1} {2} {3} {4}", dragNode.Text ,_position.ToString() , _dropNode.Nodes[_index].Text
 | |
| 								//						,_dropNode.Nodes[_index].PrevNode,_dropNode.Nodes[_index].NextNode);
 | |
| 								_dropNode = null;
 | |
| 							}
 | |
| 							break;
 | |
| 						case DropPosition.Child:
 | |
| 							if (dragNode.Parent == _dropNode)
 | |
| 							{
 | |
| 								//					if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Child {0} {1} {2} {3} {4} {5}", dragNode.Text ,_position.ToString() , _dropNode.Nodes[_index].Text
 | |
| 								//						,_dropNode.Nodes[_index].PrevNode,_dropNode.Nodes[_index].NextNode,DateTime.Now);
 | |
| 								_dropNode = null;
 | |
| 							}
 | |
| 							break;
 | |
| 						case DropPosition.After:
 | |
| 							if (dragNode == _dropNode.Nodes[_index] || dragNode == _dropNode.Nodes[_index].NextNode)
 | |
| 							{
 | |
| 								//					if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("After {0} {1} {2} {3} {4}", dragNode.Text ,_position.ToString() , _dropNode.Nodes[_index].Text
 | |
| 								//						,_dropNode.Nodes[_index].PrevNode,_dropNode.Nodes[_index].NextNode);
 | |
| 								_dropNode = null;
 | |
| 							}
 | |
| 							break;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 			public override string ToString()
 | |
| 			{
 | |
| 				return string.Format("{0}[{1}].{2}", _dropNode.Text, _index, _position.ToString());
 | |
| 			}
 | |
| 			#region Drawing
 | |
| 			private void TreeNodeTriangle(Graphics g)
 | |
| 			{
 | |
| 				Rectangle r = _dropNode.Bounds;
 | |
| 				int RightPos = r.Right + 6;
 | |
| 				Point[] RightTriangle = new Point[]{
 | |
| 											new Point(RightPos, r.Y ),
 | |
| 											new Point(RightPos - (r.Height / 2), r.Y + (r.Height / 2)),
 | |
| 											new Point(RightPos, r.Y + r.Height),
 | |
| 											new Point(RightPos - (r.Height / 3), r.Y + (r.Height / 2))
 | |
| 				};
 | |
| 				g.FillPolygon(System.Drawing.Brushes.Black, RightTriangle);
 | |
| 			}
 | |
| 			private void InsertPointer(TreeNode tn, Graphics g)
 | |
| 			{
 | |
| 				TreeView tv = _dropNode.TreeView;
 | |
| 				Rectangle r2 = _dropNode.Nodes[_index].Bounds;
 | |
| 				Rectangle r3 = tn.Bounds;
 | |
| 				int y = (_position == DropPosition.Before ? r2.Y : r3.Bottom);
 | |
| 				int x = r2.Left;
 | |
| 
 | |
| 				if (y == 0)
 | |
| 				{
 | |
| 					return;
 | |
| 				}
 | |
| 								if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("Line at {0} Node {1}[{2}] {3}", _location, _dropNode.Text, _index, _position.ToString());
 | |
| 				Color lc = (_position == DropPosition.After ? Color.Red : Color.Blue);
 | |
| 				Brush lb = (_position == DropPosition.After ? Brushes.Red : Brushes.Blue);
 | |
| 				Point[] RightTriangle;
 | |
| 				if (_position == DropPosition.After)
 | |
| 				{
 | |
| 					RightTriangle = new Point[]{
 | |
| 												new Point(x, y ),
 | |
| 												new Point(x+4, y+4),
 | |
| 												new Point(x+8, y)};
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					RightTriangle = new Point[]{
 | |
| 												new Point(x, y),
 | |
| 												new Point(x+4, y-4),
 | |
| 												new Point(x+8, y)};
 | |
| 				}
 | |
| 				g.DrawLine(new System.Drawing.Pen(lc, 2), new Point(r2.Left, y), new Point(tv.Width - 8, y));
 | |
| 				g.FillPolygon(lb, RightTriangle);
 | |
| 			}
 | |
| 			public void ShowLocation(System.Windows.Forms.DragEventArgs e, bool ScrollOnly)
 | |
| 			{
 | |
| 				//if (e.Effect == DragDropEffects.None) return;
 | |
| 				if (_dropNode != null)
 | |
| 				{
 | |
| //					if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("ShowLocation1 {0} {1}", e.Effect.ToString(), DateTime.Now.Millisecond);
 | |
| 					DragHelper.ImageList_DragShowNolock(false);
 | |
| 					TreeView tv = _dropNode.TreeView;
 | |
| 					TreeNode tmp = tv.GetNodeAt(tv.PointToClient(new Point(e.X, e.Y)));
 | |
| //					if (!ScrollOnly)
 | |
| //					{
 | |
| 					if (ScrollTreeView(tmp) || !ScrollOnly)
 | |
| 					{
 | |
| 						if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("ShowLocation2 {0} {1}", e.Effect.ToString(), DateTime.Now.Millisecond);
 | |
| 						tv.Refresh();
 | |
| 						if (e.Effect != DragDropEffects.None)
 | |
| 						{
 | |
| 							//tv.SelectedNode = dropNode;
 | |
| 							Graphics g = tv.CreateGraphics();
 | |
| 							TreeNodeTriangle(g);
 | |
| 							if (_position != DropPosition.Child)InsertPointer(tmp, g);
 | |
| 						}
 | |
| 					}
 | |
| //					}
 | |
| //					else ScrollTreeView(tmp);
 | |
| 					DragHelper.ImageList_DragShowNolock(true);
 | |
| 				}
 | |
| 			}
 | |
| 			#endregion
 | |
| 			public void ShowLocation()
 | |
| 			{
 | |
| 				if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("{0}[{1}] {2}", _dropNode.Text, _index, _position.ToString());
 | |
| 			}
 | |
| 			#region AutoScroll
 | |
| 			private bool ScrollTreeView(TreeNode tn)
 | |
| 			{
 | |
| 				bool retval = false;
 | |
| 				TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - _lastScroll.Ticks);
 | |
| 				if (ts.Milliseconds > 100)// This controls the scroll speed
 | |
| 				{
 | |
| 					int top = tn.Bounds.Top;
 | |
| 					_lastScroll = DateTime.Now;
 | |
| 					if (tn.TreeView.ClientSize.Height < tn.Bounds.Bottom) tn.EnsureVisible();// Make sure that the current node is visible
 | |
| 					if (tn.NextVisibleNode != null && tn.TreeView.ClientSize.Height < tn.NextVisibleNode.Bounds.Bottom)
 | |
| 						tn.NextVisibleNode.EnsureVisible();// Make sure that the next node is visible
 | |
| 					else
 | |
| 						if (tn.PrevVisibleNode != null && tn.PrevVisibleNode.PrevVisibleNode != null && tn.PrevVisibleNode.PrevVisibleNode.IsVisible == false)
 | |
| 							tn.PrevVisibleNode.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible					}
 | |
| 						else
 | |
| 							if (tn.PrevVisibleNode != null && tn.PrevVisibleNode.IsVisible == false)
 | |
| 								tn.PrevVisibleNode.EnsureVisible();// Make sure that the previous node is visible
 | |
| 					retval = (top != tn.Bounds.Top);
 | |
| 					//					if (retval) if(_MyLog.IsInfoEnabled)_MyLog.Info("Scroll");
 | |
| 				}
 | |
| 				return retval;
 | |
| 			}
 | |
| 			#endregion
 | |
| 			public bool Equals(DropLocation dl)
 | |
| 			{
 | |
| 				return (dl != null && _lastScroll.Equals(dl.LastScroll) && _dropNode.Equals(dl.DropNode) &&
 | |
| 					_position.Equals(dl.Position));
 | |
| 			}
 | |
| 		}
 | |
| 		private DropLocation _LastDropLocation = null;
 | |
| 		private void tv_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				TreeNode dragNode = GetTreeNodeFromData(e.Data);
 | |
| 				// Compute drag position and move image
 | |
| 				Point formP = this.FindForm().PointToClient(new Point(e.X, e.Y));
 | |
| 				DragHelper.ImageList_DragMove(formP.X - this.Left, formP.Y - this.Top);
 | |
| 				DropLocation dl = new DropLocation(this, e, _LastDropLocation == null ? DateTime.Now : _LastDropLocation.LastScroll);
 | |
| 				string s = string.Empty;
 | |
| 				if (dl.DropNode == null)
 | |
| 				{
 | |
| 					e.Effect = DragDropEffects.None;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					DragDropEffects ee = e.Effect;
 | |
| 					if ((e.KeyState & 8) == 8)
 | |
| 						ee = DragDropEffects.Copy; // Copy it
 | |
| 					else
 | |
| 						ee = DragDropEffects.Move; // Move it
 | |
| 					if (IsChild(dragNode, dl.DropNode))				// Don't copy or move to a child node
 | |
| 						ee = DragDropEffects.None;
 | |
| 					else if (IsDocVersion((VETreeNode)dragNode))	// Don't move docversions
 | |
| 						ee = DragDropEffects.None;
 | |
| 					else if (IsFolder((VETreeNode)dragNode))		// Folder move is only valid if moving to folder with NO docversions
 | |
| 					{
 | |
| 						FolderInfo fdropi = ((VETreeNode)dl.DropNode).VEObject as FolderInfo;
 | |
| 						if (fdropi == null || fdropi.FolderDocVersionCount > 0) ee = DragDropEffects.None;
 | |
| 					}
 | |
| 					else if (IsSection((VETreeNode)dragNode))
 | |
| 					{
 | |
| 						// A section can be moved within a procedure or to a section within the same procedure...
 | |
| 						// For HLP, just move within the same procedure
 | |
| 						// TODO:   allow for section move within subsections.
 | |
| 						ProcedureInfo pdropi = ((VETreeNode)dl.DropNode).VEObject as ProcedureInfo;
 | |
| 						if (pdropi == null || (dragNode.Parent != dl.DropNode))	ee = DragDropEffects.None;
 | |
| 					}
 | |
| 					else if (!IsFolder((VETreeNode)dragNode) && (dragNode.Parent != dl.DropNode))
 | |
| 						ee = DragDropEffects.None;
 | |
| 					if (e.Effect != ee) e.Effect = ee;
 | |
| 					dl.ShowLocation(e, dl.Equals(_LastDropLocation));
 | |
| 					_LastDropLocation = dl;
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				if(_MyLog.IsErrorEnabled)_MyLog.Error("tv_DragOver", ex);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private bool IsSection(VETreeNode vETreeNode)
 | |
| 		{
 | |
| 			SectionInfo sectInfo = vETreeNode.VEObject as SectionInfo;
 | |
| 			if (sectInfo != null) return true;
 | |
| 			return false;
 | |
| 		}
 | |
| 		private bool IsProcedure(VETreeNode vETreeNode)
 | |
| 		{
 | |
| 			ProcedureInfo procInfo = vETreeNode.VEObject as ProcedureInfo;
 | |
| 			if (procInfo != null) return true;
 | |
| 			return false;
 | |
| 		}
 | |
| 		private bool IsDocVersion(VETreeNode dragNode)
 | |
| 		{
 | |
| 			DocVersionInfo dvInfo = dragNode.VEObject as DocVersionInfo;
 | |
| 			if (dvInfo != null) return true;
 | |
| 			return false;
 | |
| 		}
 | |
| 		private static TreeNode GetTreeNodeFromData(IDataObject datobj)
 | |
| 		{
 | |
| 			foreach (string s in datobj.GetFormats())
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| 					return (TreeNode)datobj.GetData(s);
 | |
| 				}
 | |
| 				catch (Exception ex)
 | |
| 				{
 | |
| 					if(_MyLog.IsErrorEnabled)_MyLog.Error("GetTreeNodeFromData", ex);
 | |
| 				}
 | |
| 			}
 | |
| 			return null;
 | |
| 		}
 | |
| 		private bool IsFolder(VETreeNode veTreeNode)
 | |
| 		{
 | |
| 			return (veTreeNode.VEObject.GetType() == typeof(FolderInfo));
 | |
| 		}
 | |
| 		private void tv_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				TreeNode dragNode = GetTreeNodeFromData(e.Data);
 | |
| 				DragHelper.ImageList_DragLeave(this.Handle);
 | |
| 				int index = _LastDropLocation.Index + (_LastDropLocation.Position == DropPosition.After ? 1 : 0);
 | |
| 				int myIndex = index;
 | |
| 				if (dragNode.Parent == _LastDropLocation.DropNode && dragNode.Index <= _LastDropLocation.Index) index--;
 | |
| 				if (e.Effect == DragDropEffects.Move)// If Move Remove drag node from parent
 | |
| 					dragNode.Remove();
 | |
| 				else
 | |
| 					dragNode = Clone(dragNode);
 | |
| 				_LastDropLocation.DropNode.Nodes.Insert(index, dragNode);
 | |
| 				this.SelectedNode = dragNode;
 | |
| 				FolderInfo fdragi = ((VETreeNode)dragNode).VEObject as FolderInfo;
 | |
| 				FolderInfo fdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as FolderInfo;
 | |
| 				if (fdragi != null && fdropi != null && fdropi.FolderDocVersionCount==0)
 | |
| 				{
 | |
| 					using (Folder fdrag = fdragi.Get())
 | |
| 					{
 | |
| 						using (Folder fdrop = fdropi.Get())
 | |
| 						{
 | |
| 							fdrag.ManualOrder = fdropi.NewManualOrder(myIndex);
 | |
| 							fdrag.MyParent = fdrop;
 | |
| 							fdrag.Save();
 | |
| 						}
 | |
| 					}
 | |
| 					return;
 | |
| 				}
 | |
| 				// No drag/drop supported for document versions.
 | |
| 
 | |
| 				// Allow drag/drop of procedures within a Document Version (must have same parent).  Note that drop location
 | |
| 				// may either be a document version or a procedure depending on where the user wants to position the procedure.				
 | |
| 				ProcedureInfo pdragi = ((VETreeNode)dragNode).VEObject as ProcedureInfo;
 | |
| 				ProcedureInfo pdropi = null;
 | |
| 				if (pdragi != null)		// moving a procedure
 | |
| 				{
 | |
| 					pdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as ProcedureInfo;
 | |
| 					if (pdropi != null && pdragi.ActiveParent == pdropi.ActiveParent)
 | |
| 					{
 | |
| 						pdragi.MoveProcedure(pdragi.ActiveParent, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 					DocVersionInfo dvdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as DocVersionInfo;
 | |
| 					DocVersionInfo dvdragpar = pdragi.ActiveParent as DocVersionInfo;
 | |
| 					if (dvdropi != null && dvdragpar.VersionID == dvdropi.VersionID)
 | |
| 					{
 | |
| 						pdragi.MoveProcedure(dvdropi, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// Allow drag/drop of sections within the same procedure or same section (if subsection) (must have same parent)
 | |
| 				SectionInfo sdragi = ((VETreeNode)dragNode).VEObject as SectionInfo;
 | |
| 				SectionInfo sdropi = null;
 | |
| 				if (sdragi != null)		// moving a section
 | |
| 				{
 | |
| 					sdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as SectionInfo;
 | |
| 					if (sdropi != null && sdragi.ActiveParent == sdropi.ActiveParent)
 | |
| 					{
 | |
| 						sdragi.MoveSection(sdragi, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 					pdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as ProcedureInfo;
 | |
| 					if (pdropi != null && sdragi.MyParent.ItemID == pdropi.ItemID)
 | |
| 					{
 | |
| 						sdragi.MoveSection(pdropi, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// Allow drag/drop of steps within the same parent only
 | |
| 				StepInfo stdragi = ((VETreeNode)dragNode).VEObject as StepInfo;
 | |
| 				StepInfo stdropi = null;
 | |
| 				if (stdragi != null)	// moving a step
 | |
| 				{
 | |
| 					stdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as StepInfo;
 | |
| 					if (stdropi != null && stdragi.ActiveParent == stdropi.ActiveParent)
 | |
| 					{
 | |
| 						stdragi.MoveStep(stdragi.ActiveParent, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 					sdropi = ((VETreeNode)_LastDropLocation.DropNode).VEObject as SectionInfo;
 | |
| 					if (sdropi != null && stdragi.MyParent.ItemID == sdropi.ItemID)
 | |
| 					{
 | |
| 						stdragi.MoveStep(stdragi.ActiveParent, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 					// the following handles items under the app nodes of 'steps', 'notes', 'cautions', etc.
 | |
| 					if (sdropi == null && dragNode.Parent == _LastDropLocation.DropNode)
 | |
| 					{
 | |
| 						stdragi.MoveStep(stdragi.ActiveParent, myIndex);
 | |
| 						return;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				if(_MyLog.IsErrorEnabled)_MyLog.Error("tv_DragDrop", ex);
 | |
| 			}
 | |
| 		}
 | |
| 		private void DumpMembers(object o)
 | |
| 		{
 | |
| 			Type t = o.GetType();
 | |
| 			if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("\r\n\r\nMembers for type {0}", t.ToString());
 | |
| 			MemberInfo[] mis = t.GetMembers();
 | |
| 			int i = 0;
 | |
| 			foreach (MemberInfo mi in mis)
 | |
| 			{
 | |
| 				i++;
 | |
| 				try
 | |
| 				{
 | |
| 					if(mi.MemberType != MemberTypes.Method)
 | |
| 						if(_MyLog.IsInfoEnabled)_MyLog.InfoFormat("{0} {1} {2}", i, mi.Name, mi.MemberType);
 | |
| //						if (fi.Name == "TreeView")
 | |
| //							fi.SetValue(o, null);
 | |
| 				}
 | |
| 				catch (Exception ex)
 | |
| 				{
 | |
| 						if(_MyLog.IsErrorEnabled)_MyLog.Error("DumpMembers", ex);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		private TreeNode Clone(TreeNode tn)
 | |
| 		{
 | |
| 
 | |
| 			TreeNode tmp = (TreeNode)tn.Clone();
 | |
| 			ExpandMatch(tmp,tn);
 | |
| 			return tmp;
 | |
| 		}
 | |
| 		private void tv_DragDropOld(object sender, System.Windows.Forms.DragEventArgs e)
 | |
| 		{
 | |
| 			TreeNode dragNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");// Get the drag node
 | |
| 			DragHelper.ImageList_DragLeave(this.Handle);
 | |
| 			TreeNode cloneNode = (TreeNode)dragNode.Clone();// copy the source node
 | |
| 			ExpandMatch(cloneNode, dragNode);
 | |
| 			_LastDropLocation.DropNode.Nodes.Insert(_LastDropLocation.Index + (_LastDropLocation.Position == DropPosition.After ? 1 : 0), cloneNode);
 | |
| 			if (e.Effect == DragDropEffects.Move)// If Move Remove drag node from parent
 | |
| 				dragNode.Remove();
 | |
| 			this.SelectedNode = cloneNode;
 | |
| 		}
 | |
| 		private void tv_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
 | |
| 		{
 | |
| 			DragHelper.ImageList_DragEnter(this.Handle, e.X - this.Left, e.Y - this.Top);
 | |
| 		}
 | |
| 		private void tv_DragLeave(object sender, System.EventArgs e)
 | |
| 		{
 | |
| 			DragHelper.ImageList_DragLeave(this.Handle);
 | |
| 			this.Refresh();
 | |
| 		}
 | |
| 		private void ExpandMatch(TreeNode tn1, TreeNode tn2)
 | |
| 		{
 | |
| 			if (tn2.IsExpanded) tn1.Expand();
 | |
| 			foreach (TreeNode tc in tn2.Nodes) ExpandMatch(tn1.Nodes[tc.Index], tc);
 | |
| 		}
 | |
| 		private bool IsChild(TreeNode parent, TreeNode child)
 | |
| 		{
 | |
| 			if (parent.Equals(child)) return true;// Check against self
 | |
| 			foreach (TreeNode tc in parent.Nodes) if (IsChild(tc, child)) return true;//Check all children
 | |
| 			return false;// Must not be a child at this level
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| 	#region DragHelper
 | |
| 	public class DragHelper
 | |
| 	{
 | |
| 		[DllImport("comctl32.dll")]
 | |
| 		public static extern bool InitCommonControls();
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern bool ImageList_BeginDrag(IntPtr himlTrack, int
 | |
| 			iTrack, int dxHotspot, int dyHotspot);
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern bool ImageList_DragMove(int x, int y);
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern void ImageList_EndDrag();
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern bool ImageList_DragEnter(IntPtr hwndLock, int x, int y);
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern bool ImageList_DragLeave(IntPtr hwndLock);
 | |
| 
 | |
| 		[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
 | |
| 		public static extern bool ImageList_DragShowNolock(bool fShow);
 | |
| 		static DragHelper()
 | |
| 		{
 | |
| 			InitCommonControls();
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| }
 |