/// <summary> /// Add sorted floating containers to the list /// </summary> /// <param name="containers">containers</param> private void AddSortedFloatingContainers(List <DockableContainer> containers) { List <DockableContainer> containersToBringInFront = new List <DockableContainer>(); foreach (DockableFormInfo info in _dockableForms) { FormsTabbedView view = HierarchyUtility.GetTabbedView(info.DockableForm); if (view.IsDocked) { continue; } DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); if (_host.Contains(container) == false) { continue; } if (containersToBringInFront.Contains(container) == false) { containersToBringInFront.Add(container); } } SortContainersBasedOnTheirZOrder(containersToBringInFront); containers.AddRange(containersToBringInFront); }
/// <summary> /// Set the height of a form docked: top or bottom or fill /// </summary> /// <param name="info">info identifing the form</param> /// <param name="newHeight">new height value</param> public void SetHeight(DockableFormInfo info, int newHeight) { int delta = newHeight - info.DockableForm.Height; if (delta == 0) { return; } DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); List <DockableContainer> hierarchy = new List <DockableContainer>(); List <int> modifiers = new List <int>(); hierarchy.Add(container); modifiers.Add(delta); DockableContainer containerParent = container.Parent as DockableContainer; while (containerParent != null) { hierarchy.Add(containerParent); modifiers.Add(containerParent.Height - container.Height + delta); container = containerParent; containerParent = containerParent.Parent as DockableContainer; } for (int index = hierarchy.Count - 1; index >= 0; index--) { hierarchy[index].Height += modifiers[index]; } }
/// <summary> /// Remove the form /// </summary> /// <param name="info">info about form to remove</param> public void Remove(DockableFormInfo info) { if (info == null) { return; } FormsTabbedView view = HierarchyUtility.GetTabbedView(info.DockableForm); if (view != null) { if (view.Count == 1 && view.IsDocked) { _layout.Undock(view); } if (view.Count == 1) { _host.Remove(view.Parent); DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); container.SetModeEmpty(); view.Remove(info); } else { if (view.Remove(info) == false) { if (SelectedFormInfo == info) { SelectedFormInfo = null; } return; } } } if (SelectedFormInfo == info) { SelectedFormInfo = null; } _dockableForms.Remove(info); info.SelectedChanged -= OnFormSelectedChanged; info.ShowAutoPanel -= OnShowFormAutoPanel; info.ExplicitDisposing -= OnInfoDisposing; if (info.IsAutoHideMode) { _autohide.ArrangeAutoButtonsPanels(); } info.Dispose(); }
/// <summary> /// Dock a form previously added to guider over another form previously added to guider /// </summary> /// <param name="info">info about the form to dock</param> /// <param name="infoOver">info about form over which to dock</param> /// <param name="dock">how to dock</param> /// <param name="mode">were to dock</param> public void DockOver(DockableFormInfo info, DockableFormInfo infoOver, DockStyle dock, zDockMode mode) { DockableContainer containerToDock = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); DockableContainer containerWhereToDock = null; if (infoOver != null) { containerWhereToDock = HierarchyUtility.GetClosestDockableContainer(infoOver.DockableForm); } _layout.DockControl(containerToDock, containerWhereToDock, dock, mode); }
/// <summary> /// Save /// </summary> /// <param name="info">info</param> /// <param name="parentId">parent id identifier</param> /// <param name="xmlForms">forms</param> private void Save(DockableFormInfo info, Guid parentId, XmlNode xmlForms) { XmlDocument xmlDocument = xmlForms.OwnerDocument; XmlNode xmlForm = xmlForms.AppendChild(xmlDocument.CreateElement(XmlTags.TagForm)); XmlNode xmlGuid = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagGuid)); XmlNode xmlAllowedDock = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagAllowedDock)); XmlNode xmlCurrentDock = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagCurrentDock)); XmlNode xmlCurrentMode = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagCurrentMode)); XmlNode xmlIsSelected = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagIsSelected)); XmlNode xmlIsAutoHide = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagIsAutoHide)); XmlNode xmlWidth = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagWidth)); XmlNode xmlHeight = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagHeight)); if (parentId != Guid.Empty) { XmlNode xmlParentGuid = xmlForm.AppendChild(xmlDocument.CreateElement(XmlTags.TagParentGuid)); xmlParentGuid.InnerText = parentId.ToString(); } xmlGuid.InnerText = info.Id.ToString(); xmlAllowedDock.InnerText = info.AllowedDock.ToString(); xmlCurrentMode.InnerText = info.DockMode.ToString(); xmlIsSelected.InnerText = info.IsSelected.ToString().ToLower(); xmlIsAutoHide.InnerText = info.IsAutoHideMode.ToString().ToLower(); DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); xmlWidth.InnerText = container.Width.ToString(); xmlHeight.InnerText = container.Height.ToString(); if (parentId == Guid.Empty) { if (info.IsAutoHideMode == false) { xmlCurrentDock.InnerText = info.HostContainerDock.ToString(); } else { xmlCurrentDock.InnerText = info.AutoHideSavedDock.ToString(); } } else { xmlCurrentDock.InnerText = info.Dock.ToString(); //xmlCurrentDock.InnerText = "Bottom"; //xmlCurrentMode.InnerText = "Inner"; } }
/// <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> /// Add sorted fill containers to the list /// </summary> /// <param name="containers">containers</param> private void AddSortedFillContainers(List <DockableContainer> containers) { List <DockableContainer> containersToBringInFront = new List <DockableContainer>(); foreach (DockableFormInfo info in _dockableForms) { FormsTabbedView view = HierarchyUtility.GetTabbedView(info.DockableForm); if (view.HostContainerDock != DockStyle.Fill) { continue; } DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); while (true) { if (container.Parent as DockableContainer != null) { container = (DockableContainer)container.Parent; } else { break; } } Debug.Assert(_host.Contains(container), "Floating form views must have their parent in form"); if (containersToBringInFront.Contains(container) == false) { containersToBringInFront.Add(container); } } SortContainersBasedOnTheirZOrder(containersToBringInFront); containers.AddRange(containersToBringInFront); }
/// <summary> /// Dock a form previously added to guider /// </summary> /// <param name="info">info about the form to dock</param> /// <param name="dock">how to dock</param> /// <param name="mode">were to dock</param> public void Dock(DockableFormInfo info, DockStyle dock, zDockMode mode) { DockableContainer container = HierarchyUtility.GetClosestDockableContainer(info.DockableForm); _layout.DockControl(container, null, dock, mode); }