/// <summary> /// Get form size info /// </summary> /// <param name="form">form </param> /// <param name="source">size infos</param> /// <returns>form size info</returns> private static ControlSizeInfo GetInfo(Form form, List <ControlSizeInfo> sizesInfo) { for (int index = 0; index < sizesInfo.Count; index++) { ControlSizeInfo info = sizesInfo[index]; if (info.Control == form) { return(info); } } return(null); }
/// <summary> /// Move view size info /// </summary> /// <param name="view">view</param> /// <param name="source">source</param> /// <returns>view size</returns> private static Size RemoveViewSizeInfo(FormsTabbedView view, List <ControlSizeInfo> source) { Form form = view.GetPageAt(0); ControlSizeInfo firstInfo = GetInfo(form, source); for (int index = 0; index < view.Count; index++) { ControlSizeInfo info = GetInfo(view.GetPageAt(index), source); source.Remove(info); } return(new Size(firstInfo.Width, firstInfo.Height)); }
/// <summary> /// Restore sizes /// </summary> /// <param name="formsSize">form sizes</param> private void RestoreSizes(List <ControlSizeInfo> formsSize) { while (formsSize.Count > 0) { ControlSizeInfo sizeInfo = formsSize[0]; DockableContainer container = HierarchyUtility.GetClosestDockableContainer((Form)sizeInfo.Control); while (container.Parent.Handle != _container.Handle) { container = (DockableContainer)container.Parent; } List <ControlSizeInfo> containersSize = new List <ControlSizeInfo>(); ExtractContainersSizeInfo(container, formsSize, containersSize); for (int index = containersSize.Count - 1; index >= 0; index--) { ControlSizeInfo info = containersSize[index]; info.Control.Width = info.Width; info.Control.Height = info.Height; } } }
/// <summary> /// Extract containers size info /// </summary> /// <param name="container">container</param> /// <param name="source">source</param> /// <param name="destination">destination</param> /// <returns>computed container size</returns> private static ControlSizeInfo ExtractContainersSizeInfo(DockableContainer container, List <ControlSizeInfo> source, List <ControlSizeInfo> destination) { DockableContainer currentContainer = container; if (currentContainer.SingleChild != null) { Size size = RemoveViewSizeInfo(currentContainer.SingleChild, source); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return(result); } if (currentContainer.TopPane != null) { ControlSizeInfo topSize = ExtractContainersSizeInfo(container.TopPane, source, destination); ControlSizeInfo bottomSize = ExtractContainersSizeInfo(container.BottomPane, source, destination); Size size = new Size(Math.Max(topSize.Width, bottomSize.Width), topSize.Height + bottomSize.Height + container.TopPane.Splitter.Height); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return(result); } if (currentContainer.LeftPane != null) { ControlSizeInfo leftSize = ExtractContainersSizeInfo(container.LeftPane, source, destination); ControlSizeInfo rightSize = ExtractContainersSizeInfo(container.RightPane, source, destination); Size size = new Size(leftSize.Width + rightSize.Width + container.LeftPane.Splitter.Width, Math.Max(leftSize.Height, rightSize.Height)); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return(result); } throw new NotSupportedException(); }
/// <summary> /// Extract containers size info /// </summary> /// <param name="container">container</param> /// <param name="source">source</param> /// <param name="destination">destination</param> /// <returns>computed container size</returns> private static ControlSizeInfo ExtractContainersSizeInfo(DockableContainer container, List<ControlSizeInfo> source, List<ControlSizeInfo> destination) { DockableContainer currentContainer = container; if (currentContainer.SingleChild != null) { Size size = RemoveViewSizeInfo(currentContainer.SingleChild, source); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return result; } if (currentContainer.TopPane != null) { ControlSizeInfo topSize = ExtractContainersSizeInfo(container.TopPane, source, destination); ControlSizeInfo bottomSize = ExtractContainersSizeInfo(container.BottomPane, source, destination); Size size = new Size(Math.Max(topSize.Width, bottomSize.Width), topSize.Height + bottomSize.Height + container.TopPane.Splitter.Height); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return result; } if (currentContainer.LeftPane != null) { ControlSizeInfo leftSize = ExtractContainersSizeInfo(container.LeftPane, source, destination); ControlSizeInfo rightSize = ExtractContainersSizeInfo(container.RightPane, source, destination); Size size = new Size(leftSize.Width + rightSize.Width + container.LeftPane.Splitter.Width, Math.Max(leftSize.Height, rightSize.Height)); ControlSizeInfo result = new ControlSizeInfo(container, size.Width, size.Height); destination.Add(result); return result; } throw new NotSupportedException(); }