B2025-018 PROMS - Issues with folder order in tree view. #526
@@ -19,6 +19,7 @@ using System.Drawing;
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.ComponentModel;
 | 
					using System.ComponentModel;
 | 
				
			||||||
using System.Text.RegularExpressions;
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace VEPROMS.CSLA.Library
 | 
					namespace VEPROMS.CSLA.Library
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -143,6 +144,8 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		#endregion
 | 
							#endregion
 | 
				
			||||||
		#region SortingChildren
 | 
							#region SortingChildren
 | 
				
			||||||
 | 
							private static bool IsInManualOrderNullFix = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		[NonSerialized]
 | 
							[NonSerialized]
 | 
				
			||||||
		public Csla.SortedBindingList<FolderInfo> _SortedChildFolders;
 | 
							public Csla.SortedBindingList<FolderInfo> _SortedChildFolders;
 | 
				
			||||||
		public Csla.SortedBindingList<FolderInfo> SortedChildFolders
 | 
							public Csla.SortedBindingList<FolderInfo> SortedChildFolders
 | 
				
			||||||
@@ -151,6 +154,29 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
			{
 | 
								{
 | 
				
			||||||
				if (ChildFolders != null)
 | 
									if (ChildFolders != null)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
 | 
										//B2025-018 Issues with folder order in tree view
 | 
				
			||||||
 | 
										// if any ChildFolders with a missing Manual Order
 | 
				
			||||||
 | 
										// set them to the end of the list
 | 
				
			||||||
 | 
										// use IsInManualOrderNullFix - so, if setting ChildFolders Currently, 
 | 
				
			||||||
 | 
										// do not try to set them (thus creating an infinite loop)
 | 
				
			||||||
 | 
										if (!IsInManualOrderNullFix && ChildFolders.Any(x => x.ManualOrder == null))
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											IsInManualOrderNullFix = true;
 | 
				
			||||||
 | 
											foreach (FolderInfo fi in ChildFolders.Where(x => x.ManualOrder == null))
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												using (FolderInfo parfolderinfo = FolderInfo.Get(fi.ParentID))
 | 
				
			||||||
 | 
												{
 | 
				
			||||||
 | 
													using (Folder fldr = fi.Get())
 | 
				
			||||||
 | 
													{
 | 
				
			||||||
 | 
														fldr.ManualOrder = parfolderinfo.NewManualOrder(9999);
 | 
				
			||||||
 | 
														fldr.Save();
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											RefreshChildFolders();
 | 
				
			||||||
 | 
											IsInManualOrderNullFix = false;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (_SortedChildFolders == null)
 | 
										if (_SortedChildFolders == null)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						_SortedChildFolders = new SortedBindingList<FolderInfo>(ChildFolders);
 | 
											_SortedChildFolders = new SortedBindingList<FolderInfo>(ChildFolders);
 | 
				
			||||||
@@ -166,6 +192,10 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
				return _SortedChildFolders;
 | 
									return _SortedChildFolders;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//B2025-018 Issues with folder order in tree view
 | 
				
			||||||
 | 
							//Note: this should be called from the parent item
 | 
				
			||||||
 | 
							//As you want to put this into the sorted order of the parent item
 | 
				
			||||||
		public double? NewManualOrder(int index)
 | 
							public double? NewManualOrder(int index)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			double? retval = 1;
 | 
								double? retval = 1;
 | 
				
			||||||
@@ -174,13 +204,27 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
			else if (index == 0)
 | 
								else if (index == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (retval >= SortedChildFolders[index].ManualOrder) // If one is too big, then divide first value in half
 | 
									if (retval >= SortedChildFolders[index].ManualOrder) // If one is too big, then divide first value in half
 | 
				
			||||||
					retval = SortedChildFolders[index].ManualOrder / 2;
 | 
										retval = SortedChildFolders[index].ManualOrder / 2.0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (SortedChildFolders.Count > index)
 | 
								else if (SortedChildFolders.Count > index)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				retval += SortedChildFolders[index - 1].ManualOrder; // Just go to the next whole number
 | 
									//B2025-018 Issues with folder order in tree view
 | 
				
			||||||
				if (retval >= SortedChildFolders[index].ManualOrder)
 | 
									//filter to just items with the same parent
 | 
				
			||||||
					retval = (SortedChildFolders[index - 1].ManualOrder + SortedChildFolders[index].ManualOrder) / 2;
 | 
									//want new order to be halfway between the previous item
 | 
				
			||||||
 | 
									//and the next ManualOrder
 | 
				
			||||||
 | 
									var tmp = SortedChildFolders.Where(x => x.ParentID == FolderID);
 | 
				
			||||||
 | 
									var lbound = SortedChildFolders[index - 1].ManualOrder;
 | 
				
			||||||
 | 
									var ubound = tmp.OrderBy(y => y.ManualOrder).FirstOrDefault(x => x.ManualOrder > lbound)?.ManualOrder;
 | 
				
			||||||
 | 
									if (ubound != null)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										retval = ((ubound - lbound) / 2.0) + lbound;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										//in this case, item before is highest for that parent
 | 
				
			||||||
 | 
										//so just make this 1 more
 | 
				
			||||||
 | 
										retval = lbound + 1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -769,6 +769,15 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
            tmp.MyParent = myParent;
 | 
					            tmp.MyParent = myParent;
 | 
				
			||||||
            tmp.Name = name;
 | 
					            tmp.Name = name;
 | 
				
			||||||
            tmp.ShortName = shortName;
 | 
					            tmp.ShortName = shortName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //B2025-018 Issues with folder order in tree view
 | 
				
			||||||
 | 
					            //if no manual order is set, add it at the end
 | 
				
			||||||
 | 
					            if (myParent != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID))
 | 
				
			||||||
 | 
					                    tmp.ManualOrder = parfolderinfo.NewManualOrder(9999);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return tmp;
 | 
					            return tmp;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
 | 
					        public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
 | 
				
			||||||
@@ -784,6 +793,15 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
            tmp.Config = config;
 | 
					            tmp.Config = config;
 | 
				
			||||||
            tmp.DTS = dts;
 | 
					            tmp.DTS = dts;
 | 
				
			||||||
            tmp.UsrID = usrID;
 | 
					            tmp.UsrID = usrID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //B2025-018 Issues with folder order in tree view
 | 
				
			||||||
 | 
					            //if no manual order is set, add it at the end
 | 
				
			||||||
 | 
					            if (myParent != null && manualOrder == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID))
 | 
				
			||||||
 | 
					                    tmp.ManualOrder = parfolderinfo.NewManualOrder(9999);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return tmp;
 | 
					            return tmp;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
 | 
					        public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
 | 
				
			||||||
@@ -813,6 +831,15 @@ namespace VEPROMS.CSLA.Library
 | 
				
			|||||||
            tmp.MyFormat = myFormat;
 | 
					            tmp.MyFormat = myFormat;
 | 
				
			||||||
            tmp.ManualOrder = manualOrder;
 | 
					            tmp.ManualOrder = manualOrder;
 | 
				
			||||||
            tmp.Config = config;
 | 
					            tmp.Config = config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //B2025-018 Issues with folder order in tree view
 | 
				
			||||||
 | 
					            //if no manual order is set, add it at the end
 | 
				
			||||||
 | 
					            if (myParent != null && manualOrder == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID))
 | 
				
			||||||
 | 
					                    tmp.ManualOrder = parfolderinfo.NewManualOrder(9999);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return tmp;
 | 
					            return tmp;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config)
 | 
					        public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2812,23 +2812,27 @@ namespace Volian.Controls.Library
 | 
				
			|||||||
						int f2 = -1;
 | 
											int f2 = -1;
 | 
				
			||||||
						string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder");
 | 
											string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder");
 | 
				
			||||||
						int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0);
 | 
											int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0);
 | 
				
			||||||
						FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.FolderID);
 | 
											//B2025-018 Issues with folder order in tree view
 | 
				
			||||||
						double? myorder = parfolderinfo.NewManualOrder(myindex); 
 | 
											//since before/after folder is at same level as current folder
 | 
				
			||||||
						using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID))
 | 
											//so need to use the parents order to determine where to place it
 | 
				
			||||||
						{
 | 
											using (FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.MyParent.FolderID))
 | 
				
			||||||
							ShowBrokenRules(folder.BrokenRulesCollection);
 | 
											{ double? myorder = parfolderinfo.NewManualOrder(myindex);
 | 
				
			||||||
							SetLastValues(FolderInfo.Get(folder.FolderID));
 | 
												using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID))
 | 
				
			||||||
							if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
 | 
					 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								folder.Save();
 | 
													ShowBrokenRules(folder.BrokenRulesCollection);
 | 
				
			||||||
								tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo);
 | 
													SetLastValues(FolderInfo.Get(folder.FolderID));
 | 
				
			||||||
								if (newtype == MenuSelections.FolderBefore) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index, tn);
 | 
													if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
 | 
				
			||||||
								if (newtype == MenuSelections.FolderAfter) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 1, tn);
 | 
													{
 | 
				
			||||||
 | 
														folder.Save();
 | 
				
			||||||
 | 
														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);
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
													else
 | 
				
			||||||
 | 
														f2 = folder.FolderID;
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							else
 | 
												if (f2 != -1) Folder.Delete(f2);
 | 
				
			||||||
								f2 = folder.FolderID;
 | 
					 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if (f2 != -1) Folder.Delete(f2);
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user